5.同步互斥机制

5.1进程并发执行

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

从进程的特征出发:

  1. 并发:a.进程的执行是间断性的;b.进程的相对执行速度不可预测;
  2. 共享:进程/线程共享某些资源,使用过程中,会产生制约性;
  3. 不确定性:进程执行的结果与其执行的相对速度有关,是不确定的。

5.2进程互斥

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

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

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

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

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

临界区使用原则:

  1. 没有进程在临界区时,想进入临界区的进程可进入;
  2. 不允许两个进程同时处于其临界区中;
  3. 临界区外运行的进程不得阻塞其他进程进入临界区;
  4. 不得使进程无限期等待进入临界区。

实现进程互斥的方案:

  • 软件方案:Dekker解法,Peterson解法

Dekker算法:在两个进程都想进又都谦让的时候,让turn决定谁进CPU。

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;
... ...                                                  ... ...

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

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

  • 硬件方案:屏蔽中断、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)。

  • P操作:

P(s)

{s.count--;

if(s.count<0)

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

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

重新调度;

}

}

  • 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. 无其他读者、写者,该读者可以读;
  2. 若已有写者等,但有其他读者正在读,则该读者也可以读;
  3. 若有写者正在写,该读者必须等。
  • 如果写者执行:
  1. 无其他读者、写者,该写者可以写;
  2. 若有读者正在读,该写者等待;
  3. 若有其他写者正在写,该写者等待。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值