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