多CPU,多核,多进程,多线程

当面临这些问题的时候,有两个关键词没法绕开,那就是并行并发程序员

首先,要先了解几个概念:多线程

  一、进程是程序的一次执行。并发

  二、进程是资源分配的基本单位(调度单位)。spa

  三、一个进程能够包括多个线程。操作系统

  四、在单CPU计算机中,有一个资源是没法被多个程序并行使用的:CPU。线程

  五、操做系统调度器:拆分CPU为一段段时间的运行片,轮流分配给不一样的程序。进程

  六、操做系统内存管理模块:管理物理内存、虚拟内存相关的事务。事务

  因为CPU同时刻只能执行一个进程,若是咱们不加以控制的话,一个进程可能使用CPU直到运行结束,因而出现了操做系统调度器,而进程也成为了调度单位。内存

  进程的运行不只仅须要CPU,还须要不少其余资源,如内存啊,显卡啊,GPS啊,磁盘啊等等,统称为程序的执行环境,也就是程序上下文。资源

  在这里就出现了并发的概念,调度器切换CPU给不一样进程使用的速度很是快,因而在使用者看来程序是在同时运行,这就是并发,而实际上CPU在同一时刻只在运行一个进程。

  CPU进程没法同时刻共享,可是出现必定要共享CPU的需求呢?此时线程的概念就出现了。线程被包含在进程当中,进程的不一样线程间共享CPU和程序上下文。(共享进程分配到的资源)

  单CPU进行进程调度的时候,须要读取上下文+执行程序+保存上下文,即进程切换。

  若是这个CPU是单核的话,那么在进程中的不一样线程为了使用CPU核心,则会进行线程切换,可是因为共享了程序执行环境,这个线程切换比进程切换开销少了不少。在这里依然是并发,惟一核心同时刻只能执行一个线程。

  若是这个CPU是多核的话,那么进程中的不一样线程可使用不一样核心,真正的并行出现了。

  线程是CPU调度和分配的基本单位,必定要和 进程是操做系统进行资源分配(包括cpu、内存、磁盘IO等)的最小单位 区别清楚。有句话说CPU只能看到线程,能够这么理解,假设我是CPU,我闭着眼,操做系统调度器将一个进程分配给我以后,我拿到进程睁开眼,我看到的是什么?我看到的是进程中的不少线程,那么我如今能调度和分配的是什么?进程?不行,由于我看不到其余进程,何来调度分配,只能调度我看到的那些线程,若是我是4核的话,把线程ABCD分配到核心1234,其余的线程依然要等待分配,至于等待多久,如何分配,暂不在本文讨论范围。因而线程是CPU调度和分配的基本单位。

  最后说一下操做系统内存管理模块这里作的事:在这以前,程序员须要为每一个程序安排运行的空间,这里的空间指的是内存的物理地址,可是这么的问题就是,每一个程序都要协商如何使用同一内存的不一样空间,并且程序员还要关心底层内存分配问题。解决办法就是,提出进程的概念,每一个进程用同样的虚拟地址空间,CPU上增长了MMU模块负责转换虚拟地址和物理地址,虚拟地址通过操做系统和MMU以后,虚拟地址会映射到不一样的物理地址,不一样的进程就能得到各自独立的物理内存空间。

  另外在有的操做系统里,进程不是调度单位,线程是最基本的调度单位,调度器只调度线程,不调度进程,如VxWorks。

  总结:

  一、单CPU中进程只能是并发,多CPU计算机中进程能够并行。

  二、单CPU单核中线程只能并发,单CPU多核中线程能够并行。

  三、不管是并发仍是并行,使用者来看,看到的是多进程,多线程。