- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
浅析 Linux IO技术体系
1 基本概念
IO操作是程序设计里的一个重头戏 ,尤其是 Linux中 ,管道、网络等设备都看成了文件描述符 ,因此IO对于Linux程序设计更加重
要。近年来 ,随着Nginx、lighttpd等新型高性能web服务器的广泛使用 ,其内部采用的epoll、异步IO等IO模型逐渐走入了人们的视野。
本文将探究Linux各个IO模型的来龙去脉、基于原理与相互之间的联系 ,并进行IO效率与性能的简要分析 ,解决人们对于Linux IO众多概
念、模型的理解混乱与误解 ,理顺出一个清晰的技术体系。
介绍Linux IO模型之前 ,需要先介绍两个对于论述IO模型非常重要的概念。
1.1 阻塞IO与非阻塞IO
所谓IO的阻塞与非阻塞 ,是指当进行IO操作时 ,需要的资源不可用 ,这时程序的表现。阻塞IO将让程序处于等待状态 ,指导需要的资源可
用 ;而非阻塞IO将直接返回 ,不等需要的资源可用。
比如通过read函数从一个网络socket中读取数据 ,对于阻塞IO来说 ,如果网络中没有数据 ,则read函数将一直阻塞直到有数据可
用 ,程序阻塞期间CPU将把时间片调度给其他进程 ;如果处于非阻塞IO模式 ,read函数将直接返回一个错误码 ,不会等待。
Linux支持将文件描述符设置为NOBOLCK支持IO的非阻塞模式。
1.2 同步IO与异步IO
IO的同步异步与IO的阻塞非阻塞这两种概念很容易混淆 ,实际上这两种概念的定义并不相似。同步IO是指发出IO操作后 ,后面的操
作不能进行 ,要么等待IO操作完成 ,要么放弃IO操作 ,总之后面的操作和当前的IO操作只能有一个 进行 ;异步IO是指发出IO操作后 ,马
上返回而继续执行后面的操作 ,而IO操作也 此时刻执行。
从以上的概念可以看出 ,同步与异步、阻塞与非阻塞这两种概念关注点不同 ,没有半毛钱关系。实现IO和其他任务的异步操作并难 ,
开启两个线程 ,一个进行IO操作 ,另一个线程继续进行后面的任务处理就行了 ,至于进行IO操作的线程既可以使用阻塞IO ,也可以使用非
阻塞IO。
而同步IO就更简单了 ,一般单个线程下的普通阻塞IO或者非阻塞IO都是同步的 ,因为IO操作和其他任务无法同时进行 ,要么想阻
塞IO那样 ,一直等待进行IO操作而不管后面的任务操作 ,要么想非阻塞IO那样 资源不可用时不管IO操作 ,直接 返回 ,进行后面的业务
操作。
需要指出的是 ,本文介绍的异步IO并不是采用多线程或者多进程那样简单的实现 ,而是 单线程内实现IO操作和其他任务的异步执
行 ,这需要Linux操作系统内核的支持 ,而且效率更高。
2 Linux IO模型分析
2.1 普通阻塞IO (普通青年 选择 )
普通阻塞IO是最基础最简单 ,也是使用最广泛的一种IO编程模型 ,菜鸟程序员 提高之前必须熟练掌握。
这种编程模型的详细流程如下图所示 ,各种IO操作 ,比如socket accept、read、write等 , 资源不可用时 , 此模型下都处于等待
状态 ,让出CPU资源给其他进程。
利用普通阻塞IO模型实现对多个文件描述符进行IO操作时 ,或者实现异步操作时 ,只能使用多线程方式 ,从而增加了线程切换方面
的开销 , 后面对各个IO模型性能的分析中将详细比较多线程阻塞IO和多路IO复用的性能差异。
2.2 普通非阻塞IO (2B青年 选择 )
普通非阻塞IO模型与阻塞模型的区别只是当IO操作遇到资源不可用时 ,非阻塞IO不会等待 ,而直接返回。普通非阻塞IO模型是实现
多路复用技术和异步IO技术的重要基础 ,但是单独使用非阻塞IO则是一种效率极低的行为。比如当进行read操作时没有可读数据 ,因为不
等待直接返回 ,所以不得不自己编写while循环 ,一遍遍的进行非阻塞的read操作 ,也就是轮询。这时程序一直处 运行状态 ,因此不会
让出CPU ,但是轮询实际上是一种无用功 ,最终的结果就是CPU都用 了无谓的轮询上了 ,造成CPU占用量高 ,但是IO吞吐量却不会超过
普通阻塞IO编程。
普通非阻塞IO模型的时序流程如下图所示 :
正如上图显示的轮询过程
文档评论(0)