阻塞式IO:一个线程处理一个请求时,若内核还未处理完,则会一直阻塞,知道准备就绪
非阻塞式IO:一个线程处理一个请求时,若内核未处理完则返回error,并未阻塞,我们需要不断循环读取,直到不是error,说明可以了。
IO多路复用:程序注册一组socket文件描述符给操作系统,表示“我要监视这些fd是否有IO事件发生,有了就告诉程序处理”。不断轮询这些文件描述符,若轮询到某一个就绪时,则调用用户线程来读它,后面的就暂时被阻塞。
信号驱动IO:给对应的文件描述符注册一个信号函数,若准备就绪的时候,反馈给用户线程,用户线程接收到信号之后,便在信号函数中调用IO读写操作来进行实际的IO请求操作。
异步IO:用户只需要发起一次请求后,在内核准备数据以及准备好写入用户线程中,然后发个信号通知用户线程,整个过程(准备数据与写入用户线程)不需要用户线程参与,达到真正意义的异步。
整个会有两块可能阻塞:
1.用户线程请求要读的时候
2.用户线程电泳IO函数在读的时候
阻塞式IO:两个都阻塞
非阻塞式IO:虽然1不阻塞,但是需要不断轮询,2仍然阻塞
IO多路复用:1不阻塞,轮询过程由用户态的处理转移到内核态,2仍然阻塞
信号驱动IO:1不阻塞,2阻塞