文章目录
- 进程互斥的4个概念
- 认识信号量
- 认识接口
- 理解IPC
信号量主要用于同步和互斥的,下面先来看看什么是同步和互斥。
进程互斥的4个概念
我们把大家都能看到的资源,称为公共资源。并且要想实现进程间通信,首要条件就是要让互相通信的进程看到同一份资源。
- 互斥:由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥,所以任何一个时刻,都只允许一个执行流在进行共享资源的访问。(解决方法:加锁)
- 我们把任何一个时刻,都只允许一个执行流在进行访问共享资源,叫做临界资源或互斥资源。
- 临界资源是要通过代码访问的,凡是访问临界资源的代码,叫做临界区(在进程中涉及到互斥资源的程序段叫临界区)。
- 原子性:要么不做,要么做完,只有两种确定状态的属性。
- 特性方面:IPC资源必须删除,否则不会自动清除,除非重启,所以system V IPC资源的生命周期随内核
认识信号量
信号量又称信号灯,本质是一个描述资源数量的计数器。
任何一个执行流,想访问临界资源中的一个子资源时,都不能直接访问,必须先申请信号量资源,相当于计数器count–(资源数量减1,OS会进行资源数量的判断,如果资源用完了,就会被挂起,阻塞进程,直到有进程将资源释放),申请成功后,才能进入自己的临界区,访问对应的临界资源。最后释放信号量资源,相当于把计数器count++(资源数量加1),只要将计数器增加,就表示将我们对应的资源进行了归还,这分别称为PV(荷兰语:通过and释放)操作。
可以类比生活中的电影院,看电影之前,我们得先买票,而买票的的本质功能就是对座位资源的预定机制,并且确保不会导致座位冲突。
假设我们要看晚上18:00的《蜘蛛侠:纵横宇宙》,我们得先申请座位,若预定座位成功了,则座位资源(临界资源就会减减),如果这一场电影的票被卖完了,那么我们就阻塞住了,直到有人退票(临界资源++),我们才能预定电影院放映厅的座位资源。
所有进程都必须先看到同一份信号量,竟然这样,那么信号量也是共享资源咯,所以信号量被归类到了进程间通信,但它不以传送数据为目的,而以让不同的进程看到同一份计数器为目的,并且信号量必须保证的++,–操作是保证原子性的。
认识接口
创建获取信号量
查看删除信号量——ipc
ipcs -s //查看信号量
ipcrm -s semid //释放信号量
或者使用semctl删除,类似共享内存。
控制信号量
信号量的数据结构如下:
信号量加减
对信号量集进行操作我们需要用semop函数,semop函数的函数原型如下:
int semop(int semid, struct sembuf *sops, unsigned nsops);
功能:
semop是用于操作信号量的系统调用函数之一,它可以实现对信号量进行P、V操作,从而解决多进程或多线程之间的互斥和同步问题。当一个进程要访问共享资源,需要调用semop函数执行P操作,该操作会将信号量减1,如果值小于0,则当前进程会被阻塞住,直到有其它进程执行V操作使信号量加加,释放共享资源。
P操作
:我们将申请信号量的操作叫做P操作,申请信号量的本质就是有权限访问临界资源,申请成功后,P操作的本质就是让计数器–即可V操作
:将释放信号量叫做V操作,归还临界资源,V操作的本质是让计数器++
参数解读:
- semid:要操作的信号量标识符,由semget函数返回。
- sops:类型是struct sembuf*,是一个指向sembuf结构体数组的指针,表示要对哪些信号量进行操作,sembuf结构体需要我们自己定义,它包括三个成员变量,分别是:sem_num(要操作的信号量在信号量集合中的下标),sem_op(对信号量执行的操作,负值代表P操作,正值代表V操作,0表示不做任何操作),sem_flg(控制操作行为的标志,默认SEM_UNDO在进程异常终止时撤销未完成的操作,因为信号量要保证其原子性)。
- nsops:表示要执行操作的sembuf结构体数量。