加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

UNIX情形高级编程:system V信号量

发布时间:2016-10-26 11:25:33 所属栏目:Unix 来源:站长网
导读:副标题#e# 1. 信号 量(semaphore)主要用于保护临界资源。 进程可以根据它判断是否能访问某些共享资源。 信号 量除了用于访问控制外,还可用于进程同步,也就是进程间通信。 2. 信号量分类: a. 二值信号量: 信号量的值只能取0或1,类似于互斥锁mutex,但两
副标题[/!--empirenews.page--]

1. 信号量(semaphore)主要用于保护临界资源。

进程可以根据它判断是否能访问某些共享资源。

信号量除了用于访问控制外,还可用于进程同步,也就是进程间通信。

2. 信号量分类:

a. 二值信号量: 信号量的值只能取0或1,类似于互斥锁mutex,但两者又不同:

mutex 与 二值信号量的区别:

信号量强调共享资源,只要共享资源可用,其他进程同样可以修改信号量的值;

互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来接锁。

b. 计数信号量:信号量的值可以取任意非负值。

system V信号量通过定义如下概念给信号量增加了另外一级复杂度。

计数信号量集:一个或多个信号量(构成一个集合),其中每个都是计数信号量。每个集合的信号量数存在一个限制,一般在25个数量级。

3.semget函数(信号量的创建)

semget函数创建一个信号量集或访问一个已存在的信号量集。

#include <sys/sem.h>  
int senget(key_t key,int nsems,int oflag);

nsems参数指定集合中的信号量数。如果我们不创建一个新的信号量集,而只是访问一个已存在的集合,那就可以把该参数指定为0。一旦创建完一个信号量集,我们就不能改变其中的信号量数。

oflag值是SEM_R和SEM_A常值得组合。他们还可以与IPC _CREAT或IPC_CREAT | IPC_EXCL按位或。

当实际操作为创建一个新的信号量集时,相应的semid_ds结构的以下成员将被初始化。

(1)sem_perm结构的uid和cuid成员被置为调用进程的有效用户ID,gid和cgid成员被置为调用进程的有效组ID。

(2)oflag参数中的读写权限位存入sem_perm.mode。

(3)sem_otime被置为0,sem_ctime则被置为当前时间。

(4)sem_nsems被置为nsems参数的值。

(5)与该集合中每个信号量关联的各个sem结构并不初始化。这些结构时在以SET_VAL或SETALL命令调用semctl时初始化的。

4.semop函数(操作信号量)

使用semget打开一个信号量集后,,对其中一个或多个信号量的操作就使用semop函数来执行。

#include <sys/sem.h>  
int semop(int semid,struct sembuf *opsptr,size_t nops);

其中opsptr指向一个如下结构的数组:

struct sembuf{  
           unsigned short sem_num;  /* semaphore number */
           short          sem_op;   /* semaphore operation */
           short          sem_flg;  /* operation flags */
};

假定有一个信号量变量sv,

P(sv):用于等待,如果sv大于0,就给它减去1,如果它的值等于0,就挂起该进程的执行

V(sv):用于发送信号,如果有其他进程因等待sv而挂起,就让它恢复运行,如果没有进程因等待sv而被挂起,就给它加1

semaphore sv=1;

loop forever{

P(sv);

critical code section;

V(sv);

noncritical code section;

}

查看本栏目更多精彩内容:http://www.bianceng.cn/OS/unix/

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读