打印

信号量的形象化理解

[复制链接]
130|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
无幻|  楼主 | 2018-9-27 12:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
*********************************************************************************************************

*                                        POST TO A SEMAPHORE**Description: This function signals asemaphore**Arguments : pevent       is a pointer to the event control block associated with thedesired*                           semaphore.**Returns   : OS_NO_ERR          The call was successful and the semaphore wassignaled.*             OS_SEM_OVF         If the semaphore count exceeded its limit.  In other words, youhave*                                 signalled the semaphore more often than you waited on it witheither*                                 OSSemAccept() or OSSemPend().*             OS_ERR_EVENT_TYPE   Ifyou didn't pass a pointer to a semaphore*             OS_ERR_PEVENT_NULL  If 'pevent' is a NULLpointer.                                                     发出一个信号量描述:发出一个信号量参数:pevent :指向事件控制块结合目标信号量的指针返回:OS_NO_ERR          调用成功,信号量发出*             OS_SEM_OVF      信号量数目超出范围. 也就是说你发送的信号量多于在either*                                 OSSemAccept() or OSSemPend()中等待的*             OS_ERR_EVENT_TYPE  没有传递指针给信号量*             OS_ERR_PEVENT_NULL 如果 'pevent' 是空指针**********************************************************************************************************/   疑惑之处:信号量中的val 代表什么意义???answer:表示信号量代表的资源的可用数量 摘自一个论坛上一个回帖,相当经典:

http://www.dzsc.com/dzbbs/20060225/200765201736984447.html

简单地说:

    当信号量=0时,表示信号量代表的资源不可用,操作系统就调用OSSemPend()函数的任务加入该信号量的等待任务列表中;

    当信号量>0时,表示信号量代表的资源可用,OSSemPend()函数返回,任务可以使用资源。

    一般地,信号量的最大值(nmax)表示资源的最大同时共享数。nmax=1,表示资源最多只能由一个任务使用,如读写某内存单元时,为保证该单元不被其它任务篡改,就使用nmax=1的(二值)信号量;nmax>1,表示资源可由多个任务使用,如FIFO,一个任务写某单元时,另一个任务可以写其它单元,则可使用nmax>1的(多值)信号量,信号量的大小用来表示FIFO的可用单元数。

    减1操作:当该信号量=0时表示FIFO已满,任务只能等待;当该信号量>0时表示FIFO有空,可以使用,同时要减1表示调用OSSemPend()函数的任务已经使用了一个资源(FIFO单元),可使用资源少了一个。

    加1操作:当某任务调用OSSemPost()从FIFO中取出一个值时,该FIFO单元就空出一个可写单元,也就是资源多了一个,为表示这个变化,信号量要加1,一旦信号量由0->1,则把资源给等待任务列表中优先级最高的任务(通过OSSemPend()函数的返回)。

    总之,信号量的值代表共享资源的剩余量,用掉一个减1,空出一个加1。



举个例子:



顾客(任务)到银行办事,银行(OS)现有N名业务员(共享资源)。

1. 办事前先要取号(OSSemPend()),号条一般有“前面有xx位顾客”,表示正在等待服务(资源)的顾客(任务)数。

2. 另外假设银行有一指示牌(信号量)指示当前空闲的业务员的数量为n(信号量的值)。

3.当n>0时,表示有空闲的业务员,那么顾客可以立即去业务员那办理业务(OSSemPend()立即返回),这样空闲的业务员就少一个,指示牌指示的数量(信号量的值)就要减1,但n只能减到0。

4. 当n=0时,表示没有空闲的业务员,那么顾客只能等待(OSSemPend()不返回,切换到其它任务)。

5. 当某位业务员为顾客办完手续后,他就空闲下来,这样空闲的业务员就多一个(调用OSSemPost)释放信号量,指示牌指示的数量(信号量的值)就要加1,但n只能加到N。

   这时银行就会去查找有没有正在等待的顾客,如果有,就找出其中优先级最高的顾客,让他来办理业务(OSSemPend()返回)。

6.顾客在取号时若设置了等待时间,那么在等待时间过后,银行就会通知顾客时间到(OSSemPend()返回),顾客接着去办其它事。

7.也有的顾客希望:在取号时,如果有空闲的业务员他就办事,没有的话就走(去办其它事),那么就要用特殊的取号方式(OSSemAccept())。

8. N=1时,表示只有一个业务员,指示牌只能指示0或1两个值,这就是二值信号量。



不知道这个例子能不能说清楚信号量的概念,请大伙完善。



关于2值信号量,还有一个例子如下:



楼上例子不错

再举一个互斥的例子

一间屋子,只能一人进去。门口箱子里放着一把钥匙。当有钥匙时箱子上显示1,无钥匙时显示0。来人看见1就打开箱子取出钥匙进屋,同时显示减一为0,再来人时看见0,就知道有人在屋里,于是在外等待,屋里人出来时,把钥匙放回箱中,显示加1。后面的人看见1又可以进入。

这里钥匙相当于信号量,根据钥匙的有无取0,1两个值。屋子相当于公用资源,同一时间只能由一人使用它。使用信号量保证不会有两人同时使用公用资源

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

431

主题

436

帖子

0

粉丝