byd这章大题比选择多
闲聊
异步和同步的概念一开始说过了


看一看



1 就是如果临界区是空着,没人用,就是让进
2 忙正在用,不能同时用,等
3 你别一直等,会自卑的
4 你进不去就释放CPU,别死皮赖脸
然后中间跳了很多很多东西,直到
信号量

然后整型信号量也跳了
直接看
记录型信号量

然后代码看一下

用链表实现的队列,重命名为semaphore,记录型信号量就是除了整数,还有一个队列
我们来好好看看这些代码吧,如果下面文字没看懂没事,后面有炒鸡详细的理解过程

这里wait操作
首先让S里的值value先减少,表示分配该资源的数量减1
如果发现里面的值小于0了,说明这个资源已经被分配完了,就把这个进程添加到队列,并让出CPU(运行变堵塞)

wakeup就是堵塞变成就绪
然后举个例子理解上面的原理

那个波浪线是临界资源,想要让它互斥,你就得在上下设置一个PV
然后我们把初始值S设置为1

这里P2先执行,执行P的时候 S的值是0,并不是<0,所以进入临界区大干,快干,多干,苦干,实干,加油干
这时候P3错过了风口,但也想执行,进入了P3的P(S)发现减1后是<0的了,此时你就等吧,你就加入0人在意的队列吧
,你CPU也别占着了,赶紧自己堵塞自闭去吧
最后刚刚毕业于食品工程的P1也想执行,进入了P1的P(S)后发现![]()

这时!!P2终于退休干完了!加完后发现S是-1,确实是<=0的,就会先移除队列的P3放入process P,然后唤醒它,终于,我们的P3再也不用等了,也拿回了自己的CPU进程
但值得注意的是,唤醒是堵塞变就绪,并不是立即执行的
最后的最后,等P1做完到V的时候,信号量已经变成了1,这时V操作的if条件不再执行,再也没有任何进程堵在队列里了,世界变的美好了
用PV操作实现同步
我想先执行P1再执行P2 bro
先说结论
先发生的后面加V,后发生的前面加P,信号量该为0
欧克,我们可以试试会发生什么
如果你愣头青,就是想执行P1,行,你执行的时候会发现你会被堵塞,因为信号量是-1,加入堵塞队列
P2就没人拦着,运行完了就可以把P1拿出来删除唤醒了
PV操作实现前驱关系

什么拓扑图,这里每个地方都定义了一个信号量
然后死套公式,先发生的后面加V,后发生的前面加P



书上的小知识


这里可以看成P是加锁和V是释放锁
然后是同步,简单看看



被折叠的 条评论
为什么被折叠?



