socket在创建的时候默认是阻塞的。我们可以通过socket系统调用的第二个参数传递SOCK_NONBLOCK标志,或者通过fcntl系统调用的F_SETFL命令,将其设置为非阻塞的。阻塞和非阻塞的概念能应用与所有文件描述符,不仅仅是socket,我们称阻塞的文件描述符为阻塞I/O,非阻塞的文件描述符为非阻塞I/O.

针对阻塞I/O执行的系统调用可能因为无法立即完成而被操作系统挂起,直到等待的事件发生为止。比如,客户端通过connect向服务器发起连接时,connect将首先发送同步报文段给服务器,然后等待服务器返回确认报文段,如果服务器的确认报文段没有立即到达客户端,则connect调用将被挂起,直到客户端收到确认报文段并唤醒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读写(是应用程序还是内核),在并发模型中,同步指的是程序完全按照代码序列的顺序执行,异步值得是程序执行需要由系统事件来驱动,常见的系统事件包括中断,信号等。

linux服务器i o模型,高性能服务器框架--I/O模型相关推荐

  1. linux操作系统使用论文_Linux高性能服务器设计

    C10K和C10M 计算机领域的很多技术都是需求推动的,上世纪90年代,由于互联网的飞速发展,网络服务器无法支撑快速增长的用户规模.1999年,Dan Kegel提出了著名的C10问题:一台服务器上同 ...

  2. web 服务器 内存 影响_高性能服务器架构思路「不仅是思路」

    在服务器端程序开发领域,性能问题一直是备受关注的重点.业界有大量的框架.组件.类库都是以性能为卖点而广为人知.然而,服务器端程序在性能问题上应该有何种基本思路,这个却很少被这些项目的文档提及.本文正式 ...

  3. 阿里开源自研工业级稀疏模型高性能训练框架 PAI-HybridBackend

    近年来,随着稀疏模型对算力日益增长的需求, CPU集群必须不断扩大集群规模来满足训练的时效需求,这同时也带来了不断上升的资源成本以及实验的调试成本. 为了解决这一问题,阿里云机器学习PAI平台开源了稀 ...

  4. c1000k 高性能服务器构建技术,C1000K高性能服务器构建技术.ppt

    C1000K高性能服务器构建技术.ppt 还剩 50页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: C1000 ...

  5. 超算和服务器性能,烽火GPU高性能服务器助力武大超算中心建设

    近日,继"武汉大学100G高速网络及网格计算集群采购项目"中标后,烽火GPU高性能服务器再次中标"武汉大学GPU集群采购项目".作为行业首例,此次烽火将在武大超 ...

  6. c1000k 高性能服务器构建技术,C1000K高性能服务器构建技术 (52页)-原创力文档...

    C1000K高性能服务器构建技术;C1000K面对的挑战;解决方案;Agenda;Dell R710机器;硬件体系巨大变化;Cache在现代CPU硬件上的版面, 也充分说明了cache的重要性;9.要 ...

  7. 两个线程同时从服务器接收消息_Linux高性能服务器处理框架

    本文为转载,文中所提到的知识点是每个Linux开发人员都需要考虑的问题.https://www.jianshu.com/p/db15ff4e8359 终于开始学习epoll了,虽然不明白的地方还是很多 ...

  8. python高性能服务器编写,Tornado的高性能服务器开发常用方法

    最近一直开发AI人脸识别相关的项目,需要提供给客户一些服务,所以我需要开发一些服务端程序.由于AI算法都是用python3写的,所以我就索性用起了python开发服务端,毕竟速度也快,以前用过Flas ...

  9. 曙光天阔H系列服务器,曙光天阔 A620r- H服务器系统支持 AMD最新推出的

    曙光天阔 A620r- H服务器系统支持 AMD最新推出的 天阔A620r-H服务器 页码:1 版本:1.4 概述 曙 光天阔A620r-H服务器是曙光精心打造的一款性能卓越,稳定可靠,配置灵活的新一 ...

最新文章

  1. linux版魔兽服务端,linux下玩warcraft III(魔兽)
  2. centos 7.2 mysql 允许_CentOS 7.2 mysql-5.7.17 审计插件安装、开启与设定
  3. AdaBoost详解
  4. C#使用System.Data.SQLite操作SQLite
  5. Silverlight图片处理——(伸展,裁剪,蒙版)
  6. html制作微博界面,微博发布的HTML界面
  7. mp4box 编译与常用命令
  8. 大前研一《思考的技术》
  9. linux下反汇编命令,Linux下反汇编指定的函数
  10. NetSuite 库存盘点
  11. Linux预科知识篇之认识计算机
  12. 装部署VMware vSphere 5.5文档 (6-2) 为IBM x3850 X5服务器安装配置VMware ESXi
  13. CodeForces 839A Arya and Bran
  14. D1net阅闻:微信支付上线新一轮鼓励金活动
  15. Python UI自动化测试详解
  16. Vue项目中实现sm4 CBC、ECB加密传输
  17. BPM:现代化银行的“避雷针”(转)
  18. TronLink钱包连接后如何获取钱包地址
  19. 利用HTML5 canvas元素+原生JS编写贪吃蛇
  20. 推荐100首值得听的英文歌

热门文章

  1. 学习PowerShell和SQL Server –简介
  2. azure未连接_处理影响Azure成本的未使用和不必要的资源
  3. 如何下载和安装SQL Server数据库实验助手(DEA v2.0)
  4. 利用jQuery如何获取当前被点击的按钮
  5. python web开发-flask中消息闪现flash的应用
  6. js-JavaScript高级程序设计学习笔记1
  7. C++ 操作sqlite
  8. ASP.NET之Ajax系列(三)
  9. C++ 类的成员函数指针 ( function/bind )
  10. SQL Server 锁