应用程序从网络中拿数据,要经历两个阶段:1、等待数据准备好-分组到达,被拷贝到内核缓冲区,组装数据报;2、数据从内核缓冲区拷贝至用户态应用程序的缓冲区。Unix下五个I/O模型:

阻塞I/O:

进程调用recvfrom,此系统调用直到数据报到达且拷贝到应用缓冲区(或出错)才返回。

非阻塞I/O:

应用程序调用recvfrom时无数据,内核立马返回错误;有数据,则拷贝数据到应用缓冲区。一般应用程序会循环调用recvfrom(轮询),不断查询内核数据是否准备好,浪费CPU。

I/O复用(select/poll/epoll,IO条件满足时获得通知):

应用阻塞于select调用,等待数据报可读。当select返回套接口可读条件时,我们调用recvfrom将数据拷贝到应用缓冲区。I/O复用对阻塞IO的好处是可以等待多个描述字准备好

信号驱动I/O(SIGIO):

通过系统调用sigaction安装一个信号处理程序(注册信号),然后立即返回。数据报准备好时,内核生成SIGIO信号通知信号处理程序,信号处理程序调用recvfrom取回数据或者通知主循环自己来取数据。好处:半阻塞,数据到达之前,程序不阻塞,主循环可以继续执行,只是等待信号处理程序的通知(数据准备好或者数据报准备好读)。

异步I/O(Posix.1的aio_和lio_系列函数):

与信号驱动模型的区别-信号驱动IO是由内核通知何时可以启动一个IO操作,而异步IO模型是由内核通知IO操作何时完成。我们调用aio_read函数告诉内核描述字、缓冲区指针、缓冲区大小、文件偏移,并告诉内核整个操作完成时何时通知我们。此系统调用立即返回,进程不阻塞于等待IO完成。

异步IO很少使用,支持的系统较少。

I/O模型对比:

前4种I/O模型主要区别在第一阶段,第二个阶段基本相同(在数据从内核拷贝到应用程序缓冲区时,进程阻塞于recvfrom调用)。而异步I/O的两个阶段都不同于前4个模型。

同步I/O与异步I/O定义(Posix.1)比较:

同步I/O:同步I/O操作引起请求进程阻塞,直到I/O操作完成。前四个模型阻塞I/O、非阻塞I/O、I/O复用模型和信号驱动型I/O模型都是同步I/O模型。

异步I/O:异步I/O操作不引起请求进程阻塞,因此只有两阶段都不阻塞的异步模型属于异步I/O。

Linux网路编程系列-网络I/O模型的更多相关文章

  1. (46)LINUX应用编程和网络编程之一Linux应用编程框架

    3.1.1.应用编程框架介绍 3.1.1.1.什么是应用编程 (1)整个嵌入式linux核心课程包括5个点,按照学习顺序依次是:裸机.C高级.uboot和系统移植.linux应用编程和网络编程.驱动. ...

  2. (50)LINUX应用编程和网络编程之五 Linux信号(进程间通信)

                                                                                 信号实现进程间的通信 3.5.1.什么是信号 ...

  3. (47)LINUX应用编程和网络编程之二Linux文件属性

    Linux下的文件系统为树形结构,入口为/ 树形结构下的文件目录: 无论哪个版本的Linux系统,都有这些目录,这些目录应该是标准的.各个Linux发行版本会存在一些小小的差异,但总体来说,还是大体差 ...

  4. linux网路编程:字节序(大端、小端、网络、主机)

    字节序:就是数据在内存中的存放顺序,也可称之为端模式. 大端模式和小端模式的定义 1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端. 2) Big-End ...

  5. linux网络编程系列-网络连接的建立

    一个比较实用的连接函数,支持host为域名. #include <netdb.h> #include <sys/socket.h> #include <sys/types ...

  6. (54)LINUX应用编程和网络编程之九Linux网络通信实践

    3.9.1.linux网络编程框架 3.9.1.1.网络是分层的 (1)OSI 7层模型(理论指导) (2)网络为什么要分层 (3)网络分层的具体表现 3.9.1.2.TCP/IP协议引入(网络分层实 ...

  7. (51)LINUX应用编程和网络编程之六Linux高级IO

    3.6.1.非阻塞IO 3.6.1.1.阻塞与非阻塞 阻塞:阻塞具有很多优势(是linux系统的默认设置),单路IO的时候使用阻塞式IO没有降低CPU的性能 补充:阻塞/非阻塞, 它们是程序在等待消息 ...

  8. Linux网络通信编程(套接字模型TCP\UDP与IO多路复用模型select\poll\epoll)

    Linux下测试代码: http://www.linuxhowtos.org/C_C++/socket.htm TCP模型 //TCPClient.c #include<string.h> ...

  9. (49)LINUX应用编程和网络编程之四 Linux进程全解

    补充: 1.  C程序的执行过程: C编译器调用链接器,链接器设置可执行程序文件的启动起始地址(启动例程),启动例程获得内核传递来的 命令行参数和环境变量值,为调用main函数做准备.[实际上该启动例 ...

随机推荐

  1. 大前端学习笔记整理【二】CSS视觉格式化模型

    1. 概念 在视觉格式化模型中,文档树中的每个元素都将会根据盒模型产生零到多个盒子.这些盒子的布局由如下因素决定: 盒子的尺寸和类型 定位策略(正常文档流,浮动或者绝对定位) 和文档树中其他元素的关系 ...

  2. oracle数据库下的关系(库,实例,用户,表)

    一.数据库数据库顾名思义是数据的集合,而Oracle则是管理这些数据集合的软件系统,它是一个对象关系型的数据库管理系统.     二.表空间表空间是Oracle对物理数据库上相关数据的逻辑映射.一个数 ...

  3. centOS升级python3.5

    CentOS自带的版本是2.7.5  目前在看廖老师的教学,他给的新版本是3以上了,果断升级到最新的Python版本 (windows下面多线程里面有点问题没解决,所以才换到linux下继续学习) 一 ...

  4. Php 笔记

    php基本简介 为何要学习php 通过上网查资料,了解了基本的php知识,并知道了php的优缺点.php是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要适用 ...

  5. Oracle中rownum和rowid的理解(转)

    本文转自地址http://www.linuxidc.com/Linux/2012-04/58300.htm rownum,rowid都叫伪列. 但是,rownum是逻辑上的编号,且其值总是从1开始,每 ...

  6. Kickstart/Anaconda实现自动化安装原理探究

    原网页地址:http://molinux.blog.51cto.com/2536040/548247#55918... 内容概要:  1.  系统安装基本流程图示2.  Anaconda简介3.  K ...

  7. MySql数据源配置

    1.tomcat的config/server.xml中将以下代码写到 </Host>前: <Context docBase="struts1" path=&quo ...

  8. java变量

    java有四种变量: 成员变量:类成员,在类体内,但在任何方法或构造器之外. 局部变量:在一个代码块中声明并使用. 参数:方法或构造器的变量. 异常处理参数:和参数类似,只是异常处理的自变量而不是方法 ...

  9. websocket---Html5

    使用websocket主要是处理,通过服务器向页面发送消息,进行页面操作的处理. 以前类似情况,由于程序立即相应,处理事件较短,所遇采用过ajax进行轮询, 但是由于本次,需要人工干预,所以采用web ...

  10. cocos2d-x 3.0 版本 骨骼动画设置shader

    因为骨骼动画是由多个sprite组成, 所以需要遍历每个sprite 才能修改整体, 开头这样设置,在游戏中发现走路状态没问题,攻击状态就有部分sprite没效果 for (auto & ob ...