1.阻塞式I/O模型(blocking i/o)
简介
在阻塞式I/O模型中,应用程序在从调用recvfrom开始到它返回有数据报准备好这段时间是阻塞的,recvfrom返回成功后,应用进程开始处理数据报
比喻
一个人在钓鱼,当没鱼上钩时,就坐在岸边直等
2.非阻塞式I/O模型(non-blocking i/o)
简介
在非阻塞式I/O模型中,应用程序把一个套接口设置为非阻塞就是告诉内核,当所请求的I/O操作 无法完成时,不要将进程睡眠,而是返回-一个错误,应用程序基于I/O操作函数将不断的轮询数据 是否已经准备好,如果没有准备好,继续轮询,直到数据准备好为止
比喻
边钓鱼边玩手机,隔会再看看有没有鱼上钩,有的话就迅速拉杆
3.I/O复用模型(i/o multiplexing)
简介
在I/O复用模型中,会用到select或poll函数或epoll函数(Linux2.6以后的内核开始支持), 这两个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作,而且可以同时对多个读操作,多个写操作的I/0函数进行检测,直到有数据可读或可写时,才填正调用I/O操作函数
比喻
放了一堆鱼竿,在岸边一直守着这堆鱼竿,直到有鱼上钩
4.信号驱动式I/O模型(signal-driven i/o)
简介
由POSIX规范定义,应用程序告知内核启动某个操作,并让内核在整个操作( 包括将数据从内核拷贝到应用程序的缓冲区)完成后通知应用程序。这种模型与信号驱动模型的主要区别在于:信号驱动I/O是由内核通知应用程序何时启动一个I/O操作, 而异步I/O模型是由内核通知应用程序I/O操作何时完成
比喻
这种方式钓鱼,和前几种相比,所使用的工具有了一些变化,需要有一些定制(实现复杂)。但是钓鱼的人就可以在鱼儿咬钩之前彻底做别的事儿去了。等着报警器响就行了
5.异步I/O模型(asynchronous i/o)
简介
用户进程发起aio_read操作之后,给内核传递描述符、缓冲区指针、缓冲区大小等,告诉内核当整个操作完成时,如何通知进程,然后就立刻去做其他事情了。当内核收到aio_read后,会立刻返回,然后内核开始等待数据准备,数据准备好以后,直接把数据拷贝到用户控件,然后再通知进程本次IO已经完成
比喻
这种方式的钓鱼,无疑是最省事儿的。啥都不需要管,只需要交给鱼竿就可以了。