• 202120221diocsUnix/Linux系统编程第十一周学习笔记


    20191218 2021-2022-1-diocs-块设备和缓冲区管理(学习笔记10)

    思维导图

    知识总结

    1. 解释块设备I/O的原理和I/O缓冲的优点
    2. 介绍Unix的缓冲区管理算法
    3. 利用信号量设计新的缓冲区管理算法,以提高I/O缓冲区的缓存效率和性能
    4. 介绍简单的PV算法及其特点

    基本概念
    
读写普通文件的算法依赖于两个关键操作,即get_block和put_block,这两个操作将磁盘块读写到内存缓冲区中。由于与内存访问相比,磁盘I/O速度较慢,所以不希望在每次执行读写文件操作时都执行磁盘I/O。因此、大多数文件系统使用I/O缓冲来减少进出存储设备的物理I/O数量。

    合理设计的I/O缓冲方案可显著提高文件I/O效率并增加系统吞吐量。

    I/O缓冲的基本原理非常简单。文件系统使用系列I/O缓冲区作为块设备的缓存内存。当进程试图读取(dev,blk)标识的磁盘块时。它首先在缓冲区缓存中搜索分配给磁盘块的缓冲区。

    如果该缓冲区存在并且包含有效数据、那么它只需从缓冲区中读取数据、而无须再次从磁盘中读取数据块。如果该缓冲区不存在,它会为磁盘块分配一个缓冲区,将数据从磁盘读人缓冲区,然后从缓冲区读取数据。当某个块被读入时,该缓冲区将被保存在缓冲区缓存中。以供任意进程对同一个块的下一次读/写请求使用。同样。当进程写入磁盘块时。它首先会获取一个分配给该块的缓冲区。然后,它将数据写入缓冲区,将缓冲区标记为脏、以延迟写入,并将其释放到缓冲区缓存中。由于脏缓冲区包含有效的数据,因此可以使用它来满足对同一块的后续读/写请求,而不会引起实际磁盘I/O。脏缓冲区只有在被重新分配到不同的块时才会写入磁盘。

    在read file/write file中,我们假设它们从内存中的一个专用缓冲区进行读/写。
    对于I/O缓冲,将从缓冲区缓存中动态分配缓冲区。假设BUFFER是缓冲区的结构类型,而且getblk(dev,blk)从缓冲区缓存中分配一个指定给(dev,blk)的缓冲区。定义一个bread(dev,blk)函数,它会返回一个包含有效数据的缓冲区(指针)。

    从缓冲区读取数据后,进程通过brelse(bp)将缓冲区释放会缓冲区缓存。同理,定义一个write_block(dev, blk, data)函数。

    同步写入操作等待写操作完成,用于顺序块或可移动块设备。

    当I/O操作完成后,设备中断处理程序会完成当前缓冲去上的I/O操作,并启动I/O队列中下一个缓冲区的I/O。

    Unix I/O缓冲区管理算法

    实践过程

    1. 信号同步
    生产者消费者问题

    吃梨子和吃苹果

    2. setbuf函数和setvbuf函数
    函数setbuf()用于将指定缓冲区与特定的文件流相关联,实现操作缓冲区时直接操作文件流的功能。
    函数原型为void setbuf(FILE * stream, char * buf);
    参数stream为文件流指针,buf为缓冲区的起始地址。
    如果参数buf 为NULL 指针,则为无缓冲,setbuf()相当于调用setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZE)
    在打开文件流后,读取内容之前,可以调用setbuf()来设置文件流的缓冲区

    setvbuf()函数设置文件流的缓冲区
    函数原型为int setvbuf(FILE * stream, char * buf, int type, unsigned size);
    参数stream为文件流指针,buf为缓冲区首地址,type为缓冲区类型,size为缓冲区内字节的数量。

    setbuf()和setvbuf()函数的实际意义在于:用户打开一个文件后,可以建立自己的文件缓冲区,而不必使用fopen()函数打开文件时设定的默认缓冲区。这样就可以让用户自己来控制缓冲区,包括改变缓冲区大小、定时刷新缓冲区、改变缓冲区类型、删除流中默认的缓冲区、为不带缓冲区的流开辟缓冲区等。

    代码链接

    我的码云仓库

  • 相关阅读:
    使用Oracle ODP.NET 11g的.NET程序发布方法
    Client使用c#和odp.net连接server oracle
    打造百度网盘备份利器:自动备份Linux VPS文件和多线程下载百度网盘资源
    安装软件:/lib/ld-linux.so.2: bad ELF interpreter解决
    ArcSDE数据库连接(直连、服务连)与GT_Geometry存
    AE的Annotation学习摘记
    Samba简单配置--匿名用户共享资料可读可写的实现
    Sublime Text 2 使用心得
    ArcGIS Server启动服务报:ERROR: Unable to start Xvfb on any port in the range 6600
    [DataContract] 和[DataMember]
  • 原文地址:https://www.cnblogs.com/20191218tangqiheng/p/15560052.html
Copyright © 2020-2023  润新知