操作系统学习(2)

84 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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]={11111};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]={11111};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);
}