操作系统-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)的数据结构为记录型数据结构一个值和一个指针,指针指向等待该信号量的下一个进程.信号量的值与相应资源的使用情况有关,在操作系统中,信号量用 ...
随机推荐
- 【Gin-API系列】需求设计和功能规划(一)
场景需求 数据库存储2个模型,每个模型都有一个或多个IP字段,需要通过 Golang Http Api(Restful Api) 返回 IP 信息. 模型1 - 服务器 ID 主机名 IP 内存大小 ...
- Django学习路5_更新和删除数据库表中元素
查找所有的元素 Student.objects.all() 查找单个元素 Student.objects.get(主键=值) 主键 pk = xxx 更新数据库数据后进行保存 stu.save() 删 ...
- PHP 循环 - While 循环
PHP 循环 - While 循环 循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块. PHP 循环 在您编写代码时,您经常需要让相同的代码块一次又一次地重复运行.我们可以在代码中使用循 ...
- JavaScript正则表达式相关方法
一.正则表达式方法 var str="abcdefabcdef"; (1)reg.test(str); 查看字符串是否有满足正则表达式的内容,并返回一个布尔值true/false ...
- P3270 [JLOI2016]成绩比较 容斥 数论 组合数学 拉格朗日插值
LINK:成绩比较 大体思路不再赘述 这里只说几个我犯错的地方. 拉格朗日插值的时候 明明是n次多项式 我只带了n个值进去 导致一直GG. 拉格朗日插值的时候 由于是从1开始的 所以分母是\((i-1 ...
- 阿里居然推出了开源的JDK,你造么?
简介 Alibaba Dragonwell 是一款免费的, 生产就绪型Open JDK 发行版,提供长期支持,包括性能增强和安全修复.阿里巴巴拥有最丰富的Java应用场景,覆盖电商,金融,物流等众多领 ...
- source命令用法:source FileName
转自https://zhidao.baidu.com/question/59790034.html 写得很清楚,就直接搬过来了备忘 作用:在当前bash环境下读取并执行FileName中的命令. 注 ...
- Spring中使用MyBatis Generator
简介 MyBatis Generator 是由MyBatis官方提供的MyBatis代码生成器.可以根据数据库表生成相关代码,比如POJO.Mapper接口.SQL Map xml等. 使用方式 MB ...
- C++文件操作和模板
1.数据层次 位 bit 字节 byte 域/记录 将所有记录顺序地写入一个文件---->顺序文件:一个有限字符构成的顺序字符流 C++标准库中:ifsteam,ofstream,fstream ...
- “随手记”开发记录day17
继续开发账单的图形展示这一部分,丰富“随手记”的显示方法,对我们的APP进行添砖加瓦.