何为并发 博客分类: 并发编程
学习并发编程之前,先了解下何为并发?
"并发"在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,从宏观外来看,好像是这些进程都在执行。
“并行”:常与并发有混淆的概念:
并行一般是指没有互斥和同步的情况下独立进行同时发生的事件。因此单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在不停的切换~
推荐阅读
-
何为并发 博客分类: 并发编程
-
何为并发 博客分类: 并发编程
-
第二届战神杯线上编程挑战赛月赛第一题:回文数 博客分类: java java编程
-
第五届在线编程大赛月赛第一题:完全平方数的个数 博客分类: java java
-
第二届战神杯线上编程挑战赛月赛第一题:回文数 博客分类: java java编程
-
凯撒密码 史上最难的问题(呃,这是编程题目的名字,不是真的最难.....) 博客分类: java Java
-
Flex Array,Arraylist,ArrayCollection使用详解 博客分类: 编程 FlashUI
-
利用第三方开源包cpdetector获取文件编码格式 博客分类: 编程 javachardet-1.0cpdetector-1.0.10
-
中文转拼音【pinyin4j使用】 博客分类: 编程
-
Hibernate_10 博客分类: Hibenate hibernte并发