曲径通幽论坛

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

内核缓冲技术

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2008-11-16 23:03:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
缓冲技术对提高系统的效率很明显,它的主要思想是一次读入大量的数据放入缓冲区,需要的时候从缓冲区取得数据。

    在内核方面,管理员模式和用户模式的切换需要消耗时间,但相比之下,磁盘的I/O操作消耗的时间更多,为了提高效率,内核也使用缓冲技术提高对磁盘的访问速度。

   模型如下图示:
  

上图中,最底下的圆盘为“磁盘”,中间灰色长方体为“内核空间”,内核中的紫色部分为“内核缓冲区”;内核上面的身绿色长方体为“进程空间”,“进程空间”中的白色部分为“由程序建立的缓冲区”。

  磁盘是数据块的集合。内核会对磁盘上的数据块作缓冲,就像 who 程序缓冲 utmp 记录一样。内核将磁盘上的数据块复制到内核缓冲区中,当一个用户空间中的进程要从磁盘行读取数据时,内核一般不直接读取磁盘,而是将内核缓冲区中的数据复制到进程的缓冲区中。

  当进程所需要的数据快不在内核缓冲区时,内核会把相应的数据块加入到请求数据列表中,然后把该进程挂起,接着为其他进程服务。

一段时间后(很短),内核把相应的数据块从磁盘读到内核缓冲区中,然后再把数据复制到进程的缓冲区中,最后唤醒被挂起的进程。

系统调用 read() 和write();read()把数据从内核缓冲区复制到进程缓冲区中;write()把数据从进程缓冲区复制到内核缓冲区,它们并不等价于数据在内核缓冲和磁盘之间的交换。比如说,read()一块 512K 字节的数据,如果 内核缓冲区中已经有了需求的 500K ,那么只需要再从磁盘里拿出12K ,即可满足要求;这里,内核缓冲区和磁盘间的交换只有 12K。因此,read()的动作,不是说要读512K,那么内核缓冲区就得从磁盘里取出512K,所以说read()不等价于数据在内核缓冲和磁盘之间的交换。

从理论上讲,内核可以在任何时候写磁盘,但并不是所有的 write操作都会导致内核的写动作。内核会把要写的数据暂时存放在缓冲区中,积累到一定数量后再一次写入。有时候会导致意外情况,比如突然断电,内核还来不及吧内核缓冲区中的数据写到磁盘上,这些更新的数据就要丢失。

  应用内核缓冲技术导致的结果:

  1、提高磁盘 I/0 效率
  2、优化磁盘的写操作
  3、需要及时地将缓冲数据写入磁盘

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-4 20:42 , Processed in 0.062088 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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