学习笔记10

第12章 块设备I/O和缓冲区管理

1. 块设备I/O缓冲区

1. 缓冲区的作用:

缓冲区在内存中缓存数据,减少了直接磁盘操作的次数,从而提高了系统的吞吐量。

2. 缓冲区的类型:

在 Unix/Linux 中,有多种类型的缓冲区,例如:

  • 全缓冲:在这种缓冲区中,所有的 I/O 操作都在内存中完成,直到写入或读取一个完整的缓冲块后,才会与磁盘进行实际的交互。
    - 行缓冲:对于文本文件,某些应用程序可能会使用行缓冲。在这种情况下,缓冲区会缓存一行文本,直到遇到换行符或读取/写入完毕。
    - 无缓冲:在这种情况下,I/O 操作会直接与磁盘交互,不经过缓冲区。

3. 缓冲区的操作:

  • 刷新缓冲区:将缓冲区中的数据写入磁盘。
  • 清除缓冲区:从缓冲区中删除数据,以便可以重新使用。

4. 缓冲区的使用示例:

  • 读取文件:使用 read() 系统调用读取文件时,如果设置了缓冲区,则数据会先被读取到缓冲区,直到读取完毕或遇到 EOF。
  • 写入文件:使用 write() 系统调用写入文件时,如果设置了缓冲区,则数据会先被写入到缓冲区,直到缓冲区满或调用 flush()。

5. 注意事项:

  • 缓存区大小:需要根据实际情况设置合适的缓冲区大小。如果缓冲区太小,可能会频繁地进行磁盘操作,降低性能。如果缓冲区太大,可能会浪费大量内存。
  • 刷新问题:在使用缓冲区时,需要注意及时刷新缓冲区,以避免数据丢失。
  • 无缓冲 I/O:在某些情况下(例如,实时数据传输),可能需要禁用缓冲区。

2. I/O缓冲区管理算法

1. 全缓冲 (Full Buffering):

在这种模式下,所有的I/O操作都在内存中进行缓冲。当你向设备发送数据时,内核会先将其放入缓冲区,然后一次性将缓冲区的数据发送到设备。
同样,从设备读取数据时,也是先读入缓冲区,然后用户可以从缓冲区中读取数据。
这种模式下,用户程序不需要干预缓冲区的管理。

2. 行缓冲 (Line Buffering):

行缓冲是针对文本设备的。在标准输出(例如终端)上,行缓冲会确保每一行文本被完整地写入,或者读取。
虽然行缓冲也是全缓冲的一种形式,但它有特殊的要求:当读取或写入缓冲区时,只有当缓冲区中的数据量达到一定程度或者遇到换行符时,才会进行实际的I/O操作。

3. 无缓冲 (No Buffering):

在无缓冲模式下,所有的I/O操作都是立即执行的,没有缓冲区可言。
这种模式下,用户程序需要直接和设备进行交互,适合于那些需要精确控制数据传输的程序。

4. 标准I/O (Standard I/O):

Unix/Linux提供了一个标准I/O库,它使用上述缓冲区管理模式之一来处理I/O操作。例如,使用stdio.h库中的函数进行文件读写时,默认情况下是行缓冲的。

苏格拉底挑战
image
image
image
image

posted @   窦豆  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示