学IO之前需要先了解几个概念,这篇文章中不说同步、非同步,阻塞、非阻塞的概念,直接说太干。对IO中计算机底层比较感兴趣,可以读一下这篇IO和DMA原理
几个概念:
内核空间:所有的程序都需要加载到内存中才能运行,而操作系统也是程序的一种,程序被加载到内存之后,操作系统占用的这部分内存被称为内核空间。内核空间中的指令拥有最高指令权限,可以直接访问硬件,可以执行机器能够运行的任何指令,安全性要求极高也更为复杂。
用户空间:除操作系统之外的程序加载到内存中所占用的内存空间被称为用户空间。用户空间所能执行的指令知识所有指令中的一个子集,比如计算(add)可以读写(read,write)不行。用户没法直接访问计算机硬件,当然计算机硬件设备也没法直接访问用户空间。当进程请求 I/O 操作的时候,它执行一个系统调用将控制权移交给内核。
I/O概念:
所谓“ I/O”无非就是把数据移进或移出缓冲区。进程执行 I/O 操作,归结起来,也就是向操作系统发出请求,让它要么把用户缓冲区里的数据排干(write),要么用数据把用户缓冲区填满(read)。进程使用这一机制处理所有数据进出操作。
以一次传统的从硬盘中读数据为例
普通用户进程发起systemcall,要求其缓冲区被填满,系统调用read,向磁盘控制硬件发出命令,要求其从磁盘读取数据。磁盘控制器把数据直接写入内核内存缓冲区,这一步通过 DMA 完成,无需主 CPU 协助。一旦磁盘控制器把缓冲区装满,内核即把数据从内核空间的临时缓冲区拷贝到进程执行 read( )调用时指定的缓冲区。
网络编程基础:
IO操作除了从硬盘中读取数据文件,还可以从网络读取数据,那么就必须了解网络基础知识。
一、网络分层
OSI七层模型结构体: 物、数、网、传、会、表、应
TCP/IP 四层模型:数、网、传、应
我们以一个快递的心路历程来解释其中的五层,一个快递从发件到收件人收件大概经过这样几个阶段。
- 一个快递的运输需要丰富的交通运输网,这是基石,没有公路根本没法进行最开始的快递运输。这就是物理层,是所有信号的物理传输介质,比如光纤,没有这些传输介质信号根本无法传输。