5.同步互斥机制

来源:互联网 发布:淘宝试用申请成功 编辑:程序博客网 时间:2024/06/05 22:41

5.1进程并发执行

并发是所有问题产生的基础,并发是操作系统设计的基础。

从进程的特征出发:(1)并发:a.进程的执行是间断性的;b.进程的相对执行速度不可预测

                                    (2)共享:进程/线程共享某些资源,使用过程中,会产生制约性

                                    (3)不确定性:进程执行的结果与其执行的相对速度有关,是不确定的

5.2进程互斥

竞争条件:两个或多个进程在读写某些共享数据的时候,而最后的结果取决于进程运行的精确时序

进程互斥:由于各进程要求使用共享资源(变量、文件等),而这些资源需要排他性使用,各进程之间竞争使用这些资源,这一关系成为进程互斥。

临界资源(critical resource):系统中某些资源一次只允许一个进程使用,这样的资源成为临界资源或互斥资源或共享变量。

临界区(互斥区)(critical section):各个进程中某个临界资源(共享变量)实施操作程序片段

例:当进程A在临界区中时,进程B不能进入临界区。

临界区使用原则:

(1)没有进程在临界区时,想进入临界区的进程可进入

(2)不允许两个进程同时处于其临界区中

(3)临界区外运行的进程不得阻塞其他进程进入临界区

(4)不得使进程无限期等待进入临界区

实现进程互斥的方案:

(1)软件方案:Dekker解法,Peterson解法

a.Dekker算法

P:                                                      Q:... ...                                                  ... ...pturn=true;                                              qturn=true;while(qturn){                                            while(pturn){     if(turn==2){                                             if(turn==1){       pturn=false;                                             qturn=false;       while(turn==2);                                          while(turn==1);        pturn=true;                                             qturn=true;}}                                                       }}临界区                                                   临界区turn=2;                                                  turn=1;pturn=false;                                             qturn=false;... ...                                                  ... ...
在两个进程都想进又都谦让的时候,让turn决定谁进CPU。

 b.Peterson算法——解决了互斥访问的问题,而且克服了强制轮流法的缺点,可以完全正常地工作

 进程i想进入临界区时,调用enter_region(i)判断是否可以安全进入临界区,如果可以,则当前函数执行完进入临界区,调用时,使用进程号,执行完成后,调用leave_region(i);

(2)硬件方案:屏蔽中断、TSL(XCHG)指令

 a.“开关中断”指令:执行“关中断”指令——临界区操作——执行“开中断”指令。

 特点:简单高效,代价高,限制CPU并发能力(临界区大小),不适用于多处理器,适用于操作系统本身,不适于用户进程。

 b.“测试并加锁”指令。TSL指令:TEST AND SET LOCK。

 c.交换指令。

5.3进程同步——协作关系

进程同步:系统中多个进程中发生的时间存在某种时序关系,需要相互合作共同完成一项任务。具体地说,一个进程运行到某一点时,要求另一伙伴进程为他提供消息,在未获得消息之前,该进程进入阻塞态,获得消息后被唤醒进入就绪态。

5.4一种经典的进程同步机制——信号量及P\V操作

信号量:一个特殊变量,用于进程间传递信息的一个整数值。定义如下:

structure semaphore

{

   int count;

   queueType queue;

}

信号量说明:semaphore s;对信号量可实施的操作:初始化,p和v(P,V分别是荷兰语的test和increment)。

(1)P操作:

P(s)

{s.count--;

if(s.count<0)

{该进程状态置为阻塞状态;

 将该进程插入相应的等待队列s.queue末尾;

重新调度;

}

}

(2)V操作

V(s)

{s.count++;

if(s.count<=0)

{唤醒相应等待队列s.queue中等待的一个进程;

改变其状态为就绪态,并将其插入就绪队列;

}

}

有关说明:P,V操作为原语操作。

用P,V操作解决进程间互斥问题:

(1)分析并发进程的关键活动,划定临界区

(2)设置信号量mutex,初值为1

(3)在临界区前实施P(mutex)

(4)在临界区之后实施V(mutex)。

5.5 用信号量解决读者 /写者问题

问题描述:多个进程共享一个数据区,这些进程分为两组:(1)读者进程:只读数据区中的数据(2)写者进程:只往数据区写数据;

要求满足条件:

(1)允许多个读者同时执行读操作;

(2)不允许多个写者同时操作;

(3)不允许读者、写者同时操作。

解决问题时,必须要明确是哪一类读者写者问题。

第一类读者写者问题:读者优先。则

(1)如果读者执行:

a.无其他读者、写者,该读者可以读;

b.若已有写者等,但有其他读者正在读,则该读者也可以读;

c.若有写者正在写,该读者必须等。

(2)如果写者执行:

a.无其他读者、写者,该写者可以写;

b.若有读者正在读,该写者等待;

c.若有其他写者正在写,该写者等待。

原创粉丝点击