- 1、本文档共25页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux那些破事儿之我的高性能
Linux 那些破事儿之我的高性能
1. 引子
台湾作家林清玄在接受记者采访的时候,如此评价自己 30 多年写作生涯:
“第一个十年我才华横溢,‘贼光闪现’,令周边黯然失色;第二个十年,我终于
‘宝光现形’,不再去抢风头,反而与身边的美丽相得益彰;进入第三个十年,
繁华落尽见真醇,我进入了‘醇光初现’的阶段,真正体味到了境界之美”。
长夜有穷,真水无香。领略过了Linux 特种文件系统的繁花似锦,该是体味
性能境界之美的时候了。
首先感谢大家,能够花时间在这里看我发疯,与我共同完成这种伪技术课程。
真的,时间有限生命有限,我永远相信,挤乳沟要比挤时间容易很多。这一节课
中,我挑选出了几个当今Linux 系统中最具高性能特质的东东,把它们进行抽丝
剥茧,打碎牙齿,统统喂到你们耳朵里。至于你们能不能接受,反正我是过瘾了。
我在每一个小节都会划分为:技术背景、理论和实际应用案例三个部分。虽
然是这么划的,但是我会根据自己对某一方面掌握的深浅,在这三个部分中的侧
重会有所偏差。还是那句话:至于你们习惯不习惯,反正我就是这么划了。
2. epoll
某医学院上专业课,一男老师叫起一位不专心听讲的女生问:“人体哪个器
官,在激动时可以变大好几倍?”女生憋得脸通红不知如何作答。一男生出来解
围,答道:“瞳孔。”
呵呵,你们是否也想歪了?不过,在医学界有一个专有名词叫 ED,凡是患
上这种疾病的男性,不管怎么激动,有个器官怎么都不会变大。这次你们没有想
歪,因为这种疾病的中文名称叫阳痿。在计算机界有一个跟这相似的名词叫ET,
中文上叫边沿触发。在发音上,ED 和 ET 很多时候是会让人混淆的,差别就在
于:作为男人你肯定是不想ED 的,但作为真男人你一定喜欢ET 。
epoll ,自从出现在人们视野中,就从不缺乏对它好奇而又有莫大敬畏的追
随者,并且一直是他们的午后谈资。究其原因就是在人们心目中,epoll 就是大
并发、高性能的代表,可是它所引入的,据说是最具超能力素质的ET 工作模式,
总是引发出各种让人们琢磨不透的问题,让人百思不得其钥匙。那么,接下来,
我就跟大家一起,配好这把钥匙吧。
2.1 背景
自从世上第一台计算机诞生到今天,计算机的本质——输入和输出,简称
I/O——就从来没有改变过。因为,没有输入,计算机就不知道要计算什么;没
有输出,再快的计算也没有意义。如何处理I/O,也就成了计算机界恒古不变的
话题。
随着技术的日新月异,计算机的速度越快,对高效的处理I/O 的需求就越紧
迫,在人们的不断探索中,时至今日已经发明了很多种处理I/O 问题的方式,从
形式上划分的话,可归类为4 大模型:阻塞、非阻塞、复用和异步。
阻塞式 I/O 就不必多说了,非阻塞式 I/O 就是在 I/O 请求时加上
O_NONBLOCK 一类的标志,立刻返回,I/O 没有就绪就会返回错误,需要请求者
主动轮询不断发I/O 请求直到返回返回正确;I/O 复用同非阻塞式I/O 本质是一
样的,不过利用新的select、poll、epoll 等系统调用,由操作系统来负责轮询操
作;异步I/O 也不会因为I/O 操作而阻塞,但不需要轮询,待I/O 操作完成后通
知请求者。作为网络服务器应用,到目前为止I/O 服用依然是最为有效的解决方
案,异步I/O 再处理大量网络请求时,相较于I/O 服用需要更多的系统资源,因
此更适用于量少但对性能要求较高的文件处理和网络传输。我们先讨论I/O 复用,
后面我们再详细讨论异步I/O 。
I/O 复用是随着网络的发展,网络服务器需要处理大量客户请求的历史背景
下被发明的。大家耳熟能详的,也是最为著名的select 调用,就是这个背景下的
产物。I/O 复用实际上是一种复合I/O 模型,既利用类似于select 的调用对阻塞
或非阻塞式I/O 的一个集合进行监控,找出那些调用者所感兴趣的I/O 事件。
经典的select 处理方式是这样的:调用者将需要监控的I/O 句柄放入一个数
组中,将这个数组传递给select 调用,并设定监控何种事件(一般是可读或可写);
这时select 会阻塞调用进程(当前多数使用线程);当有I/O 事件发生时,select
就在数组中给发生了事件的那些I/O 句柄
文档评论(0)