IO 系列——用户空间与内核空间
为了能更好理解程序中IO的操作,我们首先需要了解一下计算机中关于IO的基础知识。在这篇文章中重点掌握三个知识点:
计算机的组成;
用户空间与内核空间;
网络访问一个文件的IO过程;
1. 计算机的组成
现代计算机是由硬件、操作系统组成,操作系统通过内核与硬件交互。操作系统可以划分为:内核与应用两部分,内核提供进程管理、内存管理、网络等底层功能,封装了与硬件交互的接口,通过系统调用提供给上层应用使用。
图1
2. 用户空间与内核空间
由于CPU某些指令比较危险,如果错用会导致系统崩溃,为了保护系统,操作系统将内存空间划分为了两部分:
内核空间;
用户空间;
当进程运行在内核空间时,它就处于内核态;当进程运行在用户空间时,它就处于用户态。
当我们需要进行IO操作时,如读写硬盘文件、读写网卡数据等,进程需要切换到内核态,否则无法进行这样的操作,无论是从内核态切换到用户态,还是从用户态切换到内核态,都需要进行一次上下文的切换。一般情况下,应用不能直接操作内核空间的数据,需要把内核态的数据拷贝到用户空间才能操作。
3. IO示例
假如有一个网络请求想访问服务器上的某个静态文件,我们来看一下在这个示例中服务器的具体IO流程。
图2
整个过程如下:
进程发起一个系统调用sys_read,读取磁盘的文件;
DMA将磁盘文件数据拷贝到内核空间的read缓冲区;
CPU把内核空间read缓冲区数据拷贝到用户空间的缓冲区;
进程发起一个系统调用socket_write,向网卡写数据;
CPU把用户空间缓冲区的数据拷贝到内核空间的socket缓冲区;
最后DMA把内核空间的socket缓冲区数据拷贝到网卡;
可以看到,在整个过程中进行了四次的数据拷贝,而且也进行了四次的上下文切换。这种IO操作的效率是比较低的,因为进行了多次数据拷贝,如果希望提高IO效率,可以减少其中的数据拷贝,后面讲到的零拷贝技术就是为了减少IO操作过程中的数据拷贝次数。
PS:DMA即直接存储器访问,可以看作CPU的一个辅助硬件访问的芯片,在进行内存与IO设备数据传输时,不需要CPU来控制,直接通过DMA进行。
IO相关文章
版权声明: 本文为 InfoQ 作者【Java联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/8ade06535a85e49f196cf79c7】。文章转载请联系作者。
评论