是考研辅导书王道(操作系统)中关于信号量的一个题,个人觉得答案有精简的余地,所以讨论了一下,但是和王道高分牛校学长讨论的结果不满意,所以贴出来再探讨一下。

有一座桥,南北向,都有入口出口。(图我不画了)

1.假设该桥上每次只能有一辆车行驶,试用信号灯的P、V操作实现交通管理。

2.假设该桥上不允许两车交会,但允许同方向多个车一次通过(即桥上可有多个同方向行驶的车)。试用信号灯的P、V操作实现桥上交通管理。

课本参考“答案”:

int countSN=0;

int countNS=0;

semaphore mutexSN=1;

semaphore mutexNS=1;

semaphore bridge=1;

StoN(){

p(mutexSN);

if(countSN==0)

p(bridge);

countSN++;

V(mutexSN);

过桥;

p(mutexSN);

countSN--;

if(countSN==0)

V(bridge);

v(mutexSN);

}

NtoS(){

p(mutexNS);

if(countNS==0)

p(bridge);

countNS++;

V(mutexNS);

过桥;

p(mutexNS);

countNS--;

if(countNS==0)

V(bridge);

v(mutexNS);

}

首先肯定一下这个代码的实现,这个好处是可读性强,易于理解,坏处就是太臃肿,不够精简,对于无法玩转的人,他对这个事情的认识会浮于表面的文字标识。但是我想探讨的更精简,或者说是比较本质比较核心的部分:

我的疑问就是,答案中countSN和countNS,可不可以用一个count,一是试探其可行性,二是觉得用两个count臃肿。

我都强调了,bridge信号量可以实现互斥,count减到0才能换方向,不然一方一直霸占bridge信号量,当换方向时,count又是从0开始,可以满足另一方向的计数要求。如此往复。

网上某童鞋跟我说不可以,但是没有逻辑上的说服力。

对话如下:

我:

如题,看答案似乎有些臃肿,因为同时只能NtoS或者StoN,也就是说换方向时count都会是0,那么还有必要用countSN和countNS两个计数吗?还是我逻辑不好,遗漏了什么?主要是想知道这个,是不是我什么没考虑到。

哈工大高玩:

题目中说只能允许同时一个方向通车,这里使用两个计数器就是为了这里来考虑 ,如若使用一个,则会出现两个方向都有车辆通过的情况。

我:

如果是这样,那要bridge有什么用

哈工大高玩:

你还是没有理解我说的意思,brige是用来让两个方向同时只有一个再通车,但是假设像你说的那样,把countsn和countns都用一个count来表示,表面上看好像也是说的通,但是这里就有一个问题了,countsn和countns本来是用作对两个方向的车辆计数的,如果用一个,如何计数,计数不清楚,你怎么做到由南向北到要北向南通车的转变。其实我觉得这本身就需

要两个计数器来为两个方向计数,怎么能简化成一个呢。

我估计,他的想法无外乎几个角度,

一是说:他觉得我想的太简单,南和北count怎么能一样呢?那不就计算乱了,原来countSN和countNS分别代表南北方向的通车,如果不分用两个信号量,南北就无法互斥了~~~从字面来看,他确实是这样想的。

二是说:他认为那个countSN或者countNS本身就是那些过桥的车辆了,而我想的是,这两个只是信号量而已,区别过桥的到底是南到北还是北到南,其实是StoN()和NtoS()方法来决定的,countSN和countNS本身没有任何意义,不能代表南北方向的实际车辆,其实质只是一个计数工具,

这个工具是干什么的,很显然,是为了帮助控制bridge信号量的,根据count来完成两个if语句,占有bridge和释放bridge,既然bridge信号量只能等到count==0才能转变给另一个进程,那么两个进程就是互斥的,count不可能同时为两边计数,也就是说可以用来重复利 用,这是我的想法,我认为逻辑上现在还找不出问题。

反正觉得他的想法对~!因为我无法理解我错在哪了,请不要说是可读性的问题。。。

是人的沟通障碍还是立场差异太大,不做太多吐槽,如果是我错了也好,希望有导师指正,帮我进步。

过桥问题linux信号量课设,操作系统信号量问题——信号量的精简相关推荐

  1. 操作系统课设之基于信号量机制的并发程序设计

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  2. 操作系统课设--使用信号量解决生产者/消费者同步问题

    山东大学操作系统课设lab3 实验三 使用信号量解决生产者/消费者同步问题(lab3) 实验目的 理解Nachos的信号量是如何实现的 生产者/消费者问题是如何用信号量实现的 在Nachos中是如何创 ...

  3. 操作系统课设之Linux 进程间通信

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  4. 操作系统课设之Linux 进程管理

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  5. 操作系统课设之简单 shell 命令行解释器的设计与实现

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  6. 操作系统课设之虚拟内存页面置换算法的模拟与实现

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  7. 操作系统课设之内存管理

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  8. 操作系统课设之Windows 的互斥与同步

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  9. 操作系统课设之Windows 进程管理

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

最新文章

  1. 《Java: The Complete Reference》等书读书笔记
  2. 浩方平台CS流量评估
  3. 设置计算机在睡眠状态下能共享,使用wifi共享精灵的过程中电脑会自动休眠锁屏的解决方法...
  4. python从零基础到项目实战怎么样-Python 3.x网络爬虫从零基础到项目实战
  5. memset与malloc性能测试(转)
  6. yii2.0验签组件(jwt)
  7. Java跳出多重循环
  8. 解决TeXstudio外部查看器失败方法
  9. 修改Sql Server 2000数据库名称
  10. 桌面云的四大协议解析
  11. pytorch---nn模块(3)自定义nn 模块
  12. 推荐一款焦点图jQuery插件 SlidesJs
  13. 雷电模拟器 手机模拟器 安装 连接
  14. 应用商店优化(ASO)之关键词及描述优化
  15. SPSS进行问卷量表信度检验【SPSS 082期】
  16. 计算机控制点火系统的三个阶段,汽车发动机电控技期末考解答.doc
  17. jpress连接不上mysql_JPress安装部署超详细文档
  18. MySQL高手篇:精妙SQL语句介绍
  19. 电脑突然关机重启是什么原因?
  20. typescript关键词Parameters和ReturnType

热门文章

  1. 新旧Tier 1巨头中国市场“交锋”,华为模式战斗力如何?
  2. oracle数据库学习(ZT)
  3. Javier Paniza: Java开发效率也可以比RoR高
  4. 变参函数相关介绍和封装
  5. 纯css实现扁平化360卫士logo demo
  6. 机器学习-机器学习之特征工程
  7. 微信小程序给数组、对象赋值
  8. 黑云压境 联想逆行
  9. MySQL中distinct和distinctrow的区别
  10. 重拾信心!通过建造者模式可以解决的4大JavaScript问题