一、什么是信号量

为了防止多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种访问机制,它可以通过生成并使用令牌来授权,在同一时刻只能有一个线程访问代码的临界区域。

临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来协调进程(线程)对共享资源的访问的。

信号量是一个特殊的变量,其数值可用于表示空闲临界资源的数量。有进程释放时,信号量增加,表示可用资源增加;当有进程申请到资源时信号量减少,表示可用资源数减少。程序对其访问都是原子操作,且只允许对它进行等待(即P(信号变量))和发送(即V(信号变量))信息操作。

最简单的信号量是只能取0和1的变量,这也是信号量最常见的一种形式,叫做二元信号量。而可以取多个正整数的信号量被称为通用信号量。这里主要讨论二元信号量。

信号量的值为正的时候,说明它空闲。所测试的线程可以锁定并使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。

二、信号量的工作原理

由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:
P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程。

V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1.

举个例子,就是两个进程共享信号量sv,一旦其中一个进程执行了P(sv)操作,它将得到信号量,并可以进入临界区,使sv减1。而第二个进程将被阻止进入临界区,因为当它试图执行P(sv)时,sv为0,它会被挂起以等待第一个进程离开临界区域并执行V(sv)释放信号量,这时第二个进程就可以恢复执行

举个例子,就是两个进程共享信号量sv,一旦其中一个进程执行了P(sv)操作,它将得到信号量,并可以进入临界区,使sv减1。而第二个进程将被阻止进入临界区,因为当它试图执行P(sv)时,sv为0,它会被挂起以等待第一个进程离开临界区域并执行V(sv)释放信号量,这时第二个进程就可以恢复执行。

三、信号量的分类

Linux中提供了两种信号量,一种用于内核程序中,一种用于应用程序中。

linux信号量简介相关推荐

  1. Linux进程间通信五 Posix 信号量简介与示例

    1. 信号量简介 信号量用于进程或线程间同步,Posix信号量是一个非负整型,只有两种操作,加一(sem_post)和减一(sem_wait),如果信号量值为0,sem_wait默认阻塞. Posix ...

  2. Linux进程间通信三 System V 信号量简介与示例

    1. System V信号量简介 SystemV信号量主要用于解决生产者和消费者问题,一个信号量能够控制多个资源,说它是信号量集也不为过. 2. API接口介绍 2.1 创建或打开信号量集 #incl ...

  3. Linux信号量 sem_t简介

    简介请移步: https://blog.csdn.net/qq_19923217/article/details/82902442 https://blog.csdn.net/evsqiezi/art ...

  4. Linux 交叉编译简介

    Linux 交叉编译简介 主机,目标,交叉编译器 主机与目标 编译器是将源代码转换为可执行代码的程序.像所有程序一样,编译器运行在特定类型的计算机上,输出的新程序也运行在特定类型的计算机上. 运行编译 ...

  5. 【Android 逆向】Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )

    文章目录 一.Linux 权限简介 二.系统权限 / 用户权限 / 匿名用户权限 1.系统权限 2.用户权限 3.匿名用户权限 一.Linux 权限简介 Linux 是基于文件的系统 , 内存 , 设 ...

  6. Alpine Linux 使用简介

    Alpine Linux使用简介 目录: 一.Alpine简要介绍 二.Alpine本地安装 三.Alpine在Docker下运行 四.Alpine的配置和使用 4.1网络相关文件 4.2更新国内源 ...

  7. WSL:WSL(Windows Subsystem for Linux)的简介、安装、使用方法之详细攻略

    WSL:WSL(Windows Subsystem for Linux)的简介.安装.使用方法之详细攻略 目录 WSL的简介 WSL的安装 WSL的使用方法 WSL的简介 Windows Subsys ...

  8. linux快捷命令补齐,Linux Shell简介——自动补齐/命令行的历史记录/编辑命令行/可用的 Shell 快捷方式.doc...

    Linux Shell简介--自动补齐/命令行的历史记录/编辑命令行/可用的 Shell 快捷方式 Unix (及后继者 Linux)在命令行下面诞生,因此,Unix 中的命令行有许多非常实用的功能. ...

  9. Linux的简介与虚拟机的管理

    Linux的简介: 严格的来讲,Linux不算是一个操作系统,只是一个Linux系统中的内核,Linux的全称是GUN/Linux,这才算是一个真正意义上的Linux系统. Linux是一个多用户多任 ...

最新文章

  1. 爬虫的另一工具splash挑战selenium
  2. python 声明变量_Python的变量声明
  3. Spark UI (基于Yarn) 分析与定制
  4. THE NAUGHTY BOY
  5. CNN图片分类(Pytorch)
  6. pdf批量添加图章_还没找到适合自己的PDF阅读器吗,它来了
  7. 正则表达式(一):php常用的正则匹配
  8. 都说web前端开发薪资高,入行就有上万月薪,转行难吗?
  9. 彻底解决Android Studio Minimum supported Gradle version is X.Y.Z. Current version is x.y.z.问题
  10. 《Java程序员,上班那点事儿》荣登北京新华书店销售榜第2名,立贴纪念!
  11. 微信小程序 MinUI 组件库系列之 avatar 头像组件
  12. 弹性小球flash导航菜单源码
  13. Codeforces 1293 E. Xenon‘s Attack on the Gangs —— 树上记忆化搜索,单点加改成区间加,有丶东西
  14. 【Practical】决策系统与粗糙集
  15. 新冠全球确诊超2亿!德尔塔后,新「毒王」拉姆达已蔓延32国
  16. 底层网络知识详解:如何连接外网
  17. js 点击事件穿透 html,Js点击事件.html
  18. 【Redis】用windows客户端连接服务器上的Redis
  19. 计算机软件公司用ps是,[计算机软件及应用]PS培训.ppt
  20. 微信小程序如何批量生成带参数的小程序码,无需开发

热门文章

  1. 001_汽车之家,新浪和360之间的交流
  2. Lintcode---统计比给定整数小的数的个数
  3. 22 Notification 通知栏代码
  4. tp_link路由器 重新设置
  5. HTTPS连接的前几毫秒发生了什么
  6. 【转载】数字签名是什么?
  7. SmtpClient 身份验证失败(authentication failed) 的原因分析
  8. 计算机Java程序设计标准讲义
  9. 78. Subsets 子集
  10. 2018年第九届蓝桥杯C/C++ C组国赛 —— 第一题:年龄问题