一、为什么会引进信号量
在这里,我们先说明几个概念。
1.同步:同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而等待。传递信息所产生制约关系。进程的直接制约关系就是源于它们之间的相互合作。
2.互斥:互斥亦成为间接制约资源。当一个进程进入临界区使用临界资源时,另一个进程必须等待,当临界资源的进程退出临界区后,另一个进程才允许去访问此临界资源。
3.临界资源:一次仅允许一个进程使用的资源叫做临界资源。
4.临界区:每个进程中访问临界资源的那段代码叫做临界区。
5.原子操作:原子操作是不可分割,在执行完毕前不会被任何事件或任务中断。
具体来说,原子操作有两种:
P操作:自减1操作
V操作:自增1操作
若能保证诸进程互斥的进入自己的临界区,便能实现诸进程对临界资源的互斥访问。为此,每个进程在进入临界区之前,应先对其欲访问的临界资源进行检查,看它是否正在被访问,如果此刻临界资源未被访问,进程便可进入临界区对资源进行访问,并设置它正在被访问的标志,如果正在被某进程访问,那么本进程不能进入临界区。
这里它是否正在被访问的标志就是信号量。
二、信号量
信号量用来记录临界资源的个数,当进程占用临界资源之前,必须对信号量进行P操作,当释放临界资源后,对信号量进行V操作。信号量可以当做是一个计数器,标志着是否有进程正在访问该临界资源。
对信号量有4种操作:
1. 初始化(initialize),也叫做建立(create) int sem_init(int key);
2. 等信号(wait),也可叫做