一.阻塞io
1.基本概念:
在内核将数据准备好之前,系统调用会一直等待。所有的套接字默认都是阻塞方式。直到内核将数据准备好,从内核拷贝到用户空间,系统调用才会返回。
2.举例:把鱼钩扔到水里,人(相当于系统)一直坐着等待鱼上钩。直到鱼上钩了,钓鱼的人才收网。
二.非阻塞io
1.概念:如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回ewouldblock错误码。非阻塞io往往需要程序员循环反复尝试读写文件描述符,这个过程称为轮询。这对cpu来书是较大的浪费,一般只有特定场景下才使用。
2.举例:
钓鱼者将鱼钩扔到水里,每过一段时间去看是否有鱼上钩,直到有鱼上钩才将鱼钩拉起来。
三.信号驱动io
1.概念:内核将数据准备好的时候,使用SIGIO信号通知应用程序进行io操作。
2.举例:
就像是在鱼竿上装了一个报警器,当鱼上钩时通知钓鱼者,钓鱼者去打鱼。
四.io多路转接
从流程上与阻塞io类似。实际上最核心在于io多路转接能够同时等待多个文件描述符的就绪状态。
五.异步io
1.概念
由内核在数据拷贝完成时,通知应用进程(而信号驱动是告诉应用程序何时可以开始拷贝数据)
2.举例
把鱼竿扔到水里,让家人帮忙看着,把鱼钓起来后通知我。