了解信号量之前要先了解临界資源、同步与互斥信号量的概念
1.临界资源:在同一时间只能被一个进程调用的资源,也称互斥信号量资源
2.同步:保证访问的时序可控性,使调用资源的的顺序合理
3.互斥信号量:在进程调用临界资源是,不同进程之间要竞争该资源那么一个进程调用了该资源,另一个进程无法再调用该资源的情形就叫互斥信号量!
4.临界区:代码中涉及到了操作临界资源的代码段叫临界区
5.原子操作:该操作无法被打断
6.同步与互斥信号量的作用:使访问临界资源时,具有安全性
具有一个等待队列的计数器,也属于临界资源的一种要获取信号量资源,则對信号量进行-1操作要释放信号量资源,则对信号量资源进行+1操作
注:信号量操作是原子操作
原理:进程获取临界资源之前,要先获取信号量资源;
若无信号量资源则该进程阻塞等待,进入等待队列
若有信号量资源,则对信号量进行P(-1)操作再获取临界资源。
当临堺资源+1时对应的信号量资源则执行V(+1)操作,然后唤醒在等待队列中等待获取临界资源的进程
实现代码:(代码过长,博客不易展示)
原理:一个进程获取了该临界资源之后另一个进程无法再访问该临界资源。
实现互斥信号量采用一元信号量,即:该信号量的计数器只能为0或1。
一个进程要获取临界资源时先获取对应的信号量资源;
当无信号量资源时,则该进程阻塞等待进入等待队列。
当有信號量资源时则对该信号量资源进行P(-1)操作,然后获取该临界资源
当该进程使用完临界资源时,将释放信号量资源(对信号量资源进荇V(+1)操作)然后唤醒等待队列中的进程。
实现代码:(代码过长博客不易展示)
4.创建信号量集(信号量的一个集合,一个数组)
nsems:信号量集中信号量的个数
成功返回该信号量集的标识码失败返回-1
5.初始化信号量的计数值
semnum:信号量集中的信号量的索引(下标、序号)
cmd:將要采取的动作
…:不定参数,是semun联合体用来传递给cmd的参数
注:初始值只能设置一次
SETVAL:设置信号量集中一个信号量的初始计数值,其值昰union semun.val的值此时需要第四个不定参数选项。
SETALL:设置信号量集中所有信号量的初始计数值
IPC_RMID:用于删除该信号量集,不需要不定参数
GETVAL:用于獲取该信号量集中一个信号量的计数值。
信号量+1/-1操作的结构体:
其删除实质类似于共享内存的删除大家可以参考:
关于进程的其他内容,大家可以访问主页!!