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. struts2的action编写

    例 HelloWorld.jsp <% @ page contentType = "text/html; charset=UTF-8 " %> <% @ tagl ...

  2. Prime Number CodeForces - 359C (属于是数论)

    Simon has a prime number x and an array of non-negative integers a1, a2, ..., an. Simon loves fracti ...

  3. HDU 6119 小小粉丝度度熊(Two pointers)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6119 [题目大意] 给出一些签到区间和一些补签卡,问可以创造的最长连续签到区间 [题解] 如果我们 ...

  4. 求矩阵主对角线元素的和 Exercise08_02

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年12月 * 题目:求矩阵主对角线元素的和 * */ public class Exercis ...

  5. JavaScript学习笔记 isPrototypeOf和hasOwnProperty使用区别

    1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的原型链中,是则返回true,否则返回false. 格式如下: object ...

  6. ROS知识(1)----ROS Jade安装

    ROS入门难,进去之后会是很简单,这是很多人的经验.但是今天安装ROS就吃了闭门羹,安装成功后,回顾发现,关键是操作系统Ubantu14.04没有安装好,一些系统包没有及时更新导致的.这里总结下ROS ...

  7. VMware中网络设置之host-only

    有了前面一篇的NAT的网络设置,本文就显得非常简单了.同样图文结合的步骤: 1.设置host-only模式. 2.设置linux虚拟机的静态IP.进入linux系统,点击主菜单---系统设置---网络 ...

  8. CentOS包管理yum常用命令(转)

    一.安装 yum install 全部安装yum install package1 安装指定的安装包package1yum groupinsall group1 安装程序组group1 二.更新和升级 ...

  9. JLInk 各种版本图片收集

    所有图片来自网络, 版权归原始所有者拥有. JLink V5 JLink V6 JLink V7 JLink V8 JLink V9 JLink Ultra JLink Pro

  10. 小程序setData工作原理理解图

    优化建议:1.频繁的去setData--我曾经用这个弄过动画效果,当然后来发现JS动画不适合小程序,CSS3动画才是王道2.每次setData都传递大量新数据--这个大量还真不好理解,暂时定为排行榜类 ...