进程间通信-信号量

发布时间 2023-04-04 18:33:54作者: shubin

资源竞争

  • 资源竞争:当多个进程在同时访问共享资源时,会产生资源竞争,最终最导致数据混乱
  • 临界资源:不允许同时有多个进程访问的资源,包括硬件资源(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