最近准备潜心研究操作系统,经过自己的精挑细选,我选择了Minix,主要原因是Minix很精简,可以学习到很多本质的东西。
而讲Minix的书籍《操作系统_设计与实现》也是当年linus torvalds创造Linux的思想源泉。刚看了此书一章多,觉得此书写得非常经典。
看完本书讲了IPC经典问题:哲学家进餐问题,读者-写者问题,理发师理发问题。
这些经典问题主要解决了进程间竞争资源问题,提出了进程同步的设计模型。
以下是理发师理发问题伪代码:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
1
2 #define N 5
3 typedef int semaphore;
4 semaphore mutex = 1 ; // 用于互斥
5 semaphore customers = 0 ; // 等候客人数信号量
6 semaphore barbers = 0 ; // 等待顾客的理发师信号量
7 int wating = 0 ; // 没有理发客人数据量
8
9 // 理发师理发
10 void Barber()
11 {
12 while ( true )
13 {
14 down( & customers);
15 down( & mutex);
16 wating -- ;
17 up( & barbers);
18 up( & mutex);
19 // 理发-非临界区
20 }
21 }
22 // 来理发客人了
23 void customer()
24 {
25 down( & mutex);
26 if (wating < N){
27 wating ++ ;
28 up( & customers);
29 up( & mutex);
30 down( & barbers); // 看理发师是否空闲,如果繁忙等待
31 // 理发客人等待-非临界区
32 }
33 else
34 {
35 up( & mutex);
36 }
37 }
2 #define N 5
3 typedef int semaphore;
4 semaphore mutex = 1 ; // 用于互斥
5 semaphore customers = 0 ; // 等候客人数信号量
6 semaphore barbers = 0 ; // 等待顾客的理发师信号量
7 int wating = 0 ; // 没有理发客人数据量
8
9 // 理发师理发
10 void Barber()
11 {
12 while ( true )
13 {
14 down( & customers);
15 down( & mutex);
16 wating -- ;
17 up( & barbers);
18 up( & mutex);
19 // 理发-非临界区
20 }
21 }
22 // 来理发客人了
23 void customer()
24 {
25 down( & mutex);
26 if (wating < N){
27 wating ++ ;
28 up( & customers);
29 up( & mutex);
30 down( & barbers); // 看理发师是否空闲,如果繁忙等待
31 // 理发客人等待-非临界区
32 }
33 else
34 {
35 up( & mutex);
36 }
37 }