admin管理员组

文章数量:1531793

2024年4月5日发(作者:)

如何高效实现文件传输

一般会如何实现文件传输?

服务器提供文件传输功能,需要将磁盘上的文件读取出来,通

过(网络)协议发送到客户端。如果需要你自己编码实现这个文件传

输功能,你会怎么实现呢?

通常,你会选择最直接的方法:从网络请求中找出文件在磁盘

中的路径后,如果这个文件比较大,假设有 320MB,可以在内存中

分配 32KB 的缓冲区,再把文件分成一万份,每份只有 32KB,这样,

从文件的起始位置读入 32KB 到缓冲区,再通过网络 A(PI) 把这

32KB 发送到客户端。接着重复一万次,直到把完整的文件都发送完

毕。如下图所示:

第 1 页 共 11 页

不过这个方案性能并不好,主要有两个原因。

上下文切换:

首先,它至少经历了 4 万次用户态与内核态的上下文切换。因

为每处理 32KB 的消息,就需要一次 re(ad) 调用和一次 wri(te)

调用,每次系统调用都得先从用户态切换到内核态,等内核完成任务

后,再从内核态切换回用户态。可见,每处理 32KB,就有 4 次上下

文切换,重复 1 万次后就有 4 万次切换。

上下文切换的成本并不小,虽然一次切换仅消耗几十纳秒到几

微秒,但高并发服务会放大这类时间的消耗。

内存拷贝:

其次,这个方案做了 4 万次内存拷贝,对 320MB 文件拷贝的

第 2 页 共 11 页

本文标签: 文件内核需要网络切换