前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >进程通信原理

进程通信原理

作者头像
运维部落
发布2020-05-28 22:26:24
1.3K0
发布2020-05-28 22:26:24
举报
文章被收录于专栏:运维部落运维部落
  • 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)

代码语言:javascript
复制
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可通过协议来判断端口号。如非要指定其它端口,则需额外指定。

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

进程间通信

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维部落 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 进程通信原理
    • 1、同主机间的消息通讯机制
      • 1.1 管道(pipe),流管道(s_pipe)和有名管道(FIFO)
      • 1.2 信号(signal)
      • 1.3 消息队列
      • 1.4 共享内存
      • 信号量
      • 套接字(socket)
      • 进程间通信各种方式效率比较
    • 不同主机间的消息通讯机制
    相关产品与服务
    消息队列 CMQ 版
    消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档