Linux的IO操作如何形象理解呢?

Linux将所有外部设备都看做一个文件来进行操作。因此,linux对所有外部设备的操作都可以看做是文件的操作。文件的操作当然需要有个标示描述它,这就是文件描述符(file descriptor)。linux的IO操作如何形象理解呢?我们说网络socket的read()是一个IO操作命令,具体流程是这样的:应用程序调用read命令,通知内核需要做读取数据操作内核创建一个文件描述符内核从物理层收到读数据的命令,从网络中获取数据包数据包传递到TCP/IP层,解析数据包的头内核将数据包缓存在文件描述符的读缓存区(接受缓存区)中,注意这里的读缓存区是在内核中的当文件描述符读缓存区数据字节数大于应用程序定义的低水位的时候(read的一个参数),此时文件描述符处于读就绪的状态将读缓存区中的数据复制到应用程序(用户区)返回这里需要说明的是1 每个文件描述符都有自己的读缓冲区和写缓冲区,读缓冲区对应的是read操作,写缓冲区对应的就是write操作了2 读缓冲区和写缓冲区都是在内核区中IO模型现有的linux IO模型有5种:阻塞式IO模型,非阻塞式IO模型,IO复用模型,信号驱动式IO模型,异步IO模型经常弄不清楚的就是阻塞,非阻塞,异步,同步

上图给出的同步异步标准是:数据描述符缓存是由谁来进行读取的?由用户程序读取,则判断为同步;由内核推送,判断为异步。上图给出的阻塞非阻塞标准是:调用的用户进程是否是阻塞的状态。题外话:关于异步IO模型-实现有用户层实现库glibc和内核libaio(kernel 2.6)-顺便说一句libaio工业级别使用的范例有OceanBase 是淘宝研发的一套分布式 NoSQL 数据库系统,源代码在这里https://github.com/alibaba/oceanbase