高性能服务器框架--I/O模型

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读写(是应用程序还是内核),在并发模型中,同步指的是程序完全按照代码序列的顺序执行,异步值得是程序执行需要由系统事件来驱动,常见的系统事件包括中断,信号等。

时间: 2024-10-05 21:32:49

高性能服务器框架--I/O模型的相关文章

nginx源码分析--高性能服务器开发 常见进程模型

1.高性能服务器 对一个高性能服务器来说,处理速度快和资源占用小是典型特性,尤其是当服务器遇到C10K问题的时候(网络服务器在处理数以万计的客户端连接时,往往出现效率低下甚至完全瘫痪,这被称为C10K问题).要做到处理速度足够快,其并发模型的设计相当关键,而要做到资源尤其是内存资源的占用少,就要依赖于其资源分配和资源管理的方案设计. 服务器的并发模型设计是网络编程中很关键的一个部分,服务器的并发量取决于两个因素,一个是提供服务的进程数量,另外一个是每个进程可同时处理的并发连接数量.相应的,服务器

linux高性能服务器编程

<Linux高性能服务器编程>:当当网.亚马逊 目录: 第一章:tcp/ip协议族 第二章:ip协议族 第三章:tcp协议详解 第四章:tcp/ip通信案例:访问Internet 第五章:linux网络编程基础API 第六章:高级IO函数 第七章:linux服务器程序规范 第八章:高性能服务器框架 第九章:IO复用 第十章:信号 第十一章:定时器 第十二章:高性能IO框架库libevent 第十三章:多进程编程 第十四章:多线程编程 第十五章:进程池和线程池 第十六章:服务器调制.调试和测试

高性能服务器程序框架

服务器解构为三个主要模块: IO处理单元.四种IO模型和两种高效事件处理模式. 逻辑单元.两种高效并发模式. 存储单元.(暂不讨论) 1.服务器模型 (1)C/S (客户端/服务器)模型 C/S模型的逻辑很简单.服务器启动后,首先创建一个或者多个监听socket,并调用bind函数将其绑定到服务器感兴趣的端口上,然后调用listen函数等待客户连接.服务器稳定运行后,客户端就可以调用Connect函数向服务器发起连接了.由于客户连接请求时随机到达的异步事件,服务器需要使用某种I/O模型来监听到连

《Linux高性能服务器编程》学习总结(八)——高性能服务器程序框架

第八章      高性能服务器程序框架 我们将服务器一般分为三个主要模块,I/O处理单元.逻辑单元及存储单元.常用的服务器模型有C/S模型和P2P模型,比较简单.我们来看一下网络编程中的I/O模型.首先我们要了解阻塞模型和非阻塞模型的区别,socket在创建时默认是阻塞的,可以在socket系统调用的第二个参数传递SOCK_NONBLOCK标志或者通过fcntl将其设置为非阻塞,针对阻塞I/O的系统调用可能因为无法立即完成而被系统挂起,直到等待的事件发生为止,而非阻塞I/O的系统调用则会立即返回

完成端口与高性能服务器程序开发

原文出处:http://blog.csdn.NET/roen/archive/2007/03/19/1533378.aspx 以一个文件传输服务端为例,在我的机器上它只起两个线程就可以为很多个客户端同时提供文件下载服务,程序的性能会随机器内CPU个数的增加而线性增长,我 尽可能做到使它清晰易懂,虽然程序很小却用到了NT 5的一些新特性,重叠IO,完成端口以及线程池,基于这种模型的服务端程序应该是NT系统上性能最好的了. 首先.做为完成端口的基础,我们应该理解重叠IO,这需要你已经理解了内核对象及

【高性能服务器】Nginx剖析

引言 Nginx是一个流行的高性能服务器,官方宣称在压力测试下可以支持5万个并发连接,而且占用内存极低.相比于其他昂贵的硬件负载均衡解决方案,Nginx是开源免费的,可以大大降低成本.本文将从一下几个方面来剖析其内部结构. 特点 进程模型 惊群效应 负载均衡 核心模块 模块分类 事件驱动模块机制 反向代理模块 配置文件 Nginx的特点 Nginx是俄罗斯工程师开发的高性能Web服务器,为了实现高效Nginx全部采用C语言编写,因为底层对不同的操作系统进行了封装,所以Nginx实现了平台无关性.

【转】高性能服务器架构(High-Performance Server Architecture)

High-Performance Server Architecture 高性能服务器架构 来源:http://pl.atyp.us/content/tech/servers.html译文来源:http://www.lupaworld.com/home/space-341888-do-blog-id-136718.html (map注:本人看了一遍,“于我心有戚戚焉”,翻译得也很好,于是整理了一下,重新发布,备忘) 引言 本文将与你分享我多年来在服务器开发方面的一些经验.对于这里所说的服务器,更

高性能通信框架 HP-Socket v4.1.1

HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++.C#.Delphi.E(易语言).Java.Python 等编程语言接口.HP-Socket 对通信层实现完全封装,应用程序不必关注通信层的任何细节:HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中. 为了让使用者能方便快速地学习和使用 HP-S

第二篇:Python高性能Web框架tornado源码剖析之待请求阶段

上篇<第一篇:Python高性能Web框架Tornado原理剖析>用上帝视角多整个框架做了一个概述,同时也看清了web框架的的本质,下面我们从tornado程序的起始来分析其源码. 概述 上图是tornado程序启动以及接收到客户端请求后的整个过程,对于整个过程可以分为两大部分: 启动程序阶段,又称为待请求阶段(上图1.2所有系列和3.0) 接收并处理客户端请求阶段(上图3系列) 简而言之: 1.在启动程序阶段,第一步,获取配置文件然后生成url映射(即:一个url对应一个XXRequestH