曲径通幽论坛
标题:
提高文件 I/O 效率的方法:使用缓冲
[打印本页]
作者:
beyes
时间:
2008-11-16 23:01
标题:
提高文件 I/O 效率的方法:使用缓冲
缓冲区的大小对性能有很大的影响,举例来说,用勺子把汤从一个碗里舀到另外一个碗里,用较大的勺子就可以少舀几次,从而节省时间。
对文件操作同样如此。比如复制一个 5M 的文件,如果设定缓冲为 1M ,那么只需要系统调用 5 次便可以完成了文件的复制;如果缓冲区只设置为 512K,那么需要系统调用 10 次才可以复制完文件。然而,
系统的调用是需要很多时间的
。
为什么系统调用需要花很多时间呢?下面示范系统调用 read() 的一个过程:
Quote:
[blockquote]
|------ 用户进程----|
-->---
|-----read()-----|
--->----
|-----------------数据-------------------|
<----用户空间----> <---内核空间--> <--------------磁盘空间-------------->
[/blockquote]
当 read() 调用发生时,执行权会从用户代码转移到内核代码,其中转换和执行内核代码是需要时间的
系统调用开销大不仅仅是因为要传输数据,当运行内核代码时,CPU工作在 supervisor模式,这对应于一些特殊的堆栈和内存环境,必须在系统调用发生时建立好。系统调用结束后( read()返回),CPU要切换回用户模式,这时就必须把堆栈和内存环境恢复成用户程序运行时的状态,而这种运行环境的切换是需要消耗很多时间的。
在 supervisor(管理员模式) 下,程序可以直接访问磁盘,终端,打印机等设备,还可以访问全部的内存空间;而在用户模式下,程序不能直接访问设备,也只能访问特定部分的内存空间。
在运行时刻,系统会根据需要不断地在两种模式间的切换。管理员模式和用户模式的切换与CPU关系很大,CPU中有特定的标记来区分当前的工作模式。
举一个形象的例子,在电影《超人》中,超人有两种形态,一种是现实中普通人(用户模式);另外一种是能力惊人的超人(管理员模式)。在需要从普通人变成超人时,超人先需要找一个地方,然后脱掉西装,摘取眼镜,改变发型,然后变成超人去拯救他人。等任务完成后,又找个地方变回普通人。变来变去,是很需要时间的。
如果一个程序,无缓冲的频繁的进行系统调用,而让CPU把太多的时间消耗在执行内核代码和模式的切换上,那么CPU就不可能有很多时间来执行程序中业务逻辑的代码或提供系统服务,所以要尽可能地减少模式间的切换。也就是,不能老是让超人变来变去,那么他就没有什么精力去拯救人类了。
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/)
Powered by Discuz! X3.2