`
hilyhoo
  • 浏览: 13113 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

多核、多线程的引入

阅读更多

引言:

对应着处理器从单核到多处理器及多核,操作系统的发展历程中,从进程演化到线程、多线程。于是,我们会想到这些问题:

1、为什么微处理要从单核转向多核?

功耗问题 限制了单核处理器不断提高性能的发展途径:


作为计算机核心,影响计算机性能高低的核心部件就是处理器。反映在指令上就是处理器执行指令的效率。
  处理器性能 = 主频 x IPC
可以看出,衡量处理器性能的主要指标是每个时钟周期内可以执行的指令数(IPC)和处理器的主频。


因此,提高处理器性能就是两个途径:

提高主频和提高每个时钟周期内执行的指令数(IPC)。

1)处理器微架构的变化可以改变IPC,效率更高的微架构可以 提高IPC从而提高处理器的性能。但是,对于同一代的架构,改良架构来提高IPC的幅度是非常有限的,所以在单核处理器时代通过提高处理器的主频来提高性 能就成了唯一的手段。


2)然而,给处理器提高主频不是没有止境的,从下面的推导中可以看出,处理器的功耗和处理器内部的电流、电压的平方和主频成正比,而主频和电压成正比。
  处理器功耗 正比于 电流 x 电压 x 电压 x 主频

主频 正比于 电压
  处理器功耗 正比于 主频的三次方


3)如果通过提高主频来提高处理器的性能,就会使处理器的功耗以三次方非线性(一次方) 的速度急剧上升,很快就会触及frequency wall。过快的能耗上升,需要寻找提高处理器性能的因子,提高IPC。

  提高IPC可以通过提高指令执行的并行度来实现,而提高并行度有两种途径:一是提高处理器微架构的并行度;二是采用多核架构。

  在采用同样的微架构的情况下,为了达到处理器IPC的目的,我们可以采用多核的方法,同时有效地控制功耗的急剧上升。
  处理器功耗 正比于 电流x 电压 x 电压 x 主频

IPC 正比于 电流
  处理器功耗 正比于 IPC

  由单核处理器增加到双核处理器,如果主频不变的话,IPC理论上可以提高一倍,功耗理论上也就最多提高一倍,因为功耗的增加是线性的。而实际情况是, 双核处理器性能达到单核处理器同等性能的时候,前者的主频可以更低,因此功耗的下降也是三次方下降 的。反映到产品中就是双核处理器的起跳主频可以比单核处理器更低,性能更好。

  由此可见,将来处理器发展的趋势是:为了达到更高的性能,在采用相同微架构的情况下,可以增加处理器的内核数量同时维持较低的主频。这样设计的效果是,更多的并行提高IPC,较低的主频有效地控制了功耗的上升。

2、为什么提出线程?

其目的有二:

1)如上面所提到的,更好的支持SMP和多核:进程在SMP上可以同时使用多个cpu或者核执行各个线程,很好的支持并行。
2)减小上下文切换的开销:同一进程的线程共享资源、状态记录等;实现同类任务的内存块共享,对逻辑内存重用,而进程间只能实现对物理内存的分时共享。

3、线程模型

针对上述两大目的,相应的提出了两大线程模型 :用户级线程和核心级线程;分类的标准在于线程的调度者在核内还是核外。
其中,核内的可以实现并发;核外的使得上下文切换开销更小。

1、核心以线程为单位,控制线程的分发调度;
2、单纯的用户线程的调度全部在核外实现,只需完成线程运行栈的切换,但由于核心信号都以进程为单位,无法定位到线程,因此不能用于多处理器系统。

于是,现在的大多操作系统不是采用单一的线程模型,而是将两个模型结合起来,譬如Solaris和Linux]都是采用这样的混合模型

1、提供核心线程,高层包括基本抽象,如硬件状态和软件上下文,满足SMP;
2、支持线程库,一个核心线程成为多个用户线程的调度者,进而减小了上下文开销。每个用户线程可以独立于该进程的其他线程进行调度执行。
这个模型中,一个进程的某个线程(内核线程)由核内调度,而他又可以调度用户线程。其目的是保证内核负载最小的条件下,一个进程可以创建大量用户线程,为并发提供条件。
分享到:
评论

相关推荐

    Java多线程编程的优点和缺点

    加快响应用户的时间:多线程允许并发执行多个任务,可以充分利用多核处理器,从而提高程序的性能和响应速度。比如我们经常用的迅雷下载,都喜欢多开几个线程去下载,谁都不愿意用一个线程去下载,为什么呢?答案很简单,...

    c++11多线程编程之std::async的介绍与实例

    C++11中引入了std::async 什么是std::async std::async()是一个接受回调(函数或函数对象)作为参数的函数模板,并有可能异步执行它们. template future<typename>::type> async(launch policy, Fn&& fn, Args&&......

    Python中单线程、多线程和多进程的效率对比实验

     资料显示,如果多线程的进程是CPU密集型的,那多线程并不能有多少效率上的提升,相反还可能会因为线程的频繁切换,导致效率下降,推荐使用多进程;如果是IO密集型,多线程进程可以利用IO阻塞等待时的空闲时间执行...

    线程安全及Python中的GIL原理分析

    在多核时代的到来的背景下,基于多线程来充分利用硬件的编程方法也不断发展起来, 但是一旦 牵扯到多线程,就必然会涉及到一个概念,即 线程安全, 本文就主要谈下笔者对线程安全的一些理解. 而Python为很多人所抱怨的...

    Python多进程编程技术实例分析

    一般来说,由于Python的线程有些限制,例如多线程不能充分利用多核CPU等问题,因此在Python中我们更倾向使用多进程。但在做不阻塞的异步UI等场景,我们也会使用多线程。本篇文章主要探讨Python多进程的问题。 Python...

    Java并发缺陷模式1

    对于多线程编程经验较少的程序员而言,开发多核系统软件将面临两个方面的问题:首先,并发会给 Java 程序引入新的缺陷,如数据速度和死锁,它们是非常难以复现和发现

    Python高级用法(GIL锁,深拷贝,浅拷贝,私有属性,魔法属性,上下文管理器)

      在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势   接下来,我们需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。...

    嵌入式系统动态数据结构优化的并行进化算法 (2010年)

    为了更好地解决现代多媒体嵌入式系统动态数据结构优化问题,结合NSGA-II和SPEA2两个多目标进化算法,引入岛屿模型和多线程机制,提出了一种并行多目标进化算法――PMOEA-NS.基于多核计算机系统,使用PMOEA-NS具体的3...

    Java-Concurrency-Multithreading-in-Practice:Packt出版的《 Java Concurrency&Multithreading in Practice》

    实践中的Java并发和多线程 这是发行的的代码存储库。 它包含从头到尾完成视频课程所需的所有支持项目文件。 关于视频课程 多核处理器无处不在-从超级计算机到随身携带的移动设备。 这就是为什么现代开发人员必须知道...

    nodejs-httpp:使用Node.js在UDP上运行HTTP

    nodejs-httpp-在基于UDP的传输上运行...利用多核CPU支持高性能多进程/多线程UDP服务器 可配置的拥塞控制 每插槽网络性能监视器 透明地扩展客户端/中央服务器样式的Web服务 易于使用的API,可重用现有的http / web和node

    基于Lua实现的脚本和服务器引擎Node-Lua.zip

    Node-Lua是一款基于Lua实现的脚本和服务器引擎,它支持构建海量Lua服务(Context_Lua)并以多线程方式运行在多核服务器上,采用了任务多路复用的设计方案,有效利用了多核优势。node-lua致力于构建一个快速、简单易用...

    C#并行编程高级教程

    详细讲述最新的单指令、多数据流指令和向量化等并行编程技术,介绍现代并行库,讨论如何珠联璧合地使用高级Intel工具与C#,并指导您巧妙使用新引入的轻型协调结构来开发自己的解决方案并解决最棘手的并发编程问题。...

    C#并行编程高级教程:精通.NET 4 Parallel Extensions中文(第一部分)

    详细讲述最新的单指令、多数据流指令和向量化等并行编程技术,介绍现代并行库,讨论如何珠联璧合地使用高级Intel工具与C#,并指导您巧妙使用新引入的轻型协调结构来开发自己的解决方案并解决最棘手的并发编程问题。...

    C#并行编程高级教程:精通.NET 4 Parallel Extensions中文(第2部分)

    详细讲述最新的单指令、多数据流指令和向量化等并行编程技术,介绍现代并行库,讨论如何珠联璧合地使用高级Intel工具与C#,并指导您巧妙使用新引入的轻型协调结构来开发自己的解决方案并解决最棘手的并发编程问题。...

    C#并行编程高级教程:精通.NET 4 Parallel Extensions中文(第3部分)

    详细讲述最新的单指令、多数据流指令和向量化等并行编程技术,介绍现代并行库,讨论如何珠联璧合地使用高级Intel工具与C#,并指导您巧妙使用新引入的轻型协调结构来开发自己的解决方案并解决最棘手的并发编程问题。...

    webpack5-vue3:基于Webpack5的Vue3框架

    happyPack:多线程打包 提取公共代码和第三方代码 运用 CDN 文件名称使用 内容hash 懒加载 图片引用(设定阀值,根据文件大小选择 base64 格式或者 url 引入) webpack-bundle-analyzer:可视化分析 自动带有 代码...

    C#并行编程-Task

    TPL引入新的基于任务的编程模型,通过这种编程模型可以发挥多核的功效,提升应用程序的性能,不需要编写底层复杂且重量级的线程代码。但需要注意:任务并不是线程(任务运行的时候需要使用线程,但并不是说任务取代...

    嵌入式系统/ARM技术中的高效轻型线程助力提高Linux实时性能

    这些用户空间扩展(有多个)已首先由电信/网络高性能 IP 数据包处理系统进行驱动,以实现所谓的"裸金属"实施,其中,多核设备中的Linux用户空间应用可以模拟"无操作系统"解决方案的执行过程,即在每个内核上进行简单...

    java实战开发1200例源码-Distributed-Translation-Infrastructure:分布式统计机器翻译基础设施,包括

    除了通过在各种计算节点上引入分布式服务进行扩展外,我们还通过采用多线程来确保多核 CPU 的可扩展性。 基础设施包括以下应用程序: bpbd-server - 由以下主要组件组成的翻译服务器: 解码器- 负责将文本从一种语言...

Global site tag (gtag.js) - Google Analytics