欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

何为并发 博客分类: 并发编程

程序员文章站 2024-03-22 12:55:46
...

学习并发编程之前,先了解下何为并发?

 

"并发"在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,从宏观外来看,好像是这些进程都在执行。

 

“并行”:常与并发有混淆的概念:

并行一般是指没有互斥和同步的情况下独立进行同时发生的事件。因此单CPU操作系统的进程/线程严格意义上来说都不能算是并行事件,毕竟它们都要使用同一个CPU,真正的并行出现在多处理器的计算机上,当进程/线程独立运行在不同的CPU上,而且没有不需要共享对象时。粗略的说,没有资源互斥共享的进程和线程都是并行的

 

--------------------------------------------------------------------------------------------

并发编程中,需要理清的概念还有线程,进程,多任务

 

进程是什么呢?直观的讲,进程就是正在执行的程序,一个进程通常就是一个正在执行的应用程序。从Windows角度讲,进程是含有内存和资源并安置线程的地方。进程中的资源可以包括文件句柄、线程、用户资源(对话框或字符串)、GDI资源(设备环境DC和画笔等)等。进程往往与一个任务挂钩,就像上面我们提到的“将”,操作系统负责分配资源让进程率领众线程完成某种任务。也是因此,Windows提供一个叫做“任务管理器”的工具可以让我们查看和管理进程。

所以准确的讲,进程就是一个可执行的程序一次运行的过程,它是系统进行资源分配和调度的一个独立单位。明白进程是系统进行资源分配和调度的单位非常重要,内存和CPU都是系统资源,当一个程序被调入内存开始执行时就变成了进程,此时操作系统便为其分配了这些相关的资源并且负责进行调度。进程是将,这个将直接对操作系统这个国王负责,国王可以分配给他一定的土地和俸禄(对应系统资源)并指派他去完成特定的任务。一个国家日理万机的大将可以有很多,这也就是操作系统多进程的概念,操作系统这个国王负责调兵遣将。

线程是操作系统分配处理器(CPU)时间的基本单元,是系统中最小的执行单元。如前所述,进程如将,线程如兵,操作系统创建并控制进程,进程包含和控制线程。我们知道国王和将帅自己并不去攻城掠地,他们只是坐阵指挥。那么实际上真正进行攻城掠地的是兵(线程)。兵也有自己的资源(系统会为线程初始化一个线程内核对象,还有一块1M左右的内存堆栈)。作为将要善于谋略,善于部署,善于将兵,拥兵十万不如精甲十千。作为兵要众志成城、竭尽全力去完成自己的任务。所以线程不可滥用,进程应当精简(一个进程只需做一个任务就够了)。

---------------------------------------------------------------------------------------------------

在多CPU的现代计算机中

在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便是多任务。现代的操作系统几乎都是多任务操作系统,能够同时管理多个进程的运行。 多任务带来的好处是明显的,比如你可以边听mp3边上网,与此同时甚至可以将下载的文档打印出来,而这些任务之间丝毫不会相互干扰。那么这里就涉及到并行的问题,俗话说,一心不能二用,这对计算机也一样,原则上一个CPU只能分配给一个进程,以便运行这个进程。我们通常使用的计算机中只有一个CPU,也就是说只有一颗心,要让它一心多用,同时运行多个进程,就必须使用并发技术。实现并发技术相当复杂,最容易理解的是“时间片轮转进程调度算法”,它的思想简单介绍如下:在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短(比如10毫秒),这样用户根本感觉不出来CPU是在轮流为多个进程服务,就好象所有的进程都在不间断地运行一样。但实际上在任何一个时间内有且仅有一个进程占有CPU。 
如果一台计算机有多个CPU,情况就不同了,如果进程数小于CPU数,则不同的进程可以分配给不同的CPU来运行,这样,多个进程就是真正同时运行的,这便是并行。但如果进程数大于CPU数,则仍然需要使用并发技术。 
在Windows中,进行CPU分配是以线程为单位的,一个进程可能由多个线程组成,这时情况更加复杂,但简单地说,有如下关系: 

总线程数<= CPU数量:并行运行 

总线程数> CPU数量:并发运行 

并行运行的效率显然高于并发运行,所以在多CPU的计算机中,多任务的效率比较高。但是,如果在多CPU计算机中只运行一个进程(线程),就不能发挥多CPU的优势。 

 

---------------------------------------------------

那么在多CPU的硬件条件下,一个进程是不是会在多个CPU上运行呢?

其实这还是要明白  进程是系统进行资源分配和调度的单位  线程是操作系统分配处理器(CPU)时间的基本单元,是系统中最小的执行单元

一个进程被分配了独立的资源空间,但里面真正执行的还是一个一个线程,在运行一个进程的时候,它里的若干线程会被空间的CPU调度执行。 所以一个进程会在多CPU上运行,也就是你在一个多CPU上只行动一个程序,也会看到多CPU在不停的切换~