理发店问题

理发店问题--操作系统进程互斥

六眼飞鱼酱① 提交于 2020-05-05 01:34:34
假设理发店的理发室中有 3 个理发椅子和 3 个理发师,有一个可容 纳 4 个顾客坐等理发的沙发。此外还有一间等候室,可容纳 13 位顾客等候进入理发 室。顾客如果发现理发店中顾客已满(超过 20 人),就不进入理发店。 在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空 出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完后,可向任何一位 理发师付款。但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。 理发师在没有顾客的时候就坐在理发椅子上睡眠。理发师的时间就用在理发、收款、 睡眠上。 请利用 linux 系统提供的 IPC 进程通信机制实验并实现理发店问题的一个解法。 参考解法伪代码: 理发师程序(Barber) { 建立一个互斥帐本信号量: s_account,初值=1; 建立一个同步顾客信号量: s_customer,初值=0; 建立沙发消息队列: q_sofa; 建立等候室消息队列:q_wait; 建立 3 个理发师进程: b1_pid, b2_pid, b3_pid; 每个理发师进程作: while(1) { 以阻塞方式从沙发队列接收一条消息, 如果有消息,则消息出沙发队列(模拟一顾客理发); 唤醒顾客进程(让下一顾客坐入沙发)。 用进程休眠一个随机时间模拟理发过程。 理完发,使用帐本信号量记账。 互斥的获取账本 记账