本文主要是介绍操作系统【OS】Ch2 大题 PV题型分类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- 生产者-消费者问题:生产资源-消费资源
- 理发师问题:服务-被服务
- 读者-写者问题:同类进程不互斥、异类进程互斥
- 哲学家进餐问题:只有一类进程,每个进程需要同时拥有多种资源才能运行
- 单纯的同步问题:前驱后继图
生产者-消费者问题
- 有几类进程?
- 每类进程对应一个函数
- 在每个函数内部,用中文描述进程动作
- 只做一次:不加whlie
- 不断重复:加while(1)
- 分析每一动作之前是否需要p什么?
- ⚠️隐含的互斥(eg 缓冲区的访问,需要加:P(mutex))
- 只要有P必定有V,每写一个P,就要安排V
- 所有PV写完之后,再去定义信号量(semaphore)
- 定义完之后思考每个信号量的初值是多少
- 检查多个P连续出现的地方是否可能产生死锁
- ⚠️可以尝试调整P顺序
- 若某个信号量PV操作总连续出现,中间没有夹其他P,则不可能因信号量产生死锁
- 读题检查,是否满足题目要求
哲学家进餐问题
无脑让进程一口气取得所有的资源,再开始运行
- 定义大锁:`Semophore Lock = 1; //互斥信号量`
- 定义资源数:
```
//eg:有a、b、c三类资源,分别有9个、8个、5个,则:
int a = 9; // 表示a的剩余数量
int b = 8; // 表示b的剩余数量
int c = 5; // 表示c的剩余数量
```
- 代码模版:
```
Process(){
while(1){
P(Lock);
if(所有资源都够){
所有资源的int值减少; //题目回告知每类资源需要多少个。
取xxx资源; //一口气拿走所有的资源。
V(Lock); //拿完资源解锁
break; //跳出while循环
}
V(Lock); //资源不够,解锁,再循环尝试一次
}
做进程该做的事情(例如:哲学家干饭)// 用中文说明即可。
P(Lock);
归还所有资源,所有资源的int值增加。
V(Lock);
}
```
读者-写者问题
题目没有要求避免饥饿的话,用最简单的方法(读优先)可以得满分
- 读者优先:
```
semaphore lock = 1; // 用于实现对共享文件的互斥访问
int count = 0; //记录当前有几个读进程在访问文件
semaphore mutex = 1; //用于保证对count变量的互斥访问
writer(){
while(1){
P(lock); // 写之前上锁
write;
V(lock); // 写完了解锁
}
}
reader(){
while(1){
P(mutex); //各个进程互斥访问count
if(count == 0) P(lock); //第一个读者,读之前帮他的兄弟们上锁
count ++; //访问文件的读进程数+1
V(mutex);
read;
P(mutex); //各个进程互斥访问count
count—-; //访问文件的读进程数-1
if(count == 0) V(lock); //最后一个读进程负责解锁
V(mutex);
}
}
```
这篇关于操作系统【OS】Ch2 大题 PV题型分类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!