标签: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----信号量
原文地址:http://10808695.blog.51cto.com/10798695/1827158