操作系统-PV操作的原理和几种常见问题
- typedef struct semaphore {
- int value;
- struct pcb *list; //信号量队列指针
- }
- void P(semaphore s){
- s.value--;
- if(s.value<) sleep(s.list); //若信号量值小于0,执行P操作的进程调用sleep(s.list)阻塞自己,被置成等待信号量s状态并移入s信号量队列,转向进程调度程序
- }
- void V(semaphore s){
- s.value++;
- if(s.value<=) wakeup(s.list); //若信号量小于等于0,则调用wakeup(s.list)从信号量s队列中释放一个等待信号量s的进程并转换成就绪态,进程则继续运行
- }
- 机票问题
- int A[m];
- Semaphore s = ;
- cobegin
- process Pi {
- int Xi;
- Li:按旅客定票要求找到A[j];
- P(s);
- Xi = A[j];
- If (Xi>=) { Xi=Xi-; A[j]=Xi;V(s); 输出一张票;}
- else {V(s); 输出票已售完;}
- goto Li;
- }
- coend;
- int A[m];
- Semaphore s[m]; //每一个航班都有自己的临界区
- For (int j=;j<m;i++) s[j] = ;
- cobegin
- process Pi {
- int Xi;
- L1:按旅客定票要求找到A[j];
- P(s[j]);
- Xi = A[j];
- If (Xi>=) { Xi=Xi-; A[j]=Xi;V(s[j]); 输出一张票;
- } else {V(s[j]); 输出票已售完;}
- goto L1;
- }
- coend;
- 生产者消费者问题
- int B;
- semaphore sput = ; /* 可以使用的空缓冲区数 */
- semaphore sget = ; /* 缓冲区内可以使用的产品数 */
- process producer {
- L1:
- produce a product;
- P(sput);
- B = product;
- V(sget);
- goto L1;
- }
- process consumer {
- L2:
- P(sget);
- product = B;
- V(sput);
- consume a product;
- goto L2;
- }
- int B[k]; // 共享缓冲区队列
- semaphore sput = N; //可以使用的空缓冲区数
- semaphore sget = ; //缓冲区内可以使用的产品数
- int putptr = getptr = ;
- process producer {
- L1:produce a product;
- P(sput);
- B[putptr] = product;
- putptr = (putptr + ) mod k;
- V(sget);
- goto L1;
- }
- process consumer {
- L2:P(sget);
- product = B[getptr];
- getptr = (getptr + ) mod k;
- V(sput);
- consume a product;
- goto L2;
- }
- int B[k];
- semaphore sput = N; /* 可以使用的空缓冲区数 */
- semaphore sget = ; /* 缓冲区内可以使用的产品数 */
- int putptr = getptr = ;
- semaphore s1 = s2 = ; /* 互斥使用putptr、getptr */
- process producer_i {
- L1:produce a product;
- P(sput);
- P(s1);
- B[putptr] = product;
- putptr = ( putptr + ) mod k;
- V(s1);
- V(sget);
- goto L1;
- }
- process consumer_j {
- L2:P(sget);
- P(s2);
- Product = B[getptr];
- getptr = ( getptr + ) mod k;
- V(s2);
- V(sput);
- consume a product;
- goto L2;
- }
- process consumer_j {
- P(mutex1);
- for(int i=; i<; i++){
- P(full);
- P(mutex2);
- 互斥访问缓冲区;
- V(mutex2);
- V(empty);
- }
- V(mutex1);
- }
- Semaphore sp; /* 盘子里可以放几个水果*/
- Semaphore sg1; /* 盘子里有桔子*/
- Semaphore sg2; /* 盘子里有苹果*/
- sp = ; /* 盘子里允许放入一个水果*/
- sg1 = ; /* 盘子里没有桔子*/
- sg2 = ; /* 盘子里没有苹果*/
- process father {
- L1: 削一个苹果;
- P(sp);
- 把苹果放入plate;
- V(sg2);
- goto L1;
- }
- process mother {
- L2: 剥一个桔子;
- P(sp);
- 把桔子放入plate;
- V(sg1);
- goto L2;
- }
- process son {
- L3: P(sg1);
- 从plate中取桔子;
- V(sp);
- 吃桔子;
- goto L3;
- }
- process daughter {
- L4: P(sg2);
- 从plate中取苹果;
- V(sp);
- 吃苹果;
- goto L4;
- }
- int random;
- Semaphore offer1 = offer2 = offer3 = ;
- Semaphore finish = ;
- process producer(){
- while(){
- random = 任意随机整数;
- random = random % ;
- P(finish);
- 对应两种材料放在桌子上;
- if(random==) V(offer1);
- else if(random==) V(offer2);
- else V(offer3);
- }
- }
- process consumer_1(){
- while(){
- P(offer1);
- 拿自己缺的那两种材料;
- 卷成烟抽掉;
- V(finish);
- }
- }
- 哲学家就餐问题
- Semaphore fork[];
- for (int i = ; i < ; i++)
- fork[i] = ;
- cobegin
- process philsopher_i() {
- while (true) {
- think();
- P(fork[i]);
- P(fork[(i+)%]);
- eat();
- V(fork[i]);
- V(fork[(i+)%]);
- }
- }
- coend
- Semaphore fork[];
- for (int i = ; i < ; i++)
- fork[i] = ;
- Semaphore mutex = ;
- cobegin
- process philsopher_i() {
- while(true){
- P(mutex);
- P(fork[i]);
- P(fork[(i+)%]);
- V(mutex);
- eat();
- V(fork[i]);
- V(fork[(i+)%]);
- }
- }
- coend
- 写者问题
- int readcount = ;
- Semaphore writeblock = ;
- Semaphore mutex = ;
- cobegin
- process read_i() {
- P(mutex);
- readcount++;
- if(readcount==) P(writeblock); //自己是唯一的读进程,写者在写文件时自己不能开始读,自己开始读后不允许写操作
- V(mutex);
- /*读文件*/
- P(mutex);
- readcount-—;
- if(readcount==) V(writeblock); //自己是唯一的读进程,读文件完成后允许写操作
- V(mutex);
- }
- process write_j() {
- P(writeblock);
- /*写文件*/
- V(writeblock);
- }
- coend
- 男女共浴问题、汽车过桥问题
- Semaphore mutex;
- Semaphore mutex_man = mutex_woman= ;
- int mancount = womancount =;
- Process man(){
- P(mutex_man)
- mancount++;
- if(mancount==) P(mutex);
- V(mutex_man);
- 洗澡;
- P(mutex_man);
- mancount—;
- if(mancount==) V(mutex);
- V(mutex_man)
- }
- 理发师问题
- int waiting = ;
- Semaphore customers = ;
- Semaphore barbers = ;
- Semaphore mutex = ;
- cobegin
- process barbers() {
- while(true) {
- P(customers);//判断是否有顾客,没有的话理发师睡眠
- P(mutex);
- waiting--;
- V(barbers);//理发师准备为顾客理发
- V(mutex);
- cuthair(); //理发师理发,不应放在临界区
- }
- }
- process customer_i() {
- P(mutex);
- if(waiting<N) {
- waiting++;
- V(customers);//唤醒理发师
- V(mutex);
- P(barbers);//如果理发师忙则等待
- get_haircut();
- }
- else V(mutex);//人满了,顾客离开
- }
- coend
操作系统-PV操作的原理和几种常见问题的更多相关文章
- 操作系统实验——PV操作实现生产者消费者模型
操作系统PV操作之--生产者消费者模型 个人博客主页 参考资料: Java实现PV操作 | 生产者与消费者 浙大公开课 在操作系统的多进程.多线程操作中经常会有因为同步.互斥等等问题引发出的一系列问题 ...
- 操作的系统的PV操作
转自:https://blog.csdn.net/sunlovefly2012/article/details/9396201 在操作系统中,进程之间经常会存在互斥(都需要共享独占性资源时) 和同步( ...
- Java实现PV操作 | 读者与写者(在三种情况下进行讨论)
注 :本文应结合[天勤笔记]进行学习. 1.读者优先 设置rmutex信号量来对readcount变量进行互斥访问.mutex信号量对写者与读者进行同步. static syn rmutex=new ...
- 信号量与PV操作
在计算机操作系统中,PV操作是进程管理中的难点.首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):①将信号量S的 ...
- 软测试综述——PV操作
在操作系统中,进程之间常常会存在相互排斥(都须要共享独占性资源时)和同步(完毕异步的两个进程的协作)两种关系.而信号量和PV操作完美有效的处理了这两种情况. 相互排斥:就好比过独木桥,一 ...
- <<操作系统精髓与设计原理>>读书笔记(一) 并发性:互斥与同步(1)
<<操作系统精髓与设计原理>>读书笔记(一) 并发性:互斥与同步 并发问题是所有问题的基础,也是操作系统设计的基础.并发包括很多设计问题,其中有进程间通信,资源共享与竞争,多个 ...
- 转 信号量与PV操作
在计算机操作系统中,PV操作是进程管理中的难点.首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):①将信号量S的 ...
- 【转】进程同步之信号量机制(pv操作)及三个经典同步问题
原文地址:http://blog.csdn.net/speedme/article/details/17597373 上篇博客中(进程同步之临界区域问题及Peterson算法),我们对临界区,临界资源 ...
- OS__信号量(semaphore)PV操作
信号量的概念 1.信号量的类型定义 信号量(semaphore)的数据结构为记录型数据结构一个值和一个指针,指针指向等待该信号量的下一个进程.信号量的值与相应资源的使用情况有关,在操作系统中,信号量用 ...
随机推荐
- Spring Boot AOP的使用
简单来说讲,动态地将代码切入到类的指定方法.指定位置上的编程思想就是面向切面的编程. 目录 AOP几个术语 AOP Demo 引入Maven依赖 一个简单的Controller 定义切面类 调用服务 ...
- bootstrap-treeview 研究一下
一直以来都是拿来主义,现在正好有空,也正好用到,准备好好研究下bootstrap-treeview. 实现目标:可搜索,可复选选中的权限控制菜单项. 研究失败 转 jstree
- PHP array_shift() 函数
实例 删除数组中的第一个元素(red),并返回被删除的元素: <?php $a=array("a"=>"red","b"=> ...
- PHP krsort() 函数
------------恢复内容开始------------ 实例 对关联数组按照键名进行降序排序: <?php$age=array("Peter"=>"35 ...
- PHP in_array() 函数
实例 在数组中搜索值 "Runoob" ,并输出一些文本: <?php $sites = array("Google", "Runoob&quo ...
- PHP xml_parser_free() 函数
定义和用法 xml_parser_free() 函数释放 XML 解析器.高佣联盟 www.cgewang.com 如果成功,该函数则返回 TRUE.如果失败,则返回 FALSE. 语法 xml_pa ...
- PHP mysqli_refresh() 函数
定义和用法 mysqli_refresh() 函数刷新表或缓存,或者重置复制服务器信息.高佣联盟 www.cgewang.com 语法 mysqli_refresh(connection,option ...
- AGC 043 C - Giant Graph SG函数 dp 贪心
LINK:Giant Graph 神仙题目. 容易发现在图中选择某个点的贡献为\(10^{18\cdot(x+y+z)}\) 这等价于多选一个点多大一点就多乘了一个\(10^{18}\) 所以显然是贪 ...
- luogu P4887 模板 莫队二次离线 莫队 离线
LINK:模板莫队二次离线 很早以前学的知识点 不过 很久了忘了. 考虑暴力 :每次莫队更新的时候 尝试更新一个点到一个区间的答案 可以枚举二进制下位数为k的数字 看一下区间内的这种数字有多少个. 不 ...
- 卷积神经网络 part1
[任务一]视频学习心得及问题总结 根据下面三个视频的学习内容,写一个总结,最后列出没有学明白的问题. [任务二]代码练习 在谷歌 Colab 上完成代码练习,关键步骤截图,并附一些自己的想法和解读. ...