互斥的作用:保护数据的完整性
进程间通信会引起死锁,(两个都等互相发消息过来),可能会有饥饿现象

互斥的要求:
一次只允许一个资源去使用临界起源
在非临界区终止了这个进程的执行,也不能影响其他进程
不允许在互斥的时候产生死锁与饥饿
如果没有进程在访问临界区,那么就立马把申请的进程拿进去使用

互斥条件:空闲让进
忙则等待
有限等待
让权等待

互斥的解决方案:软件、硬件、信号量、Monitors(管权)、信息传递;
硬件方法:
1.屏蔽中断:独占资源,代价很高,遇到紧急情况无法去解决,多处理器其他处理器也会来竞争
2.专用机器指令:一个指令和另一个指令之间避免了冲突(test set、exchange)两个都能够控制任意多个进程
缺点:出现忙等,消耗了处理机的时间
可能出现饥饿现象
可能会产生死锁

Semaphores(信号量):一种用来进程之间交换信息的特殊变量
Wait(s)、signal(s)是对信号量操作的原语,是一段代码,在执行操作时不能被中断;
信号量包含一个整形量,可以被初始化为一个非负整数;
Wait操作对信号量做递减操作:wait(s):S-1 wait操作:申请资源且可能阻塞自己(s<0)
signal操作对信号量做加法操作:signal(s):S+1 signal操作:释放资源并唤醒阻塞进程(s<=0)
General Semaphore(通用信号量):是记录型,其中一个域为整型,另一个域为队列,其元素为等待该信号量的阻塞进程(FIFO)
Binary Semaphore(二进制信号量):只能是0、1

信号量的类型:互斥信号量、资源信号量
互斥信号量用于申请或释放资源的使用权,常初始化为1
资源信号量用于申请或归还资源,可以初始化为大于1的正整数,表示系统中某资源的可用个数
Wait操作用于申请资源(或使用权),进行wait原语时,可能会阻塞自己;
Signal操作用于释放资源(或归还资源使用权),进程执行signal原语时,有责任唤醒一个阻塞进程

信号量的意义:
1.互斥信号量:申请/释放使用权,常初始化为1
2.资源信号量:申请/归还资源,资源信号量可以初始化为一个正整数

操作系统内核通过系统调用形式提供wait和signal原语,应用程序通过系统调用实现进程间的互斥
工程实践证明,利用信号量方法实现进程互斥是高效的,一直被广泛采用。

生产者消费者问题:
生产者:产生数据并将数据放入缓冲区(buffer)
消费者:一个消费者一次取一条数据
注意:1.进程先申请资源信号量,再申请互斥信号量,顺序不能颠倒。
2.对任何信号量的wait与signal操作必须配对。同一进程中的多对wait与signal语句只能嵌套,不能交叉。
3.对同一个信号量的wait与signal可以不在同一个进程中。
4.wait与signal语句不能颠倒顺序,wait语句一定先于signal语句。

读者写者问题:
可用于解决多个进程共享一个数据区(文件、内存区、一组寄存器等),其中若干读进程只能读数据,若干写进程只能写数据等实际问题。
读者优先:一旦有读者正在读数据,允许多个读者同时进入读数据,只有当全部读者退出,才允许写者进入写数据。(写者容易饥饿)

互斥 互斥的解决方案相关推荐

  1. The Little Book of Semaphores 信号量小书 第四章 经典同步问题 4.3 无饿死互斥

    第四章 经典同步问题 4.3 无饿死的互斥 在上一节中,我们讨论了被称之为绝对饥饿的问题,其中一类线程(读者)允许另一类别(写者)挨饿. 在更基本的层面上,我们必须解决线程饿死的问题,即一个线程可能无 ...

  2. 开篇:并发编程核心[分工、协作、互斥]

    线程和进程图解 工厂.车间.工人 并发编程可抽象成三个核心问题: 分工.同步/协作.互斥 学并发编程,透彻理解这三个核心是关键 分工 将当前 Sprint 的 Story 拆分成「合适」大小的 Tas ...

  3. 线程互斥和同步-- 互斥锁

    一. 线程分离 我们一般创建的线程是可结合的,这个时候如果我们调用pthread_jion()去等待的话,这种等待的方式是阻塞式等待,如果主线程一直等待,主线程就无法做其他的事情了,所以应该使用线程分 ...

  4. Java并发,并行,同步,互斥

    2019独角兽企业重金招聘Python工程师标准>>> 一切都要从这个世界的并行性开始说,事物的发展总是并行进行的,汽车在奔驰的同时,自行车也在行驶;别人正在唱歌,你可能正在吃饭;等 ...

  5. 操作系统(十八)进程同步与进程互斥

    2.3.1 进程同步与进程互斥 目录 2.3.1 进程同步与进程互斥 2.3.1.1 进程同步 2.3.1.2 进程互斥 在之前我们提到过,进程有异步性的特征,所谓异步性就是并发执行的进程以各自独立的 ...

  6. 2.3.1 进程的同步与互斥

    文章目录 0.思维导图 1.进程同步 2.进程互斥 0.思维导图 1.进程同步 同步也称为直接制约关系. 在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系.为了协调进程之间的相 ...

  7. Linux 多线程(二)线程安全:线程安全、互斥与互斥锁、死锁、同步与条件变量

    线程安全 互斥 死锁 同步 线程安全 所谓线程安全,其实就是当多个线程对临界资源进行争抢访问的时,不会造成数据二义或者逻辑混乱的情况(通常情况下对全局变量和静态变量进行操作时在会出现) 常见的线程安全 ...

  8. 进程同步,异步,互斥

    同步 同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而等待.传递信息所产生的制约关系.进程间的直接制约关系就是源于它们之间的相互合作. ...

  9. 互斥锁、条件变量、信号量浅析

    互斥锁.条件变量.信号量浅析 互斥锁与条件变量 条件变量是为了保证同步 条件变量用在多线程多任务同步的,一个线程完成了某一个动作就通过条件变量告诉别的线程,别的线程再进行某些动作(大家都在semtak ...

最新文章

  1. Android 自定义View之3D骰子旋转
  2. 【zabbix学习笔记之二】部署zabbix-server端
  3. 如何系统的自学python 知乎-如何系统地自学Python?
  4. java facade dao_java – 在Facade模式中放置用于创建namedQuer...
  5. Tomcat应用部署:打war包、在Tomcat中注册用户角色、创建虚拟目录和域名
  6. 1047:判断能否被3,5,7整除
  7. .gpg 进程 linux,小知识之Linux系统中的最大进程数,最大文件描述,最大线程数...
  8. 算法-二分搜索-找出最大值和最小值
  9. Arthas实践--快速排查Spring Boot应用404/401问题
  10. GDAL\OGR C#中文路径不支持的问题解决方法
  11. centos7 简单搭建lnmp环境
  12. oracle 之 游标
  13. Uniapp 移动端调用摄像头扫描二维码或者条形码
  14. 安川机器人位置变量要素_安川机器人位置型变量操作方法详细步骤解析
  15. 史上最傻java代码记录
  16. Java开发必须会的技能!java程序开发基础彭政答案
  17. Kotlin:关于Sealed密封类
  18. 基于Web SCADA平台的食品饮料行业数字化系统
  19. 计算机组成原理-第一章 计算机系统概述(详细知识点总结)
  20. 持久记录精彩时刻,汉印CP4000体验

热门文章

  1. FHS和一些文件相关的操作命令
  2. 数据分析——算法——K-means聚类(天池:汽车产品聚类分析)
  3. 设计模式之六大原则(实现部分)
  4. 私有云服务器搭建及ssh连接
  5. Android友盟消息推送
  6. ASP.NET MVC 学习(一)--MVC的cshtml的介绍
  7. win10上启用HEIF文件缩略图显示 - 删除没用的微软内置HEIF组件 - 安装开源免费的三方HEIF组件CopyTransHEIC
  8. Percona(MySQL)安装
  9. Windows10 移动热点无法正常开启
  10. 最大数leetcode_Leetcode:最大化有效体验