转自:http://www.jobcoding.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/processandthread/
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位。
例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等,然后,该进程被放入到进程的就绪队列,进程调度程序选中它,为它分配CPU及其它相关资源,该进程就被运行起来。
线程是进程的一个实体,是CPU调度和分派的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
在没有实现线程的操作系统中,进程既是资源分配的基本单位,又是调度的基本单位,它是系统中并发执行的单元。而在实现了线程的操作系统中,进程是资源分配的基本单位,但线程是调度的基本单位,线程是系统中并发执行的单元。
具体而言,引入线程,主要有以下4个方面的优点:
(1) 易于调度。
(2) 提高并发性。通过线程可以方便有效地实现并发。
(3) 开销小。创建线程比创建进程要快,所需要的开销也更少。
(4) 有利于发挥多处理器的功能。通过创建多线程,每个线程都在一个处理器上运行,从而实现应用程序的并行,使每个处理器都得到充分运行。
需要注意的是,尽管线程与进程二者很相似,但也存在着很大的不同,区别如下:
(1) 一个线程必定属于也只能属于一个进程;而一个进程可以拥有多个线程并且至少拥有一个线程。
(2) 属于一个进程的所有线程共享该线程的所有资源,包括打开的文件、创建的Socket等。不同的进程互相独立。
(3) 线程又被称为轻量级进程。进程有进程控制块,线程也有线程控制块。但线程控制块比进程控制块小得多。线程间切换代价小,进程间切换代价大。
(4) 进程是程序的一次执行,线程可以理解为程序中一段程序片段的执行。
(5) 每个进程都有独立的内存空间,而线程共享其所属进程的内存空间。
转自:http://blog.csdn.net/laoyang360/article/details/7889301
一、程序、进程、线程
1.程序和进程.
进程由两个部分组成:1)操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。2)地址空间。它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。
|
定义 |
使用系统运行资源情况 |
程序 |
计算机指令的集合,它以文件的形式存储在磁盘上。程序是静态实体(passive Entity),在多道程序系统中,它是不能独立运行的,更不能与其他程序并发执行。 |
不使用【程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位,因此,它不占用系统的运行资源】。
|
进程 |
通常被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动。 定义:进程是进程实体(包括:程序段、相关的数据段、进程控制块PCB)的运行过程,是系统进行资源分配和调度的一个独立单位。 |
使用【进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源。】 |
2. 进程与线程
如果说操作系统引入进程的目的是为了提高程序并发执行,以提高资源利用率和系统吞吐量。那么操作系统中引入线程的目的,则是为了减少进程并发执行过程中所付出的时空开销,使操作系统能很好的并发执行。
进程process定义了一个执行环境,包括它自己私有的地址空间、一个句柄表,以及一个安全环境;线程则是一个控制流,有他自己的调用栈call stack,记录了它的执行历史。
线程由两个部分组成:1)线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。2)线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量。当创建线程时,系统创建一个线程内核对象。该线程内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。
进程与线程的比较如下:
比较 |
进程 |
线程 |
活泼性 |
不活泼(只是线程的容器) |
活泼 |
地址空间 |
系统赋予的独立的虚拟地址空间(对于32位进程来说,这个地址空间是4GB) |
在进程的地址空间执行代码。线程只有一个内核对象和一个堆栈,保留的记录很少,因此所需要的内存也很少。因为线程需要的开销比进程少 |
调度 |
仅是资源分配的基本单位 |
独立调度、分派的基本单位 |
并发性 |
仅进程间并发(传统OS) |
进程间、线程间并发 |
拥有资源 |
资源拥有的基本单位 |
基本上不拥有资源 |
系统开销 |
创建、撤销、切换开销大 |
仅保存少量寄存器内容,开销小。 |
3. 进程同步
进程同步的主要任务:是对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。
同步机制遵循的原则:
(1) 空闲让进;
(2) 忙则等待(保证对临界区的互斥访问);
(3) 有限等待(有限代表有限的时间,避免死等);
(4) 让权等待,(当进程不能进入自己的临界区时,应该释放处理机,以免陷入忙等状态)。
由于进程同步产生了一系列经典的同步问题“生产者-消费者”问题,“哲学家进餐”问题,“读者-写者”问题。
4. 进程间的通信是如何实现的?
进程通信,是指进程之间的信息交换(信息量少则一个状态或数值,多者则是成千上万个字节)。因此,对于用信号量进行的进程间的互斥和同步,由于其所交换的信息量少而被归结为低级通信。
所谓高级进程通信指:用户可以利用操作系统所提供的一组通信命令传送大量数据的一种通信方式。操作系统隐藏了进程通信的实现细节。或者说,通信过程对用户是透明的。
高级通信机制可归结为三大类:
(1) 共享存储器系统(存储器中划分的共享存储区);实际操作中对应的是“剪贴板”(剪贴板实际上是系统维护管理的一块内存区域)的通信方式,比如举例如下:word进程按下ctrl+c,在ppt进程按下ctrl+v,即完成了word进程和ppt进程之间的通信,复制时将数据放入到剪贴板,粘贴时从剪贴板中取出数据,然后显示在ppt窗口上。
(2) 消息传递系统(进程间的数据交换以消息(message)为单位,当今最流行的微内核操作系统中,微内核与服务器之间的通信,无一例外地都采用了消息传递机制。应用举例:邮槽(MailSlot)是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输。邮槽是一种单向通信机制,创建邮槽的服务器进程读取数据,打开邮槽的客户机进程写入数据。
(3) 管道通信系统(管道即:连接读写进程以实现他们之间通信的共享文件(pipe文件,类似先进先出的队列,由一个进程写,另一进程读))。实际操作中,管道分为:匿名管道、命名管道。匿名管道是一个未命名的、单向管道,通过父进程和一个子进程之间传输数据。匿名管道只能实现本地机器上两个进程之间的通信,而不能实现跨网络的通信。命名管道不仅可以在本机上实现两个进程间的通信,还可以跨网络实现两个进程间的通信。
|
同一机器两个进程间通信 |
跨网络通信 |
剪贴板Clipboard |
可以 |
不可以 |
匿名管道Pipe |
可以 |
不可以 |
命名管道(点对点单一通信,数据量可较大)Namedpipe |
可以 |
可以 |
邮槽(一对多,数据量较小,424字节以下)Mailslot |
可以 |
可以 |
在Win32下提供的进程间通信方式有以下几种:
1)剪贴板Clipboard:在16位时代常使用的方式,CWnd类中提供了支持。
2)COM/DCOM:通过COM系统的代理存根方式进行进程间数据交换,但只能够表现在对接口函数的调用时传送数据,通过DCOM可以在不同主机间传送数据。
3)Dynamic Data Exchange (DDE):在16位时代常使用的方式。
4)File Mapping:文件映射,在32位系统中提供的新方法,可用来共享内存。
5)Mailslots:邮件槽,在32位系统中提供的新方法,可在不同主机间交换数据,分为服务器方和客户方,双方可以通过其进行数据交换,在Win9X下只支持邮件槽客户。
6)Pipes:管道,分为无名管道:在父子进程间交换数据;有名管道:可在不同主机间交换数据,分为服务器方和客户方,在Win9X下只支持有名管道客户。
7)RPC:远程过程调用,很少使用,原因有两个:复杂而且与UNIX系统的RPC并不完全兼容。但COM/DCOM的调用是建立在RPC的基础上的。
8)Windows Sockets:网络套接口,可在不同主机间交换数据,分为服务器方和客户方。
9)WM_COPYDATA:通过发送WM_COPYDATA消息并将数据放在参数中来传递数据给其他进程。
5. 线程同步
根据用户模式及内核模式下的同步方式的不同,分类及对比如下:
|
内核对象/ 非内核对象 |
含义 |
缺点 |
适用 |
关键代码段(临界区)CriticalSection |
非内核对象,工作在用户方式下,为用户模式对象 |
从程序代码的角度来控制线程的并发性 |
1.因为在等待进入关键代码段时无法设定超时值,所以其很容易进入死锁状态。2.不能跨进程使用。 |
单个进程中线程间的同步(同步速度快) |
事件对象Event |
内核对象 |
所有内核对象中最基本的。 |
速度较慢(相比用户模式实现线程同步) |
多个进程间的各个线程间实现同步 |
互斥对象Mutex |
内核对象 |
代表对一个资源的独占式访问 |
||
信号量 Semaphore |
内核对象 |
使用计数器来控制程序对一个共享资源的访问 |