开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情
1.PCB作用
进程控制块PCB作用:进程控制块的作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程。或者说,操作系统是根据PCB来对并发执行的进程进行控制和管理的,PCB是进程存在的唯一标识,常驻内存。
2.哲学家进餐
n个进程 n个资源
每个进程需要两个资源才可以运行
进程之间只有互斥,没有协作
经典同步问题:哲学家进餐问题
所有信号量均被初始化为1,第i位哲学家的活动可描述为: repeat
P(chopstick [i]);
P(chopstick [(i+1) mod 5] );
V(chopstick [i] );
v(chopstick [(i+1) mod 5]);
until false;
有问题:当所有人都拿右筷子会产生死锁
解决:
1)两根筷子同时拿起
semaphore chopstick[5]={1,1,1,1,1};void philosopher(int i)
(
while(true){
think();
Swait(chopstick[i];
chopstick[(i+1) mod 5]);
eat();
Ssignal(chopstick[(i+1) mod 5];
chopstick[i]);
think();
}
}
2)n个筷子,最多有n-1个人吃饭
semaphore chopstick[5]={1,1,1,1,1};semaphore r=4;
void philosopher(int i){
while(true)(
think0;wait(r);
//请求进餐
wait(chopstick[i]);
//请求左手边的筷子
wait(chopstick[i+1) mod 5]);
1/请求右手边的筷子
eat0;
signal(chopstick[(i+1 ) mod 5]);//释放右手边的筷子signalchopstick[i]);
//释放左手边的筷子
signal(r);
//释放信号量r
think0;
}
3)让相邻两个人去拿一根筷子,谁拿到再去拿另一根筷子(奇数拿左边,偶数拿右边,拿到以后再去拿另一边的)
{
while(true)
if(i mod 2 == 0)
//偶数的哲学家,先右手拿然后左手拿。
wait (chopstick IOi.+ 1) mod 5]);
wait(chopstick i;
eat():
signal (chopstick [i]);
signal (chopstick[(i+1) mod 5]);}
Else
//奇数的哲学家,先左手拿然后右手拿。
{
wait(chopstick [il);.
wait (chopstick i(i+1) mod 5]);eat0.
signal (chopstick [(i+ 1) mod 5]);signal (chopstick i);
}