资源竞争
- 资源竞争:当多个进程在同时访问共享资源时,会产生资源竞争,最终最导致数据混乱
- 临界资源:不允许同时有多个进程访问的资源,包括硬件资源(CPU、内存、存储器以及其他外围设备)与软件资源(共享代码段、共享数据结构)
- 临界区:访问临界资源代码
多进程对 stdout 资源的竞争
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
int main(){
pid_t cpid;
cpid = fork();
if(cpid == -1){
perror("[Error] fork()");
exit(EXIT_FAILURE);
}
else if(cpid == 0){
while(1){
printf("----------------\n");
printf("C start.\n");
printf("C end.\n");
printf("---------------\n");
}
}else if(cpid > 0){
while(1){
printf("----------------\n");
printf("P start.\n");
printf("P end.\n");
printf("-----------------\n");
}
wait(NULL);
}
return 0;
}
二、同步与互斥
- 互斥 :同一时刻只有一个进程访问临界资源
- 同步: 在互斥的基础上增加了进程对临界资源的访问顺序
- 进程主要的同步与互斥手段是 信号量
信号量简介
- 信号量: 由内核维护的整数,其值被限制为大于或等于0
- 信号量可以执行如下操作:
- 将信号量设置成一个具体的值
- 在信号量当前值的基础上加上一个数值
- 在信号量当前值的基础上减上一个数值
- 等待信号量的值为 0
一般信号量分为 二值信号量 与 数信号量
- 二值信号量 :一般指的是信号量 的值为 1可以理解为只对应一个资源
- 计数信号量:一般指的是值大于等于2可以理解为对应多个资源0
- 在 Linux 系统中查询信号量使用 ipcs -s