进程与线程的区别,以及同步的问题#操作系统

本文的主要框架是:
1、进程和线程的区别
2、同步的概念
3、互斥和同步
4、(加个彩蛋)进程间的通讯

Part1
那进程与线程的区别到底是什么?
进程是指在系统中正在运行的一个应用程序;
线程是系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元。对于操作系统而言,其调度单元是线程。一个进程至少包括一个线程,通常将该线程称为主线程。一个进程从主线程的执行开始进而创建一个或多个附加线程,就是所谓基于多线程的多任务。
进程是执行程序的实例。线程可以理解为进程中的一段程序片段。
进程间是独立的,表现在内存空间、上下文的环境中;
线程运行在进程空间内。一般来说,进程无法突破进程边界存取其他进程内的存储空间;而线程由于处于进程空间内,所以同一进程所产生的线程共享同意内存空间。
关于上面所说的独立,举个例子:
以沙箱为例进行阐述。一个进程就好比一个沙箱。线程就如同沙箱中的孩子们。孩子们在沙箱子中跑来跑去,并且可能将沙子攘到别的孩子眼中,他们会互相踢打或撕咬。但是,这些沙箱略有不同之处就在于每个沙箱完全由墙壁和顶棚封闭起来,无论箱中的孩子如何狠命地攘沙,他们也不会影响到其它沙箱中的其他孩子。因此,每个进程就象一个被保护起来的沙箱。未经许可,无人可以进出。


再通过windows的资源管理器来理解一下进程:
例如,当你运行记事本程序(Nodepad)时,你就创建了一个用来容纳组成 Notepad.exe的代码及其所需调用动态链接库的进程。每个进程均运行在其专用且受保护的地址空间内。因此,如果你同时运行记事本的两个拷贝,该程序正在使用的数据在各自实例中是彼此独立的。在记事本的一个拷贝中将无法看到该程序的第二个实例打开的数据。
通过Windows任务管理器来看一下:
启动了一个记事本,进程中有一个notepad.exe

启动了2个记事本,进程中有2个notepad.exe

 


Part2
关于同步
四种进程或线程同步互斥的控制方法
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 
2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 
3、信号量:为控制一个具有有限数量用户资源而设计。 
4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。
总结: 
1. 互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量 。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。 
2. 互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。所以可以使用WaitForSingleObject来等待进程和 线程退出。 
3. 通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数器。


Part3 
针对互斥和同步再详述一下
互斥
 进程互斥是进程之间的间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待。只有当使用临界资源的进程退出临界区后,这个进程才会解除阻塞状态。
这种关系表现为:进程-资源-进程
同步
 进程同步也是进程之间直接的制约关系,是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系来源于他们之间的合作。
这种关系表现为:进程-进程
Note:
进程的同步与互斥是两个既有区别又有联系的概念。从本质上看,并发进程的异步运行都必须按照一定的相互约束的时序进行,因此,从广义上说,互斥也是一种同步关系。

 

互斥量和信号量的区别

1. 互斥量用于线程的互斥,信号量用于线程的同步。

这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源

以上区别是主要想记住的。

note:信号量可以用来实现互斥量的功能

2. 互斥量值只能为0/1,信号量值可以为非负整数。

也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。

3. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。

有个文章写的不错:

http://www.cnblogs.com/CareySon/archive/2012/04/14/Process-SynAndmutex.html

 

 

 

Part4
进程间的通讯
进程通讯的方式,主要分为三类:
1、共享存储器
在内存中分配一片空间作为共享存储区。需要进行通信的各个进程把共享存储区附加到自己的地址空间中,然后像正常操作一样对共享区中的数据进行读写操作。
如果用户不需要某个共享存储区,可以把它取消。通过对共享存储区的访问,相关进程间就可以传输大量数据。
2、管道通信
管道是用于连接读进程和写进程以实现它们之间通信的共享文件,向管道提供输的发送进程(即写进程)以字符流形式将大量的数据送入管道,而接收管道输出的接收进程(that is,读进程)可以从管道中接收数据。
3、消息传递
1)直接通信方式
发送进程直接将信息挂在消息缓冲队列中,接收进程从消息缓冲队列中得到消息
2)间接通信方式
发送进程将信息送到信箱的中间设施中,接收进程从信箱中取得消息。这种通信方式也称为信箱通信方式。
posted on 2015-04-08 12:37  依风152  阅读(204)  评论(0)    收藏  举报