首页 > 系统相关 >《Unix/Linux系统编程》第十二章学习笔记

《Unix/Linux系统编程》第十二章学习笔记

时间:2023-11-16 14:57:03浏览次数:41  
标签:缓存 编程 dev Unix bp Linux 缓冲区 磁盘

《Unix/Linux系统编程》第十二章学习笔记

概念介绍

块设备I/O缓冲区

用来代替磁盘I/O的文件存取方法,基本原理是使用一系列的I/O缓冲区作为块设备的缓存内存。当进程试图读取(dev, blk)标识的磁盘块时,它首先在缓冲区缓存中搜索分配给磁盘块的缓冲区。如果该缓冲区存在并且包含有效数据,那么它只需从缓冲区中读取数据,而无须再次从磁盘中读取数据块。如果该缓冲区不存在,它会为磁盘块分配一个缓冲区,将数据读入缓冲区中,再从缓冲区中读取数据。当某个块被读入时,该缓冲区将被保存在缓冲区缓存中,以供任意进程对同一个块的下一次读/写请求使用。同样,当进程写入磁盘块时,它首先会获取一个分配给该块的缓冲区。然后,它将数据写入缓冲区,将缓冲区标记为脏,以延迟写人,并将其释放到缓冲区缓存中。由于脏缓冲区包含有效的数据,因此可以使用它来满足对同一块的后续读/写请求,而不会引起实际磁盘L/O。脏缓冲区只有在被重新分配到不同的块时才会写入磁盘

  • 返回一个包含有效数据的缓冲区指针

    BUFFER *bread(dev,blk)
    {
    	BUFFER *bp =» getblk(dev,blk)} //get a buffer for(dev,blk)
        if (bp data valid)
    		return bp;
    	bp -> opcode = READ;		 //issue READ operation
    	start_io(bp);
    	wait for I/O complete;
    	return bp;
    }
    
  • 释放缓冲区

    write_block(dev , blk , data)
    {
    	BUFFER *bp = bread(dev , data) //write data for U space
    	write data to bp;
    	(synchronous write)? bwrite(bp) : dwrite(bp);
    }
    

    bwrite(bp)表示同步写入,一般用于USB驱动器之类的设备。

    dwrite(bp)表示延迟写入,是随机访问设备如硬盘所使用的写操作方式,dwrite会将缓冲区标记为脏,脏缓冲区只有在被重新分配到不同的磁盘块时才会被写入磁盘。

Unix系统的 I/O缓冲区管理算法

1 . Unix I/O缓冲区管理算法 :

  • I/O缓冲区:内核中的一系列NBUF缓冲区。 每个缓冲区用一个结构体表示。缓冲区结构体由两部分组成; 用于缓冲区管理的缓冲头部分和用于数据块的数据部分。为了保护内核内存, 状态字段可以定义为一个位向扭, 其中每个位表示一个唯一的状态条件。
  • 设备表:每个块设备用一个设备表结构表示
  • 缓存区初始化:系统启动时的I/O缓冲区都处在空闲列表,所有设备列表和I/O队列皆为空
  • 缓冲区列表:当缓冲区被分配给(dev , blk)时,插入设备列表的dev_list中
  • Unix get/brelse算法:用于重新分配缓冲区

2 . Unix算法的一些具体说明

  • 数据一致性:为了确保数据-致性,getblk一定不能给同一个(dev,blk)分配多个缓冲区。这可以通过让进程从休眠状态唤醒后再次执行“重试循环”来实现。读者可以验证分配的每个缓冲区都是唯一的。其次,脏缓冲区在重新分配之前被写出来,这保证了数据的一致性。

  • 缓存效果:缓存效果可通过以下方法实现。释放的缓冲区保留在设备列表中,以便可能重用。标记为延迟写入的缓冲区不会立即产生I/O、并且可以重用。缓冲区会被释放到空闲列表的末尾,但分配是从空闲列表的前面开始的。这是基于LRU(最近最少使用)原则, 它有助于延长所分配缓冲区的使用期,从而提高它们的缓存效果。

  • 临界区:设备中断处理程序可操作缓冲区列表,例如从设备表的I/O队列中删除 bp. 更改其状态并调用brelse(bp)。所以,在getblk和brelse中,设备中断在这些临界区中会被屏蔽。这些都是隐含的,但没有在算法中表现出来。

3 . Unix算法的缺点:

  • 效率低下:该算法依赖于重试循环,例如,释放缓冲区可能会唤醒两组进程:需要释放的缓冲区的进程,以及只需要空闲缓冲区的进程。由于只有一个进程可以获取释放的缓冲区,所以,其他所有被唤醒的进程必须重新进入休眠状态。从休眠状态唤醒后,每个被唤醒的进程必须从头开始重新执行算法,因为所需的缓冲区可能已经存在。这会导致过多的进程切换。
  • 缓存效果不可预知:在Unix算法中,每个释放的缓冲区都可被获取'如果缓冲区 由需要空闲缓冲区的进程获取,那么将会重新分配缓冲区,即使有些进程仍然需要当前的缓冲区。
  • 可能会出现饥饿:Unix算法基于“自由经济”原则,即每个进程都有尝试的机会,但不能保证成功,因此,可能会出现进程饥饿。
  • 该算法使用只适用于单处理器系统的休眠/唤醒操作

chatgpt 提问

  • 1 临界区

  • 2 缓冲区

标签:缓存,编程,dev,Unix,bp,Linux,缓冲区,磁盘
From: https://www.cnblogs.com/Semelia/p/17833246.html

相关文章

  • Android并发编程高级面试题汇总(含详细解析 五)
    Android并发编程高级面试题汇总最全最细面试题讲解持续更新中......
  • Windows下搭建Linux开发环境(vagrant)
     [下载]vagrant软件:https://www.virtualbox.org/wiki/Downloads centos镜像: http://isoredirect.centos.org/centos/7/isos/x86_64/ [安装]1.新建虚拟机新建:- 指定主机名称-类型:Linux-版本:RedHat(64-bit) 点击下一步,可以根据实际需要调整CPU和内存,后面的直接点击下一......
  • Linux(Centos7)升级MySQL 5.7到8.0.31
    一、下载MySQL安装包下载地址:https://downloads.mysql.com/archives/community/二、备份mkdir/home/mysqlbackmysqldump-uroot-p--all-databases>/home/mysqlback/mysqldback.sql三、卸载MySQL注:卸载之前一定要先备份好数据库1.检查当前系统是否安装过MySQLrpm-q......
  • Linux LVM 管理
        LinuxLVM用于磁盘卷的扩容和收缩,常见操作汇总如下:--创建pvpvcreate/dev/sdapvcreate/dev/sdb1--创建vgvgcreatevg_data/dev/sda--扩充vgvgextendvg_data/dev/sdb --将新的pv/dev/sdb扩充至vg_data--创建lvmlvcreatevg_data-lextents_number -nlv_data......
  • java8 stream api流式编程
    ......
  • Linux-1-简介
    1、什么是操作系统,了解操作系统的分类2、什么是嵌入式操作系统,与通用PC系统有什么不同   Q1:什么是操作系统 A1: 本质:操作系统是管理和控制计算机硬件与软件资源的计算机程序。意义:操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口。功......
  • Linux
     Linuxln(英文全拼:linkfiles)命令是一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命......
  • Linux下redis的安装下载以及连接RESP
    一、环境Centos7、redis-6.2.6、gcc依赖、管理员权限将防火墙放通6379/tcp端口或直接关闭防火墙二、安装具体步骤1.安装依赖redis是由C语言开发,因此安装之前必须要确保服务器已经安装了gcc,可以通过如下命令查看机器是否安装:gcc-v如果没有安装则通过以下命令安装:yumins......
  • 掌握终端基础技巧:Linux下的文件和目录复制操作
    1.cp命令:在Linux中,cp命令用于复制文件和目录。基本语法如下:cp[选项]源文件目标文件其中,源文件是要复制的文件名,目标文件是复制后的新文件名或路径。2.复制单个文件:要复制单个文件,只需指定源文件和目标路径即可。例如,将文件file.txt复制到目录path下:cpfile.......
  • Linux 部署 Swagger Editor 接口文档并且实现远程访问教程
    SwaggerEditor是一个用于编写OpenAPI规范的开源编辑器。它提供了一个可视化的界面,使得用户可以更加方便地编写和管理API文档。SwaggerEditor远程访问的好处是您可以随时随地访问和编辑您的SwaggerAPI文档,而不需要在本地安装Swagger编辑器。此外还可以轻松地与团队成员共......