目录
- (1)定义:
- 信号量是一个特殊的变量,一般取正数值。它的值代表允许访问的资源数目,获取资源时,需要对信号量的值进行原子减一,该操作被称为Р操作。
- 当信号量值为О时,代表没有资源可用,Р操作会阻塞。释放资源时工需要对信号量的值进行原子加一,该操作被称为V操作。信号量主要用来同步进程。
- 信号量的值如果只取0,1,将其称为二值信号量。如果信号量的值大于1,则称之为计数信号量。
- 注意:正数值;加一减一是一个原子操作;
- (原子操作:信号量+1 -1,不能被打断)
(2)临界资源和临界区的概念
①临界资源:指计算机的软硬件资源;同一时刻,只允许进程或者线程访问的资源。
②临界区:访问临界资源的代码段。
- 不加控制模拟使用打印机
- 题目:进程a和进程b模拟访问访问打印机,进程a输出第一个字符'a'表示开始使用打印机,输出第二个字符’a‘表示结束使用,b进程操作与a进程相同。
- (由于打印机同一时刻只能被一个进程使用,所以输出结果不应该出现abab这样交替的结果)。
- //进程a.c
- #include
- #include
- #include
- #include
- #include
-
- int main()
- {
- int i=0;
- for(;i<5;i++)
- {
- printf("A");
- fflush(stdout);
- int n=rand()%3;
- sleep(n);
- printf("A");
- fflush(stdout);
- n=rand()%3;
- sleep(n);
- }
- }
-
- //进程b.c
- #include
- #include
- #include
- #include
- #include
-
- int main()
- {
- int i=0;
- for(;i<5;i++)
- {
- printf("B");
- fflush(stdout);
- int n=rand()%3;
- sleep(n);
- printf("B");
- fflush(stdout);
- n=rand()%3;
- sleep(n);
- }
- }
如果不加控制,两个进程运行结果:
(1)semget
- int semget(key_t key,int nsems,int semflg);//创建或者获取一个已经存在的信号量
- //key:给相同的key值,能得到相同的信号量
- //nsems:创建几个信号量;
- //semflg:标志位;如果为创建:IPC_CREAT;
- //如果为全新创建,也就是不知道是否有人创建过,则IPC_CREATE|IPC_EXCL,就是如果
没有则创建,如果有则创建失败 ;
(2)semop
- int semop(int semid,struct sembuf *sops,unsigned nsops);//对信号量进行改变,做P操作或者V操作;
- //semid:信号量的id号,也就是刚才semget的返回值;说明对哪个信号量进行操作;
- //sops:结构体指针,指向sembuf的结构体指针,sembuf结构体有三个成员变量:
①sem_num表示信号量的编号(即指定信号量集中的信号量下标);
②sem_op表示是p还是v操作;
③1为v操作。
注意:(加1),-1为p操作(减1);
sem_flg为标志位;
(3)semctl
- int semctl(int semid,int semnum,int cmd,...);//对信号量进行控制:初始化/删除信号量
- semid:信号量id;
- semnum:信号量编号;
- cmd:命令:SETVAL:初始化信号量;
- IPC_RMID:删除信号量;
**注意**:联合体semun,这个联合体需要自己定义;
(不存在abab交替打印)
思路: 在打印前进行p操作和v操作。
- (1)查看信号量和消息队列,共享内存:ipcs
- (2)只查看所有的信号量:ipcs -s
- (3)只查看所有的共享内存:ipcs -m
- (4)显示所有消息队列:ipcs -q
- (5)显示最近访问过IPC设施的进程ID ipcs -p ipcs -m -p ipcs -q -p
- (6)显示IPC设施的最后操作时间
ipcs -t
ipcs -q -t
ipcs -m -t
ipcs -s -t
- (7)显示IPC设施的当前状态
ipcs -u
- (8)显示IPC设施的权限关系
ipcs -c
ipcs -m -c
ipcs -q -c
ipcs -s -c
- (9)显示IPC设施的详细信息
ipcs -q -i id
注意:id 对应shmid、semid、msgid等。-q对应设施的类型(队列),查看信号量详细情况使用-s,查看共享内存使用-m。
- (10)显示所有的IPC设施
ipcs -a
如有错误,敬请指正。
您的收藏与点赞都是对我最大的鼓励和支持!