基础知识之什么是I/O

本文内容来之书籍《Netty 4核心原理与手写RPC框架实战》

1. 什么是I/O

我们都知道在UNIX世界里一切皆文件,而文件是什么呢?文件就是一串二进制流而已,其实不管是Socket,还是FIFO(First Input First Output,先进先出队列))、管道、终端。对计算机来说,一切都是文件,一切都是流。在信息交换的过程中,计算机都是对这些流进行数据的收发操作,简称为I/O操作(Input andOutput),包括往流中读出数据、系统调用Read、写入数据、系统调用Write。不过计算机里有那么多流,怎么知道要操作哪个流呢?实际上是由操作系统内核创建文件描述符(File Descriptor,FD)来标识的,一个FD就是一个非负整数,所以对这个整数的操作就是对这个文件(流)的操作。我们创建一个Socket,通过系统调用会返回一个FD,那么剩下的对Socket的操作就会转化为对这个描述符的操作,这又是一种分层和抽象的思想。

2. I/O交互流程

通常用户进程中的一次完整I/O交互流程分为两阶段,首先是经过内核空间,也就是由操作系统处理;紧接着就是到用户空间,也就是交由应用程序。具体交互流程如下图所示。

基础知识之什么是I/O_第1张图片

内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中,Linux使用两级保护机制:0级供内核(Kernel)使用,3级供用户程序使用。每个进程都有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的。最高的1G字节虚拟内核空间则为所有进程及内核共享。

操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据。因为Linux使用的虚拟内存机制,必须通过系统调用请求Kernel来协助完成I/O操作,内核会为每个I/O设备维护一个缓冲区,用户空间的数据可能被换出,所以当内核空间使用用户空间的指针时,对应的数据可能不在内存中。

对于一个输入操作来说,进程I/O系统调用后,内核会先看缓冲区中有没有相应的缓存数据,如果没有再到设备中读取。因为设备I/O一般速度较慢,需要等待,内核缓冲区有数据则直接复制到进程空间。所以,一个网络输入操作通常包括两个不同阶段。

(1)等待网络数据到达网卡,然后将数据读取到内核缓冲区。(2)从内核缓冲区复制数据,然后拷贝到用户空间。I/O有内存I/O、网络I/O和磁盘I/O三种,通常我们说的I/O指的是后两者。如下图所示是I/O通信过程的调度示意。

基础知识之什么是I/O_第2张图片

 

你可能感兴趣的:(操作系统,操作系统,linux,unix,I/O)