2题目源于《操作系统原理》孟庆昌等编著。

可配合以下链接“食用”:

【考研】操作系统——同步互斥问题(P、V操作)1_住在阳光的心里的博客-CSDN博客

【考研复习】《操作系统原理》孟庆昌等编著课后习题+答案——第二章_住在阳光的心里的博客-CSDN博客

【考研】操作系统:2019年真题43(同步互斥问题)_住在阳光的心里的博客-CSDN博客_有n位哲学家围坐在一张圆桌边

17. 设有无穷多个信息,输入进程把信息逐个写入缓冲区,输出进程逐个从缓冲区中取出信息。针对下述两种情况:
(1) 缓冲区是环形的,最多可容纳 n 个信息
(2) 缓冲区是无穷大的
试分别回答下列问题:
① 输入、输出两组进程读/写缓冲区需要什么条件?
② 用P、V操作写出输入、输出两组进程的同步算法,并给出信号量含义及初值。

解:(1) 缓冲区是环形的,最多可容纳 n 个信息时:

① 输入、输出两组进程读/写缓冲区需要的条件是:
A. 所有进程都要互斥使用缓冲区。
B. 所有输入进程连续写人缓冲区的个数不能超过缓冲区的总容量(n)。
C. 输出进程不能超前输入进程。


② 设置三个信号量:
● full —— 放有信息的缓冲区数,其初值为 0。
● empty —— 可供使用的缓冲区数,其初值为 n。
● mutex —— 互斥信号量,初值为1,表示各进程互斥进人临界区,即保证任何时候只有一
个进程使用缓冲区。
两个计数变量: in 和 out 分别是输人进程和输出进程使用的计数量,表示下面使用的缓冲
区编号,初值都是0。

//输入进程:
while (TRUE) {
    P(empty); 

    P(mutex);   //互斥访问缓冲区
    信息送往buffer(in);
    in = (in + 1) mod n;   /* 以 n 为模 */ 
    V(mutex);

    V(full);
}

//输出进程:
while (TRUE){
    P(full);

    P(mutex);   //互斥访问缓冲区
    从buffer (out )中取出信息;
    out = (out + 1) mod n;     /*以n为模*/
    V(mutex);

    V(empty);
}

(2) 缓冲区是无穷大时:

① 输入、输出两组进程读/写缓冲区需要的条件是:
● 所有进程都要互斥使用缓冲区。
● 输出进程不能超前输入进程。


② 设置两个信号量:
● full——缓冲区满的情况,初值为0。
● mutex——互斥信号量, 初值为1。
计数器:i = 0, j = 0 ( i、j 分别为输入进程和输出进程使用的缓冲区号码)。

// 输入进程:
while(TRUE) {
    P(mutex);   //互斥访问缓冲区
    信息送往buffer(i);
    i = i + l;
    V(mutex);

    V(full);
}

// 输出进程:
while (TRUE) {
    P(full);

    P (mutex);    //互斥访问缓冲区
    从buffer(j)中取出信息;
    j = j + 1;
    V(mutex) ;
}

Logo

汇聚原天河团队并行计算工程师、中科院计算所专家以及头部AI名企HPC专家,助力解决“卡脖子”问题

更多推荐