针对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函数,参数定义如下
* 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模型)的更多相关文章

  1. linux网络编程IO模型

    同步与异步:         同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成.         异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要 ...

  2. Linux网络编程-IO复用技术

    IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...

  3. LINUX网络编程 IO 复用

    参考<linux高性能服务器编程> LINUX下处理多个连接时候,仅仅使用多线程和原始socket函数,效率十分低下 于是就出现了selelct poll  epoll等IO复用函数. 这 ...

  4. linux网络编程 IO多路复用 select epoll

    本文以我的小型聊天室为例,对于服务器端的代码,做了三次改进,我将分别介绍阻塞式IO,select,epoll . 一:阻塞式IO 对于聊天室这种程序,我们最容易想到的是在服务器端accept之后,然后 ...

  5. Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)

    Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...

  6. Linux 网络编程的5种IO模型:信号驱动IO模型

    Linux 网络编程的5种IO模型:信号驱动IO模型 背景 上一讲 Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 我们讲解了多路复用等方面的知识,以及有关例程. ...

  7. Linux 网络编程的5种IO模型:异步IO模型

    Linux 网络编程的5种IO模型:异步IO模型 资料已经整理好,但是还有未竟之业:复习多路复用epoll 阅读例程, 异步IO 函数实现 背景 上一讲< Linux 网络编程的5种IO模型:信 ...

  8. linux网络编程模型

    1.编程模型 Linux网络编程模型是基于socket的编程模型

  9. Linux网络编程(四)

    在linux网络编程[1-3]中,我们编写的网络程序仅仅是为了了解网络编程的基本步骤,实际应用当中的网络程序并不会用那样的.首先,如果服务器需要处理高并发访问,通常不会使用linux网络编程(三)中那 ...

随机推荐

  1. opencv 处女作

    显示一幅图:主要是运用功能:imread namedWindow imshowimread:从字面意思我们就可以看懂,用来读取图片的:namedWindow:显然,我们也可以看到这是用来命名窗口名称的 ...

  2. C# 中科学计数法转成正常值

    抓取数据的时候碰到科学技术法,查了一些资料,直接贴代码 /// <summary> /// 数字科学计数法处理 /// </summary> /// <param nam ...

  3. windows平台升级ORACLE11.2.0.1到11.2.0.4

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://4445027.blog.51cto.com/4435027/1674217 一  ...

  4. 如何查看apache,php,mysql的编译参数

    查看nginx编译参数:/usr/local/nginx/sbin/nginx -V 查看apache编译参数:cat /usr/local/apache2/build/config.nice 查看m ...

  5. Scala学习笔记一

    首先是安装Scala 下载Scala进行安装 http://www.scala-lang.org/ 安装好scala后,为scala配置系统环境参数 新建环境变量SCALA_HOME,值为scala安 ...

  6. Windows下解压版mysql的安装方法

    1 首先下载mysql的解压版的rar安装包 1 将安装包解压到安装路径.C:\Program Files (x86)\MySQL2 将安装路径下的bin追加到环境变量"PATH" ...

  7. Centos 基础开发环境搭建之Maven私服nexus

    hmaster 安装nexus及启动方式 /usr/local/nexus-2.6.3-01/bin ./nexus status Centos 基础开发环境搭建之Maven私服nexus . 软件  ...

  8. 51nod 1428 活动安排问题(优先队列)

    1428 活动安排问题 首先按照开始时间从小到大排序. 其实只要维护一个结束时间的最小堆,每次比较开始时间和堆中最小时间的大小,如果比它大就放入堆中并且时间就要变成当前任务的结束时间, 否则就要新开一 ...

  9. 用词法分析器Flex过滤日志

    每日构造中,我的项目中 Visual Studio 的 MakeFile 后会产生大量信息,如下 Microsoft (R) Visual Studio Version 10.0.40219.1.Co ...

  10. 成都印迹婚纱摄影 | yinjilove.com

    成都印迹婚纱摄影工作室 官方网站:http://yinjilove.com/ 联系方式:028-84278563 手机及微信号:18180642817 微信公众号:印迹摄影 地址:成都市锦江区牛王庙东 ...