五种IO模型

网络 IO 主要为以下两个步骤:

(1)等待内核准备好数据
(2)将数据从内核拷贝到用户空间

一共有五种 IO 模型:阻塞 IO 、非阻塞 IO 、信号驱动 IO 、多路复用 IO 、异步 IO, 前四种是同步 IO

阻塞 IO (Blocking I/O)

五种IO模型
描述:当用户线程发出 IO 请求后,内核查看数据是否准备好,没有准备好的话,用户线程就阻塞,只有当数据准备就绪,返回给用户线程后,才会解除阻塞状态
例如: A 拿了一个鱼竿来到河边钓鱼,在鱼上钩之前,他一直专心致志的等待,其他什么事情也不做,只有鱼上钩了,才算是结束等待这个动作

信号驱动IO(signal blocking I/O)五种IO模型

描述:用户发起一个 IO 请求,并且告诉内核:当数据准备好的时候,你给我发送一个信号,用户会对信号进行捕捉,并且调用信号处理函数来获取数据
例子:C 也来到河边钓鱼,他在鱼竿上挂了一个铃铛,当有鱼要上钩时,铃铛一响,C就将鱼钓上来

IO多路复用(I/O multiplexing)

五种IO模型
描述:会有一个线程不断的轮询socket状态,就好像一个监视器,只有当socket真正有读写时,监视器会通知去实际的处理IO请求
IO多路复用,指的是有一个专门监视 socket 的监视器,类似于一个代表人物,它一直监听多个文件描述符是否有数据到来,来数据了,这个代表就告诉某某你的数据来了,赶紧去处理吧

异步IO(asynchronous I/O)五种IO模型

描述:用户线程发起 read 操作之后,就可以去做别的事情,从内核角度看,当内核收到一个IO请求时立马成功返回,说明read请求已经成功发起,因此用户线程不会发生阻塞,等待内核将数据准备好后,再将数据拷贝到用户线程,当这两个动作完成后,会给用户线程发送一个信号,告诉他请求处理完成
例如:E也想钓鱼,但E有事情,于是他雇来了F,让F帮他等待鱼上钩,一旦有鱼上钩,F就打电话给E,E就会将鱼钓上去