Featured image of post Chapter 6 进程同步

Chapter 6 进程同步

信号量有关的同步问题

有限缓冲

1、分析需要的信号量个数

1
2
3
Binary semaphore mutex = 1//互斥信号量,实现对缓冲区的互斥访问
semaphore empty = n//同步信号量,表示空闲缓冲区的数量
semaphore full = 0//同步信号量,表示产品的数量,也即非空缓冲区的数量

2、类c代码 alt text 互斥信号量一定要放在同步信号量之后

复杂读者-写者

普通

1
2
3
4
int r_cnt = 0;
Semaphore 
    wrt = 1;
    r_mutex = 1;
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
writer(){
    wait(wrt);
    //w
    signal(wrt);
}

reader(){
    wait(r_mutex);
    r_cnt++;
    if(r_cnt == 1) wait(wrt);
    signal(r_mutex);
    //r
    wait(r_mutex);
    r_cnt--;
    if(r_cnt == 0) signal(wrt);
    signal(r_mutex);

}

带队列的读-写

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
Semaphore q = 1;
writer(){
    wait(q);
    //逻辑不变
    signal(q);
}

reader(){
    wait(q); 
    wait(r_mutex);
    r_cnt++;
    if(r_cnt == 1) wait(wrt);
    signal(r_mutex);
    signal(q); // 完成读计数之后就signal队列,之后你慢慢读没人管你
    //r
    wait(r_mutex);
    r_cnt--;
    if(r_cnt == 0) signal(wrt);
    signal(r_mutex);

}

扩展的读写者问题——最多允许M个读者同时读

alt text alt text alt text alt text alt text

四出生之家

alt text 可扩展到更多水果,核心是处理第一个和最后一个,保证盘内品种唯一

哲学家吃屎

管程写法模板

1
2
3
4
5
6
Monitor M{
    enum {THINKING, EATING, HUNGRY} states[5];
    condition self[5];
    // void ...
    // void initialize();
}

(期中)计数范围

alt text 三状态最大、最小值: 可以都在waiting,但是最多时必须有cpus个进程在running,所以ready_max = total - cpus

Built with Hugo
Theme Stack designed by Jimmy