Linux 内核包含4个IO调度器,分别是 Noop IO scheduler、Anticipatory IO scheduler、Deadline IO scheduler 与 CFQ IO scheduler。
相比起用户态的DPDK、SPDK,io_uring 作为内核的一部分,通过 mmap 的方式实现用户和内核共享内存,并基于 memory barrier 在这块内存上实现了两个无锁环形队列: submission queue ring 和 completion queue ring。
同步、异步是相对的,在请求或执⾏过程中,如果会阻塞等待,就是同步操作,反之就是异步操作。在出站流程开始的时候,通过调⽤ ctx.writeAndFlush,Bytebuf 缓冲区开始进⼊出站处理的 pipeline 流⽔线 。
关于IO会涉及到阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO等几个知识点。IO多路复用中文比较让人头大,IO多路复用的原文叫 I/O multiplexing,这里的 multiplexing 指的其实是在单个线程通过记录跟踪每一个Sock的状态来同时管理多个I/O流. 发明它的目的是尽量多的提高服务器的吞吐能力。
在这个过程中,最最最关键点在于其中的一行代码:在这里调用了 poll 方法,执行具体的事件拉取逻辑,进一步往下走:最后会调用 WindowsSelectorImpl.poll 方法,而该方法最终会调用本地的 native 方法: poll0 方法,而在 JVM 的源码实现中,该方法最终会调用内核所提供的函数。
本文其他的内容主要是得出了下面几个结论:服务器要接收客户端的数据,要建立 socket 内核结构,主要包含两个重要的数据结构,等待队列,和接收队列,socket在进程中作为一个文件,可以用文件描述符 fd 来表示,为了方便理解,本文中, socket 内核对象 ≈ fd 文件描述符 ≈ TCP连接;
引言IO(Input/Output) 方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的 IO 教学大多数是停留在最基本的 BIO ,而并未对于 NIO、AIO 、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本