五种网络I/O模型

UNIX提供了5种I/O模型分类:

1. 阻塞I/O模型


      最常用的模型就是阻塞I/O模型,默认情况下,所有文件的操作都是阻塞的。应用进程调用recvfrom获取数据,系统调用直到数据包被复制到用户进程的缓冲区或发生错误时返回。从调用recvfrom到系统返回的整段时间内,应用进程都是被阻塞的,因此被称为阻塞I/O模型。


2. 非阻塞I/O模型


      应用进程调用recvfrom获取数据,如果缓冲区没有数据,直接返回EWOULDBLOCK错误。再通过轮询的方式看内核是否有数据准备好。


3. I/O复用模型


      Linux系统提供select/poll,进程将fd传给select/poll系统调用,阻塞在select操作上。select/poll顺序扫描fd是否就绪,如果数据变为可读状态,应用进程调用recvfrom获取数据。

fd(File Descriptor):文件描述符。Linux系统中,所有的外部设备都是一个文件,对一个文件的读写操作会返回一个fd。描述符就是一个数字,指向内核中的一个结构体,如文件路径等。


4. 信号驱动I/O模型


      需要开启套接口信号驱动I/O功能,应用进程通过系统调用sigaction后立即返回继续工作(非阻塞)。当数据准备就绪后,系统为该应用进程生产一个SIGIO信号,通过信号回调通知应用程序调用recvfrom获取数据。


5. 异步IO模型


应用进程告知内核执行某个动作,并让内核在操作完成之后(包括数据从内核空间复制到用户空间)通知该进程。

异步与信号驱动的区别:

信号驱动:内核通知进程,数据包已经准备好了,可以调用recvfrom来获取数据了

异步:内核通知进程,数据准备好了,并且也已经从内核拷贝到了用户空间。

猜你喜欢

转载自blog.csdn.net/ghaohao/article/details/80226242