操作系统中PV操作
来源:互联网 发布:怎么查看电脑的端口号 编辑:程序博客网 时间:2024/06/05 05:32
操作系统的进程管理中,PV是重点和难点。
信号量:信号量是个数据结构。
struct semaphore{int value;pcb *blockqueue;}mutex;
其中value是信号量的值;blockqueue是等待使用该信号量的进程排成的队列的对手指针。
p操作:当一个进程对信号量mutex执行p操作时,执行两个动作:
mutex.valu–;
if (mutex.value<0)
sleep();
v操作:当一个进程对信号量mutex执行v操作时,执行两个动作:
mutex.value++;
if (mutex.value>=0)
wakeup();
注:操作系统会保证PV操作的原子性,也就是说当一个进程执行PV操作,检测信号量时,不受中断。
接下来来看一下PV操作实现的功能:
实现进程之间的互斥; 实现进程之间的同步;
区别:互斥是为了保证资源一次只能由一个进程使用,互斥进程彼此在逻辑上是完全无关的,它们的运的运行不具有时间次序的特征。而同步是为了实现进程通信,同步进程之间具有合作关系,在执行时间上须按照一定顺序协同进行。
mutex = 1;
IN:
p(mutex);
count++;
v(mutex);
过程:一个学生进入教室执行IN,p操作,mutex.value = 0;假设在进行count++之前遇到了中断,而中断之后跳回来时正好这个学生又在出教室,那么这时候就会执行OUT,mutex.value = -1,该OUT进程进入睡眠,返回IN进程,count = 1,v操作,mutex.value = 0(说明有等待使用count的进程);唤醒OUT进程,count = 0,v操作,mutex.value = 1。
注意上面划线部的假设。PV操作在这就是为了保证这种竞争情况的发生。
2.同步:桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。
分析:在本题中,爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。当盘子为空时,爸爸可将一个水果放入果盘中。若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。本题实际上是生产者-消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。
解:在本题中,应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值为l;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值为0。同步描述如下:
int S=1;int Sa=0;int So=0;
main()
{cobegin
father();
son();
daughter();
coend
}
father()
{while(1)
{P(S);
将水果放入盘中;
if(放入的是桔子)V(So);
else V(Sa);
}
}
son()
{while(1)
{P(So);
从盘中取出桔子;
V(S);
吃桔子;
}
}
daughter()
{while(1)
{P(Sa);
从盘中取出苹果;
V(S);
吃苹果;
}
}
一些问题:为什么要设计三个信号量?因为这里盘子的状态有三种情况。所以在PV操作用在同步的时候,资源都多少种状态,就应该有多少个信号量(高并发的不一定好,需要更多的信号量,这样消耗系统的资源就更多)。还有,有没有留意到,每一次“吃”的操作都是在V操作之后进行,这是为什么呢?这是因为V操作是释放资源的一个操作,当然是越早释放对系统越有利啊。
- 操作系统中PV操作
- 操作系统中PV操作
- 关于操作系统中pv操作的实现
- 操作系统的PV操作
- 操作系统之PV操作
- 操作系统 信号量 PV操作
- 操作系统之PV操作
- 操作系统之PV操作
- 【操作系统】-PV操作
- 操作系统--PV操作
- 【操作系统】PV操作
- 【操作系统】 PV操作
- 操作系统之PV操作
- 操作系统pv操作
- 操作系统 -- PV操作
- 操作系统-PV操作
- 操作系统PV操作典型问题
- 【操作系统】——PV操作
- make menuconfig出错
- Ffmpeg快速命令使用
- 期待第一款游戏打气球(shoot balloons)App store审核通过
- 建立数据库关系图时出现将数据库所有者设为有效登录名
- Flushing out pdflush
- 操作系统中PV操作
- <<C++Primer PLus 第五版>>读书笔记2
- <<探讨linux/unix>>之du
- ORACLE集合操作符号UNION、UNION ALL、INTERSECT、MINUS来进行查询结果的合并操作
- android 读取 AndroidManifest.xml 中的数据:版本号、应用名称、自定义K-V数据(meta-data)
- 海量数据处理系列----C++中Bitmap算法的实现
- Advanced JavaScript: Objects, Arrays, and Array-Like objects
- 2012年8月27日|第二章:编程语言概述|总结
- 买书折扣问题的贪心解法