获得徽章 0
#每天一个知识点# Linux操作系统将系统的资源(内存、CPU、IO)划分为用户态与内核态。用户态是指进程运行时CPU能够访问的资源范围,通俗地说就是进程可以直接使用的资源;内核态是指CPU可以访问的全部资源,包括操作系统内部数据结构、硬件寄存器等。

在用户态下,应用程序只能访问自己的逻辑地址空间,不能直接访问内核空间的地址。为了完成从用户态到内核态的操作,需要通过系统调用(如read、write等)来发起请求,由操作系统内核代为完成。

以write为例,应用程序通过write系统调用发起文件写入请求,将数据写入自己的缓冲区,然后将数据从用户空间拷贝到内核空间,再将数据刷回磁盘。read则相反,将数据从磁盘读取到内核空间,再拷贝到用户空间缓冲区。

然而,使用零拷贝技术可以避免数据在用户态与内核态之间的频繁拷贝,提高了IO效率。其中,mmap用于文件IO,可以完全避免拷贝,通过将文件映射到内存中,用户进程可以直接访问内核空间的页面缓存。sendFile针对网络IO,则直接将数据写入内核态的socket缓冲区中,不再使用用户进程的缓冲区。

综上,零拷贝技术可以避免数据在用户态和内核态之间的频繁拷贝,提高IO效率。同时需要注意的是,使用零拷贝时需要根据实际情况进行配置和优化,合理利用操作系统提供的API来最大化性能收益。
展开
1
下一页