哲学家就餐问题

image-20250526212627699

方法一

image-20250526212704462

方法二

image-20250526212745898

管程实现

image-20250527100050343

主要是这个test也太难想到了,通过test去判断我是否有吃的条件

注意,putdown那里还需要通过test去判断相邻两位是否可以吃,从而给他们signal

生产者消费者问题

image-20250526212134866

sput和sget其实是存在某种互补联系的,但是我们还是把他们分开来了

生产者和消费者自己还都各需要一个semaphore,是为了解决数组B和putptr、getptr变化导致的并发问题

image-20250527100701374

这个还是很好理解的

苹果-桔子问题

image-20250526212837371

不需要额外的取信号了,是桔子就解锁儿子,是苹果就解锁女儿,不会出现冲突

管程

image-20250527104501238

读者-写者问题

image-20250526213142359

image-20250526213154966

这个有点难想,readcount不需要信号量的同步功能,所以不需要作为semaphore变量类型

读写的mutex分开很好想,关键是把开始读和读完这两个过程分开,有点难想

关键的这个S,太难想了,如果没有这个S,会出现文件在被一个读者读的时候,此刻另一个读者和写者同时想操作文件,这个读者的优先级一定会高于写者,就不公平了

image-20250527091147850

管程实现

image-20250527094838983

唯一很让我不解的是为啥end_write那里,让写在读上面signal,挺离谱的

睡眠的理发师问题

image-20250526214226838

image-20250526215809770

mutex是为了防止waiting 的变化导致出错

这个理发必须在非临界区,因为理发师理发和顾客被理发是同时发生,如果放进临界区就没法并行了

银行业务问题

image-20250527004735132

image-20250527004749123

难点在于理解server_count为啥初始值为0,其实这里我们两个进程,一个是无数个customer,一个是n个server,这里的server数量其实不会对这个信号产生影响

整个逻辑是:客户进来了找沙发坐下,然后坐等有空闲服务员(对应P(server_count)),然后服务员空闲后呼号为他服务,再腾出自己

缓冲区问题

image-20250527010034557

image-20250527010333053

本质上类似生产者和消费者,empty和full有关联,但是还是用了两个

吸烟

image-20250527012202433

image-20250527012249235

这里面应该把吸烟放到V(sput)前面的

独行桥问题

image-20250527012820717

image-20250527012834387

右边那个mutex1应该是mutex2

很难自己想到这么做,但是看了之后也能懂,第一个车到的时候把这个桥占住,后面车来车去随它去,直到车都走完,再放走对桥的使用权 mutex1和mutex2是为了防止对count1和count2的修改出现并发错误

image-20250527013626679

image-20250527013941111

多加了个条件只对过桥有限制,而不限制排队,所以p(bridge)在那个位置

image-20250527014252229

image-20250527014303700

太绕了,已经让我很难想象了,只能干看去理解

image-20250527014855414

image-20250527014908551