远离CPU,存储能力比较大; 接近CPU,成本大,但是性能好

五种I/O模型包括:阻塞、非阻塞、多路复用、信号驱动、异步I/O模型

1、阻塞I/O   (使用广泛)

     在调用read()/recvfrom()函数时,导致应用程序阻塞;若数据没有准备好,就什么都不干一直等待,直到数据准备就绪了就搬迁(从内核把读到的数据拿到用户区)

     在网络上传输时:等待的时间长,因为是远距离传输;在本地上传输时:不需要等

    

五种I/O模型

图1  阻塞I/O模型


2、非阻塞I/O(浪费cpu资源,一般不太使用)

     把一个SOCKET接口设置为非阻塞,就是告诉内核,当请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。通过I/O操作函数recvfrom()不断地测试数据是否准备好,如果没有准备好,继续轮询测试,直到数据准备好,从内核拿到用户空间,I/O函数返回成功。


       五种I/O模型

图2  非阻塞I/O模型

3、I/O复用模型

     I/O复用模型会用到select、poll、epoll函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的是:这些函数可以同时阻塞多个I/O操作,而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。


五种I/O模型

图3 I/O复用模型


4 、信号驱动I/O

     允许SOCKET接口进行信号驱动I/O,并注册一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。

五种I/O模型

图4  信号驱动I/O

5、异步I/O模型

     当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者的输入输出操作


五种I/O模型

图5 异步I/O模型


五种I/O模型的比较


五种I/O模型


阻塞与非阻塞只是等的方式不同

前四个都属于同步I/O(由自己发起,由自己将数据从内核搬迁到用户区)

最后一个为异步I/O(只由自己发起,由别的部件完成后通知发起者)