返回顶部
首页 > 资讯 > 服务器 >进程间的通信方式(六种)
  • 873
分享到

进程间的通信方式(六种)

linux运维服务器进程线程 2023-08-18 15:08:30 873人浏览 安东尼
摘要

进程之间的通信 参考文章:https://blog.csdn.net/qq_34827674/article/details/107678226 前提知识:每个进程都有自己的用户空间,而内核空间是每个进程共享的。因此进程之间想要进行通信,

进程之间的通信

参考文章:https://blog.csdn.net/qq_34827674/article/details/107678226

img

前提知识:每个进程都有自己的用户空间,而内核空间是每个进程共享的。因此进程之间想要进行通信,就需要通过内核来实现。

管道

管道是最简单,效率最差的一种通信方式。

管道本质上就是内核中的一个缓存,当进程创建一个管道后,linux会返回两个文件描述符,一个是写入端的描述符,一个是输出端的描述符,可以通过这两个描述符往管道写入或者读取数据。

如果想要实现两个进程通过管道来通信,则需要让创建管道的进程fork子进程,这样子进程们就拥有了父进程的文件描述符,这样子进程之间也就有了对同一管道的操作。

缺点:

  1. 半双工通信,一条管道只能一个进程写,一个进程读。
  2. 一个进程写完后,另一个进程才能读,反之同理。

消息队列:

管道的通信方式效率是低下的,不适合进程间频繁的交换数据。这个问题,消息队列的通信方式就可以解决。A进程往消息队列写入数据后就可以正常返回,B进程需要时再去读取就可以了,效率比较高。

而且,数据会被分为一个一个的数据单元,称为消息体,消息发送方和接收方约定好消息体的数据类型,不像管道是无格式的字节流类型,这样的好处是可以边发送边接收,而不需要等待完整的数据。

但是也有缺点,每个消息体有一个最大长度的限制,并且队列所包含消息体的总长度也是有上限的,这是其中一个不足之处。

另一个缺点是消息队列通信过程中存在用户态和内核态之间的数据拷贝问题。进程往消息队列写入数据时,会发送用户态拷贝数据到内核态的过程,同理读取数据时会发生从内核态到用户态拷贝数据的过程。

共享内存:

共享内存解决了消息队列存在的内核态和用户态之间数据拷贝的问题。

现代操作系统对于内存管理采用的是虚拟内存技术,也就是说每个进程都有自己的虚拟内存空间,虚拟内存映射到真实的物理内存。共享内存的机制就是,不同的进程拿出一块虚拟内存空间,映射到相同的物理内存空间。这样一个进程写入的东西,另一个进程马上就能够看到,不需要进行拷贝。

(这里的物理内存貌似不是内核空间的内存?)

信号量:

当使用共享内存的通信方式,如果有多个进程同时往共享内存写入数据,有可能先写的进程的内容被其他进程覆盖了。

因此需要一种保护机制,信号量本质上是一个整型的计数器,用于实现进程间的互斥同步

信号量代表着资源的数量,操作信号量的方式有两种:

  • P操作:这个操作会将信号量减一,相减后信号量如果小于0,则表示资源已经被占用了,进程需要阻塞等待;如果大于等于0,则说明还有资源可用,进程可以正常执行。
  • V操作:这个操作会将信号量加一,相加后信号量如果小于等于0,则表明当前有进程阻塞,于是会将该进程唤醒;如果大于0,则表示当前没有阻塞的进程。

(1)信号量实现互斥:

信号量初始化为1

  • 进程 A 在访问共享内存前,先执行了 P 操作,由于信号量的初始值为 1,故在进程 A 执行 P 操作后信号量变为 0,表示共享资源可用,于是进程 A 就可以访问共享内存。
  • 若此时,进程 B 也想访问共享内存,执行了 P 操作,结果信号量变为了 -1,这就意味着临界资源已被占用,因此进程 B 被阻塞。
  • 直到进程 A 访问完共享内存,才会执行 V 操作,使得信号量恢复为 0,接着就会唤醒阻塞中的线程 B,使得进程 B 可以访问共享内存,最后完成共享内存的访问后,执行 V 操作,使信号量恢复到初始值 1。

(2)信号量实现同步:

由于多线程下各线程的执行顺序是无法预料的,有些时候我们希望多个线程之间能够密切合作,这时候就需要考虑线程的同步问题。

信号量初始化为0

  • 如果进程 B 比进程 A 先执行了,那么执行到 P 操作时,由于信号量初始值为 0,故信号量会变为 -1,表示进程 A 还没生产数据,于是进程 B 就阻塞等待;
  • 接着,当进程 A 生产完数据后,执行了 V 操作,就会使得信号量变为 0,于是就会唤醒阻塞在 P 操作的进程 B;
  • 最后,进程 B 被唤醒后,意味着进程 A 已经生产了数据,于是进程 B 就可以正常读取数据了。

信号:

在Linux中,为了响应各种事件,提供了几十种信号,可以通过kill -l命令查看。

如果是运行在shell终端的进程,可以通过键盘组合键来给进程发送信号,例如使用Ctrl+C产生SIGINT信号,表示终止进程。

如果是运行在后台的进程,可以通过命令来给进程发送信号,例如使用kill -9 PID产生SIGKILL信号,表示立即结束进程。

Socket:

前面提到的管道,消息队列,共享内存,信号量和信号都是在同一台主机上进行进程间通信,如果想要跨网络和不同主机上的进程进行通信,则需要用到Socket

实际上,Socket不仅可以跨网络和不同主机进行进程间通信,还可以在同一主机进行进程间通信。

Socket是操作系统提供给程序员操作网络的接口,根据底层不同的实现方式,通信方式也不同。

Socket的系统调用:

int socket(int domain, int type, int protocal)

针对TCP的Socket通信:

img

  1. 服务端和客户端初始化Socket,得到文件描述符
  2. 服务端调用bind,绑定IP和端口
  3. 服务端调用listen,进行监听
  4. 服务端调用accept,等待客户端连接
  5. 客户端调用connect,向服务端发起连接请求。(tcp三次握手)
  6. 服务端调用accept返回用于传输的Socket的文件描述符(和第一点得到的Socket不同)
  7. 客户端使用write写入数据,服务端调用read读取数据
  8. 客户端断开连接时会调用close,服务端也会调用close(TCP四次挥手)

这里要注意的是,调用accept,连接成功得到的Socket是用来传输数据的,而第一次初始化Socket是用来监听的,是两个不同作用的Socket。

针对UDP的Socket通信:

img

来源地址:https://blog.csdn.net/OYMNCHR/article/details/124728256

--结束END--

本文标题: 进程间的通信方式(六种)

本文链接: https://lsjlt.com/news/374252.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 进程间的通信方式(六种)
    进程之间的通信 参考文章:https://blog.csdn.net/qq_34827674/article/details/107678226 前提知识:每个进程都有自己的用户空间,而内核空间是每个进程共享的。因此进程之间想要进行通信,...
    99+
    2023-08-18
    linux 运维 服务器 进程线程
  • linux进程间的通信方式有哪几种
    这篇文章主要介绍“linux进程间的通信方式有哪几种”,在日常操作中,相信很多人在linux进程间的通信方式有哪几种问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux进程间的通信方式有哪几种”的疑惑有所...
    99+
    2023-06-20
  • Linux进程间通信的方式
    这篇文章主要介绍“Linux进程间通信的方式”,在日常操作中,相信很多人在Linux进程间通信的方式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux进程间通信的方式”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-16
  • Vue组件间怎么通信?六种方式浅析
    Vue组件间怎么通信?下面本篇文章给大家介绍一下Vue组件通信的六种方式,希望对大家有所帮助!组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用。一般来说,组件可以有几种关系.针对...
    99+
    2023-05-14
    组件通信 前端 Vue.js
  • Python进程间通信方式
    目录一、通信方式二、Queue介绍三、方法介绍三、生产者和消费者模型四、什么是生产者消费者模式实现方式一:Queue实现方式二:利用JoinableQueue一、通信方式 进程彼此之...
    99+
    2024-04-02
  • 详解Android 进程间通信的几种实现方式
    一、概述 由于应用程序之间不能共享内存。在不同应用程序之间交互数据(跨进程通讯),在Android SDK中提供了4种用于跨进程通讯的方式。 这4种方式正好对应于android...
    99+
    2022-06-06
    进程 进程间通信 通信 Android
  • python进程间通信的方法有哪几种
    Python进程间通信的方法主要有以下几种: 管道(Pipe):使用multiprocessing模块中的Pipe()函数创建管...
    99+
    2024-04-09
    python
  • Linux进程间的通信方式有哪些
    本篇内容主要讲解“Linux进程间的通信方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux进程间的通信方式有哪些”吧!进程的概念进程是操作系统的概念,每当我们执行一个程序时,对于...
    99+
    2023-06-16
  • Android进程间通信的方式有哪些
    Android进程间通信的方式有以下几种:1. Intent:通过Intent对象进行进程间的通信。可以使用隐式Intent在不同的...
    99+
    2023-10-08
    Android
  • Linux进程间通信的方式有哪些
    本文小编为大家详细介绍“Linux进程间通信的方式有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux进程间通信的方式有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.管道管道分为有名管道和无名...
    99+
    2023-06-28
  • Python进程间的通信方式是什么
    这篇文章主要介绍“Python进程间的通信方式是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python进程间的通信方式是什么”文章能帮助大家解决问题。什么是进程的通信这里举一个例子接介绍通信...
    99+
    2023-06-29
  • Linux进程间通信的方式是什么
    本篇内容主要讲解“Linux进程间通信的方式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux进程间通信的方式是什么”吧!·进程间通信:操作系统为系统提供的用于实现进程间通信的方式进...
    99+
    2023-06-29
  • 进程间的通信
      使用 multiprocessing 里的 Queue() import multiprocessing def download_from_web(q): """下载数据""" # 模拟从网上下载的数据 ...
    99+
    2023-01-30
    进程 通信
  • 线程通信的四种方式
    多个线程在并发执行的时候,他们在CPU中是随机切换执行的,这个时候我们想多个线程一起来完成一件任务,这个时候我们就需要线程之间的通信了,多个线程一起来完成一个任务,线程通信一般有4种方式: 通过 vo...
    99+
    2023-09-05
    java
  • Python语法学习之进程间的通信方式
    目录什么是进程的通信队列的创建 - multiprocessing进程之间通信的方法进程间的通信 - 队列演示案例批量给 send 函数加入数据小节进程间通信的其他方式 - 补充什么...
    99+
    2024-04-02
  • android实现线程间通信的四种常见方式
    1,通过Handler机制 主线程中定义Handler,子线程发消息,通知Handler完成UI更新,Handler对象必须定义在主线程中,如果是多个类直接互相调用,就不是很方便,...
    99+
    2024-04-02
  • Python multiprocessing进程间通信方式如何实现
    这篇文章主要介绍“Python multiprocessing进程间通信方式如何实现”,在日常操作中,相信很多人在Python multiprocessing进程间通信方式如何实现问题上存在疑惑,小编查阅了各式资料,整理...
    99+
    2023-07-05
  • Java线程间通信方式
    前文了解了线程的创建方式和状态切换,在实际开发时,一个进程中往往有很多个线程,大多数线程之间往往不是绝对独立的,比如说我们需要将A和B 两个线程的执行结果收集在一起然后显示在界面上,又或者比较典型的消...
    99+
    2023-09-24
    java jvm 开发语言 android
  • python 进程间通信
    python multiprocessing multiprocessing 在2.6才开始使用 multiprocessing 是一个使用方法类似threading模块的进程模块。允许程序员做并行开发。并且可以在UNIX和Windo...
    99+
    2023-01-31
    进程 通信 python
  • Linux-进程间通信
    进程间通信 进程间通信介绍进程间通信目的进程间通信发展进程间通信分类 管道匿名管道匿名管道特点匿名管道读写规则 命名管道创建一个命名管道命名管道的打开规则用命名管道实现server&client通信 system...
    99+
    2023-08-19
    linux 服务器 网络 c++ C语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作