基于数据流分析,发现并减少内存拷贝次数,能降低CPU使用率,并减少内存带宽占用。
减少内存拷贝要基于业务逻辑进行分析,这里列举几种减少内存拷贝的实现机制:
如下两条语句将文件发送给对端,一般会有4次内存拷贝:
ssize_t read (int fd, void *buf, size_t count); ssize_t send (int s, const void * buf, size_t len, int flags);
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
内核通过DMA将文件搬运到缓存(一次内存拷贝),然后把缓存的描述信息(位置和长度)传递给TCP/IP协议栈,内核在通过DMA将缓存搬运到网卡(第二次内存拷贝)。
除了修改代码,部分开源软件已经支持这个特性,如Nginx可以通过sendfile on参数打开这个功能。
内存共享方式可以让多个进程操作同样的内存区域,相比socket通信的方式,内存拷贝少。应用程序可以使用shmget等函数实现进程间通信。