作者:熊轶翔@熊仙僧,中国科学院软件研究所智能软件研究中心

上一章我们学习了进程调度,进程调度的过程是由操作系统内核管理的。在Linux中还存在着另一种由内核管理且又与进程运行息息相关的操作,也是就在本章所要介绍的进程间通信。

进程通信

在学习进程通信之前首先来了解一些要用到的概念。

  • 亲缘关系:比如Linux中进程的父子关系,兄弟关系。
  • 半双工:指数据可以在这个信号载体的两个方向上传输,但是不能同时传输。
  • 全双工:在半双工的基础上,信号可以同时在两个方向上传输。
  • 字节流:数据的存储以字节为单位,没有特别的格式。
  • 数据报:将数据以若干个字节为单位组织成具有一定格式的数据单位,这个数据单位就叫数据报。
  • 面向字节流:对于放入的数据只当作字节流来看待,而不关心数据内部的格式。
  • 面向数据报:和面向字节流相反,将传入的数据以数据报为单位进行传输。
  • 互斥:互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性[1]。
  • 同步:在互斥的基础上,通过某种机制让访问者对资源进行特定的顺序访问。

了解过Linux下进程空间的读者都已经知道进程只能在自己的内存地址空间内进行读写等操作,这虽然起到了保护内存的作用,但是进程间无法交流,这也就使得整个系统的作用有了很大的局限。为了克服这个局限,Linux提供了进程间通信(IPC)的机制。

以下是Linux下进程间通信的几种主要方式的简介[2]:

  1. 匿名管道:本质是内核提供的一段内存(以队列的方式实现),不同进程借助这段内存完成进程间通信。实现方法是将管道这段内存空间抽象成文件,通过其文件描述符来读写管道对应的这块内存。
  2. 命名管道:本质和匿名管道相同,对于进程通信的限制没有匿名管道那么苛刻。与匿名管道最大的区别就是命名管道可以通过其文件名来访问管道对应的内存。
  3. 消息队列:本质是内核中的一个链表,因此在访问消息队列的时候,以节点为单元,对数据进行读、写。
  4. 共享内存:同一块物理内存通过不同进程的页表分别映射到这些进程的虚拟地址空间中,当第一个进程修改变量时,对应物理内存地址保存的值发生变化,第二个进程再去读取,就能感知到变量的改变。
  5. 信号量:信号量并不是让进程间能够直接的发送字符串数据,而是通过内核提供的功能,来完成进程之间的同步和互斥。

进程间进行通信,免不了要让不同的进程操作相同的资源,此时就可能会发生竞争。在了解完进程通信的各种方式之后,我们再来了解一下竞争的概念。

竞争,顾名思义就是不同进程对于同一个资源的争夺,严重的时候甚至可能会发展成死锁。死锁则是个比竞争更能危害系统稳定性的因素。

死锁

上图即为死锁的状态图,图中的所有进程都在等待所需的系统资源,箭头表示发出箭头的进程在等待箭头指向的进程释放资源,当有等待的进程连成一个环之后,就发生了死锁。发生死锁的进程将会一直等待,大家都无法运行,这将是对系统资源的极大浪费,因此进程间通信所要解决的一大问题就是死锁问题。

总结

操作系统为了系统稳定以及数据的安全,把不同进程的逻辑空间都分隔开了,同时又提供了一系列系统调用来解决进程的通信问题。理论上,进程通信都是通过系统调用进行的,因此进程必须得到操作系统的许可才能进行通信。在学习进程通信的同时又引申出了竞争、死锁的概念,这些都是造成操作系统崩溃的主要原因之一。


参考:

[1]https://www.cnblogs.com/baizhanshi/p/6844356.html
[2]https://blog.csdn.net/giraffe_255/article/details/80751198

进程间通信方式_第四十九期-Linux内核中的进程概述(4)相关推荐

  1. 数据库管理-第四十九期 Exadata的存储节点管理(20221223)

    数据库管理 2022-12-23 第四十九期 Exadata的存储节点管理 1 咋个查看数据是否被缓存到闪存卡了没 2 EM13.5的Exadata监控 3 存储降级 总结 第四十九期 Exadata ...

  2. android 仿qq相册功能,Android第四十九期 - 仿QQ空间上传功能+本地数据库存储

    最近在看撸撸代码,他自己创了一种,网上有三种,分别是OpenDroid,greenDao,sugar,Sqlite原生写法,感觉都差不多,个人使用最优的是greenDao,下面开始介绍:    1.O ...

  3. 互联网创新创业大赛优秀范例_第五十九期创业沙龙——“互联网+”大学生创新创业大赛实践案例...

    原标题:第五十九期创业沙龙--"互联网+"大学生创新创业大赛实践案例 第五十九期创业沙龙 第六届"互联网+".2020年"创青春"系列竞赛开 ...

  4. 第四十二期-ARM Linux内核的系统调用(2)

    作者:罗宇哲,中国科学院软件研究所智能软件研究中心 上一期中我们介绍了ARM Linux内核中的系统调用和定义系统调用的流程,这一期我们将介绍系统调用的执行过程. 一.ARM Linux内核中系统调用 ...

  5. 量子计算帮助实现超冷离子调谐原子钟; 商业化的量子加强密钥将大幅提升网络的安全性 | 全球量子科技与工业快讯第四十九期

    量子计算机正在为宝马和LG等领军企业解决复杂的实际问题 在经过过去数年的研究与开发,部分企业开始相信目前的量子计算机已经可以帮助他们解决现实的商业问题了. 作为全球制造业巨头之一的宝马(BMW)认为量 ...

  6. 第四十九期:大牛总结的MySQL锁优化,写得太好了!

    随着 IT 技术的飞速发展,各种技术层出不穷,让人眼花缭乱.尽管技术在不断更新换代,但是有些技术依旧被一代代 IT 人使用至今. 作者:崔皓 随着 IT 技术的飞速发展,各种技术层出不穷,让人眼花缭乱 ...

  7. Android Studio 第四十九期 - Sqlite数据库四种写法

    最近在看撸撸代码,他自己创了一种,网上有三种,分别是OpenDroid,greenDao,sugar,Sqlite原生写法,感觉都差不多,个人使用最优的是greenDao,下面开始介绍: 1.Open ...

  8. 第四十九期:化繁为简的五种码农必备工具

    如今,开发工具已成为了软件开发过程中必不可少的组成部分.本文将向您介绍当前软件开发市场上颇具影响力的五种化繁为简的码农必备工具. 不知您是否已经发现:那些以任务为中心的软件开发工作,会比独立的研究式开 ...

  9. python布尔测试对象_面试题十九期-测试开发面试题之python系列-这个中~

    坚持梦想 就算所有人都不支持你.这条路会很曲折,你也会一度认为是不是自己选错了,但只要坚持,就算最后没有成功,但努力了就不会有遗憾. 测试开发python系列面试题 01 单选题 1.下列哪个语句在P ...

最新文章

  1. jQuery ajax 传递JSON数组到Spring Controller
  2. 一个想法照进现实-《IT连》创业项目:直觉型面试招聘的Bug
  3. 【bzoj2463】 谁能赢呢?
  4. [LeetCode] Palindrome Linked List
  5. net的retrofit--WebApiClient库
  6. 【机器视觉学习笔记】二值图像连通区域提取算法(C++)
  7. 前端学习(1800):前端调试之清除浮动练习1
  8. java radix sort_用于Radix Sort的Java程序
  9. Ubuntu在系统栏 给应用程序添加提示图标
  10. Window下完全卸载MySQL教程
  11. 大量的免费电子书下载地址
  12. Java线程状态以及 sheep()、wait()、yield() 的区别
  13. 计算机视觉学生论文,计算机视觉方面论文参考文献
  14. 构造不可测集-Vitalie Set
  15. 写给朋友们的Markdown教程,真的很好用,而且很简单
  16. C++ CURL使用
  17. 做互联网产品运营的一点心得
  18. python学习使用easyocr识别图片文字
  19. mapping文件的编写
  20. 限制 input text 只能输入数字

热门文章

  1. 【java基础知识】通过java实时查询数据库
  2. day32 java的多线程(4)synchronized
  3. php 工厂模式作用,PHP工厂模式的好处
  4. python接口测试_python接口测试—get请求
  5. linux进程作为服务,将一个监视进程做成linux系统服务
  6. java接口自动化测试的搭建_java接口自动化(一) - 接口自动化测试整体认知 - 开山篇(超详解)...
  7. 拼小圈营销群_深圳弘辽科技电商:拼多多“砍单免费拿”:一场关于人性的较量...
  8. 初分配和再分配图解_针织好看暖和的儿童帽子图解教程,宝妈们千万不要错过...
  9. dnf剑魂buff等级上限_DNF:又是随机大坑?8月新护石装备可升级,但升3个需要刷半年...
  10. vscode 多行 行尾_vscode 常用快捷键