五种模型分别为:
阻塞IO, 非阻塞IO,多路复用IO, 信号驱动IO, 异步IO
阻塞IO :调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的去检查这个函数有没有返回,必须等待这个函数返回才能进行下一步动作。
流程图为:
作为最传统的一种IO模型,即在读写数据过程中会发生阻塞现象,典型的阻塞IO模型例子为:
data = socket.read();
如果数据没有就绪,就会一直阻塞在read方法。
非阻塞IO:非阻塞等待, 每隔一段时间就去检测IO事件是否就绪。没有就绪就可以做其他事。
流程图为:
典型的非阻塞IO模型一般如下:
while(true){
data = socket.read();
if(data!= error){
处理数据
break;
}
}
多路复用IO:linux用select/poll函数实现IO复用模型, 这两个函数也会使进程阻塞, 但是和阻塞IO所不同的是这两个函数可以同时阻塞多个IO操作。 而且可以同时对多个读操作,写操作的IO函数进行检测。知道有数据可读或可写,才真正调用IO 操作函数
流程图为:
信号驱动IO:信号驱动IO:Linux用套接口进行信号驱动IO, 安装一个信号处理函数,进程运行并不会阻塞,当IO时间 就绪,进程收到SIGIO信号。然后处理IO事件。
异步IO:Linux中,可以调用aio_read函数告诉内核描述子缓冲区的大小, 文件偏移及通知的方式,然后立即返回, 当内核将数据拷贝到缓冲区后, 再通知应用程序。
流程图为: