本书封皮如下:
在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早就把这种信箱机制给废了。实在很囧,理论不联系实际,又有何用?我知道有这么回事,但不知道具体是用在哪个环境中的,对程序员来说,这实在是太凄凉了吧。