I/O基础

I/O基础教程

Linux 系统中,万物皆文件,它把所有的外部设备都看作文件来操作。Linux 怎么对文件进行有效的管理呢?文件描述符 file descriptor(fd,文件描述符)就应运而生了。他是用来标识文件的概念或者术语。它是一个非负整数。

I/O 是输入输出端口,操作系统每个设备都有一个专有的 I/O 地址用来处理输入输出信息。CPU 与外部设备之间的通信连接和数据交换都需要通过 I/O 地址来实现。

I/O分层

Linux 下的 I/O 操作是一个复杂的过程。在操作 I/O 的过程中,它涉及到操作用户空间(应用程序)和内核空间(操作系统)。在用户层和内核层之间,有一个缓冲区,叫 Page Cache。

当我们往 Linux 内容写内容的时候,我们会调用 C 接口提供的 I/O 操作方法。将数据推送到 Page Cache 缓存池中,然后操作系统会有定时调度机制,将 Page Cache 池中的数据推到磁盘介质上面。如果数据在 Page Cache 中,没有推送到服务器磁盘上面,服务器出现了一些状况 down 机了,那么这部分数据会丢失。

当我们从 Linux 内核中读取数据的时候,会先判断,数据在 Page Cache 里面存在不存在,如果存在,就直接总 Page Cache 里面获取,如果不存在,就需要到内核中获取数据,然后填充到 Pape Cache 中,最后再返回给用户。

I/O模型

I/O 操作其实就是将用户区和内核区的数据进行流通。一次读的 I/O 操作,将数据从磁盘读取到操作系统的内核缓冲区,再从内核缓冲区读取到用户缓冲区。一次写的 I/O 过程是先将信息维护到用户缓冲区,然后写进 Page Cache。然后通过定时调度机制,将 Page Cache 里面的数据维护到磁盘空间中。在读或者写的过程中涉及到两个过程:

  1. 等待数据的准备
  2. 如果是读取:将数据从内核区拷贝到用户区,如果是写入:将数据从用户区写入到内核区。

磁盘I/O

01 IO交互.png

网络I/O

02 网络io交互.png

由于两个过程是不持续的,操作系统为了提升自身的性能,就设计了以下 5 种 I/O 通信模型

  • 阻塞 I/O
  • 非阻塞 I/O
  • I/O 多路复用
  • 信号驱动 I/O
  • 异步 I/O

I/O总结

本章我们对 I/O 的基础知识进行了了解,知道了 I/O 是分为用户域和内核域的。将用户域和内核域之间的信息进行交互,我们就用到了通信。后面我们就会讲解几种常见的通信模型。阻塞、非阻塞、多路复用、信号驱动和异步。