关于进程间的通信方式的总结

news/2024/11/7 14:30:40/

一、背景

在人类思想史上,马克思第一次对人的本质作出科学界定:人的本质是一切社会关系的总和。时间万物都存在或多或少的关系。那么人除了天生父子这样的家族关系,还有后天 通过 语言 ,这样区别于其他动物的方式来进行和其他人的交流产生关系。

在计算机中,单个机器或者说应用玩儿是没有意思的,只是完成了个体的语言翻译【计算机的执行本质上也是一种语言翻译的过程,通过 中间层 将 人类语言 翻译为 机器语言】。因此,网络的诞生以及进程间的通信极大丰富了计算机世界。我们下面来看看 进程间、线程间是如何通信的以及现有的网络模型有哪些?


二、进程间通信

通信是指由一地向另一地进行消息的有效传递。关键点则是 抓住 (进程、线程、主机或集群),介质(文件、内存、管道、网线)。而进程的概念则是针对的操作系统的概念,所以研究范围则为操作系统。在现有的Linux操作系统的进程通信方式有以下几种。

分类

  • 管道
  • 消息传递、消息队列
  • 共享内存
  • 信号量
  • 信号
  • 信号驱动

在理解通信之前,我们先来简单回顾一些进程的基础概念。进程是资源分配(内存、文件等资源)的基本单位,在线程未出现之前也是CPU的调度单位。在Linux的表现为 task_struct 结构体(Linux下的进程控制块PCB)。可GitHub 去搜索一下 sched.h文件看看【快捷键T 】。重点关注一下 含有的资源。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
通过进程的基本属性,我们可以发现 进程 想要 和另外的进程交流 只能通过CPU的寄存器、内存、文件等公有的介质交流。

管道

基本概念

进程通信的使用例子之一是UNIX系统的管道通信。UNIX系统从System V 开始,提供有名管道和无名管道两种通信方式。

  • 匿名管道:像 ls | grep main 命令中 | 就是管道 ,作用是将ls命令的结果写入管道文件,grep再从管道文件中读出数据,过滤出名字中有“main”的文件。
  • 命名管道:也被叫做 FIFO,采用mkfifo 命令进行创建

特点

  • 通信效率低:由于管道文件处于磁盘,这种通信方式效率低,不适合进程间频繁地交换数据。
  • 半双工:只能单向写入、读出,通信需要建立两个fd
  • 实现简单:实现读写端,并且容易感知到。

消息队列(传递)

基本概念

设计一个中间层:消息队列(保存在内核中的消息链表),进行解耦,不让进程之间进行直接交互数据,通过处于运行于内核的消息链表(物理上的介质在内存层面,比文件更快)进行中转交互数据。
在这里插入图片描述

特点

  • 需要进行用户态和内核态的数据拷贝(消息队列位于内核,在读\取数据时需要系统调用)
  • 对于交换较少数量的数据很有用,无需避免冲突。
  • 对于分布式系统,消息传递易于实现。

共享内存

基本概念

为避免像消息传递的数据拷贝问题,共享内存则直接开辟进程进行交互的相同 物理 地址内存空间。
(对于进程角度来说就是拿出一块虚拟地址空间来,映射到相同的物理内存中。
在这里插入图片描述

特点

  • 交互速度更快(IPC最快的方式)
  • 存在高速缓存一致性问题,这是由共享数据在多个高速缓存之间迁移而引起的(信号量,PV操作来保证安全性)

信号

基本概念

对于异常情况下的工作模式,就需要用信号的方式来通知进程。
在 Linux 操作系统中, 为了响应各种各样的事件,提供了几十种信号,分别代表不同的意义。我们可以通过 kill -l 命令,查看所有的信号。

特点

  • 唯一的异步事件机制
  • 事件来源主要为硬件事件,其次才是软件

网络Socket

基本概念

网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。

特点

  • 用于不同主机间的进程通信
  • 需要经过相关的网络协议控制

三、线程通信

线程实际上是进程的特殊形式,在Linux实现上都是task_struct。它们直接通信则直接通过共享变量\全局变量进行交互,它们更多关注的是资源竞争问题。


http://www.ppmy.cn/news/9101.html

相关文章

2022 CSDN年度报告已出炉

2022年已过,我们迎来了2023年,那么在2022年,你在CSDN平台都做了些什么,收获了什么呢?2022 CSDN年度报告已出炉,来看看你的2022年度报告吧。 点此查看2022年度报告 或扫码查看你的2022 CSDN年度报告哦&…

Servlet运行原理及生命周期

Servlet运行原理及生命周期一、Servlet 运行原理1.1 Tomcat 的定位1.2 Tomcat 的伪代码1.2.1 Tomcat 初始化流程1.2.2 Tomcat 处理请求流程1.2.3 Servlet 的 service 方法的实现二、Servlet生命周期一、Servlet 运行原理 承接 Servlet基础教程:https://blog.csdn.n…

docker减少构建镜像大小

目录 1.原镜像大小 1.1 Dockerfile文件 1.2 hello文件 1.3 进入文件夹myprojecthello打包镜像 1.4查看打包的镜像 2.通过拆分文件夹减少镜像大小 2.1 创建两个文件夹 2.2 移动文件 2.3 打包镜像 3. 通过 .dockerignore 文件的方式 3.1 创建 world.txt文件 3.2 创建 …

Spring-boot启动失败 Unregistering JMX-exposed beans on shutdown 异常处理

目录一、异常错误二、原因三、解决方法一、异常错误 Spring-boot启动Run时,出现 o.s.j.e.a.AnnotationMBeanExporter - Unregistering JMX-exposed beans on shutdown 错误 *************************** APPLICATION FAILED TO START Description: The Tomcat conn…

vue新春游戏-拼手速抢车票小游戏,学习玩乐两不误,春节小游戏,新年小游戏

ue新春游戏-拼手速抢车票,老规矩,体验地址:http://game.pkec.net/word-ticket/。 写这个主要是前几天群里运营老师说咋没人写抢车票的,再加上我上一篇文章上了掘金一周,听说多上几次有证书,我还没搞到过掘金…

【Linux】文件操作|文件描述符|重定向

文章目录1.文件操作系统调用的几个基本接口openwritereadlseekwrite read close lseek ,对比C文件相关接口2.如何理解文件操作?3.文件描述符fd文件描述符的分配规则重定向使用 dup2 系统调用进行重定向4.在自己的shell中添加重定向功能:1.文件操作系统调…

Linux:使用telnet命令提示:Connection refused

我是 ABin-阿斌:写一生代码,创一世佳话,筑一览芳华。如果小伙伴们觉得不错就一键三连吧~ 下一篇:Linux安装telnet命令教程 文章目录一、分析没有xinetd服务:二、讲解: 什么是 telnet 命令具体语法具体参数三…

信息学奥赛一本通 1916:【01NOIP普及组】求先序排列 | 洛谷 P1030 [NOIP2001 普及组] 求先序排列

【题目链接】 ybt 1916:【01NOIP普及组】求先序排列 洛谷 P1030 [NOIP2001 普及组] 求先序排列 【题目考点】 1. 二叉树 【解题思路】 已知中序、后序遍历序列,构建二叉树,而后对该二叉树做先序遍历,得到先序遍历序列。 该题…