- 生产者-消费者问题:生产资源-消费资源
- 理发师问题:服务-被服务
- 读者-写者问题:同类进程不互斥、异类进程互斥
- 哲学家进餐问题:只有一类进程,每个进程需要同时拥有多种资源才能运行
- 单纯的同步问题:前驱后继图
生产者-消费者问题
- 有几类进程?
- 每类进程对应一个函数
- 在每个函数内部,用中文描述进程动作
- 只做一次:不加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);`
` }`
`}`