信号量机制

作者&投稿:陟风 (若有异议请与网页底部的电邮联系)
操作系统中进程互斥的方式之一,信号量机制,理解不了啊,求大神举例说明~

其实很简单呢,信号量就是一个资源计数器,对信号量有两个操作来达到互斥,分别是P和V操作。
一般情况是这样进行临界访问或互斥访问的:
设信号量值为1,
当一个进程1运行时,使用资源,进行P操作,即对信号量值减1,也就是资源数少了1个。这时信号量值为0。系统中规定当信号量值为0时,必须等待,直到信号量值不为零才能继续操作。
这时如果进程2想要运行,那么也必须进行P操作,但是此时信号量为0,所以无法减1,即不能P操作,也就阻塞。这样就达到了进程1排他访问。
当进程1运行结束后,释放资源,进行V操作。资源数重新加1,这时信号量的值变为1.
这时进程2发现资源数不为0,信号量能进行P操作了,立即执行P操作。信号量值又变为0.此时进程2占有资源,排他访问资源。
这就是信号量来控制互斥的原理。
希望能帮助到你,如果帮助到你,请采纳为意见。

首先,一句话总结它们之间的区别:

字面上相似,但是本质上存在巨大的差别!请看详细解答...
Linux信号(signal) 机制

signal,又简称为信号(软中断信号)用来通知进程发生了异步事件。

原理:

一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息。


分类:
从两个不同的分类角度对信号进行:
可靠性方面:可靠信号与不可靠信号;
与时间的关系上:实时信号与非实时信号。

部分定义转自:http://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html


Linux信号量(semaphore)机制
 Linux内核的信号量用来操作系统进程间同步访问共享资源。


原理:信号量在创建时需要设置一个初始值,表示同时可以有几个任务可以访问该信号量保护的共享资源,初始值为1就变成互斥锁(Mutex),即同时只能有一个任务可以访问信号量保护的共享资源。
  一个任务要想访问共享资源,首先必须得到信号量,获取信号量的操作将把信号量的值减1,若当前信号量的值为负数,表明无法获得信号量,该任务必须挂起在该信号量的等待队列等待该信号量可用;若当前信号量的值为非负数,表示可以获得信号量,因而可以立刻访问被该信号量保护的共享资源。
当任务访问完被信号量保护的共享资源后,必须释放信号量,释放信号量通过把信号量的值加1实现,如果信号量的值为非正数,表明有任务等待当前信号量,因此它也唤醒所有等待该信号量的任务。

 常用的信号量的API:

DECLARE_MUTEX(name)

  该宏声明一个信号量name并初始化它的值为0,即声明一个互斥锁。
DECLARE_MUTEX_LOCKED(name)

  该宏声明一个互斥锁name,但把它的初始值设置为0,即锁在创建时就处在已锁状态。因此对于这种锁,一般是先释放后获得。
void sema_init (struct semaphore *sem, int val);

  该函用于数初始化设置信号量的初值,它设置信号量sem的值为val。
void init_MUTEX (struct semaphore *sem);

  该函数用于初始化一个互斥锁,即它把信号量sem的值设置为1。
void init_MUTEX_LOCKED (struct semaphore *sem);

  该函数也用于初始化一个互斥锁,但它把信号量sem的值设置为0,即一开始就处在已锁状态。
void down(struct semaphore * sem);

  该函数用于获得信号量sem,它会导致睡眠,因此不能在中断上下文(包括IRQ上下文和softirq上下文)使用该函数。该函数将把sem的值减1,如果信号量sem的值非负,就直接返回,否则调用者将被挂起,直到别的任务释放该信号量才能继续运行。
int down_interruptible(struct semaphore * sem);

  该函数功能与down类似,不同之处为,down不会被信号(signal)打断,但down_interruptible能被信号打断,因此该函数有返回值来区分是正常返回还是被信号中断,如果返回0,表示获得信号量正常返回,如果被信号打断,返回-EINTR。
int down_trylock(struct semaphore * sem);

  该函数试着获得信号量sem,如果能够立刻获得,它就获得该信号量并返回0,否则,表示不能获得信号量sem,返回值为非0值。因此,它不会导致调用者睡眠,可以在中断上下文使用。
void up(struct semaphore * sem);

  该函数释放信号量sem,即把sem的值加1,如果sem的值为非正数,表明有任务等待该信号量,因此唤醒这些等待者。

 实例:
信号量在绝大部分情况下作为互斥锁使用,下面以console驱动系统为例说明信号量的使用。

  在内核源码树的kernel/printk.c中,使用宏DECLARE_MUTEX声明了一个互斥锁console_sem,它用于保护console驱动列表console_drivers以及同步对整个console驱动系统的访问。

《Operating Systems Design and Implementation》中Andrew S. Tanenbaum对信号量的描述和以前看过的教材有区别。但其核心思想是类似的。

以前的书上(包括网上不少帖子)是这么叙述的:

―――――――――――――――――――――――――――――――――――――

信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用临界区的进程数。

Dijkstra同时提出了对信号量操作的PV原语。

P原语操作的动作是:

(1)S减1;

(2)若S减1后仍大于或等于零,则进程继续执行;

(3)若S减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。

V原语操作的动作是:

(1)S加1;

(2)若相加结果大于零,则进程继续执行;

(3)若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。

PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在PV原语执行期间不允许有中断的发生。

―――――――――――――――――――――――――――――――――――――

说明:要保证PV是原子操作,对于操作系统,只须在操作过程中关中断即可。

Andrew S. Tanenbaum对信号量的定义有所不同,其PV操作也有区别。

―――――――――――――――――――――――――――――――――――――

信号量是一个整数,其值不小于0。它表示被积累下来的唤醒操作数。

P原语操作的动作是:

(1) 检查S是否大于0。

(2) 若S>0,则S = S – 1;否则,执行P操作的进程将睡眠,并且此时P操作并未结束。

V原语操作的动作是:

(1)S = S + 1。

(2)如果一个或多个进程在该信号量上睡眠,无法完成先前的P操作,则有系统选择其中一个并允许它完成P操作。

――――――――――――――――――――――――――――――――――――――

Andrew S. Tanenbaum的观点认为:当S = 0时,P操作不会马上结束。其作用(S = S – 1)必须在该进程被唤醒后才能实现。

两种定义的区别是:

前者定义的PV操作都不会阻塞,而后者中P操作可能被阻塞。

前者的S的初值一般大于0,而后者中,S通常初值为0。

kfk kkf


信号量机制是什么?
1. 信号量机制,由荷兰学者Dijkstra于1965年提出,是一种在进程同步中广泛应用的有效工具。2. 随着时间的推移,信号量机制经历了发展,从最初的整型信号量,演变为记录型信号量,进而扩展到“信号量集”机制。3. 这一机制不仅被广泛应用于单处理机系统,如操作系统,也适用于多处理机系统和计算机网络。

信号量机制
信号量机制是一种卓有成效的进程同步工具,在长期且广泛的应用中,信号量机制又得到了很大的发展,它从整型信号量经记录型信号量,进而发展为“信号量集”机制,现在,信号量机制已经被广泛地应用于单处理机和多处理机系统以及计算机网络中。

信号量信号量机制
7. 由于其灵活性和通用性,信号量机制在现代计算机系统中扮演了至关重要的角色,是实现并发控制和资源管理的核心技术。8. 信号量,有时被称作信号灯,是在多线程环境中用来防止关键代码段并发执行的设施。9. 线程在进入关键代码段之前,必须先获取信号量;而当关键代码段执行完毕后,线程必须释放该信号...

信号量机制
为了确保程序的健壮性,可以使用一个二进制信号量(如useQueue)来防止队列内部状态的破坏。当两个生产者同时向空队列添加数据时,这可能会破坏队列状态的一致性。通过使用二进制信号量,可以确保队列状态的完整性。另外,为了避免死锁问题,需要在每个操作后释放信号量,以确保线程的正常流转。死锁恢复机制通...

信号量机制是谁提出来的?
信号量机制是一种在多线程环境中用来同步对共享资源的访问的算法。它由荷兰计算机科学家艾兹赫尔·戴克斯特拉(Edsger W. Dijkstra)于1965年提出。信号量用于防止多个线程同时访问同一资源,确保关键代码段不被并发执行。在关键代码段之前,线程必须获取信号量。完成关键代码段后,线程必须释放信号量。其他...

什么是信号量机制?
信号量机制 目录 1摘要 2基本信息 (2)若S减1后仍大于或等于零,则进程继续执行; 信号量机制分 信号量集的定义:基本信息 提出时间 1965年 1965年,荷兰学者Dijkstra提出了利用信号量机制解决进程同步问题,信号量正式成为有效的进程同步工具,现在信号量机制被广泛的用于单处理机和多处理机系统以及...

信号量信号量机制
信号量的原理是通过控制对共享资源的访问权限,确保在多进程环境下,进程间的协作和同步得以有序进行。通过设置和操作信号量,进程能够协调自身的行为,避免了数据竞争和死锁等问题。这种机制的灵活性和通用性使其在现代计算机系统中扮演了重要角色,是实现并发控制和资源管理的关键工具。

四种常用的信号量机制
四种常用的信号量机制  我来答 分享 微信扫一扫 新浪微博 QQ空间 举报 可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。 信号量 机制 搜索资料 本地图片 图片链接 代码 提交回答 匿名 回答自动保存中 为你推荐: 特别推荐 NASA公布照片后,全世界感谢中国! 先有鸡或...

信号量机制怎么理解
PV操作:通过对信号量S进行两个标准的原子操作(不可中断的操作)wait(S)和signa(S),可以实现进程的同步和互斥。这两个操作又常被称为P、V操作,其定义如下:P(S):①将信号量S的值减1,即S.value=S.value-1;②如果S.value≥0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。...

信号量机制是谁提出来的?
‍‍信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线...

绿春县18643435595: 信号量机制 - 搜狗百科
东郭功洛芬: 其实很简单呢,信号量就是一个资源计数器,对信号量有两个操作来达到互斥,分别是P和V操作. 一般情况是这样进行临界访问或互斥访问的: 设信号量值为1, 当一个进程1运行时,使用资源,进行P操作,即对信号量值减1,也就是资源数...

绿春县18643435595: 信号量机制可以总结为三个要素,应该是哪些 -
东郭功洛芬: 《Operating Systems Design and Implementation》中Andrew S. Tanenbaum对信号量的描述和以前看过的教材有区别.但其核心思想是类似的.以前的书上(包括网上不少帖子)是这么叙述的:―――――――――――――――――...

绿春县18643435595: ...常说的PV操作:P操作V操作各自对应的是哪个英文单词?为了方便记忆,不至混淆,所以想弄明白,我国读者常常不明白这一同步机制为什么叫PV操作,... -
东郭功洛芬:[答案] 1962年,狄克斯特拉离开数学中心进入位于荷兰南部的艾恩德霍芬技术大学(Eindhoven Technical University)任数学教授.... 信号量 信号量是最早出现的用来解决进程同步与互斥问题的机制, 包括一个称为信号量的变量及对它进行的两个原语操...

绿春县18643435595: 进程常见的同步机制有哪些? -
东郭功洛芬: 锁机制、信号量机制以及管程机制.

绿春县18643435595: 为什么在操作系统中引入信号量及P、V操作? -
东郭功洛芬: 在操作系统理论中有一个非常重要的概念叫做P,V原语.在我们研究进程间的互斥的时候经常会引入这个概念,将P,V操作方法与加锁的方法相比较,来解决进程间的互斥问题.实际上,他的应用范围很广,他不但可以解决进程管理当中的互斥...

绿春县18643435595: 请列举几种进程的同步机制,并比较其优缺点? -
东郭功洛芬: 一个信号量只能置一次初值,以后只能对之进行p操作或v操作.由此也可以看到,信号量机制必须有公共内存,不能用于分布式操作系统,这是它最大的弱点.信号量机制功能强大,但使用时对信号量的操作分散, 而且难以控制,读...

绿春县18643435595: 如何使用Java编写多线程程序(1) -
东郭功洛芬: 一、简介1、什么是线程要说线程,就必须先说说进程,进程就是程序的运行时的一个实例.线程呢可以看作单独地占有CPU时间来执行相应的代码的.对早期的计算机(如DOS)而言,线程既是进程,进程既是进程,因为她是单线程的.当然...

绿春县18643435595: 如何利用信号量机制实现多进程访问临界资源 -
东郭功洛芬: 进程互斥 定义:两个或两个以上的进程,不能同时进入关于同一组共享变量的临界区域,否则可能发生与时间有关的错误,这种现象被称作进程互斥.在多道程序环境下,存在着临界资源,它是指多进程存在时必须互斥访问的资源.也就是某一...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网