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

  • 计算机的组成;
  • 用户空间与内核空间;
  • 网络访问一个文件的IO过程;

 

1. 计算机的组成

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

IO基础——用户空间与内核空间

2. 用户空间与内核空间

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

  • 内核空间;
  • 用户空间;

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

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

 

3. IO示例

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

IO基础——用户空间与内核空间

整个过程如下:

  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进行。

 

相关文章:

  • 2021-06-17
  • 2021-09-09
  • 2021-09-08
  • 2021-06-04
  • 2021-07-12
  • 2021-08-18
猜你喜欢
  • 2021-04-22
  • 2021-06-28
  • 2021-08-06
  • 2021-07-31
相关资源
相似解决方案