曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6259|回复: 0
打印 上一主题 下一主题

提高文件 I/O 效率的方法:使用缓冲

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2008-11-16 23:01:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
缓冲区的大小对性能有很大的影响,举例来说,用勺子把汤从一个碗里舀到另外一个碗里,用较大的勺子就可以少舀几次,从而节省时间。

对文件操作同样如此。比如复制一个 5M 的文件,如果设定缓冲为 1M ,那么只需要系统调用 5 次便可以完成了文件的复制;如果缓冲区只设置为 512K,那么需要系统调用 10 次才可以复制完文件。然而,系统的调用是需要很多时间的

为什么系统调用需要花很多时间呢?下面示范系统调用 read()  的一个过程:

Quote:
[blockquote]
|------ 用户进程----|-->---|-----read()-----|--->----|-----------------数据-------------------|
<----用户空间---->        <---内核空间-->            <--------------磁盘空间-------------->
[/blockquote]

当 read() 调用发生时,执行权会从用户代码转移到内核代码,其中转换和执行内核代码是需要时间的

系统调用开销大不仅仅是因为要传输数据,当运行内核代码时,CPU工作在 supervisor模式,这对应于一些特殊的堆栈和内存环境,必须在系统调用发生时建立好。系统调用结束后( read()返回),CPU要切换回用户模式,这时就必须把堆栈和内存环境恢复成用户程序运行时的状态,而这种运行环境的切换是需要消耗很多时间的。

在 supervisor(管理员模式) 下,程序可以直接访问磁盘,终端,打印机等设备,还可以访问全部的内存空间;而在用户模式下,程序不能直接访问设备,也只能访问特定部分的内存空间。

在运行时刻,系统会根据需要不断地在两种模式间的切换。管理员模式和用户模式的切换与CPU关系很大,CPU中有特定的标记来区分当前的工作模式。

举一个形象的例子,在电影《超人》中,超人有两种形态,一种是现实中普通人(用户模式);另外一种是能力惊人的超人(管理员模式)。在需要从普通人变成超人时,超人先需要找一个地方,然后脱掉西装,摘取眼镜,改变发型,然后变成超人去拯救他人。等任务完成后,又找个地方变回普通人。变来变去,是很需要时间的。

如果一个程序,无缓冲的频繁的进行系统调用,而让CPU把太多的时间消耗在执行内核代码和模式的切换上,那么CPU就不可能有很多时间来执行程序中业务逻辑的代码或提供系统服务,所以要尽可能地减少模式间的切换。也就是,不能老是让超人变来变去,那么他就没有什么精力去拯救人类了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 05:21 , Processed in 0.064690 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表