进程共享资源信号量控制详细实现.docVIP

  • 16
  • 0
  • 约2.47万字
  • 约 21页
  • 2018-08-04 发布于福建
  • 举报
进程共享资源信号量控制详细实现

信号量 信号量(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)

1亿VIP精品文档

相关文档