Linux | 信号量相关知识点

信号量:信号量(Semaphore)有时被称为信号灯,是解决并发问题过程中所使用的一种设施,可以用来保证两个或多个关键代码段不被并发调用。一个进程在进入一个关键代码段之前,进程(或线程)必须获取一个信号量;一旦关键代码段完成了,那么该进程(或线程)必须释放信号量。其它想进入该关键代码段的进程(或线程)必须等待直到第一个进程(或线程)释放信号量。

从并发机制的角度看,信号量是一种并发机制,它用于进程间传递信号的一个整数值。在信号量上只有3中操作可以进行:初始化、递减和增加,这三种都是原子操作。递减操作可以用于阻塞一个进程,增加操作可以用于解除阻塞一个进程。也成为计数信号量或一般信号量。(其它的并行机制还有很多,如二元信号量、互斥量、自旋锁、事件标志等)

简单的理解:信号量:特殊变量,加1(v操作,释放资源),减1(p操作,获取资源),都是一个原子操作,值为0,减1阻塞。信号量用来同步进程。同步:只有一个程序在执行。

临界资源:临界资源是一次仅允许一个进程使用的共享资源。每次只准许一个进程进入临界区,进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。

临界区:临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。当有线程进入临界区段时,其他线程或是进程必须等待(例如:bounded waiting 等待法),有一些同步的机制必须在临界区段的进入点与离开点实现,以确保这些共用资源是被互斥获得使用,例如:semaphore。只能被单一线程访问的设备,例如:打印机。

原子操作:执行过程中不能被打断。

原子性:原子性是指一个操作是不可中断的,要么全部执行成功要么全部执行失败,有着“同生共死”的感觉。及时在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程所干扰。

P,V操作:

p操作 原子-1(获取资源) 信号量值为0 p操作阻塞

v操作 原子+1(释放资源)

信号量是用来解决互斥问题的一种方法。设信号量为s,设有n个进程,所有的进程都需要访问共享资源。每个进程中进入临界区前执行semWait(s),如果s的值为负,则进程被阻塞,s的绝对值就是被阻塞进程的数量;如果值为1,则s被减为0,进程立即进入临界区;由于s不再为正,因而其他任何程序都不能进入临界区。信号量一般初始化为1,这样第一个执行semWait的进程可以立即进入临界区,并把s的值置为0。接着任何试图进入临界区的其他(一个)进程,都将发现第一个进程忙,因此被阻塞,把s的值置为-1。可以有任意数目的进程试图进入,每个不成功的尝试都会使s的值减1,当最初进入临界区的进程离开时,s的值增1,一个被阻塞的进程(如果有的话)被移出阻塞队列,置为就绪状态(这里的s的值增1和一个阻塞进程被移出置为就绪状态是一步完成的)。这样,当操作系统下一次调度时,它可以进入临界区,并把信号量的值置为0。

PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思。p操作和v操作是不可中断的程序段,称为原语。如果将信号量看作共享变量,则pv操作为其临界区,多个进程不能同时执行,一般用硬件方法保证。一个信号量只能置一次初值,以后只能对之进行p操作或v操作。

使用PV操作实现进程互斥时应该注意的是:

⑴每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。

⑵P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。

⑶互斥信号量的初值一般为1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值