IO 系列——用户空间与内核空间

用户头像
Java联盟
关注
发布于: 2020 年 07 月 24 日
IO系列——用户空间与内核空间

为了能更好理解程序中IO的操作,我们首先需要了解一下计算机中关于IO的基础知识。在这篇文章中重点掌握三个知识点:

  • 计算机的组成;

  • 用户空间与内核空间;

  • 网络访问一个文件的IO过程;

1. 计算机的组成

现代计算机是由硬件、操作系统组成,操作系统通过内核与硬件交互。操作系统可以划分为:内核与应用两部分,内核提供进程管理、内存管理、网络等底层功能,封装了与硬件交互的接口,通过系统调用提供给上层应用使用。

图1

2. 用户空间与内核空间

由于CPU某些指令比较危险,如果错用会导致系统崩溃,为了保护系统,操作系统将内存空间划分为了两部分:

  • 内核空间;

  • 用户空间;



当进程运行在内核空间时,它就处于内核态;当进程运行在用户空间时,它就处于用户态。

当我们需要进行IO操作时,如读写硬盘文件、读写网卡数据等,进程需要切换到内核态,否则无法进行这样的操作,无论是从内核态切换到用户态,还是从用户态切换到内核态,都需要进行一次上下文的切换。一般情况下,应用不能直接操作内核空间的数据,需要把内核态的数据拷贝到用户空间才能操作。



3. IO示例

假如有一个网络请求想访问服务器上的某个静态文件,我们来看一下在这个示例中服务器的具体IO流程。

图2

整个过程如下:

  1. 进程发起一个系统调用sys_read,读取磁盘的文件;

  2. DMA将磁盘文件数据拷贝到内核空间的read缓冲区;

  3. CPU把内核空间read缓冲区数据拷贝到用户空间的缓冲区;

  4. 进程发起一个系统调用socket_write,向网卡写数据;

  5. CPU把用户空间缓冲区的数据拷贝到内核空间的socket缓冲区;

  6. 最后DMA把内核空间的socket缓冲区数据拷贝到网卡;



可以看到,在整个过程中进行了四次的数据拷贝,而且也进行了四次的上下文切换。这种IO操作的效率是比较低的,因为进行了多次数据拷贝,如果希望提高IO效率,可以减少其中的数据拷贝,后面讲到的零拷贝技术就是为了减少IO操作过程中的数据拷贝次数。



PS:DMA即直接存储器访问,可以看作CPU的一个辅助硬件访问的芯片,在进行内存与IO设备数据传输时,不需要CPU来控制,直接通过DMA进行。



IO相关文章

  1. IO系列——用户空间与内核空间

  2. IO系列——UNIX五种IO模型



发布于: 2020 年 07 月 24 日 阅读数: 28
用户头像

Java联盟

关注

海纳百川,有容乃大。 2019.04.18 加入

~

评论

发布
暂无评论
IO系列——用户空间与内核空间