课程作业

课程名称:操作系统
作业名称:课后习题1
学号:21281280
姓名:柯劲帆
班级:物联网2101班
--- ## 1. 问题1 **哲学家进餐问题的变形。假设5支筷子都放在圆桌的中间,哲学家进餐时拿起任意两支筷子就可以进餐。其他条件不变。请用信号量实现5个哲学家进程的同步。** ```pascal Var chopsticks, eating_philosophers: Semaphore := 5, 4; Procedure Philosopher(i: integer); Begin Repeat wait(eating_philosophers); wait(chopsticks); wait(chopsticks); Eat; signal(chopsticks); signal(chopsticks); signal(eating_philosophers); Think; Until False; End; ``` ## 2. 问题2 **四个进程P0,P1,P2,P3和四个信箱M0,M1,M2,M3进程间借助相邻的信箱传递消息:Pi每次从Mi中取出一条消息,经加工送入Mi+1(mod 4)中。其中M0,M1,M2,M3分别设有3,3,2,2个格子,每个格子放一条消息,初始时,M0装满了三条消息,其余为空。写出使用信号量实现进程 (i=0,1,2,3)同步的算法。** ```pascal Var full, empty, mutex: array[0..3] of Semaphore := (3, 0, 0, 0), (0, 3, 2, 2), (1, 1, 1, 1); Procedure ProcessPi(i: integer); Var message: Message; Begin Repeat wait(full[i]); wait(mutex[i]); message := Get_Message_From_Mailbox(i); signal(mutex[i]); signal(empty[i]); ProcessMessage; wait(empty[(i + 1) mod 4]); wait(mutex[(i + 1) mod 4]); Send_Message_To_Mail_box((i + 1) mod 4, message); signal(mutex[(i + 1) mod 4]); signal(full[(i + 1) mod 4]); Until False; End; ``` ## 3. 问题3 **汽车司机与售票员之间必须协同工作,汽车每到一个站后,一方面,只有当司机已经停下,售票员才能开门上下客,另一方面,只有售票员把车门关好了司机才能开车。假定某辆公共汽车上有前后门各有一名售票员以及一名司机,汽车初始状态是正在始发站停车上客。试设必要的信号量及赋初值,实现售票员进程和司机进程的同步。** ```pascal Var driver, ticket_seller: Semaphore := 1, 2; Procedure Driver; Begin Repeat wait(driver); Move; Stop; signal(ticket_seller); signal(ticket_seller); Until False; End; Procedure Ticket_seller(i: integer); Begin Repeat wait(ticket_seller); wait(ticket_seller); Open; signal(driver); Close; Until False; End; ```