Skip to content

管道

先来深入了解下请求交互的过程,

  1. 客户端进程调用 write 将消息写到操作系统内核为套接字分配的发送缓冲 send buffer。
  2. 客户端操作系统内核将发送缓冲的内容发送到网卡,网卡硬件将数据通过「网际路由」送到服务器的网卡。
  3. 服务器操作系统内核将网卡的数据放到内核为套接字分配的接收缓冲 recv buffer。
  4. 服务器进程调用 read 从接收缓冲中取出消息进行处理。
  5. 服务器进程调用 write 将响应消息写到内核为套接字分配的发送缓冲 send buffer。
  6. 服务器操作系统内核将发送缓冲的内容发送到网卡,网卡硬件将数据通过「网际路由」送到客户端的网卡。
  7. 客户端操作系统内核将网卡的数据放到内核为套接字分配的接收缓冲 recv buffer。
  8. 客户端进程调用 read 从接收缓冲中取出消息返回给上层业务逻辑进行处理。
  9. 结束。

在这个过程中重点关注 write 和 read ; write主要是将数据写入到操作系统内核的发送缓冲区就返回了,剩下的操作都是交给了操作系统异步完成的,如果缓冲区满了,write方法就会阻塞等待,这才是写操作真正的耗时情况。read操作只负责从操作系统内核缓存区中取出数据, 如何缓存区是空的,read就会阻塞等待,这是读操作真正耗时的情况

管道的本质就是客户端通过对管道中的指令列表改变读写顺序,把全部的write放在一起连续操作,read放到一起操作就可以大幅节省 IO 时间,服务器根本没有任何区别对待,还是收到一条消息,执行一条消息,回复一条消息的正常的流程。

对于管道来说,连续的write 操作根本就没有耗时,之后第一个read 操作会等待一个网络的来回开销,然后所有的响应消息就都已经回送到内核的读缓冲了,后续的 read 操作直接就可以从缓冲拿到结果,瞬间就返回了。

原文链接: http://herman7z.site