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信号量 linux 51 sem信号量内存分配_临界资源


sem.c

行号

注释

8

创建新的信号量

9

如果创建失败,则可能信号量已存在

11

得到已存在的信号量

12

如果还是-1,则无法创建

18

如果是新创建的信号量,则初始化

21

初始化信号量的值为1

22

0为下标

sem信号量 linux 51 sem信号量内存分配_linux_02

行号

注释

33

下标

34

p操作

35

SEM_UNDO表示如果这里出错没有释放资源的话,系统帮你自动释放

37

1表示只有一个信号量

sem信号量 linux 51 sem信号量内存分配_临界资源_03


a.c

sem信号量 linux 51 sem信号量内存分配_共享内存_04


b.c(b没有destroy信号量,如果单独./b完记得ipcrm -s semid)

sem信号量 linux 51 sem信号量内存分配_linux_05


运行

sem信号量 linux 51 sem信号量内存分配_sem信号量 linux 51_06

2.共享内存shm

共享内存的使用一定伴随着信号量的使用。
共享内存每写入一个数据,便重头覆盖共享内存。

举个栗子:
Eg:一个输入一个读取

main.c

行号

注释

10

获得shmid

13

链接到一个地方NULL,s就指向这个空间

sem信号量 linux 51 sem信号量内存分配_sem信号量 linux 51_07

test.c

一个输入一个读取

sem信号量 linux 51 sem信号量内存分配_sem信号量 linux 51_08

这个程序当main中输入一次后但未输入第二次,test中会每隔一秒一直打印第一次输入的。为使test中只打印一次,我们进行如下优化:↓

Eg:上一道题改进版本

main.c

sem信号量 linux 51 sem信号量内存分配_sem信号量 linux 51_09


sem信号量 linux 51 sem信号量内存分配_信号量_10

test.c

sem信号量 linux 51 sem信号量内存分配_linux_11