第2章4节
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设有一个发送者进
程和一个接收者进程,
其流程图如下。s是用于 实现进程同步的信号量, mutex是用于实现进程互 斥的信号量。试问流程 图中的A、B、C、D四 个框中应填写什么?假 定缓冲区有无限多个,s 和mutex的初值应为多少?
设有一个发送者进程和一个 接收者进程,其流程图如下。
s是用于实现进程同步的信号
生产者/消费者必须互斥
• 生产者和消费者可能同时进入缓冲区,甚至可 能同时读 / 写一个存储单元,将导致执行结果 不确定。 • 这显然是不允许的。必须使生产者和消费者互 斥 进入缓冲区。即,某时刻只允许一个实体 (生产者或消费者)访问缓冲区,生产者互斥 消费者和其它任何生产者。
生产者/消费者必须同步
注意:Block(s.queue):将执行次操作的进程的 PCB插入到s.queue的尾部,使进程状态转换为阻塞状 态。
signal(s)
signal(s): { s.count:=s.count+1; if(s.count<=0)wakeup(s.queue); //唤醒队首进程; //将进程从s.queue阻塞队列中移出; ﹜
注意
1. 进程应该先申请资源信号量,再申请互斥信 号量,顺序不能颠倒。 2. 对任何信号量的 wait 与 signal 操作必须配对。 同一进程中的多对 wait 与 signal 语句只能嵌 套,不能交叉。 3. 对同一个信号量的 wait 与 signal 可以不在同 一个进程中。 4. wait与signal语句不能颠倒顺序,wait语句一 定先于signal语句。
2、下面对临界区的论述中,正确的论述是()。 A.临界区是指进程中用于实现进程互斥的那段 代码 B. 临界区是指进程中用于实现进程同步的那段 代码 C.临界区是指进程中用于实现共享资源的那段 代码 D.临界区是指进程中访问临界资源的那段代码
3、由于并发进程的随机性,一个进程对另一个 进程的影响是不可预测的,甚至造成结果的不 正确,()。 A.造成不正确的因素只与外界的影响有关系 B.造成不正确的因素只与执行的速度有关 C.造成不正确的因素与时间有关 D.造成不正确的因素只与进程占用处理器有关
信号量定义
type semaphore = record count : integer; queue : list of PCB end; var s: semaphore;
信号量的应用
对信号量的两个原语操作为P操作和V操作。 这里P代表荷兰语Passeren/Proberen,意思为 “通过/测试或等待”;V代表荷兰语Vrijeren /verhogen,意思为“释放/增加或发信号”, 在有些教材中使用Wait操作和Signal操作代替P 操作和V操作。
注意:wakeup(s.queue)将s.queue中的第一个进程 唤醒,并插入到就绪队列。
Wait、 signal的应用
• 进程进入临界区之前,首先执行wait(s)原语, 若s. count < 0,则进程调用阻塞原语,将自己阻 塞,并插入到s.queue队列排队。 • 注意,阻塞进程不会占用处理机时间,不是 “忙等”。直到某个从临界区退出的进程执行 signal(s)原语,唤醒它。 • 一旦其它某个进程执行了signal(s)原语中的s. count + 1操作后,发现s. count≤ 0,即阻塞队列 中还有被阻塞进程,则调用唤醒原语,把 s.queue中第一个进程修改为就绪状态,送就绪 队列,准备执行临界区代码。
经典进程互斥与同步问题
• 生产者/消费者问题 • 读者/写者问题 • 哲学家进餐问题
2.7 生产者/消费者问题
• 生产者与消费者是一个广义的概念,可 以代表一类具有相同属性的进程。 • 生产者和消费者进程共享一个大小固定 的缓冲区,其中,一个或多个生产者生 产数据,并将生产的数据存入缓冲区, 并有一个消费者从缓冲区中取数据。
s.count的取值范围
• 当仅有两个并发进程共享临界资源时, 互斥信号量仅能取值0、1、-1。其中,
- s.count=1,表示无进程进入临界区 - s. count=0,表示已有一个进程进入临界区 - s. count= - 1,则表示已有一进程正在等待进入临界区
• 当用s来实现n个进程的互斥时,s.count 的取值范围为1~-(n-1)
信号量的类型
• 信号量分为:互斥信号量和资源信号量。 • 互斥信号量用于申请或释放资源的使用权,常 初始化为1。 • 资源信号量用于申请或归还资源,可以初始化 为大于1的正整数,表示系统中某类资源的可 用个数。 • wait操作用于申请资源(或使用权),进程执 行wait原语时,可能会阻塞自己; • signal操作用于释放资源(或归还资源使用 权),进程执行signal原语时,有责任唤醒一 个阻塞进程。
互斥与同步解决方法之三: 信号量(semaphores)方法
• 软件方法和硬件方法都存在“忙等”问 题,浪费了处理机时间。 • 信号量方法能实现进程互斥与同步,而 不必“忙等”
实例
交通信号灯:红灯停,绿灯行
信号量实现互斥的基本原理
• 两个或多个进程可以通过传递信号进行合作, 可以迫使进程在某个位置暂时停止执行(阻塞 等待),直到它收到一个可以“向前推进”的 信号(被唤醒)。 • 相应地,将实现信号灯作用的变量称为信号量, 常定义为记录型变量s,其中一个域为整型, 另一个域为队列,其元素为等待该信号量的阻 塞进程(FIFO)。
• 信号量的物理意义
• s. count≥0表示还可执行wait(s)而不会阻塞的进程数 (可用资源数)。每执行一次wait(s)操作,就意味着 请求分配一个单位的资源 • 当s. count < 0时,表示已无资源可用,因此请求该资 源的进程被阻塞。此时,s. count的绝对值等于该信号 量阻塞队列中的等待进程数。执行一次signal操作,就 意味着释放一个单位的资源。若s. count < 0,表示 s.queue队列中还有被阻塞的进程,需要唤醒该队列中 的第一个进程,将它转移到就绪队列中。
• 假设缓冲区的大小为n(存储单元的个 数),它可以被生产者和消费者循环使 用。
• 分别设置两个指针in和out,指向生产者 将存放数据的存储单元和消费者将取数 据的存储单元,如图
1 2 3 4 5 6 7 8
n
out
in
(a)
1 2 3 4 5 6 7 8 in out
n
(b)
其中,in表示存数据位置,out表示取数据位置
• 生产者不能向满缓冲区写数据,消费者 也不能在空缓冲区中取数据,即生产者 与消费者必须同步。
生产一条数据 无 是否有空 存储单元 有 是否 否 可用 是 存入一条数据 归还使用权 数据单元加1 唤醒一个消费者 (a) 生产者
阻塞 等待资源 被唤醒
是否有数 无 据单元
阻塞 等待资源
被唤醒
有
是否 可用
4、如果有4个进程共享同一程序段,每次允许 3个进程进入该程序段。若用wait、signal 操作作为同步机制,则信号量的取值范围是 ()。 A.4,3,2,1,-1 B.2,1,0,-1,-2 C.3,2,1,0,-1 D.2,1,0,-2,-3
填空
1、一次仅允许一个进程使用的资源为(), 一个进程访问这种资源的那段程序代码 称为()。 2、信号量的物理意义是:信号量大于零, 表示();信号量小于零,其绝对值为 ()。
3、采用wait、signal操作管理临界区时, 任何一个进程在进入临界区之前,应调 用()操作;退出临界区时,应调用() 操作。 4、有n个进程共享同一临界资源,若使用 信号量机制实现对临界资源的互斥访问, 则信号量值的变化范围是()。
综合题
1、利用信号量实现进程P 1 、P 2互斥。 (设 S 为互斥信号量) 2、利用wait、signal操作描述前驱关系。
否 阻塞 等待使用权
被唤醒
是ห้องสมุดไป่ตู้
阻塞 等待使用权
被唤醒 归还使用权 空单元加1 唤醒一个生产者 消费数据 取一条数据
(b) 消费者
图2.36 生产者/消费者执行流程图
program producer_consumer; const sizeofbuffer =…; /* 缓冲区大小 */ var s: semaphore(:= 1); /* 互斥信号量s,初始化为1 */ n : semaphore(:= 0); /* 资源信号量n,数据单元,初始化为0 */ e : semaphore(:= sizeofbuffer); /* 资源信号量e,空存储单元 */ procedure producer ; procedure consumer ; begin begin repeat repeat 生产一条数据; wait(n); wait(e); wait(s); wait(s); 取一条数据; 存入一条数据; signal(s); signal(s); signal(e); signal(n); 消费数据; forever forever end; end; begin /* 主程序 */ parbegin producer ; consumer ; parend end. 图2.37 利用信号量实现生产者/消费者同步与互斥
program mutualexclusion; const n=…; /* 进程数 */ var s: semaphore(:= 1); /* 定义信号量s,s.count初始化为1 */ procedure P(i:integer); begin repeat wait(s); <临界区>; signal(s); <其余部分> forever end; begin /* 主程序 */ parbegin P(1); P(2); … P(n) parend end. 图2.34 利用信号量实现互斥的通用模式
量,mutex是用于实现进程互 斥的信号量。试问流程图中 的A、B、C、D四个框中应 填写什么?假定缓冲区有无 限多个,s和mutex的初值应 为多少?
A. P(mutex) B. V(mutex)
C. P(s) D. V(mutex) 消息链上没有可供接收的信
定义对信号量的两个原子操作
• wait(s) 和signal(s) • 早期这两个原语被称作P(s)和V(s)
wait(s)
var s: semaphore; wait(s): { s.count:=s.count-1; if(s.count<0)block(s.queue); //进程阻塞; //进程进入s.queue队列; ﹜
• 操作系统内核以系统调用形式提供wait 和signal原语,应用程序通过该系统调用 实现进程间的互斥。 • 工程实践证明,利用信号量方法实现进 程互斥是高效的,一直被广泛采用。
1、当己有进程进入临界区时,其他试图进 入临界区的进程必须等待,以保证对临 界资源的互斥访问,这是下列()同步 机制准则。 A.空闲让进 B.忙则等待 C.有限等待 D.让权等待
信号量的物理意义
• s. count≥0表示还可执行wait(s)而不会阻塞的进 程数(可用资源数)。每执行一次wait(s)操作, 就意味着请求分配一个单位的资源 • 当s. count < 0时,表示已无资源可用,因此请 求该资源的进程被阻塞。此时,s. count的绝对 值等于该信号量阻塞队列中的等待进程数。执 行一次signal操作,就意味着释放一个单位的 资源。若s. count < 0,表示s.queue队列中还有 被阻塞的进程,需要唤醒该队列中的第一个进 程,将它转移到就绪队列中。
:被占用单元 , :空存储单元
图2.35 生产者/消费者循环使用缓冲区
?不控制生产者/消费者
• 指针in和out初始化指向缓冲区的第一个存储 单元。 • 生产者通过in指针向存储单元存放数据,一次 存放一条数据,且in指针向后移一个位置。 • 消费者从缓冲区中逐条取走数据,一次取一条 数据,相应的存储单元变为“空”。每取走一 条数据,out指针向后移一个存储单元位置。 • 试想,如果不控制生产者与消费者,将会产生 什么结果?