什么是进程,什么是线程

转载请注明出处:http://blog.csdn.net/li0978/article/details/52054320html

进程是指在操做系统中正在运行的一个应用程序,线程是指进程内独立执行某个任务的一个单元。程序员

线程与进程有不少相似的性质,所以人们习惯上也称线程为轻量级进程( lightweightprocess, LWP),也是CPU调度和分派的基本单元;而传统意义上的进程则被称为重量级进程(heavyweight process, HWP),从现代的角度来看,它就是只拥有一个线程的进程。若是进程有多个控制线程,那么它就能同时执行多个任务。他们之间的关系能够简单的由下图表示:并发

下面,咱们主要从调度、并发性、系统开销、拥有资源等方面来对线程和进程进行比较。spa

 

调度操作系统

在传统的操做系统中,CPU调度和分派的基本单位是进程。而在引入线程的操做系统中,则把线程做为CPU调度和分派的基本单位,进程则做为资源拥有的基本单位,从而使传统进程的两个属性分开,线程便能轻装运行,这样能够显著地提升系统的并发性。同一进程中线程的切换不会引发进程切换,从而避免了昂贵的系统调用。可是在由一个进程中的线程切换到另外一进程中的线程时,依然会引发进程切换。.net

并发性线程

在引入线程的操做系统中,不只进程之间能够并发执行,并且在一个进程中的多个线程之间也能够并发执行,于是使操做系统具备更好的并发性,从而能更有效地使用系统资源和提升系统的吞吐量。例如,在一个未引入线程的单CPU操做系统中,若仅设置一个文件服务进程,当它因为某种缘由被封锁时,便没有其余的文件服务进程来提供服务。在引入了线程的操做系统中,能够在一个文件服务进程中设置多个服务线程。当第一个线程等待时,文件服务进程中的第二个线程能够继续运行;当第二个线程封锁时,第三个线程能够继续执行,从而显著地提升了文件服务的质量以及系统的吞吐量。htm

系统开销blog

不管是引入了线程的操做系统,仍是传统的操做系统,进程都是拥有系统资源的一个独立单位,它能够拥有本身的资源。通常地说,线程本身不拥有系统资源(也有一点必不可少的资源),但它能够访问其隶属进程的资源。亦即一个进程的代码段、数据段以及系统资源(如已打开的文件、I/O设备等),可供同一进程的其余全部线程共享。接口

拥有资源

因为在建立或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等。所以,操做系统所付出的开销将显著地大于在建立或撤消线程时的开销。相似地,在进行进程切换时,涉及到整个当前进程CPU环境的保存环境的设置以及新被调度运行的进程的CPU环境的设置。而线程切换只需保存和设置少许寄存器的内容,并不涉及存储器管理方面的操做。可见,进程切换的开销也远大于线程切换的开销。此外,因为同一进程中的多个线程具备相同的地址空间,导致它们之间的同步和通讯的实现也变得比较容易。在有的系统中,线程的切换、同步和通讯都无需操做系统内核的干预。


PS:

一、在单核计算机里,有一个资源是没法被多个程序并行使用的:cpu。
没有操做系统的状况下,一个程序一直独占着全都cpu。
若是要有两个任务来共享同一个CPU,程序员就须要仔细地为程序安排好运行计划--某时刻cpu和由程序A来独享,下一时刻cpu由程序B来独享
而这种安排计划后来成为OS的核心组件,被单独名命为“scheduler”,即“调度器”,它关心的只是怎样把单个cpu的运行拆分红一段一段的“运行片”,轮流分给不一样的程序去使用,而在宏观上,由于分配切换的速度极快,就制造出多程序并行在一个cpu上的假象。


二、在单核计算机里,有一个资源能够被多个程序共用,然而会引出麻烦:内存。
在一个只有调度器,没有内存管理组件的操做系统上,程序员须要手工为每一个程序安排运行的空间 -- 程序A使用物理地址0x00-0xff,程序B使用物理地址0x100-0x1ff,等等。
然而这样作有个很大的问题:每一个程序都要协调商量好怎样使用同一个内存上的不一样空间,软件系统和硬件系统千差万别,使这种定制的方案没有可行性。
为了解决这个麻烦,计算机系统引入了“虚拟地址”的概念,从三方面入手来作:
a、硬件上,CPU增长了一个专门的模块叫MMU,负责转换虚拟地址和物理地址。
b、操做系统上,操做系统增长了另外一个核心组件:memory management,即内存管理模块,它管理物理内存、虚拟内存相关的一系列事务。
c、应用程序上,发明了一个叫作【进程】的模型,(注意)每一个进程都用【彻底同样的】虚拟地址空间,然而经由操做系统和硬件MMU协做,映射到不一样的物理地址空间上。不一样的【进程】,都有各自独立的物理内存空间,不用一些特殊手段,是没法访问别的进程的物理内存的。


三、如今,不一样的应用程序,能够不关心底层的物理内存分配,也不关心CPU的协调共享了。然而还有一个问题存在:有一些程序,想要共享CPU,【而且还要共享一样的物理内存】,这时候,一个叫【线程】的模型就出现了,它们被包裹在进程里面,在调度器的管理下共享CPU,拥有一样的虚拟地址空间,同时也共享同一个物理地址空间,然而,它们没法越过包裹本身的进程,去访问别一个进程的物理地址空间。


四、进程之间怎样共享同一个物理地址空间呢?不一样的系统方法各异,符合posix规范的操做系统都提供了一个接口,叫mmap,能够把一个物理地址空间映射到不一样的进程中,由不一样的进程来共享。


参考:

进程与线程的一个简单解释 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html