Linux网路编程系列-网络I/O模型
应用程序从网络中拿数据,要经历两个阶段: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模型的更多相关文章
- (46)LINUX应用编程和网络编程之一Linux应用编程框架
3.1.1.应用编程框架介绍 3.1.1.1.什么是应用编程 (1)整个嵌入式linux核心课程包括5个点,按照学习顺序依次是:裸机.C高级.uboot和系统移植.linux应用编程和网络编程.驱动. ...
- (50)LINUX应用编程和网络编程之五 Linux信号(进程间通信)
信号实现进程间的通信 3.5.1.什么是信号 ...
- (47)LINUX应用编程和网络编程之二Linux文件属性
Linux下的文件系统为树形结构,入口为/ 树形结构下的文件目录: 无论哪个版本的Linux系统,都有这些目录,这些目录应该是标准的.各个Linux发行版本会存在一些小小的差异,但总体来说,还是大体差 ...
- linux网路编程:字节序(大端、小端、网络、主机)
字节序:就是数据在内存中的存放顺序,也可称之为端模式. 大端模式和小端模式的定义 1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端. 2) Big-End ...
- linux网络编程系列-网络连接的建立
一个比较实用的连接函数,支持host为域名. #include <netdb.h> #include <sys/socket.h> #include <sys/types ...
- (54)LINUX应用编程和网络编程之九Linux网络通信实践
3.9.1.linux网络编程框架 3.9.1.1.网络是分层的 (1)OSI 7层模型(理论指导) (2)网络为什么要分层 (3)网络分层的具体表现 3.9.1.2.TCP/IP协议引入(网络分层实 ...
- (51)LINUX应用编程和网络编程之六Linux高级IO
3.6.1.非阻塞IO 3.6.1.1.阻塞与非阻塞 阻塞:阻塞具有很多优势(是linux系统的默认设置),单路IO的时候使用阻塞式IO没有降低CPU的性能 补充:阻塞/非阻塞, 它们是程序在等待消息 ...
- Linux网络通信编程(套接字模型TCP\UDP与IO多路复用模型select\poll\epoll)
Linux下测试代码: http://www.linuxhowtos.org/C_C++/socket.htm TCP模型 //TCPClient.c #include<string.h> ...
- (49)LINUX应用编程和网络编程之四 Linux进程全解
补充: 1. C程序的执行过程: C编译器调用链接器,链接器设置可执行程序文件的启动起始地址(启动例程),启动例程获得内核传递来的 命令行参数和环境变量值,为调用main函数做准备.[实际上该启动例 ...
随机推荐
- Hadoop2.6.0的事件分类与实现
前言 说实在的,在阅读Hadoop YARN的源码之前,我对于java枚举的使用相形见绌.YARN中实现的事件在可读性.可维护性.可扩展性方面的工作都值得借鉴. 概念 在具体分析源码之前,我们先看看Y ...
- Process 执行shell 脚本
概述: Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序). Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的退出状态以及销毁(杀掉 ...
- 关于swfupload,客户端中文乱码解决方案!
公司做了个邮箱系统,上传附件用到了swfupload控件,测试成功上线后hr找我说上传附件中文乱码. 奇怪了,就只有她的电脑出问题,我找了好几台电脑,虚拟机也跑了怎么就找不到问题. 后来网上查了好久, ...
- 2014NOIP前 计划
这几天天天刷水题活得很开心,是时候定一个计划了.想着我要在yzy左的吓人的歌声中看书,还是有点.... 大概就分成几类吧 数学//你们这群学霸啊 搜索 图论 dp 贪心 其他 每个不定具体时间,加油吧 ...
- PHP对象转数组||PHP数组转对象
function arrayToObject($e){ if( gettype($e)!='array' ) return; foreach($e as $k=>$v){ ...
- ExecutorService中submit和execute的区别(转)
在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动.调度.管理线程的一大堆API了.在Java5以后,通过Executor来启动线程比用Thread的start()更好.在新特征中 ...
- CabArc to create or extract a cab file
CabArc n D:\test.cab D:\output\*.* CabArc x D:\test.cab -r -p D:\output\*.*
- sqlserver和oracle的递归查询
1.sqlserver递归查询方式 CTE: if OBJECT_ID('tb','N') is not null drop table tb; create table tb(id va ...
- 杨光福IT讲师微博
杨光福IT讲师微博: http://weibo.com/321chinavideo 微博现在里面有很多干货,以后会越来越多,主要用于分享和交流技术.关注一下对你有帮助.
- ofbiz 代码日记
写代码一定要尽善尽美.. //修改方法 //条件查询 用于修改 List<GenericValue> stoList = delegator.findByAnd("YcrossS ...