Linux 网络编程(IO模型)
2013-07-16 22:24
465 查看
针对linux 操作系统的5类IO模型,阻塞式、非阻塞式、多路复用、信号驱动和异步IO进行整理,参考《linux网络编程》及相关网络资料。
阻塞模式
在socket编程(如下图)中调用如下四类函数导致阻塞:
读操作(read、readv、recv、recvfrom、recvmsg):当应用程序调用读函数,该系统调用进入内核态,若套接字接收缓冲区无数据则阻塞,数据到达则将接收缓冲区数据拷贝至进程缓冲区并返回。对TCP而言,一旦接收缓冲区中与数据则进程被唤醒,对UDP而言有完整的UDP报文达到进程被唤醒。
写操作(write、writev、send、sendto、sendmsg):当发送缓冲区空间小于写操作要求写的数量则阻塞,该情况发生很少。对UDP而言,不存在发送缓冲区,因此不可能发送阻塞。
接收连接(accept):TCP协议采用倾听套接字接收客户机连接请求,完成三次握手的TCP连接保存在倾听套接字完成队列。当accept被调用时,若完成队列为空则阻塞。当有新的TCP连接,进程被唤醒同时分配一个新的连接套接字标识这个TCP连接。
建立连接(connect):TCP套接字调用connect与服务器连接时进程将阻塞,待3次握手操作完成后(内核态)进程被唤醒。
非阻塞模式
针对上述四类阻塞模式的socket调用,均可通过设置的方式使其非阻塞。设置方式有两种fcntl设置套接字为O_NONBLOCK,以及ioctl设置FIONBIO。完成后其四类操作非阻塞,如下:
读操作:缓冲区无数据,函数以错误EWOULDBLOCK返回;
写操作:发送缓冲区无空间,函数以错误EWOULDBLOCK返回;
接收连接:若队列中无新的连接,函数以错误EWOULDBLOCK返回;
连接操作:若连接不能马上建立,返回错误类型EINPROGRESS;
非阻塞模式在运用中采用轮询,或配合select的方式使用。
多路复用
进程定义读描述符集、写描述符集以及异常描述符集(作为select的入参),在select被调用时如果没有描述符集就绪,该select将被阻塞。当有任何一个或几个描述符就绪时,select设置描述符集,并返回就绪描述符的个数。
注:对于监视一个描述符的情况,select与阻塞模式无区别。
信号驱动
信号驱动的方式属于一种异步的IO方式,进程本身不会被挂起,流程如下:
信号驱动的IO方式主要分以下三步操作:
对于UDP套接字,内核在以下情况下发送信号SIGIO:
套接字上接收到一个UDP数据报
套接字上发生一个异步错误
对TCP套接字,内核在以下情况下发送信号SIGIO:
在倾听套接字上,一个连接请求完成
初始化了一个断开连接的请求
断开连接请求完成
一个方向的连接被关闭
数据到达套接字
套接字发送了数据
异步错误发生
异步IO
异步IO是linux 2.6内核的标准特性,基本思想是允许进程发起很多IO操作,而不用阻塞或等待任何操作。稍后在接收到IO操作完成的通知时,再检索IO操作的结果。
aio过程的数据缓存在结构体aiocb中,该结构体定义如下:
根据posix.1b所要求,主要包括如下函数:
aio_read(struct aiocb* aiocbp); //进行异步读操作
aio_write(struct aiocb* aiocbp);//进行异步写操作
aio_error(struct aiocb* aiocbp);//确定请求的状态
aio_return(struct aiodb* aiocbp);//读写的异步返回
阻塞模式
在socket编程(如下图)中调用如下四类函数导致阻塞:
读操作(read、readv、recv、recvfrom、recvmsg):当应用程序调用读函数,该系统调用进入内核态,若套接字接收缓冲区无数据则阻塞,数据到达则将接收缓冲区数据拷贝至进程缓冲区并返回。对TCP而言,一旦接收缓冲区中与数据则进程被唤醒,对UDP而言有完整的UDP报文达到进程被唤醒。
写操作(write、writev、send、sendto、sendmsg):当发送缓冲区空间小于写操作要求写的数量则阻塞,该情况发生很少。对UDP而言,不存在发送缓冲区,因此不可能发送阻塞。
接收连接(accept):TCP协议采用倾听套接字接收客户机连接请求,完成三次握手的TCP连接保存在倾听套接字完成队列。当accept被调用时,若完成队列为空则阻塞。当有新的TCP连接,进程被唤醒同时分配一个新的连接套接字标识这个TCP连接。
建立连接(connect):TCP套接字调用connect与服务器连接时进程将阻塞,待3次握手操作完成后(内核态)进程被唤醒。
非阻塞模式
针对上述四类阻塞模式的socket调用,均可通过设置的方式使其非阻塞。设置方式有两种fcntl设置套接字为O_NONBLOCK,以及ioctl设置FIONBIO。完成后其四类操作非阻塞,如下:
读操作:缓冲区无数据,函数以错误EWOULDBLOCK返回;
写操作:发送缓冲区无空间,函数以错误EWOULDBLOCK返回;
接收连接:若队列中无新的连接,函数以错误EWOULDBLOCK返回;
连接操作:若连接不能马上建立,返回错误类型EINPROGRESS;
非阻塞模式在运用中采用轮询,或配合select的方式使用。
多路复用
进程定义读描述符集、写描述符集以及异常描述符集(作为select的入参),在select被调用时如果没有描述符集就绪,该select将被阻塞。当有任何一个或几个描述符就绪时,select设置描述符集,并返回就绪描述符的个数。
/* * 多路复用select函数,参数定义如下 * nfds: select监视的文件句柄数,一般设置为最大文件号+1 * readfds:select监视的可读文件句柄集合 * writefds:select监视的可写文件句柄集合 * exceptfds:select监视的异常文件句柄集合 */ int select(nfds, readfds, writefds, exceptfds, timeout)
注:对于监视一个描述符的情况,select与阻塞模式无区别。
信号驱动
信号驱动的方式属于一种异步的IO方式,进程本身不会被挂起,流程如下:
信号驱动的IO方式主要分以下三步操作:
signal(SIGIO,sig_handler); //设置SIGIO信号对应的处理函数 fcntl(sockfd,F_SETOWN, getpid());//设置接收SIGIO信号的进程为当前进程,该信号由sockfd句柄产生 ioctl(sockfd,FIOASYNC,&on);//允许sockfd套接字进行信号驱动的输入输出
对于UDP套接字,内核在以下情况下发送信号SIGIO:
套接字上接收到一个UDP数据报
套接字上发生一个异步错误
对TCP套接字,内核在以下情况下发送信号SIGIO:
在倾听套接字上,一个连接请求完成
初始化了一个断开连接的请求
断开连接请求完成
一个方向的连接被关闭
数据到达套接字
套接字发送了数据
异步错误发生
异步IO
异步IO是linux 2.6内核的标准特性,基本思想是允许进程发起很多IO操作,而不用阻塞或等待任何操作。稍后在接收到IO操作完成的通知时,再检索IO操作的结果。
aio过程的数据缓存在结构体aiocb中,该结构体定义如下:
struct aiocb { int aio_fildes; /* File desriptor. */ int aio_lio_opcode; /* Operation to be performed. */int aio_reqprio; /* Request priority offset. */ volatile void *aio_buf; /* Location of buffer. */ size_t aio_nbytes; /* Length of transfer. */struct sigevent aio_sigevent; /* Signal number and value. */
根据posix.1b所要求,主要包括如下函数:
aio_read(struct aiocb* aiocbp); //进行异步读操作
aio_write(struct aiocb* aiocbp);//进行异步写操作
aio_error(struct aiocb* aiocbp);//确定请求的状态
aio_return(struct aiodb* aiocbp);//读写的异步返回
相关文章推荐
- Linux网络编程服务器模型选择之IO复用循环并发服务器
- Linux非阻塞IO(二)网络编程中非阻塞IO与IO复用模型结合
- linux网络编程之IO模型
- Linux网络编程服务器模型选择之IO复用循环并发服务器
- Linux网络通信编程(套接字模型TCP\UDP与IO多路复用模型select\poll\epoll)
- linux网络编程-----几种服务器模型及io多路复用函数
- Linux IO模型和网络编程模型
- JAVA网络编程基础知识-Linux网络IO模型
- Linux非阻塞IO(二)网络编程中非阻塞IO与IO复用模型结合
- 【Linux网络编程】深入理解Linux五种网络IO模型
- Linux IO模型与Java网络编程
- 【Linux网络编程】IO模型与服务器模型
- (转)linux网络编程之IO模型
- Linux网络通信编程(套接字模型TCP\UDP与IO多路复用模型select\poll\epoll)
- linux网络编程--IO模型
- linux编程---网络编程之复用I/O模型
- 网络编程学习:io模型之io多路复用
- Linux 网络编程——并发服务器的三种实现模型
- Unix-Linux 网络 IO 模型简介
- Linux网络编程 -- 网络模型与通信过程