美文网首页
分享两个用PV操作(signal,wait原语)实现的操作系统综

分享两个用PV操作(signal,wait原语)实现的操作系统综

作者: Your7Maxx | 来源:发表于2020-05-14 18:21 被阅读0次

PV操作是操作系统设计中一个核心的概念,PV操作同时与信号量紧密相连。很多经典的问题讨论,由引入了信号量机制而得到很好的解决。

几个概念:

1、临界区:并发进程中与共享变量有关的程序段。
2、信号量: 信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。
3、进程的互斥:指当有若干个进程都要使用某一共享资源时,任何时刻最多只允许一个进程去使用该资源,其他要使用它的进程必须等待,直到该资源的占用着释放了该资源。
4、进程的同步:在并发进程之间存在这一种制约关系,一个进程依赖另一个进程的消息,当一个进程没有得到另一个进程的消息时应等待,直到消息到达才被唤醒。

PV操作也就是signal、wait原语的作用,主要就是对进程控制的信息量的加减控制。

wait用法:

wait(num),num是目标参数,wait的作用是使其(信息量)减一。
如果信息量>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。

signal用法:

signal(num),num是目标参数,signal的作用是使其(信息量)加一。
如果信息量>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。

例题示例:

(一)系统中有三个进程GET、PRO和PUT,共用两个缓冲区BUF1和BUF2。假设BUF1中最多可放11个信息,现已放入了两个信息;BUF2最多可放5个信息,目前为空。GET进程负责不断地将输入信息送入BUF1中,PRO进程负责从BUF1中取出信息进行处理,并将处理结果送到BUF2中,PUT进程负责从BUF2中读取结果并输出。试写出正确实现GET、PRO、PUT的同步与互斥的算法(要求:(1)用类C语言描述,条理清楚,注释恰当;(2)信号量原语统一使用wait和signal)。

代码:

semaphore
empty1=9;  //空buf1的数目
full1=2;  //有数据的buf1的数目
empy2=5;  //空buf2的数目
full1=0;  //有数据的b2的数目
mutex1=mutex2=1: //初始化互斥信号量为1

int main(){
Cobegin //并发开始
GET();
PRO();
PUT();
Coend //并发结束
}
//GET函数:
void GET(){
while(1){
wait(empty1);
wait(mutex1);
->将信息送入BUF1中
signal(mutex1);
signal(full1);
}}
//PRO函数:
void PRO(){
while(1){
wait(full1);
wait(mutex1);
->对取出的信息进行处理
signal(mutex1);
signal(empty1);
wait(empty2);
wait(mutex2);
->将结果送到BUF2中
signal(mutex2);
signal(full2);
}}
//PUT函数:
void PUT(){
while(1){
wait(full2);
wait(mutex2);
->将BUF2中读取结果并输出
signal(mutex2);
signal(empty2)
}}

(二)三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义。要求用伪代码描述。解释你定义的信号量的作用,并给出合适的初值:

代码:

semahpore  empty=N,even=0,odd=0,mutex=1
//P1:
while(1){
x=produce();
wait(empty);
wait(mutex);
put(x);
signal(mutex);
if (x%2 == 0)
    signal(even);
else
    signal(odd)

//P2:
while(1){
wait(odd);
wait(mutex);
getodd();
countodd();
wait(odd);
signal(mutex)
signal(empty)

//P3:
while(1){
wait(even);
wait(mutex);
geteven();
counteven();
wait(even);
signal(mutex)
signal(empty)

相关文章

  • 分享两个用PV操作(signal,wait原语)实现的操作系统综

    PV操作是操作系统设计中一个核心的概念,PV操作同时与信号量紧密相连。很多经典的问题讨论,由引入了信号量机制而得到...

  • PV原语

    概念 PV原语通过操作信号量来完成进程间的同步和互斥。信号量由操作系统来维护 原语 P原语 为阻塞原语,负责把当前...

  • semaphore

    前言 信号量的概念是狄克斯特拉提出的,他定义了PV原语,P操作即等待通过(wait),V操作表示释放(post),...

  • 进程同步二

    信号量及PV操作 信号量机制是一种功能较强的机制,可用来解决互斥与同步问题,它只能被两个标准的原语wait(S)和...

  • PV操作

    PV操作是利用信号量机制来实现的一种有效的进程同步与互斥工具,可以实现资源的互斥使用。PV操作属于低级通信原语,使...

  • PV操作经典问题

    PV(wait/singal)在考操作系统的时候经常被问到,这篇小文就整理一下几个常见的PV问题。 1. 生产者-...

  • 操作系统基础 锁的实现

    锁的实现 操作系统会给用户程序提供开锁,闭锁的原语操作,那么锁在操作系统中是怎么实现的呢? 1.使用中断启用与禁止...

  • java多线程实现生产者消费者问题

    思想可以参考操作系统里的pv操作实现生产者消费者问题

  • Java并发之Semaphore应用

    Semaphore意为信号量,它的使用原理跟操作系统中的PV原语非常相似,所以不再多说。下面是一个使用Semaph...

  • wait、notify、notifyAll以及Condition

    wait、notify、notifyAll以及Condition的await、signal,signalAll的用...

网友评论

      本文标题:分享两个用PV操作(signal,wait原语)实现的操作系统综

      本文链接:https://www.haomeiwen.com/subject/rmkxohtx.html