美文网首页
《操作系统概念精要》基本概念整理之进程篇(三)

《操作系统概念精要》基本概念整理之进程篇(三)

作者: 小pb | 来源:发表于2019-10-29 16:33 被阅读0次

进程间通信

操作系统的并发执行的进程可以是独立的也可以是协作的。一个进程的运行不会影响其他进程的运行,那么这个进行时独立的。显然,不与任何其他进程共享数据的进程是独立的。相反的,进程之前就是相互协作的。协作的进程之间会有共享的数据。

协作进程需要进行进程间通信(InterProcess Communication, IPC)机制,以允许进程相互交换数据与信息。
就目前大多数系统来说,进程间的通信一般由两种基本模型:共享内存消息传递
消息传递在交换少量的数据量来说很有用,而且在分布式系统中,消息传递是比共享内存更容易实现。如业界的kafka。
共享内存的优点是快于消息队列,这是因为消息传递经常使用系统调用,而共享内存是在内存里映射一个共享内存区域,访问他就和内存的速度一样,不需要内核进行干预。

IPC.png

对于消息传递和共享内存,会在后面的文章中详细去讲解,这里只做最基本的概念整理。

共享内存

采用共享内存进行通信,需要通信的进程公共的共享内存区域。通常,一个进程创建一个共享内存区域,这块内存会驻留在创建共享内存段的进程的地址空间里,其他希望使用共享内存的进程需要将这块地址附加到自己的地址空间里。

消息传递

消息传递提供一种机制,以便允许进程不必共享地址空间来实现通信和同步。对分布式系统特别有用。
假如两个进程,P和Q需要进程通信,他们需要互相发送和接受消息:他们必须有通信链路。该通信链路有多种实现方法。但这里不关心物理实现。
一般消息传递工具,至少提供两种操作:

 send (messge)     
 receive(message)

同步

进程间通信可以通过调用原语 send() 和receive()来进行。实现这些原语有很多种设计方案。
消息在传递的时候可以是阻塞的(blocking),也可以是非阻塞的(nonblocking), 也称为同步的(synchronous)异步的(asynchronous)

  • 阻塞发送: 发送进程阻塞,直到消息由接收进程或者邮箱所接收。
  • 非阻塞发送: 发送进程发送消息,不用等待接收进程回复,继续自己的操作。
  • 阻塞接收:接收进程阻塞,直到有消息可用。
  • 非阻塞接收: 接收进程收到一个有效消息或者空消息。

网络进程通信

了解了使用共享内存和消息传递进行通信。但是现在使用最多的还是基于客户端/服务器通信的方式。
这里介绍网络通信最常用的两种策略和历史的IPC机制管道: 套接字(socket), 远程程序调用(RPC)和管道。

套接字

套接字为通信的端点。通过网络通信的每对进程需要使用一对套接字,每个进程表示一个端点。
每个套接字由一个IP地址和一个端口组成。通常,套接字采用客户端——服务器的架构。服务器通过监听指定端口,来等待客户请求。服务器收到请求后,接收来到套接字的连接,从而完成套接字的连接。(此细节和三次握手相关过程参考和计算机网络有关的参考书)。


socket.png

远程过程调用(RPC)

RPC 与IPC想对应,是目前业界许多互联网公司常用的通信方式。目前业界用的比较多rpc框架的有:应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。

和IPC不同的是,RPC通信交换的消息具有明确的结构,而不仅仅是数据包。消息传递到RPC服务,RPC服务监听远程系统的端口号;消息包含用于指定,执行的函数的一个标识符和传给函数的参数。函数按照要求来进行执行,而所有的结构会通过另一种消息传递给请求方。
rpc的通信过程:
RPC语义上允许客户端调用位于远程主机的过程,就如同调用本地的过程一样。它一般通过客户端提供的存根(stub), 当用户调用远程过程是,RPC系统调用适当的存根,并且传递远程过程参数,都有存根定位服务器的端口,并且封装参数并且对rpc的内部结构进行序列化并进行打包。然后像服务器发送一个消息。
服务器根据类似于存根接收到这个消息,并且调用定义好的Rpc协议格式,对封装的结构解包并进行反序列化,得到客户端的消息。

rpc_call.png

管道

管道允许两个进程进行通信,早期是Unix系统最早使用的一种IPC通信机制。现在基本不怎么用了。
这里做最基本的管道设计考虑。

  • 管道允许单向通信还是双向通信。
  • 如果允许双向通信,他是半双工的还是全双工的。
  • 通信进程之间是否应该有一定的关系(父子进程)
  • 管道通信是否只能在单机进行,是否可以在网络上用?

根据管道的类型分为:普通管道和命名管道

普通管道

回答上面的问题。

  • 普通管道是单向的,要双向通信,就要两个管道。
  • 普通管道通信是在父子进程间进行的。所以肯定不能进行网络通信。
pipe.png
命名管道(FIFO)
  • 命名管道可以是双向的。但是具体在实现的时候一般都是半双工的,如果要实现双向通信,需要两个FIFO。
  • 不需要是父子关系。
  • 只能在一台机器上使用,网络通信还是选择套接字。

相关文章

网友评论

      本文标题:《操作系统概念精要》基本概念整理之进程篇(三)

      本文链接:https://www.haomeiwen.com/subject/dyfgvctx.html