预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共12页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

以下为《构建高性能Web站点》部分内容节选,感谢您的阅读,您可以自由传播它,但请确保它的完 整性。 《构建高性能Web站点》目前还在编写中,预计上市时间为2009年9月,出版商为电子工业出版 社。在本书上市之前,作者希望听到更多的建议和支持,如果您希望了解本书编写进展、试读内容节 选、反馈宝贵建议,请您加入以下讨论组,对于讨论组活跃的成员,新书上市后会获得赠送版,以表感 谢。 《构建高性能Web站点》读者讨论组 http://groups.google.com/group/highperformanceweb 截至目前完成的内容索引列表 http://groups.google.com/group/highperformanceweb/web/《构建高性能web站点》已完成 内容索引 服务器并发处理能力 I/O模型 有人说,比特天生就是用来被复制的,数据的生命意义便在于输入输出,的确,计算机的重要工作之一 便是负责各种设备的数据输入输出,也就是I/O(In/Out)操作。 事实上,I/O操作根据设备的不同,有很多种类型,比如内存I/O、网络I/O、磁盘I/O。对于内存I/ O,一般我们在讨论Web站点性能时很少提及,因为相比于后两种I/O操作,内存I/O的速度已经足够 快了,前边我们介绍过网络数据传输中的瓶颈往往在于带宽最低的交换节点,类似的,计算机性能的瓶 颈往往并不在于内存I/O本身。 对于网络I/O和磁盘I/O,它们的速度要慢很多,尽管使用RAID磁盘阵列可以通过并行磁盘访问来加快 磁盘I/O速度,购买大量独享网络带宽以及使用高带宽网络适配器可以提高网络I/O的速度。可是,问 题在于,这些I/O操作需要由内核系统调用来完成,同时系统调用显然需要由CPU来调度,而CPU的速 度毫无疑问是非常快的,这就使得CPU不得不浪费宝贵的时间来等待慢速I/O操作。 尽管我们通过多进程等方式来充分利用空闲的CPU资源,但是我们还是希望能够让CPU花费足够少的时 间在I/O操作的调度上,这样就可以腾出更多的CPU时间来完成更多的I/O操作,事实上,如何让高速 的CPU和慢速的I/O设备更好的协调工作,这是从现代计算机诞生到现在一直在探讨的话题,很多技术 和策略都围绕它们展开。 针对本章Web服务器并发处理能力的讨论范畴,我们所关注的I/O操作具体的说,主要是网络数据的接 收和发送,以及磁盘文件的访问,我们将其归纳为多种模型,称为I/O模型,它们的最大本质区别便在 于CPU的参与方式。 PIO与DMA 在介绍I/O模型之前,有必要简单的说说慢速I/O设备和内存之间的数据传输方式。 我们拿磁盘来说,很早很早以前,磁盘和内存之间的数据传输是需要CPU控制的,也就是说如果我们读 取磁盘文件到内存中,数据要经过CPU存储转发,这种方式成为PIO。显然这种方式非常的不合理,需 要占据大量的CPU时间来读取文件,造成文件访问时系统几乎停止响应。 后来,DMA(直接内存访问,DirectMemoryAccess)取代了PIO,它可以不经过CPU而直接进行 磁盘和内存的数据交换。在DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据 的传送,DMA控制器通过系统总线来传输数据,传送完毕再通知CPU,这样就很大程度上减轻了CPU 占有率,大大节省系统资源,而它的传输速度与PIO的差异其实并不十分明显,因为这主要取决于慢速 设备的速度。 可以肯定的是,PIO模式的计算机我们已经很少见到。 同步阻塞I/O 说到阻塞,首先得说说I/O等待。造成等待的原因非常多,比如Web服务器在等待用户的访问,这便是 等待,因为它不知道谁会来访问,所以只能等。随后,当某个用户通过浏览器发出请求,Web服务器 与该浏览器建立TCP连接后,又要等待用户发出HTTP请求数据,用户的请求数据在网络上传输需要时 间,进入服务器接收缓冲区队列以及被复制到进程地址空间,都需要时间。另外,假如浏览器和Web 服务器采用HTTP长连接模式,那么在超时关闭连接之前,服务器还要等待浏览器发送其它的请求,这 也是I/O等待。 再比如,读取某磁盘文件的I/O操作,可能先要等待其它的磁盘访问操作,因为除非是RAID磁盘,否 则磁头只有一个,只能一个个排队读取,即使是轮到自己了,在磁盘上读取数据本身也要花费时间。 可见,I/O等待是不可避免的,那么既然有了等待,就会有阻塞,但是注意,我们说的阻塞是指当前发 起I/O操作的进程被阻塞,并不是CPU被阻塞,事实上没有什么能让CPU阻塞的,CPU只知道拼命的计 算,对于阻塞一无所知。 另外,“同步”的概念在这里显得并不那么重要,只是为了和后边的异步I/O加以区分,我们在介绍异步 事件通知和异步I/O的时候再