[OS] 信号量(Semaphore)
一个信号量S是一个整型量,除对其初始化外,它只能由两个原子操作P和V来访问。P和V的名称来源于荷兰文proberen(测试)和verhogen(增量),后面亦将P/V操作分别称作wait(), signal()。
Wait()/Signal()的伪码表示:
Wait(){ Signal(){
while(S <= ); S ++;
S--; }
}
但这并不是信号量的最终实现,最终的信号量实现最好是能解决2个问题:
(1)不能忙等。
(2)有某种方式记录处于等待状态的进程数量。
信号量可以被用来解决n个进程的临界区问题,进程之间共享一个信号量mutex,mutex初始化为1。
下面是使用信号量的互斥实现(这里,初值为1的信号量代替了互斥锁的功能):
do
{
wait(mutex);
//临界区;
signal(mutex);
//退出区;
}
while();
上述的信号量的概念描述中,P操作中的等待是用while循环形式的忙等来实现的-----忙等,浪费CPU时钟
使用忙等形式实现的信号量也被成为自旋锁(Spinlock)。
Spinlock在多处理器系统中是有用的,在进程等待一个锁的时候无需进行上下文切换,上下文切换可能需要花费很长的时间,在锁只需要保留较短时间时,自旋锁比较有用。
为了避免进程忙等,wait和signal的定义需要进行修改:
Wait:
当一个进程执行wait操作但发现信号量S<=0时,它必须等待,这里的等待不是忙等,而是阻塞自己。
阻塞操作将一个进程放入与信号量相关的等待队列中,且该进程的状态被切换成等待状态,接着控制被转到CPU调度程序,以选择另一个进程来执行。
Signal:
一个进程阻塞且等待信号量S,可以在其他进程执行signal操作之后被重新执行。
信号量的物理意义:
S>0表示有S个资源可用
S=0表示无资源可用
S<0,|S|表示S等待队列中的进程个数
为了定义基于阻塞(block)/唤醒(wakeup)的信号量,可以将信号量定义为如下一个"C"结构:
typedef struct
{
int value;
struct process *L;//在该信号量上阻塞的进程队列
} semaphore;
Wait操作定义:
void wait(semaphore S)
{
S.value--;
if(S.value<)
{
add this process to S.L;
block();
}
}
Signal操作定义:
void signal(semaphore S)
{
S.value++;
if(S.value<=)
{
remove a process P from S.L;
wakeup(P);
}
}
下图是Wait()和Signal()操作执行的流程图:

Wait() Signal()
[OS] 信号量(Semaphore)的更多相关文章
- C# 多线程之一:信号量Semaphore
通过使用一个计数器对共享资源进行访问控制,Semaphore构造器需要提供初始化的计数器(信号量)大小以及最大的计数器大小 访问共享资源时,程序首先申请一个向Semaphore申请一个许可证,Sema ...
- 经典线程同步 信号量Semaphore
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- 互斥锁Mutex与信号量Semaphore的区别
转自互斥锁Mutex与信号量Semaphore的区别 多线程编程中,常常会遇到这两个概念:Mutex和Semaphore,两者之间区别如下: 有人做过如下类比: Mutex是一把钥匙,一个人拿了就可进 ...
- 信号量 Semaphore
一.简介 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用,负责协调各个线程, 以保证它们能够正确.合理的使用公共资源. Semaphore可以控制某个资源可被同时 ...
- windows核心编程-信号量(semaphore)
线程同步的方式主要有:临界区.互斥区.事件.信号量四种方式. 前边讲过了互斥器线程同步-----windows核心编程-互斥器(Mutexes),这章我来介绍一下信号量(semaphore)线程同步. ...
- 秒杀多线程第八篇 经典线程同步 信号量Semaphore
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <且不超过最大资源数量. 第三个參数能够用来传出先前的资源计数,设为NULL表示不须要传出. 注意:当 ...
- 转:【Java并发编程】之二十三:并发新特性—信号量Semaphore(含代码)
载请注明出处:http://blog.csdn.net/ns_code/article/details/17524153 在操作系统中,信号量是个很重要的概念,它在控制进程间的协作方面有着非常重要的作 ...
- 多线程面试题系列(8):经典线程同步 信号量Semaphore
前面介绍了关键段CS.事件Event.互斥量Mutex在经典线程同步问题中的使用.本篇介绍用信号量Semaphore来解决这个问题. 首先也来看看如何使用信号量,信号量Semaphore常用有三个函数 ...
- java笔记--对信号量Semaphore的理解与运用
java Semaphore 信号量的使用: 在java中,提供了信号量Semaphore的支持. Semaphore类是一个计数信号量,必须由获取它的线程释放, 通常用于限制可以访问某些资源(物理或 ...
- 对信号量Semaphore的理解与运用
转: java笔记--对信号量Semaphore的理解与运用 java Semaphore 信号量的使用: 在java中,提供了信号量Semaphore的支持. Semaphore类是一个计数信号量, ...
随机推荐
- 我和Python的Py交易》》》》》》 命名空间的小弟作用域
命名空间的小弟作用域 在这要明确一个观点,在Python中万物皆对象,而变量指向的就是对象. 变量可以是 类名,函数名,储存数据的变量…… 对象可以是 类 ,被封装的一段代码(函数),数据…… 命名 ...
- MongoDB入门---文档查询操作之条件查询&and查询&or查询
经过前几天的学习之路,今天终于到了重头戏了.那就是文档查询操作.话不多说哈,直接看下语法: db.collection.find(query, projection) query :可选,使用查询操作 ...
- vue.js使用axios
使用axios的两种调用方式 1.安装axios $ cnpm install axios 2.在vue入口文件main.js中引入(推荐全局引入),或是在当前页面中引入(局部) import axi ...
- C#使用API屏蔽系统热键和任务管理器
最近做的一个winform类型的项目中需要屏蔽系统热键,在网上搜索了一下,基本上都是调用api来进行hook操作,下面的代码就可以完成功能 using System; using System.IO; ...
- 使用Google Cloud Messaging (GCM),PHP 开发Android Push Notifications (安卓推送通知)
什么是GCM? Google Cloud Messaging (GCM) 是Google提供的一个服务,用来从服务端向安卓设备发送推送通知. GCM分为客户端和服务端开发. 这里我们只介绍服务端开发 ...
- 一次简单的C++编译错误
快要下班的时候,开发部的一名小鲜肉找我帮忙解决一个问题: 才哥,我们提供给计费组的库在计费主机上编译报错了,但是提供给其他组用时没有编译报错.计费也不认,说编译器报的是我们代码上的错误,要我解决,帮我 ...
- hdu1789 Doing Homework again(贪心+排序)
Doing Homework again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- 180609-Spring之事件驱动机制的简单使用
文章链接:https://liuyueyi.github.io/hexblog/hexblog/2018/06/09/180609-Spring之事件驱动机制的简单使用/ Spring之事件驱动机制的 ...
- jQuery官网plugins栏目下那些不错的插件
前言: 很久以前就关注过jQuery官网plugins栏目下那些全是英文的插件,本人的英文水平很菜,想要全部看懂确实是件不易之事. 好在大部分的案例中都有 view-homepage 或 Try a ...
- 从零开始的Python学习Episode 3——字符串格式化与for循环
一.字符串格式化 利用一段注释记录想要输出的字符串格式,并用 %s . %d 或 %f 依次代替要输出的数据(%s代表字符串,%d代表数字,%f代表浮点数),然后在这段注释之后依次加上要输出的数据. ...