信号量

1.信号量(又名:信号灯)与其他进程间通信方式不大相同,主要用途是保护临界资源。
进程可以根据它判定是否能够访问某些共享资源。除了用于访问控制外,还可用于进程同步。
信号量是用来解决进程之间的同步与互斥问题的一种进程之间通信机制,包括一个称为信号量的变量和在该信号量下
等待资源的进程等待队列,以及对信号量进行的两个原子操作(PV操作)。其中信号量对应于某一种资源,取一个非
负的整型值。信号量值指的是当前可用的该资源的数量,若它等于0则意味着目前没有可用的资源。
2.信号量大致分为两类:
(1)二值信号灯:
信号灯的值只能取0或1,类似于互斥锁。 但两者有不同:
信号灯强调共享资源,只要共享资源可用,其他进程同样可以修改信号灯的值;互斥锁更强调进程,占用资源的进程
使用完资源后,必须由进程本身来解锁。
(2)计数信号灯:
信号灯的值可以取任意非负值。
3.PV原子操作的具体定义为:
P操作:如果有可用的资源(信号量值>0),则占用一个资源(给信号量值减去一,进入临界区代码);如果没有可用
的资源(信号量值等于0),则被阻塞到,直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进
程.P:-1。
V操作:如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞进程。如果没有进程等待它,则释放一个
资源(给信号量值加一)。V:+1。
4.有关信号量操作的函数:
(1)semget
函数作用: 创建信息量
函数的原型:int semget(key_t key, int nsems, int semflg);
函数的参数:key:键值;多个进程可以通过访问它访问同一个共享内存,其中有个特殊值IPC_PRIVATE,它用于创                                建当前进程的私有共享内存。
             nsems:信号量的数目,通常是1;
             semflg:权限位;  IPC_CREAT,创建,  IPC_EXCL:如果有则出错;
返回值:成功:信号量的标识符;出错-1;
(2) semctl
函数的作用: 信号量的控制
函数的原型:int semctl(int semid, int semum, int cmd, union semun arg);
函数的参数:semid:信号量标识符;
              semnum: 信号量的编号;0;
              cmd:IPC_SETVAL,将信号量设置为arg的val值
   
                IPC_GETVAL:返回信号量的当前值;
   
                IPC_RMID: 删除信号量;
              arg:
                       union  semum
  {   
    
int val;
    struct  semid_ds  *buf;
    unsigned short *array;
                        }
返回值:  IPC_STAT,IPC_SETVAL,IPC_RMID:0;
                 IPC_GETVAL:  返回信号量的当前值;
                 出错-1;
(3)semop
   函数的作用;信号量的PV操作;
   函数的原型:int semop(int semid,  struct sembuf *sops, size_t nsops);
   函数的参数:semid:信号量标识符
                         sops:
                                  struct sembuf 
                                  {
    short sem_num;    0
    short sem_op;     P:-1, V:+1
    short sem_flg;   : SEM_UNDO
    }
                         nsops:通常取1
返回值: 成功信号量的标识符;出错-1;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值