socket在创建的时候默认是堵塞的。我们能够通过socket系统调用的第二个參数传递SOCK_NONBLOCK标志,或者通过fcntl系统调用的F_SETFL命令,将其设置为非堵塞的。

堵塞和非堵塞的概念能应用与全部文件描写叙述符。不不过socket,我们称堵塞的文件描写叙述符为堵塞I/O,非堵塞的文件描写叙述符为非堵塞I/O.

针对堵塞I/O运行的系统调用可能由于无法马上完毕而被操作系统挂起。直到等待的事件发生为止。比方,client通过connect向server发起连接时,connect将首先发送同步报文段给server,然后等待server返回确认报文段,假设server的确认报文段没有马上到达client,则connect调用将被挂起,直到client收到确认报文段并唤醒connect调用,socket的基础API中,可能被堵塞的系统调用包含acept send rev connect.

针对非堵塞I/O运行的系统调用则总是马上返回,而无论事件是否已经发生。假设事件没有马上发生,这些系统调用就返回-1。和出错的情况一样,此时我们必须依据errno来分情况,对accept send recv而言,事件未发生时errno通常被设置成EAGAIN或者EWOULDBLOCK(意思为期望堵塞),对于connect,errno则被设置为EINPROGRESS(意思为正在处理中)。

非常显然。我们仅仅有在事件已经发生的情况下操作非堵塞i/o(读写等),才干提高程序的效率,因此,非堵塞I/O通常要和其它I/O通知机制一起使用,比方I/O复用和SIGIO信号。

I/O复用是最经常使用两个的I/O通知机制,他指的是,应用程序通过I/O复用函数想内核注冊一组事件,内核通过I/O复用函数把当中就绪的事件通知给应用程序,Linux上经常使用的I/O复用函数是select、poll epoll_wait。

须要明确的是,I/O复函数本身是堵塞的,他们能提高程序效率的原因在于他们具有同一时候监听多个I/O事件的能力。

SIGIO信号也能够用来报告I/O事件。当目标文件 描写叙述符上有事件发生时,SIGIO信号的信号处理函数将被触发,我们也就能够在该信号处理函数中对目标文件描写叙述II符运行非堵塞I/O操作了。

从理论上说。堵塞I/O I/O复用和信号驱动I/O都是同步I/O模型,由于在这三种I/O模型中,I/O读写操作,都是在I/O事件发生之后,由应用程序完毕的,在POSIX规范所定义的异步I/O模型则不同。对于异步I/O而言,用户能够直接对I/O运行读写操作。这些操作告诉内核用户读写缓冲区的位置,以及I./O操作完毕之 后内核通知应用程序的方式。异步I/O的读写总是马上返回。而不论I/O是否堵塞,由于真正的读写操作已经由内核接管。也就是说。同步I/O模型要求用户代码自行运行I/O操作(将数据从内核缓冲区读入用户缓冲区,或将数据从用户缓冲区写入内核缓冲区),而异步I/O机制则由内核来运行I/O操作(数据在内核缓冲区和用户缓冲区之间的移动是由内核在“后台”完毕的)。你能够这么觉得,同步I/O向应用程序通知的是I/O就绪事件。异步I/O想应用程序通知的是I/O完毕事件。linux环境下,aio.h头文件里定义了函数提供了异步I/O支持。

总结

I/O模型                                       读写操作和堵塞阶段

堵塞I/O                                       程序堵塞与读写操作

I/O复用                                      程序堵塞于I/O复用系统调用。但可同一时候监听多个I/O事件,对I/O本身读写操作是非堵塞的

SIGIO信号                                 信号触发读写就绪事件,用户程序运行读写操作,程序没有堵塞阶段

异步I/O                                      内核运行读写并触发读写完毕事件,程序没有堵塞阶段

同一时候,在并发模型中也有同步/异步的方式。可是和这里的概念不同。

在I/O模型中,同步和异步区分的是内核向应用程序通知的是何种I/O事件(是就绪事件还是完毕事件),以及该由谁来完毕I/O读写(是应用程序还是内核),在并发模型中,同步指的是程序全然依照代码序列的顺序运行,异步值得是程序运行须要由系统事件来驱动,常见的系统事件包含中断。信号等。

高性能server框架--I/O模型的更多相关文章

  1. 高性能网络通信框架 HP-Socket

      HP-Socket 详细介绍 HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/ ...

  2. 专訪阿里陶辉:大规模分布式系统、高性能server设计经验分享

    http://www.csdn.net/article/2014-06-27/2820432 摘要:先后就职于在国内知名的互联网公司,眼下在阿里云弹性计算部门做架构设计与核心模块代码的编写,主要负责云 ...

  3. Netty高性能网络应用框架对标P7面试题分享v4.1.70.Final

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 Netty官网 https://netty.io/ 最新版本为4.1.70.Final Netty是一个异步的.事件驱 ...

  4. nginx源代码分析--高性能server开发 常见的流程模型

    1.高性能server 对于高性能server对于.处理速度和占用空间小是典型特性.特别是当server经验C10K问题的时候(网络server在处理数以万计的client连接时.往往出现效率低下甚至 ...

  5. 在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML

    在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML 格雷戈里·拉森(Gregory Larsen),2017/08/02(第一次出版:2011 /11/09) 原文链接:http ...

  6. 在SQL Server中实现关系模型

    使用SQL Server的Transact-SQL(T-SQL)方言,此楼梯将为您提供如何使用SQL Server表中的数据的基本了解. DML是数据操作语言,是处理数据的语言的一个方面.它包括SEL ...

  7. TensorFire:WEB端的高性能神经网络框架

    TensorFire:WEB端的高性能神经网络框架 摘要: 近日,一种专门用于在网页内执行神经网络算法的JavaScript库——TensorFire引起了人们的关注,这种JavaScript库在浏览 ...

  8. 高性能NIO框架Netty-对象传输

    http://cxytiandi.com/blog/detail/17403 上篇文章高性能NIO框架Netty入门篇我们对Netty做了一个简单的介绍,并且写了一个入门的Demo,客户端往服务端发送 ...

  9. 基于Protobuf的分布式高性能RPC框架——Navi-Pbrpc

    基于Protobuf的分布式高性能RPC框架——Navi-Pbrpc 二月 8, 2016 1 简介 Navi-pbrpc框架是一个高性能的远程调用RPC框架,使用netty4技术提供非阻塞.异步.全 ...

随机推荐

  1. linux 把ls -R格式化成树状结构

    谁能写脚本把linux中的ls -R命令的结果格式化成树状结构? 最好是shell脚本!欢迎讨论! 参与讨论有可能意外获取iPhone6哦~~

  2. 洛谷P2243 电路维修 [最短路]

    题目传送门 电路维修 题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和Jam ...

  3. axio post 请求后端接收不到参数的解决办法

    原因是没有对参数进行序列化 默认情况下,axios将JavaScript对象序列化为JSON. 要以应用程序/ x-www-form-urlencoded格式发送数据. 在拦截器前修改 方法一,用原生 ...

  4. FFTW3学习笔记3:FFTW 和 CUFFT 的使用对比

    一.流程 1.使用cufftHandle创建句柄 2.使用cufftPlan1d(),cufftPlan3d(),cufftPlan3d(),cufftPlanMany()对句柄进行配置,主要是配置句 ...

  5. 51nod1437 迈克步 单调栈

    考虑一个点作为最小值的区间$[L[i], R[i]]$ 那么这个区间的所有含$i$的子区间最小值都是$v[i]$ 因此,用单调栈求出$L[i], R[i]$后,对$R[i] - L[i] + 1$这个 ...

  6. 51nod1675 序列变换

    link 题意: 给定长为n的序列a,b,下标从1开始,问有多少对x,y满足gcd(x,y)=1且$a_{b_x}=b_{a_y}$? $n\leq 10^5.$ 题解: $a_{b_x}$和$b_{ ...

  7. Varnish与Squid的对比

    Varnish与Squid的对比 说到Varnish,就不能不提Squid.Squid是一个高性能的代理缓存服务器,它和Varnish相比较有诸多的异同点,下面进行分析. 下面是Varnish与Squ ...

  8. DiskFileUpload上传与Spring的CommonsMultipartResolver上传对比

    最近在做一个小小的上传功能竟被虐得体无完肤, 在使用tomcat内置的DiskFileUpload获取前台jsp传来的附件参数和其他表单参数, 竟然出现莫名其妙的乱码问题, 即使tomcat的serv ...

  9. hihocoder1320 160周 压缩字符串

    hihocoder1320 题目链接 思路: dp解法.用map[i][j]表示从第i个开始到第j个的字串的best压缩长度.(包括i,j,两端闭合). 用k表示i,j中的一点. 用zip()表示压缩 ...

  10. Theme.AppCompat无全屏主题解决办法

    V7包中的Theme.AppCompat主题系列中并没有全屏样式,这个是为什么,只有作者知道…… 解决办法: 自定义主题 <style name="Theme.AppCompat.Li ...