文章目录

  • 1. 进程间的通信方式
  • 2. 信号量机制进行进程同步
  • 3. 原子操作P/V
    • 不加同步信号量的程序:
    • 使用信号量机制后的程序:

1. 进程间的通信方式

进程间的通信有以下几种方式:

1. 管道:管道分为有名管道和无名管道
2. 信号量:通过控制多个进程对临界资源的访问,使得同一时刻只允许一个进程对临界资源进行访问
3. 共享内存:把一块内存空间映射到两个进程的地址空间中,使得他们能够访问同一块内存空间,达到数据的共享。
4. 消息队列:向消息队列中添加数据,从消息队列中读取数据

2. 信号量机制进行进程同步

什么是信号量?信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。
当它的值大于0时,表示当前可用资源的数量;
当它的值小于0时,其绝对值表示等待使用该资源的进程个数。
注意,信号量的值仅能由PV操作来改变。

同步:对临界资源的互斥访问
临界区:访问临界资源的代码段
临界资源:同一时刻只能有一个进程来访问的资源

3. 原子操作P/V

P : 申请一个资源 资源数目减一,获取资源,进程进入,可能会发生阻塞.
V : 释放一个资源,资源数目加一,释放资源,进程出来,不会发生阻塞

使用PV操作实现进程互斥时应该注意的是:
(1)每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。
(2)P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。
(3)互斥信号量的初值一般为1。

不加同步信号量的程序:

程序A.c

   #include<stdlib.h>#include<stdio.h>#include<unistd.h>#include<string.h>#include<assert.h>int main(){int i=0;for(;i<5;i++){write(1,"A",1);int n=rand()%3;sleep(n);write(1,"A",1);n=rand()%3;sleep(n);}sleep(10);exit(0);} 

程序B.c

  #include<stdlib.h>#include<stdio.h>#include<unistd.h>#include<string.h>#include<assert.h>int main(){int i=0;for(;i<5;i++){write(1,"B",1);int n=rand()%3;sleep(n);write(1,"B",1);n=rand()%3;sleep(n);}exit(0);}

运行结果如下
从图中可以看出没有使用信号量机制的时候进程不是同步的;
同步时的输出结果应该是A和B是成对出现的
例如:AABBAABBAAAABBBBAABB这种样子

使用信号量机制后的程序:

程序A.c

#include<stdlib.h>#include<stdio.h>#include<unistd.h>#include<string.h>#include<assert.h>#include"sem.h"int main(){sem_init();int i=0;for(;i<5;i++){sem_p();write(1,"A",1);int n=rand()%3;sleep(n);write(1,"A",1);sem_v();n=rand()%3;sleep(n);}sleep(10);sem_destroy();exit(0);}

程序B.c

#include<stdlib.h>#include<stdio.h>#include<unistd.h>#include<string.h>#include<assert.h>int main(){sem_init();int i=0;for(;i<5;i++){sem_p();write(1,"B",1);int n=rand()%3;sleep(n);write(1,"B",1);sem_v();n=rand()%3;sleep(n);}exit(0);}

程序sem.h 为使用信号量同步进程的头文件

  #include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<assert.h>#include<sys/sem.h>union semun{int val;}; void sem_init();void sem_p();void sem_v();void sem_destroy();

程序sem.c

   #include"sem.h"static int semid=-1;void sem_init(){semid=semget((key_t)1234,1,IPC_CREAT|IPC_EXCL|0600);if(semid==-1){semid=semget((key_t)1234,1,0600);if(semid==-1){perror("semget error");return;}}else{union semun a;a.val=1;if(semctl(semid,0,SETVAL,a)==-1){perror("semctl error");}}return ;}void sem_p(){struct sembuf buf;buf.sem_num=0;buf.sem_op=-1;//pbuf.sem_flg=SEM_UNDO;//程序崩掉也会将资源还回去if(semop(semid,&buf,1)==-1){perror("semop p error");}}void sem_v(){struct sembuf buf;buf.sem_num=0;buf.sem_op=1;//vbuf.sem_flg=SEM_UNDO;//程序崩掉也会将资源还回去if(semop(semid,&buf,1)==-1){perror("semop v error");}}void sem_destroy(){if(semctl(semid,0,IPC_RMID)==-1)//若删除失败{perror("semctl error");}}

运行结果如下

由运行结果可以看出:使用信号量机制实现了进程之间的同步

IPC(进程间通信) | 信号量机制相关推荐

  1. Linux内核IPC命名空间 (一)(用户层信号量机制实现)

    Linux内核IPC机制 在Linux内核中IPC全名称之为进程间通信机制,共分为多种,如下: 信号量 共享内存 消息队列 管道 信号 套接字通信 每一种实现都有其独特特性,一下博客中我们会讲解其中的 ...

  2. system V IPC进程间通信机制一网打尽

    目录 必备IPCS命令解析 ipcs ipcrm Linux IPC消息队列 msgget msgsnd msgrcv msgctl Linux IPC信号量 理解信号量 semget semop s ...

  3. Linux IPC进程间通信(三):信号量

    系列文章: Linux IPC进程间通信(一):管道 Linux IPC进程间通信(二):共享内存 Linux IPC进程间通信(三):信号量 Linux IPC进程间通信(四):消息队列 文章目录 ...

  4. Android开发之IPC进程间通信-AIDL介绍及实例解析

    一.IPC进程间通信 IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢? 1. 管道(Pipe)及有名管道(named pipe):管道可用 ...

  5. 操作系统课设之基于信号量机制的并发程序设计

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  6. 音视频:06.linux系统-IPC进程间通信

    linux系统-IPC进程间通信 1.进程间通信的方式 2.管道(pipe) 3.共享映射区 4.信号 1.进程间通信的方式 文件,管道,信号.信号量,共享映射区(共享内存),消息队列,管道,套接字( ...

  7. Linux进程间通信—信号量

    二.信号量(semophore) 信号量是一种计数器,可以控制进程间多个线程或者多个进程对资源的同步访问,它常实现为一种锁机制.实质上,信号量是一个被保护的变量,并且只能通过初始化和两个标准的原子操作 ...

  8. IPC进程间通信 D-Bus(Desktop Bus)快速入门(以libdbus-glib库为例)

    文章目录 一.D-Bus简介 1.D-Bus简介 2.不同IPC通信方式比较 3.D-Bus特性 二.D-Bus架构 2.D-Bus接口层 3.D-Bus总线层 测试demo 4.D-Bus封装层 三 ...

  9. 操作系统实验报告8:进程间通信—消息机制

    操作系统实验报告8 实验内容 实验内容1:进程间通信-消息机制 编译运行课件 Lecture 09 例程代码: Algorithms 9-1 ~ 9-2. 修改代码,观察在 msgsnd 和 msgr ...

  10. 【Linux】进程间通信-信号量详解及编程实例

    前面一篇文章线程同步之信号量同步 讲的是线程之间的信号量,这篇讲的更加具有通用性,能够实现进程之间的同步. 信号量概述 信号量定义: 它是一个特殊变量,只允许对它进行等待和发送信号这两种操作. P(信 ...

最新文章

  1. tp3 普通模式url模式_Thinkphp 3.2.3 url 路由访问模式
  2. 私有云管理-Windows Azure Pack
  3. 某程序员求助:喜欢上漂亮的产品经理却不敢追,追不上太尴尬,公司也不允许办公室恋情!网友:别怂!...
  4. 硬件加速_来试试微软神油灵不灵:更新驱动体验硬件加速GPU计划功能
  5. 无人机寻迹要两个单片机吗_你知道要从哪两个方面选择硬质合金锯片吗?
  6. 【白话机器学习】算法理论+实战之LightGBM算法
  7. Orleans解决并发之痛(一):单线程
  8. 杭电ACM--2004成绩转换
  9. HTML怎么把文字分栏_html代码怎样优化更利于SEO排名
  10. bzoj 2440: [中山市选2011]完全平方数(二分+莫比乌斯函数)
  11. 【C#】反射与面向接口的架构
  12. java 向后台传两个json数据类型_前台向后台传递JSON字符串,处理JSON字符串类型的方法...
  13. prototype和__proto__的概念
  14. 【Python】pip超详细教程,pip的安装与使用,解决pip下载速度慢的问题
  15. 手机能打开的表白代码_不是程序员都能学会的5个表白代码,一学就会,附源码...
  16. 保研经历总结-清华大学计算机系
  17. 软件需求功能测试用例,软件测试用例与需求的对应关系
  18. 马原期末复习知识点完整版!
  19. IT十年人生过客-二十九-结婚
  20. 12 个组织良好的网络监控工具

热门文章

  1. echarts:中国地图-省市区二级联动
  2. linux 编译cgal,Linux环境下CGAL配置
  3. MMD中的VMD文件格式详解
  4. 控制算法简析3——LKA中PID控制的error选取
  5. pdf加水印的方法,pdf如何加水印?
  6. android 获取默认字体,Android中的默认字体系列是什么?
  7. 2020-2022年最全湖南省矢量数据(路网含城市道路、铁路(包括地铁、轻轨)高速、国道、省道、县道、乡道+几百万个poi数据+省市县乡镇行政区划+河流水系网+建筑轮廓+30米dem等shp数据
  8. Spring Boot基础教程 - 程序猿DD
  9. 给马斯克群发卫星算本账,星链计划跟5G有可比性么?
  10. pymc3学生成绩分析和预测(补充+翻译)