You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1.9 KiB
1.9 KiB
一、介绍
管道是由客户端提供的一种加快存取效率的技术。
如图所示,客户端将请求发给服务器,需要进过2个操作写->读,如果是多个操作就变成写->读->写->读
!
此时如果调整读写顺序,变成写->写->读->读,两个连续的写操作和两个连续的读操作总共只会花费一次网络来回。 管道的本质就是改变读写操作顺序来节省IO时间。管道中指令越多效果越好。
二、管道原理
- 客户段进程调用write将消息写到socket的send buffer中
- 客户端操作系统将发送缓冲的内容发送到网卡,网卡将数据通过路由送到服务器网卡
- 服务器操作系统将网卡内容放到socket的recv buffer中
- 服务器进程调用read从接收缓冲中读取消息进行处理
- 服务器进程调用write将响应消息写入到socket的send buffer中
- 服务器操作系统将发送缓冲的内容发送到网卡,网卡将数据通过路由送到客户端网卡
- 客户端器操作系统将网卡内容放到socket的recv buffer中
- 客户端进程调用read从接收缓冲中读取消息进行处理
- 结束 5~8和1~4步骤一样,方向不同。一个是请求,一个是响应。
重点:write操作只负责将数据写到send buffer就返回了,剩下的事情由操作系统处理。对于redis.get(key)来说,write操作几乎没有耗时,直接写到发送缓冲就返回,而read需要走完上述的流程。 对于管道来说,连续的write操作根本没有耗时,之后的第一个read操作会等待一个网络的来回开销,然后所有的响应消息就已经回到了recv buffer,后续的read操作就直接从recv buffer拿结果即可。
如果send buffer满了,那么就需要等待缓冲空出空间来,这就是写操作IO的真正耗时。