13_信号量sem、共享内存shm
文章目录
- 13_信号量sem、共享内存shm
- 1.信号量 sem
- 2.共享内存shm
13_信号量sem、共享内存shm
1.信号量 sem
一般取正数值,值代表资源的数据,0,1二值信号量,3计数信号量
P 对信号量的值 原子减一 代表获取资源
信号量值=0时代表没有可用资源了,那么p操作阻塞
V 对信号量的值 原子加一 代表释放资源
临界资源:同一时刻只允许一个进程访问的资源 临界区:访问临界资源的代码段
同步
内核提供接口:semget,semctl,semop
sem_init()
sem_p()
sem_v()
sem_destroy()
查看信号量ipcs
ipcs -s ipcs -m ipcs -q (信号量-s 共享内存-m 消息队列-q)
ipcrm -s 2:
ipcrm -s表示删除信号量;2表示刚才ipcs -s查出的semi
举个栗子:
Eg:给两个程序设置PV操作,
使他们能够连续打印出AABB或BBAA,而不是AB或BA。
sem.h
sem.c
行号 | 注释 |
8 | 创建新的信号量 |
9 | 如果创建失败,则可能信号量已存在 |
11 | 得到已存在的信号量 |
12 | 如果还是-1,则无法创建 |
18 | 如果是新创建的信号量,则初始化 |
21 | 初始化信号量的值为1 |
22 | 0为下标 |
行号 | 注释 |
33 | 下标 |
34 | p操作 |
35 | SEM_UNDO表示如果这里出错没有释放资源的话,系统帮你自动释放 |
37 | 1表示只有一个信号量 |
a.c
b.c(b没有destroy信号量,如果单独./b完记得ipcrm -s semid)
运行
2.共享内存shm
共享内存的使用一定伴随着信号量的使用。
共享内存每写入一个数据,便重头覆盖共享内存。
举个栗子:
Eg:一个输入一个读取
main.c
行号 | 注释 |
10 | 获得shmid |
13 | 链接到一个地方NULL,s就指向这个空间 |
test.c
一个输入一个读取
这个程序当main中输入一次后但未输入第二次,test中会每隔一秒一直打印第一次输入的。为使test中只打印一次,我们进行如下优化:↓
Eg:上一道题改进版本
main.c
test.c