本书封皮如下:
在china-pub上买了这本二手的操作系统精髓与设计原理,书很新,不过也不算厚,这和高教版那本操作系统概念显然不算是同一个类型的,讲的概念也都是一笔带过,没有做过多阐述,所以其实本书并不适合对操作系统一无所知的人,建议可以看看别的操作系统的书后再看这本书,这样可以事半功倍。
p82:进程的挂起,把进程放到磁盘从而可以释放内存空间供另一个进程使用
阻塞/挂起态:进程在外存中并等待一个事件
就绪/挂起态:进程在外存中,但是只要被载入内存就可以执行
p125:windows线程状态
p153-163:生产者/消费者问题
使用二元信号量解决无限缓冲区生产者/消费者问题
int n; binary_semaphore s=1,delay=0; void producer() { while(true) { produce(); semWaitB(s); append(); n++; if(n==1) { semSignalB(delay); } semSignalB(s); } } void consumer() { int m; semWaitB(delay); while(true) { semWaitB(s); take(); n--; m=n; semSignalB(s); consume(); if(m==0) { semWaitB(delay); } } } void main() { n=0; parbegin (producer,consumer); }
semaphore n=0,s=1; void producer() { while(true) { produce(); semWait(s); append(); semSignal(s); semSignal(n); } } void consumer() { while(true) { semWait(n); semWait(s); take(); semSignal(s); consume(); } } void main() { parbegin(producer,consumer); }
const int sizeofbuffer=/*缓冲区大小*/; semaphore s=1,n=0,e=sizeofbuffer; void producer() { while(true) { produce(); semWait(e) semWait(s); append(); semSignal(s); semSignal(n); } } void consumer() { while(true) { semWait(n); semWait(s); take(); semSignal(s); semSignal(e); consume(); } } void main() { parbegin(producer,consumer); }
monitor boundedbuffer; char buffer[N]; //N个数据项空间 int nextin,nextout; //缓冲区指针 int count; //缓冲区数据项个数 cond notfull,notempty; //为同步设置的条件变量 void append() { if(count==n) { cwait(notfull); } buffer[nextin]=x; nextin=(nextin+1)%N; count++; csignal(notempty); } void take() { if(count==0) { cwait(notempty); } x=buffer[nextout]; nextout=(nextout+1)%N; count--; csignal(notfull); } //管程体 { nextin=0; nextout=0; count=0; } void producer() { char x; while(true) { produce(x); append(x); } } void consumer() { char x; while(true) { take(x); consume(x); } } void main() { parbegin(producer,consumer); }
const int capacity=/*缓冲区容量*/; const int null=/*空消息*/; int i; void producer() { message pmsg; while(true) { receive (mayproduce,pmsg); pmsg=produce(); send(mayconsume,pmsg); } } void consumer() { message cmsg; while(ture) { receive(mayconsume,cmsg); consume(cmsg); send(mayproduce,null); } } void main() { create_mailbox(mayproduce); create_mailbox(mayconsume); for(int i=0;i<=capacity;i++) { send(mayproduce,null); } parbegin(producer,consumer); }
boolean flag[2]; int turn; void P0() { while(true) { flag[0]=true; while(flag[1]) { if(turn==1) { flag[0]=false; while(turn==1) //do nothing flag[0]=true; } } //critical section turn=1; flag[0]=false; } } void P1() { while(true) { flag[1]=true; while(flag[0]) { if(turn==0) { flag[1]=false; while(turn==0) //do nothing flag[1]=true; } } //critical section turn=0; flag[1]=false; } } void main() { flag[0]=false; flag[1]=false; turn=1; parbegin(P0,P1); }
boolean flag[2]; int turn; void P0() { while(true) { flag[0]=true; turn=1; while(flag[1]&&turn==1) //do nothing //critical section flag[0]=false; } } void P1() { while(true) { flag[1]=true; turn=0; while(flag[0]&&turn==0) //do nothing //critical section flag[1]=false; } } void main() { flag[0]=false; flag[1]=false; parbegin(P0,P1); }
后记:我觉得操作系统除了这些理论知识外还应该深入了解一门操作系统,例如windows或者linux或者unix,只有从头到尾彻底理解一个操作系统才更具有实践意义和价值,理论也许每个人都懂,但要分场合。例如上周面试时面试官问我消息同步用到什么机制,我说有一个信箱,他说确实有这么一个概念,问我是哪个操作系统里面用到的,我居然告诉他windows,他哈哈大笑,说windows早就把这种信箱机制给废了。实在很囧,理论不联系实际,又有何用?我知道有这么回事,但不知道具体是用在哪个环境中的,对程序员来说,这实在是太凄凉了吧。