阻塞 IO

阻塞:等待数据就绪

阻塞 + 同步

image-20230519232001708

非阻塞 IO

非阻塞:等待数据就绪

轮询:效率不高

非阻塞 + 同步

image-20230519232211458

IO 多路复用

(集中线程)阻塞 + 同步

当数据就绪后,集中线程会唤醒其他线程,阻塞的仅仅只是一个线程

image-20230519232455469

select / poll

通过传参的形式来轮询 fd 列表,长度有上限(1024

epoll

通过 mmap用户态的内存内核态的内存进行共享,不再需要传参,解决了 fd 长度受限的问题

基于事件侦听,而非轮询
wq: wait queue, rdlist: ready list, rbr: red black tree

image-20230519233500841

Go HTTP:goroutine 与 fd 绑定

image-20230519234217394

异步 IO

非阻塞 + 异步

异步:拷贝数据(Socket 缓冲区 -> 应用缓冲区)的过程也是由 Kernel 来完成

image-20230519233231945