操作系统——信号量(理解什么是信号量,信号量如何解决同步互斥问题,信号量一些注意点)
信号量是什么
信号量(semaphore)是操作系统用来解决并发中的互斥和同步问题的一种方法。
信号量是一个与队列有关的整型变量,你可以把它想象成一个数后面拖着一条排队的队列,如图:
那信号量上面值n代表什么意思呢?
n>0:当前有可用资源,可用资源数量为n
n=0:资源都被占用,可用资源数量为0
n<0:资源都被占用,并且还有n个进程正在排队
那信号量拖着的那个队列就是用来放正在排队想要使用这一资源的进程
信号量伪代码
信号量的伪代码又如何实现呢
在代码中我们可以看到有两个对信号量的count值和阻塞队列的操作,一个是semWait,一个是semSignal,前者也被称为P操作,后者也被称为V操作。
这两个操作的用途是什么呢?
semWait我们可以理解为申请资源
semSignal我们可以理解为释放资源
当申请资源的时候,资源数count值-1,我们注意到资源数如果在-1之后<0,那么这个这个进程就会加入到等待队列
为什么这个条件设置成<0呢?
其实很好理解,当这个资源已经其他进程占有完了,即为0或者负数,那么新进程要申请这个资源时资源数再减1必然count<0,那么这个进程就要被被阻塞,进入阻塞队列
再看semSignal操作
一个进程终会使用完这个进程,然后离开,那么此时可用资源数+1
为什么这个条件设置成<=0呢?
一个进程用完资源走了,count++,如果还有进程在排队(count即值是-1或者更小),那+1之后必然count<=0,此时就唤醒一个排队中的进程
信号量解决互斥同步问题
用一个经典例子来说——生产者/消费者问题
- 首先我们分析这里有几种进程,很显然有两种:
- 消费者
- 生产者
- 分析进程之间的关系有什么:
互斥关系:缓冲区是临界资源,各进程互斥访问
两组同步关系
只有缓冲区未满,生产者才能往缓冲区放产品
只有缓冲区非空,消费者才能从缓冲区取产品
- 根据以上分析,写出大致的伪代码如下:
总结
semWait(S):请求分配一个资源。
semSignal(S):释放一个资源。
semWait、semSignal操作必须成对出现。
- 用于互斥时,位于同一进程内(初始值为1);
- 用于同步时,交错出现于两个合作进程内。
(且在前事件后加semSignal,在后事件前加semWait),比如先刷牙再吃饭,那刷牙这个事件后加semSignal,在吃饭这个事件前加semWait
多个semWait操作的次序不能颠倒,否则可能导致死锁。
多个semSignal操作的次序可任意。
操作系统——信号量(理解什么是信号量,信号量如何解决同步互斥问题,信号量一些注意点)相关推荐
- Linux内核同步机制之信号量与锁
Linux内核同步控制方法有很多,信号量.锁.原子量.RCU等等,不同的实现方法应用于不同的环境来提高操作系统效率.首先,看看我们最熟悉的两种机制--信号量.锁. 一.信号量 首先还是看看内核中是怎么 ...
- 操作系统中消费者与生产者的同步互斥问题
在操作系统中,我们有进程,进程会占用资源,有些资源是可以共享的,但有些资源是只允许一个占用,不能共享,只有当占用的线程用完释放后,下一个需要用的线程才可以申请使用,这样的资源便是临界资源.属于临界资源 ...
- 【考研】操作系统:2019年真题43(同步互斥问题)
前言 解决同步互斥问题的思路,源于对王道讲解的总结笔记 同类型题目: [考研]操作系统:2015年真题45(同步互斥问题)_住在阳光的心里的博客-CSDN博客 [考研]操作系统:2014年真题47(同 ...
- 采用信号量机制实现消费者与生产者的线程同步_你还能聊聊常用的进程同步算法? 上篇[五]...
点击上方 " 布衣码农 " ,免费订阅~选择" 设为星标 ",第一时间免费获得更新~ 「布衣码农」进程同步的最佳实践! 进程同步回顾 进程同步控制有多种方式:算 ...
- 秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量
前面<秒杀多线程第四篇一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了 ...
- python 同步 互斥 信号量 锁 简介
目录 进程间的信号 信号量(信号灯) 进程的同步互斥 Event事件 Lock 锁 进程间的信号 信号是唯一的异步通信方法 一个进程向另一个进程发送一个信号来传递某种信息,接受者根据传递的信息来做相应 ...
- c++ linux 线程等待与唤醒_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...
为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...
- 判断sem信号量为零_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...
为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...
- FreeRTOS学习笔记——互斥型信号量
来自:http://blog.csdn.net/xukai871105/article/details/43456985 0.前言 在嵌入式操作系统中互斥型信号量是任务间资源保护的重要手段.下面结合一 ...
最新文章
- WebApi2官网学习记录---异常处理
- Linux下,各种解压缩命令集合
- python3 日志检索异常抛出异常 raise KeyError(key),KeyError: ‘formatters‘
- 什么是数据中心,它们是如何变化的?
- 言有三新书预售,不贵,有料
- python列表函数方法_与Python列表相关的函数
- 领域驱动设计和开发实战总结
- php zend 多个站错误,php – 如何显示Zend框架抛出的异常错误
- ZendStdio 快捷键
- 华为防火墙配置(L2TP)
- ALPHACAM Desinger 2020.0中文破解版 64位
- 你离顶尖Java程序员,只差这11本书的距离 172 分享 分享到新浪微博 分享到QQ空间
- Windows提权—进程注入、Unattended Installs提权
- 在Spring Boot中spring mvc常见注解解析及部分源码
- 本题要求实现一个计算非负整数阶乘的简单函数
- JAVA中Iterator转List三种方法
- 分析1996~2015年人口数据特征间的关系并分析1996~2015年人口数据各个特征的分布分散状况
- Direct3D 11编程总结
- 阅读报告Implementing arbitrary coined two-dimensional quantum walks via bulk optical interferometry
- 论文解读TransFG: A Transformer Architecture for Fine-grained Recognition