操作系统概论(3) --进程的同步与互斥

来源:互联网 发布:linux命令安装oracle 编辑:程序博客网 时间:2024/05/21 18:47

进程同步:进程间的直接制约关系,是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系来源于他们之间的合作。

进程互斥:进城之间的间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待。只有当使用临界资源的进程退出临界区后,这个进程才会解除阻塞状态。
其实同步与互斥在本质上而言是差不多的,都是在使用资源使约束资源,防止其他进程共同使用,以免造成错误使用错误。同步是有序访问资源,是更复杂的互斥;互斥是单一进程访问资源,具有唯一性与排它性,是特殊的同步。
而有些比较特别的模式,如生产者消费者模式,就是两种情况存在,既需要同步又需要互斥,从这可以看出其实同步与互斥的使用经常混合在一起。

1.两个或两个以上的进程不能同时使用的资源称为临界资源(Critical Resource,CR)。
临界资源可能是一些独占设备,如打印机、磁带机等;也可能是一些共享变量、表格、链表等。

2.每个进程访问临界资源的那段代码称为临界区(Critical Section)。
必须在临界区前面增加一段用于进行检查的代码,成为进入区;
在临界区后面加一段检查推出临界区的代码,成为退出区,
进程中除去上述进入区和退出区外,其他部分的代码成为剩余区。

3.进程同步是指有协作关系的进程不断地调整它们之间的相对速度或执行过程,以保证临界资源的合理利用和进程的顺利执行。进程同步机制一般都 借助一个中间媒体来实现,如信号量操作、加锁操作等。

4.同步机制应遵循的规则
(1)空闲让进
(2)忙则等待
(3)有限等待(避免“死等”)
(4)让权等待(释放处理机)

5.信号量
整型信号量
整型信号量定义为一个用于表示资源数目的整型量S,它与一般整型量不同,除初始化外,仅能通过两个标准的原子操作(Atomic Operation) wait(S)和signal(S)来访问。

记录型信号量整型信号量机制中的wait操作,只要是信号量S≤0,就会不断地测试。因此,该机制并未遵循“让权等待”的准则,而是使进程处于“忙等”的状态。记录型信号量机制则是一种不存在“忙等”现象的进程同步机制信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表指针L,用于链接上述的所有等待进程。记录型信号量是由于它采用了记录型的数据结构而得名的。AND 型信号量    AND 同步机制的基本思想是:    将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其它所有可能为之分配的资源也不分配给它。    亦即,对若干个临界资源的分配,采取原子操作方式:要么把它所请求的资源全部分配到进程,要么一个也不分配    避免上述死锁情况的发生信号量集    在记录型信号量机制中,wait(S)或signal(S)操作仅能对信号量施以加1 或减1 操作,    意味着每次只能获得或释放一个单位的临界资源。而当一次需要N 个某类临界资源时,便要进行N 次wait(S)操作,显然这是低效的。此外,在有些情况下,当资源数量低于某一下限值时,    便不予以分配。因而,在每次分配之前,都必须测试该资源的数量,看其是否大于其下限值。基于上述两点,可以对AND 信号量机制加以扩充,形成一般化的“信号量集”机制。Swait操作可描述如下,其中S为信号量,d为需求值,而t为下限值。            Swait(S1,t1,d1,…,Sn,tn,dn)                if Si>=t1 and … and Sn>=tn then                    for i:=1 to n do                        Si:=Si-di;                    endfor                else                    Place the executing process in the waiting queue of the first Si with Si<ti and set its program counter                    to the beginning of the Swait Operation.                endif            Ssignal(S1,d1,…,Sn,dn)                for i:=1 to n do                        Si:=Si+di;                Remove all the process waiting in the queue associated with Si into the ready queue            endfor;    下面我们讨论一般“信号量集”的几种特殊情况:    (1) Swait(S,d,d)。此时在信号量集中只有一个信号量S,但允许它每次申请d 个资源,当现有资源数少于d时,不予分配。    (2) Swait(S,1,1)。此时的信号量集已蜕化为一般的记录型信号量(S>1时)或互斥信号量(S=1时)。    (3) Swait(S,1,0)。这是一种很特殊且很有用的信号量操作。当S≥1 时,允许多个进程进入某特定区;当S 变为0 后,将阻止任何进程进入特定区。换言之,它相当于一个可控开关。    在利用信号量机制实现进程互斥时应注意,wait(mutex)和signal(mutex)必须成对地出现。缺少wait(mutex)将会导致系统混乱,不能保证对临界资源的互斥访问;而缺少signal(mutex)将会使临界资源永远不被释放,从而使因等待该资源而阻塞的进程不能被唤醒。