[进程共享资源信号量控制详细实现源码及解释.docVIP

[进程共享资源信号量控制详细实现源码及解释.doc

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[进程共享资源信号量控制详细实现源码及解释

信号量 信号量(Semaphore)简单的说就是用来控制多个进程对共享资源使用的计数器。它是常被用作一种锁定保护机制,当某个进程对资源进行操作时阻止其他进程对该资源的访问。需要注意的是,System V中的的信号量对象实际上是信号量的集合(set),它可以包含多个信号量,控制多个共享资源。 有关的数据结构 和消息队列一样,我们在介绍他的使用前先介绍一些相关的数据结构: sem 前提提到,信号量对象实际是多个信号量的集合。在Linux系统中,这种集合是以数组的形式实现的。数组的每个成员都是一个单独的信号量,它们在系统中是以sem结构的形式存储的。Sem的结构在Linux系统linux/sem.h中定义是这样的: /* One semaphore structure for each semaphore in the system. */ Struct sem{ Short sempid; /*pid of last operation*/ Ushort semval; /*current value*/ Ushort semncnt; /*num procs awaiting increase in semval*/ Ushort semzcnt; /*num procs awaiting semval=0*/ }; 其中, Sem_pid成员保存了最近一次操作信号量进程的pid。 Sem_semval成员保存着信号量的计数值。 Sem_semncnt成员保存着等待使用资源的进程数目。 Sem_semzcnt成员保存等待资源完全空闲的进程数目。 2.semun Semun联合在senctl()函数中使用,提供senctl()操作所需要的信息。它在Linux系统linux/sem.h中定义是这样的: /*arg for semctl system calls */ Union semun{ Int val; /*value for SETVAL*/ Struct semid_ds *buf; /*buffer for IPC_STATSETALL*/ Ushort *array; /*array for GETALLSETALL*/ Struct seminfo *__buf; /* buffer for IPC_INFO*/ Void *_pad; }; 前三个参数在对senctl()函数介绍中会讲到,这里暂时先不管它们。后两个参数是Linux系统所独有的,只是系统的内核中使用。 3. semuf semuf结构被semop()函数(后面会讲到)用来定义对信号量对象的基本操作。它在linux/sem.h中是这样定义的: /*semop system calls takes an array of these.*/ Stcuct sembuf{ Unsigned short sem_num; /*semaphore index in array*/ Short sem_op; /*semaphore operation*/ Short sem_flg; /*operation flags*/ }; 其中, Sem_num 成员为接受操作的信号量在信号量数组中的序号(数组下标)。 Sem_op成员定义了进行的操作(可以是正,负和零)。 Sem_flg是控制操作行为的标志。 如果sem_op是负值,就从指定的信号量中减去相应的值。这对应着获取信号量所监控 的资源操作。如果没有sem_flg指定IPC_NOWAIT标志,那么,当现有的信号量数值小于sem_op的绝对值(表示现有的资源少于要获取的资源)时,调用semop()_函数的进程就会被阻塞知道信号量的数值大于sem_op的绝对值(表示有足够的资源被释放)。 如果sem_op是正值,就在指定的信号量中加上相应的值。这对应着释放信号量所监控 的资源 操作。 如果sem_op是零,那么调用semop()函数的进程就会被阻塞到直对应的信号量值为零。 这种操作的实质就是等待信号量所监控的资源被全部使用。利用这种资源操作可以动态监控资源的使用并调整资源的分配,避免不必要的等待。

文档评论(0)

34shart09 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档