码迷,mamicode.com
首页 > 其他好文 > 详细

IPC----信号量

时间:2016-07-17 18:03:51      阅读:383      评论:0      收藏:0      [点我收藏+]

标签:ipc----信号量


  1.什么是信号量

  信号量的本质 是一种数据操作锁(或者临界资源),它本身不具有数据交换功能,而是通过控制其他通信资源(文件,外部设备)来实现进程间通信,它本身是一种外部资源的标示。信号量在此过程中负责数据操作的护持,同步等功能;


2 为什么要使用信号量?

为了防止出现多个程序同时使用一个共享资源引发的一系列问题,信号量保证了在任何时刻只有一个线程访问代码的临界区,也就是说信号量是协调进程对共享资源访问的

1.临界资源:在某种时间内只允许一个进程访问的资源

2.临界区:访问临界资源的代码

3.信号量:本质就是一个计数器,记录某种资源的状况 (拿苹果,看盘子),是一个临界资源 ,所以PV操作在信号量中为原子操作(信号是一种事件通知机制)

原子操作:一件事情要么全做要么全不做

P,V操作

3.信号量的工作原理


P:申请资源如果sv的值大于1,就给它减1,如果它的值为0,就挂起该进程

V:临界资源累加,如果其他进程因等待sv被挂起,就让他恢复运行,如果进程没有因等待sv而被挂起,就给他加1


举个例子:就是两个进程共享信号量sv,其中一但一个进程执行了p操作,它将得到信号量,并可以进入了临界区,使sv-1.而第二个进程将被阻止进入临界区,因为当他试图执行p时sv为0,它将会被挂起以等待第一个进程离开临界区并执行v释放信号量,这时第二个进程就可以恢复执行。

4.linux的信号量机制

信号量的分配是以信号量集的形式 分配 

(1)semget函数创建一个新的信号量或获取一个已有的信号量

int semget(key_t key,int num_sems,int sem_flag);

key:是一个 整数值,不相关的进程可以通过它访问一个信号量,它代表程序可能要使用某个信号量资源,程序对信号量资源的访问都是间接的程序先通过调用semget函数并提供一个键,再由系统生成一个相应的信号标识符(semget函数的返回值),只有semget函数才直接使用信号量键,所有其他的信号量函数使用由semget函数返回的信号量标识符。如果多个程序使用相同的key值,key将负责协调工作。

num_sems:指定需要的信号量数目

sem_flags:一组标志,当想要的信号量不存在时创建一组新的信号量IPC_CREAT做按位或操作,设置了IPC_CREAT之后即使是一个键是已经存在的也不会出现错误,而IPC_CREAT|IPC_EXCL则可以创建一个新的唯一的信号量,如果信号量存在则返回错误。

int P(int sem_id,int num); sem_op -1

{

int op=-1;

return 

}

int V(); sem_op 1


ipcrm -s 0000566:删除信号量


总结:信号量是一种特殊的变量,程序对其访问都是源自操作,且只允许对他进行等待(P)和发送(V)信息操作,通常我们用信号量来解决多个进程对共享资源的访问问题,即在任意时刻只能有一个执行线程访问代码的临界区。

消息队列和信号量集随内核,如果用户不显示的删除则会一直存在;


IPC----信号量

标签:ipc----信号量

原文地址:http://10808695.blog.51cto.com/10798695/1827158

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!