1965年,荷兰学者Dijkstra提出了一种卓有成效的实现进程互斥、同步的方法——信号量机制

信号量其实就是一个变量(可以是一个整数,也可以是一个更复杂的变量),可以用信号量来表示系统中某种资源的数量。比如:系统中只有一台打印机,就可以设置一个初值为1的信号量。

P、V操作:

P表示通过,V表示释放

 1.整型信号量:

整型信号量与普通的信号量的区别

对信号量的操作只有:初始化、P操作、V操作 

缺点:不满足“让权等待”原则,会发生“忙等”

 2.记录型信号量:

在信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应该增加一个进程链表指针L,用于链接上述的所有等待进程。记录型信号量是由于它采用了记录型的数据结构而得名的。

例题:

 用P、V操作进行进程的通过和释放,再加入原语来实现进程的“上锁”和“解锁”,等资源使用完毕,再利用block原语进行阻塞(主动让出处理机),该机制遵循了“让权等待”的原则。

 3.AND型信号量:

AND型信号量在一些应用场合,是一个进程需要先获得两个或者更多的共享资源后方能执行其任务。

AND同步机制的基本思想是:将进程在整个运行过程中需要的所有资源,一次性全部的分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其它所有有可能为之分配的资源也不分配给它。亦即,对若干个临界资源的分配,采取原子操作方式要么把它所请求的资源全部分配给进程,要么一个也不分配。由死锁理论可知,这样就可以避免上述死锁情况发生。为此,在wait操作中,增加一个“AND”条件,故称为AND同步,或称为同时wait操作。

 缺点:AND型信号量满足了 “多种资源,数量为1”的使用情景,但是实际上还会有多种资源数量不固定的情景,AND型信号量显然处理不了这种情况的进程调度。

 死锁的概念:

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去;此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

 4.信号量集:

信号量集由两部分组成:标识组和等待任务列表;

标识组由三部分组成:1.OSFlagType——识别是否为信号量集的标志

                                    2.OSFlagWaitList——指向等待任务列表的指针

                                    3.OSFlagFlags——信号量表

注意:信号量集的标识组只是保存了各输入信号量的值,而至于如何对这些任务进行处理则是等待任务的事情。

等待任务必须完成以下两个操作:1.在多个信号量输入中挑选等待任务感兴趣的输入。

                                                      2.把挑选出来的输入按照等待任务所期待的方式运算,以得到输出。

1. 信号量集的标志组

UCOS不是使用事件控制块的结构描述信号量集,而是使用一个标志组的机构来描述信号量集OS_FLG_GRP

2. 等待任务链表

与其他事件不同,信号量集采用一个双向链表来组织等待任务。标志组OS_FLG_GRP的成员OSFlagWaitList指向信号量集的这个等待任务链表。

等待任务链表中的节点OS_FLAG_NODE中的成员OSFlagNodeFlags相当于一个过滤器,它可以将请求任务需要的信号筛选出来,不需要的信号屏蔽掉。

对等待任务链表的操作:添加节点和删除节点。

“信号量集”的三种特殊情况:

​ (1) Swait(S, d, d)。 此时在信号量集中只有一个信号量S, 但允许它每次申请d个资源,当现有资源数少于d时,不予分配。

​ (2) Swait(S, 1, 1)。 此时的信号量集已蜕化为一般的记录型信号量(S>1时)或互斥信号量(S=1时)。

​ (3) Swait(S, 1, 0)。这是一种很特殊且很有用的信号量操作。当S≥1时,允许多个进程进入某特定区;当S变为0后,将阻止任何进程进入特定区。换言之,它相当于一个可控开关。

信号量的应用:

  • 利用信号量实现进程互斥关系
  • 利用信号量实现进程同步关系
  • 利用信号量实现进程前趋关系

小结:

 5.信号量实现进程的互斥:

解释一下互斥原理:

先设置一个互斥信号量mutex(可自己定义),再初始化信号量,使mutex=1,然后进行P操作(申请资源使用),这时候mutex-1,即mutex=0,对这个资源进行“加锁”,别人无法再使用这个资源,也就是相当于(C语言中for循环的条件判断,满足条件就进行,不满足就跳出),等程序使用资源完毕时,就会进行V操作(释放资源),对资源进行“解锁”,这时候mutex+1,重新使mutex=1,使资源解放出来,等待下一个程序的使用。

 6.信号量机制实现进程同步:

进程同步:要让各进程按要求有序地进行推进。

解释一下进程同步的原理:

让各进程按要求有序地进行推进,先将初始化同步信号量的初始值设置为0。我们让代码4在代码2之后进行执行,这时候因为异步性,不知道是P1进程先进行还是P2进程先进行,我们先在代码2后面设置一个V(S)操作,在代码4后面设置一个P(S)操作。【可能有以下两种情况】

1.当先进行P1进程时,进程会按照代码1,代码2的顺序进行,当执行完代码2时,到达了V(S)操作,这时候将资源释放了出来,这时候初始值增加(S+1),接着进行P2进程,由于P2中进行了P(S)[申请资源]的操作,所以进程会按照代码4,代码5,代码6进行下去。

2.当先进行P2进程时,会遇到P(S),但这时候的初始值为0,无法提供资源,P2进程进入自我阻塞状态。然后就进行P1进程的执行。这样就实现了让各进程按要求有序地进行推进。也就是实现了进程同步。

 7.信号量机制实现前驱关系:

前驱关系本质上就是更复杂的同步问题。

在这一个进程实现之后执行V操作

在下一个进程实现之前执行P操作

总结:

这篇文章写了三个半小时,先进行看视频学习,两个视频反复看了两三遍,等自己理解之后,再写,进行整理和写上了自己对内容的理解,感觉虽然时间花费的比较多,但这些内容自己都理解了,还拓展了一部分,感觉自己棒棒,哈哈 。

信号量机制实现进程的互斥、同步、前驱相关推荐

  1. 操作系统之进程管理:11、用信号量机制实现进程同步、互斥、前驱关系

    11.用信号量机制实现进程同步.互斥.前驱关系 思维导图 用信号量机制实现进程同步 用信号量机制实现进程互斥 用信号量机制实现进程的前驱关系 思维导图 用信号量机制实现进程同步 先来看一下什么是进程同 ...

  2. 2.3.5 操作系统之信号量机制实现进程的互斥、同步与前驱关系

    文章目录 0.思维导图 1.信号量机制实现进程互斥 2.信号量机制实现进程同步 3.信号量机制实现前驱关系 0.思维导图 在看此小结内容之前,需熟悉这一篇博客里面的知识,关于P.V操作内部实现原理等h ...

  3. 十六、用信号量机制实现进程互斥、同步、前驱关系

    一.知识总览 二.信号量机制实现进程互斥 注意: 1.信号量mutex表示进入临界区的名额 2.对不同的临界资源需要设置不同的互斥信号量 3.P.V操作必须成对出现,缺少P(mutex)就不能保证临界 ...

  4. 操作系统(二十二)用信号量机制实现进程互斥、同步、前驱关系

    2.3.5 用信号量机制实现进程互斥.同步.前驱关系 目录 2.3.5 用信号量机制实现进程互斥.同步.前驱关系 2.3.5.1 用信号量机制实现进程互斥 2.3.5.2 用信号量机制实现进程同步 2 ...

  5. 二、操作系统——用信号量机制实现进程互斥、同步、前驱关系(详解)

    一.什么是进程同步? 二.什么是进程互斥? 临界资源:一个时间段内只允许一个进程使用的资源 为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则: 空闲让进.临界区空闲时,可以允许一个 ...

  6. 8 操作系统第二章 进程管理 信号量 PV操作 用信号量机制实现 进程互斥、同 步、前驱关系

    文章目录 1 信号量机制 1.1 整形信号量 1.2 记录形信号量 1.3 信号量机制小结 2 用信号量机制实现进程互斥.同 步.前驱关系 2.1 信号量机制实现进程互斥 2.2 信号量机制实现进程同 ...

  7. 信号量机制实现进程互斥

    目录 1.总览 2.信号量机制实现进程互斥 3.信号量机制实现进程同步 4.信号量机制实现前驱关系 5.小结 1.总览 2.信号量机制实现进程互斥 3.信号量机制实现进程同步 4.信号量机制实现前驱关 ...

  8. 信号量机制实现进程控制

    一.信号量机制实现进程互斥 我们将一次仅允许一个进程访问的资源称为临界资源,而临界区是指访问临界资源的那段代码. 通常将互斥信号量设置为 mutex ,初始值为 1. 为什么初始值设置为 1 呢? 因 ...

  9. 2.3.5 用信号量实现 进程互斥 同步 前驱关系

    目录 思维导图 实现进程互斥 实现进程同步 实现前驱关系 思维导图 实现进程互斥 实现进程同步 实现前驱关系

  10. 操作系统—用信号量机制实现进程互斥、进程同步和前驱关系

    建议将思维导图保存下来观看,或者点击这里在线观看

最新文章

  1. 程序员编码时都戴耳机?到底在听什么?
  2. SAP ABAP实用技巧介绍系列之如何生成值为NULL的table row
  3. [转]C++的坑真的多吗?
  4. vs 设置起始页不见了_发朋友圈屏蔽爸妈,结果不小心设置成了仅家人可见...场面一发不可收拾哈哈哈哈!...
  5. 除了速度与激情 领克01带给我另一种有关生活方式的想象
  6. abp vnext中swagger使用小结
  7. IO多路复用(番外篇)、poll、epoll三者的区别
  8. Android之基于message的进程间通信Messenger
  9. java踩坑记-getResourceAsStream
  10. 部署ASDM图形化工具
  11. Latex 环境配置(TexLive + Texstudio)
  12. php用8好还是php7好,对比说明PHP7的优化提升
  13. hp 服务器 修复,Hp服务器 raid 磁盘故障数据库数据恢复过程
  14. 【AGC035F】Two Histograms
  15. 拼多多根据ID取商品详情-API
  16. 解决windows10右下脚工具栏图标显示不正常问题
  17. 科研人必看!全球优秀大数据可视化工具汇总!
  18. 龚昇:数学历史的启示
  19. html怎么设置联网,已连接(不可上网)怎么办?
  20. MySQL中如何删除有外键约束的表数据?

热门文章

  1. 数值分析及其matlab实现习题答案,数值分析练习题(含答案).doc
  2. Mat常用构造函数及IplImage 与Mat 之间的相互转换
  3. Kibana 操作 ES+搜索
  4. nodog+adbyby实现密码认证与视频广…
  5. jwplayer.v7.1.4视频播放器的使用
  6. html转换为pdf c#,HTML转PDF(C# itextsharp)
  7. 3.1.4_cardView原理解析
  8. C4D景深与运动模糊及hdr预设文件添加技巧
  9. csr驱动程序linux版,CSR8510蓝牙驱动下载
  10. 【自定义View】从零开始写一个PDF查看器