专栏首页运维部落进程通信原理

进程通信原理

  • 1、同主机间的消息通讯机制
    • 1.1 管道(pipe),流管道(s_pipe)和有名管道(FIFO)
    • 1.2 信号(signal)
    • 1.3 消息队列
    • 1.4 共享内存
    • 1.5 信号量
    • 1.6 套接字(socket)
    • 1.7 进程间通信各种方式效率比较
  • 2、不同主机间的消息通讯机制

进程通信原理

我们每天使用互联网,你是否想过,它是如何实现的?

全世界几十亿台电脑,连接在一起,两两通信。上海的某一块网卡送出信号,洛杉矶的另一块网卡居然就收到了,两者实际上根本不知道对方的物理位置,你不觉得这是很神奇的事情吗?

互联网的核心是一系列协议,总称为"互联网协议"(Internet Protocol Suite)。它们对电脑如何连接和组网,做出了详尽的规定。理解了这些协议,就理解了互联网的原理。

为了让互联网安全且可靠,人们发明了著名的OSI七层模型、TCP/IP四(五)层模型和种类繁杂的加解密算法,但这些均不是本次要介绍的内容。我们这次要聊的是进程数据通信

1、同主机间的消息通讯机制

进程间的通讯机制有如下6种方式,其它哪些属于主机间进程通信,哪些属于同主机上的进程间通信呢。我们分别来看。

  • (1) 管道(pipe),流管道(s_pipe)和有名管道(FIFO)
  • (2) 信号(signal)
  • (3) 消息队列
  • (4) 共享内存
  • (5) 信号量
  • (6) 套接字(socket)

1.1 管道(pipe),流管道(s_pipe)和有名管道(FIFO)

pwd|ls

如上大家经常用到的命令就使用管道

管道这种通讯方式有两种限制:

  • 半双工的通信,数据只能单向流动;
  • 只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

流管道s_pipe ,去除了第一种限制,可以双向传输。命名管道:name_pipe,克服了管道没有名字的限制,因此,即具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

1.2 信号(signal)

信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;

linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);

1.3 消息队列

消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。

1.4 共享内存

共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

**使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。**是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

信号量

信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

套接字(socket)

套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信

更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:LinuxSystem V的变种都支持套接字。

进程间通信各种方式效率比较

效率比较

各种通信方式的比较和优缺点

  • 管道:速度慢,容量有限,只有父子进程能通讯
  • FIFO:任何进程间都能通讯,但速度慢
  • 消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
  • 信号量:不能传递复杂消息,只能用来同步
  • 共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存

不同主机间的消息通讯机制

每个网络应用都是基于Client/Server架构。这种模型下,一个应用是由一个服务器进程和一个或多个客户端进程组成。服务器管理某种资源,并且通过操作这些资源为客户端提供服务。

ClientServer之间是如何通信呢?对的,Socket。只有这种方式,且前提是通信主机提前知道服务器端的监听端口。即Server监听DIP+DPORT,Client发起SIP+SPORT

DPORT必须始终处于监听状态,随时供Client来连接。这里延伸两个知道点,始终监听有2种方式:瞬时Daemon和长驻Daemon进程。如ftp就是瞬间Daemon进程,在CentOS6中由xinetd统一维护,在CentOS7中由systemd统一管理。

端口如何让别人知道呢,由互联网机构统一管理,为某些众所周知的应用分配好一些固定的端口,这些特定应用只能使用这些端口,通过这些默认端口访问是无需单独跟上端口号,如http可通过协议来判断端口号。如非要指定其它端口,则需额外指定。

这些端口是独占模式,在使用的过程,其它服务是不可使用的。

进程间通信

本文分享自微信公众号 - 运维部落(linux178),作者:松鼠尚学堂

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Hello World

    呃,看起来好像不大简单的亚子。如果对计算机系统工作机制没有一定了解,理解起来确实会有困难。我们逐一来看。

    运维部落
  • AWK 专家必备的12个技巧

    AWK 专家必备的12个技巧案例1:字符切割案例2:格式化输出案例3:不显示文件最后一行案例4:不显示最后一列案例5:多列求和案例6:求每行最大值/最小值/平均...

    运维部落
  • 逐字节解包剖析TCP握手&挥手

    在这里不得不再吐槽下国内整个IT粗糙浮躁,度娘下来的中文文档几尽抄袭~google下来的文档英文文档质量远高于国内中文文档.

    运维部落
  • Android多进程总结1

    正常情况下,一个apk启动后只会运行在一个进程中,其进程名为apk的包名,所有的组件都会在这个进程中运行,以下为DDMS的进程截屏:

    随心助手
  • Linux - 请允许我静静地后台运行

    前言 常在 linux 下玩耍的开发者肯定会经常遇到需要对进程调度的情况,在 windows 中点击 最小化 去干别的就 OK 了,那么在 linux 下怎么办...

    枕边书
  • linux进程管理

    查看进行使用的指令是 ps ,一般来说使用的参数是 ps -aux,ps -ef,正常与grep连用

    小小咸鱼YwY
  • [每天五分钟,备战架构师-2]操作系统基本原理

    操作系统是管理和控制计算机硬件和软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件。注意,这里说的裸机可以是物理机,也可以是虚拟机。随着技术的发展,...

    大江小浪
  • Linux 进程总结

    进程,是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。它的执行需要系统分配资源创建实体之后,才能进行。...

    杰哥的IT之旅
  • 小说python中的孤儿进程

    然而,在实际应用中,孤儿进程虽然不会给系统造成直接性的危害,但更多时候会对业务造成一些影响,如当子进程为一个基于tcp的socket服务时,会造成主进程再次启动...

    用户2196567
  • 进程

    以前的计算机一次只能执行一个程序,后来有了多道程序设计的电脑,可以宏观上执行多个程序。由此产生了进程的概念

    用户5426759

扫码关注云+社区

领取腾讯云代金券