UNIX网络编程-I/O多路复用

目录

Unix下可用的5种I/O模型

阻塞式I/O模型

非阻塞式I/O模型

I/O复用模型

信号驱动式I/O模型

异步I/O模型

各种I/O模型的比较

参考


Unix下可用的5种I/O模型

  1. 阻塞式I/O
  2. 非阻塞式I/O
  3. I/O复用
  4. 信号驱动式I/O(SIGIO)
  5. 异步I/O(POXIS的aio_系列函数)

比如一个输入操作通常包含两个不同的阶段
1.等待数据准备好
2.从内核向进程复制数据
对于一个恶套接字上的输入操作,第一步通常涉及等待数据从网络中到达,当所有等待分组到达时,它被复制到内核中的某个缓冲区,第二部就是把数据从内核缓冲区复制到应用进程缓冲区
 

阻塞式I/O模型

最流行的I/O模型是阻塞式I/O(blocking I/O)模型,使用UPD而不是TCP是因为UDP概念简单,而TCP要处理套接字低水位标记(low-water-mark)等额外变量会变得复杂
这里的recvfrom函数是系统调用,这里要区分应用进程和内核
一般都会在应用进程空间中运行切换到在内核空间汇总运行,一段时间之后再切换回来
进程调用recvfrom,其系统调用直到数据报到达且被复制到应用进程的缓冲区中或者发生错误才返回,最常见的错误是系统调用被信号中断,recvfrom成功返回后,应用进程开始处理数据报

 

非阻塞式I/O模型

进程把一个套接字设置成非阻塞(nonblocking I/O)是在通知内核,当所有请求的I/O操作非得把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误
前三次调用recvfrom时没有数据可返回,因此内核转而立即返回一个WEOULDBLOCK错误,第四次调用recvfrom时已有了一个数据报准备好,它被复制到应用进程缓冲区,于是recvfrom成功返回,我们接着处理数据
当一个应用进程像这样对一个非阻塞描述符循环调用recvfrom时,称之为轮询polling,应用进程持续轮询内核,已查看某个操作是否就绪,这么做会消费大量CPU时间,不过这样模型偶尔也会遇到,通常在专门提供某一种功能的系统中才有


I/O复用模型

有了I/O复用(I/O multiplexing)我们就可以调用select或poll,阻塞在这两个系统调用中的某一个之上,而不是阻塞在真正的I/O系统调用上
我们阻塞于select调用,等待数据报套接字变为可读,当select返回套接字可读这一条件时,我们调用recvfrom把所有数据报复制到应用进程缓冲区
I/O复用的优势在于我们可以等待多个描述符就绪,与I/O复用相关的另一种I/O模型是在多线程中使用阻塞式I/O,这种模型与上述模型极为相似,但它没有使用select阻塞在多个文件描述符上,而是使用多个线程(每个文件描述符一个线程),这样每个线程都可以自由的调用诸如recvfrom之类的阻塞式I/O系统调用了

 

信号驱动式I/O模型

我们也可以用信号,让内核在描述符就绪时发送SIGIO信号通知我们,这种模型称为信号驱动式I/O(signal-driven I/O)
首先开启套接字的信号驱动式I/O功能,并通过sigaction系统调用安装一个信号处理函数,该系统调用将立即返回,我们的进程继续工作,也就是会所它没有被阻塞,当数据报准备好读取时,内核就为该进程产生一个SIGIO信号,我们随后即可以在信号处理函数中调用recvfrom读取数据报,并通知主循环数据已经准备好待处理,也可以激励通知主循环,让它读取数据报
无论如何处理SIGIO信号,这种模型的优势在于等待数据报达到期间进程不被阻塞,主循环可以继续执行,只要等待来自信号处理函数的通知,即可以是数据已准备好被处理,也可以是数据报已准备好被读取


异步I/O模型

异步I/O(asynchronous I/O)由POSIX规范定义,演变成当前POSIX返回的各种早期标准所定义的实时函数中存在的差异已经取得一致,一般的说这些函数的工作机制是,告知内核启动某个操作,并让内核在整个操作(包括将数据从内核复制到我们自己的缓冲区)完成后通知我们,这种模型与前面介绍的信号驱动模型的主要区别在于,信号驱动式I/O是由内核通知我们何时可以启动一个I/O操作,而异步I/O模型是由内核通知我们I/O操作何时完成
调用aio_read函数,给内核传递描述符,缓冲区指针,缓冲区大小(与read相同的三个函数)和文件偏移(与lseek类似),并告诉内核当整个操作完成时如何通知我们,该系统调用立即返回,而且在等待I/O完成期间,我们的进程不被阻塞

各种I/O模型的比较

前4种模型的主要区别在第一阶段,因为他们的第二阶段是一样的,在数据从内核复制到调用者的缓冲区期间,进程阻塞于recvfrom调用,相反,异步I/O模型在这两个阶段都要处理,从而不同于其他4种模型

同步I/O和异步I/O对比
POSIX把这两个术语定义如下
同步I/O操作(synchronous I/P operation)导致请求进程阻塞,直到I/O操作完成
异步I/O操作(asynchronous I/O operation)不导致请求进程阻塞

根据上述定义,我们的前4种模型--阻塞式I/O模型,非阻塞式I/O模型,I/O复用模型和信号驱动式I/O模型都是同步I/O模型,in为其中真正的I/O操作 recvfrom将阻塞进程,只有异步I/O模型与POSIX定义的异步I/O相匹配

参考

解读I/O多路复用技术

猜你喜欢

转载自blog.csdn.net/hixiaoxiaoniao/article/details/86225205
今日推荐