操作系统第三章

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


在整型信号量机制中的wait操作,只要是信号量S≤0, 就会不断地测试。因此,该机制并未遵循“让权等待” 的准则, 而是使进程处于“忙等”的状态。 记录型信号量机制,则是一种不存在“忙等”现 象的进程同步机制。但在采取了“让权等待”的策略 后,又会出现多个进程等待访问同一临界资源的情况。 为此,在信号量机制中,除了需要一个用于代表资源 数目的整型变量value外,还应增加一个进程链表L, 用于链接上述的所有等待进程。






procedure wait(S) var S: semaphore; begin S.value∶ =S.value-1; if S.value<0 then block(S,L) end procedure signal(S) var S: semaphore; begin S.value∶ =S.value+1; if S.value≤0 then wakeup(S,L); end
2.互斥



互斥是一组并发程序中的一个或多个程序段, 因共享某一共有资源而导致它们必须以一个不 允许交叉执行的单位执行。 互斥也就是不允许两个以上的共享该资源的并 发进程同时进入临界区。 互斥的进程间逻辑上是完全独立的,对共享资 源没有时间顺序的特征。
并发进程互斥执行满足的准则:
不能假设各并发进程的相对执行速度。 并发进程中的某个进程不在临界区,它不阻止其他进 程进入临界区。 并发进程中的若干进程申请进入临界区时,只能允许 一个进程进入。 并发进程中的进程从申请进入临界区时开始应在有限 的时间内进入临界区。 准则1、2、3保证各并发进程享有平等的、独立的竞争 和使用公有资源的权利,且保证每时刻只有一个进程 进入临界区。4保证不发生死锁。



一般“信号量集”的几种特殊情况: (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后,将阻止任何进程进入特定区。换言之, 它相当于一个可控开关。
记录型信号量是由于它采用了记录型的数据结构而得名 的。它所包含的上述两个数据项可描述为: type semaphore=record value:integer; L:list of process; end 相应地,wait(S)和signal(S)操作可描述为:


S.value的初值表示系统中某类资源的数目, 因而又 称为资源信号量. 每次wait操作,意味着进程请求一个单位的该类资源, 因此描述为S.value∶ =S.value-1; 当S.value<0时,表示该类资源已分配完毕,因此进 程应调用block原语,进行自我阻塞,放弃处理机, 并插入到信号量链表S.L中。 可见,该机制遵循了“让权等待”准则。 此时 S.value的绝对值表示在该信号量链表中已阻塞进程 的数目。
3.2.1 加锁机制实现互斥 利用硬件方法解决进程中的互斥。 禁止中断 专用机器指令 原语 原语是机器指令的延伸,往往是为完成某些特定功能 而编制的一段系统程序。原语操作也叫做原子操作。 利用软件方法解决进程中的互斥。
置锁变量
为解决互斥问题,为每一个临界区设置一把锁,某进 程进入临界区,它就锁上临界区,直到退出。 进程执行临界区的程序的操作要按照以下步骤: 1.关锁。先检查锁的状态,若为关闭状态,则等待其 打开;已经打开,则将其关闭,继续执行。 2.执行临界区资源 3.开锁。将锁打开,退出临界区。

3.3.3 信号量与P,V原语
A:lock(key[s]) 临界区 unlock ( key[s] ) gotoA B:lock(key[s]) 临界区 unlock ( key[s] ) gotoB
一。信号量

整型信号量 最初将信号量定义为一个共享的整型量,它保存可供使 用的唤醒数目。如果信号量值大于等于0,表示可供 并发进程使用的资源实体数目。当其小于0的时候, 绝对值表示等待进入临界区的进程数。 对信号量的操作有以下限制: 1.信号量可以初始化为一个非负值。 2.只能由P和V两个操作来访问信号量。

PA进入临界区时,要执行p(sem),使得 sem=sem-1=0,满足了使用临界资源的条件, 进程PA继续执行后面的程序,访问结束后退 出临界区并做v(sem)操作,sem=sem+1. 进程PB被调度时也一样。 若在PA执行V操作之前,PB申请进入临界 区,PB也要执行p(sem)操作,将使 sem=sem-1=-1,不能满足访问条件,进程PB 被阻塞进入等待队列。

多个进程对信号量S进行了5次P操作,2次V操 作后,现在的信号量是-3,与信号量S有关的 处于阻塞状态的进程有多少个?信号量的初值 是多少? 信号量为-3表示有3个进程在等待。 执行一次P操作S减一,执行一次V操作S加一。 S-5+2=-3 S=0

用信号量实现互斥实例:

Pa负责为用户分配打印机,Pb负责释放打印 机,用信号量实现它们共用一张分配表的互斥。 设一个互斥信号量mutex,其初值为1. Pa: P(mutex) 分配打印机 (读、写分配表) V(mutex) …….. Pb: P(mutex) 释放打印机 (读、写分配表) V(mutex) ……..

V原语
V原语操作 设sem为一信号量。 1.sem=sem+1 2.如果sem>0,则该进程继续执行。Sem<=0,则唤醒 一个等待进程,该进程继续执行。

做一次v操作就意味着释放一次物理资源。如果信号量小 于等于0,表示有进程等待,则唤醒一个等待进程。
用p、v原语实现互斥
用信号量实现两并发进程PA和PB的互斥: Sem为互斥信号量。取值范围(1,0,-1) Sem=1的时候表示两进程都没有进入临界区,sem=0时, 表示PB进程已经进入类为s的临界区,sem=-1时,表 示两个中的一个进入临界区,一个在等待。 进程PA p(sem) 临界区 v(sem) 进程PB
P原语
P操作表示测试,v表示增加或者成为wait操作。 P原语操作 设sem为一信号量。 1.sem=sem-1 2.如果sem>=0,则该进程继续执行。Sem<0,则阻塞 该进程,插入等待队列。 做一次P操作就意味着请求一次物理资源。如果信号量 大于0,请求得到满足,否则无资源,请求不能满足。

进程A和进程B互斥使用临界区的过程
临界区进入准则:



如果若干进程要求进入空闲的空闲的临界区, 一次仅允许一个进程进入。 处于临界区的进程不可多于一个。 进入临界区的进程要在有限的时间内退出,以 便其他进程及时进入自己的临界区。 如果进程不能进入自己的临界区,则让出CPU.
3.2 互斥的实现方法
设信号量Bufful表示Buffer满,为B的私有信号量,初值为0.
Pcal: Calculating(data){ Wait(Bufempty); Buf=data; Singnal(Bufful); }



对信号量的每次signal操作,表示执行进程释放一个 单位资源,故S.value∶ =S.value+1操作表示资源数 目加1。 若加1后仍是S.value≤0,则表示在该信号量链表中, 仍有等待该资源的进程被阻塞,故还应调用wakeup 原语,将S.L链表中的第一个等待进程唤醒。 如果S.value的初值为1,表示只允许一个进程访问临 界资源,此时的信号量转化为互斥信号量。
进程的同步与通信
本章主要内容:



同步与互斥的概念 进程间的相互关系 互斥的PV操作实现 同步的概念 同步的实现 进程通信的定义
3.1 进程同步与互斥的基本概念
3.1.1 同步与互斥的概念
进程间的相互关系主要分为三种形式: 互斥 同步 通信
1.同步


进程间的同步:异步环境下的一组并发进程因 直接制约而互相发送消息进而进行互相合作、 互相等待,使得各进程按一定的速度执行的过 程。 同步是进程间共同完成一项任务时直接发生相 互作用的关系。




整型信号量仅能通过两个标准的原子操作 wait(S)和signal(S)来访问。这两个操作一直被 分别称为P、V操作。 wait和signal操作可描述 为: wait(S): while S≤0 do no-op S∶=S-1; signal(S): S ∶=S+1;
2. 记录型信号量
3. AND型信号量


AND同步机制的基本思想是:将进程在整个运行过程 中需要的所有资源,一次性全部地分配给进程,待进 程使用完后再一起释放。只要尚有一个资源未能分配 给进程,其它所有可能为之分配的资源,也不分配给 他。亦即,对若干个临界资源的分配,采取原子操作 方式:要么全部分配到进程,要么一个也不分配。 由死锁理论可知,这样就可避免上述死锁情况的发生。 为此,在wait操作中,增加了一个“AND”条件,故称 为AND同步,或称为同时wait操作。

3.1.2 临界资源与临界区



临界资源:一次只允许一个进程使用的资源。 例如:打印机、读卡机、表格等资源。 临界区:在每个进程中访问临界资源的那段程 序。简称CS. 类:把那些不允许交叉执行的临界区按不同的 公用数据划分为不同的集合。
PA和PB共享内存MS,MS分为三个区系统区、进程 工作区和数据区。系统区主要是堆栈。 Getspace为取空数据块过程,release(ad)为释放 数据块过程,ad为待释放数据块的地址。 Getspace: begin local g G=stack[top] top=top-1 release(ad): begin top=top+1 stack[top]=ad end

临界区的类名为S,设锁定位key【s】。
加锁后的临界区程序描述: lock(key[s]) 临界区 unlock ( key[s] ) key[s]=1的时候表示类名为S的临界区可用, key[s]=0的时候不可用。 unlock ( key[s] )只有用一条语句可以实现 key[s]=1 由于lock(key[s])必须满足key[s]=0时,不允许任何进程进入临 界区。等于1时只允许一个进程进入,实现比较困难。

分析:如果Pb先执行,那么它执行P(mutex) 后, mutex=0,Pb进入临界区,若某种原因 选中Pa投入运行,执行P(mutex)后, mutex=-1,所以进入等待队列,直到Pb退出 临界区。反过来也是一样。
用p、v操作实现同步


私用信号量:只与制约进程以及被制约进程有 关而不是与整组并发进程有关的信号量(把各 进程之间发送的消息作为信号量看待)。 公用信号量:称互斥时使用的信号量为公用信 号量。

设时刻to时,top=h0,则可能按照顺序执行: 首先release(ad)的第一句执行: T0:top=top+1 top=h0+1 接着执行getspace执行: T1:G=stack[top] G=stack[h0+1] T2:top=top-1 top=h0 再是release(ad)的第一句执行: T3:stack【top】=ad stack【h0】=ad Getspace的进程取到的是ho+1中一个未定义的值,而 release(ad)的进程把空块地址重复放入了h0中。
ຫໍສະໝຸດ Baidu
Pcal和Pprt联合完成计算打印任务, Pcal 计算一个数据放入缓冲区Buffer中, Pprt 从缓冲区中取数并打印。
Buffer
A:pcal
B:pprt
合作关系:A未完成,Buffer空,B等待,B未完成,Buffe 满,A等待。
设信号量BufEmpty表示Buffer空,为A的私有信号量,初 值为1;
相关文档
最新文档