首页 > 其他分享 >块设备I/O和缓冲区管理(十二章)

块设备I/O和缓冲区管理(十二章)

时间:2022-11-06 22:22:22浏览次数:47  
标签:blk buffer dev bp 十二章 freelist 缓冲区 设备

目录

第十二章读书笔记:块设备I/O和缓冲区管理

12.1 块设备I/O缓冲区

I/O缓冲的基本原理

文件系统使用一系列I/O缓冲区作为块设备的缓存内存。

当进程试图读取(dev, blk)标识的磁盘块时,它首先在缓冲区缓存中搜索分配给磁盘块的缓冲区。
如果该缓冲区存在并且包含有效数据,那么它只需从缓冲区中读取数据,而无须再次从磁盘中读取数据块。
如果该缓冲区不存在,它会为磁盘块分配一个缓冲区,将数据从磁盘读人缓冲区,然后从缓冲区读取数据。
当某个块被读入时,该缓冲区将被保存在缓冲区缓存中,以供任意进程对同一个块的下一次读/写请求使用。同样,当进程写入磁盘块时,它首先会获取一个分配给该块的缓冲区。然后,它将数据写入缓冲区,将缓冲区标记为脏,以延退写入,并将其释放到缓冲区缓存中。由于脏缓冲区包含有效的数据,因此可以使用它来满足对同一块的后续读/写清求,而不会引起实际磁盘I/O,脏缓冲区只有
在被重新分配到不同的块时才会写入磁盘。
同步写入操作等待写操作完成。它用于顺序块或可移动块设备,如USB驱动器。对于 随机访问设备,例如硬盘,所有的写操作都是延迟写操作。在延迟写操作中,dwrite(bp)将 缓冲区标记为脏,并将其释放到缓冲区缓存中。

12.2 I/O缓冲区管理算法

Unix I/O缓冲区管理算法最早出现在第6版Unix中(Ritchie和Thompson 1978 ;Lion 1996 )。

Unix缓冲区管理子系统由以下几部分组成:

I/O缓冲区:内核中的一系列NBUF缓冲区用作缓冲区缓存。每个缓冲区用一个结构体表示。缓冲区结构体由两部分组成:用于缓冲区管理的缓冲头部分和用于数据块的数据部分。

typdef struct buf{
struct buf *next_free; // freelist pointer
struct buf *next_dev; // dev_list pointer
int dev,blk; // assigned disk block;
int opcode; // READ|WRITE
int dirty; // buffer data modified
int async; // ASYNC write flag
int valid; // buffer data valid
int busy; // buffer is in use
int wanted; // some process needs this buffer
struct semaphore lock=1; // buffer locking semaphore; value=1
struct semaphore iodone=0; // for process to wait for I/O completion;
char buf[BLKSIZE]; // block data area
} BUFFER;
BUFFER buf[NBUF], *freelist; // NBUF buffers and free buffer list
设备表:每个块设备用一个设备表结构表示。

struct devtab{
u16 dev; // major device number
BUFFER *dev_list; // device buffer list
BUFFER *io_queue; // device I/O queue
} devtab[NDEV];

缓冲区初始化:当系统启动时,所有I/O缓冲区都在空闲列表中,所有设备列表和 I/O队列均为空。

缓冲区列表

Unix getblk/brelse algorithm

数据一致性:为确保数据一致性,getblk一定不能给同一个(dev, blk)分配多个缓冲区。这可以通过让进程从休眠状态唤醒后再次执行“重试循环“来实现。可以验证分配的每个缓冲区都是唯一的一其次,脏缓冲区在重新分配之前被写出来,这保证了数据的一致性。
缓存效果:缓存效果可通过以下方法实现释放的缓冲区保留在设备列表中,以便 可能重用,标记为延迟写入的缓冲区不会立即产生I/O,并且可以重用。缓冲区会被释放到空闲列表的末尾,但分配是从空闲列表的前面开始的,这是基于LRU (最近最少使用)原则, 它有助于延长所分配缓冲区的使用期,从而提高它们的缓存效果。
临界区:设备中断处理程序可操作缓冲区列表,例如从设备表的I/O队列中删除 bp,更改其状态并调用brelse(bp)。所以,在getb汰和brelse中,设备中断在这些临界区中会被屏蔽。这些都是隐含的,没有在算法中表现出来。

/* getblk: return a buffer=(dev,blk) for exclusive use */
BUFFER \*getblk(dev,blk){
while(1){
(1). search dev_list for a bp=(dev, blk);
360 12 Block Device I/O and Buffer Management
(2). if (bp in dev_lst){
if (bp BUSY){
set bp WANTED flag;
sleep(bp); // wait for bp to be released
continue; // retry the algorithm
}
/\* bp not BUSY \*/
take bp out of freelist;
mark bp BUSY;
return bp;
}
(3). /\* bp not in cache; try to get a free buf from freelist \*/
if (freelist empty){
set freelist WANTED flag;
sleep(freelist); // wait for any free buffer
continue; // retry the algorithm
}
(4). /\* freelist not empty \*/
bp = first bp taken out of freelist;
mark bp BUSY;
if (bp DIRTY){ // bp is for delayed write
awrite(bp); // write bp out ASYNC;
continue; // from (1) but not retry
}
(5). reassign bp to (dev,blk); // set bp data invalid, etc.
return bp;
}
/** brelse: releases a buffer as FREE to freelist **/
brelse(BUFFER *bp){
if (bp WANTED)
wakeup(bp); // wakeup ALL proc’s sleeping on bp;
if (freelist WANTED)
wakeup(freelist); // wakeup ALL proc’s sleeping on freelist;
clear bp and freelist WANTED flags;
insert bp to (tail of) freelist;
}

Unix算法的缺点

效率低下
缓存效果不可预知
可能会出现饥饿
该算法使用只适用于单处理器系统的休眠/唤醒操作

12.3 新的I/O缓冲区管理算法

P/V算法

BUFFER *getblk(dev, blk)
{
while(1){
(1). P(free); // get a free buffer first
(2). if (bp in dev_list){
(3). if (bp not BUSY){
remove bp from freelist;
P(bp); // lock bp but does not wait
return bp;
}
// bp in cache but BUSY
V(free); // give up the free buffer
(4). P(bp); // wait in bp queue
return bp;
}
// bp not in cache, try to create a bp=(dev, blk)
(5). bp = frist buffer taken out of freelist;
P(bp); // lock bp, no wait
(6). if (bp dirty){
awrite(bp); // write bp out ASYNC, no wait
continue; // continue from (1)
}
(7). reassign bp to (dev,blk); // mark bp data invalid, not dirty
return bp;
} // end of while(1)
}
brelse(BUFFER *bp)
{
(8). if (bp queue has waiter){ V(bp); return; }
(9). if (bp dirty && free queue has waiter){ awrite(bp); return; }
(10). enter bp into (tail of) freelist; V(bp); V(free);
}

标签:blk,buffer,dev,bp,十二章,freelist,缓冲区,设备
From: https://www.cnblogs.com/kenneth2012/p/16864375.html

相关文章

  • 第十二章
    一、学习笔记二、遇到问题什么是pv算法?三、解决方法PV操作:对信号量进行相应操作S:信号量P:请求操作,相当于S=S-1;S>=0,进程继续进行V:释放操作,相当于S=S+1,S>0,进程被唤......
  • 第十二章学习笔记
    第十二章学习笔记一、 教材内容总结摘要:本章讨论了块设备I/O和缓冲区管理;解释了块设备I/O的原理和I/O缓冲的优点;论述了Unix的缓冲区管理算法。12.1块设备I/O缓......
  • 设备调试Lite
    下载地址:链接:https://pan.baidu.com/s/1BOTCH_Vy1o0KasRgscdxAA提取码:pmoh功能:西门子PLC虚拟,通过解析标签地址,自动建立DB块,并自动采集对应的标签,方便上位机进行调试......
  • 设备调试工具新版本-V2.0
    功能画面:针对多条线多个工位调试支持在下拉框中随意切换    模拟IO模块,实现客户端和服务端交互,方便调试  PLC交互配置连接管理,切换自如  ......
  • 20201208史逸霏第十二章学习笔记
    第十二章读书笔记:块设备I/O和缓冲区管理12.1块设备I/O缓冲区I/O缓冲的基本原理文件系统使用一系列I/O缓冲区作为块设备的缓存内存。当进程试图读取(dev,blk)标识的......
  • 第十二章学习心得
    12.1块设备I/O缓冲区I/O缓冲的基本原理文件系统使用一系列I/O缓冲区作为块设备的缓存内存。块设备将信息存储在固定大小的块中,每个块都有自己的地址。对操作系统来说,块......
  • MLIR内部Internals缓冲区释放
    MLIR内部Internals缓冲区释放https://mlir.llvm.org/docs/BufferDeallocationInternals/本节介绍缓冲区解除分配的内部功能转型。转换由多个通道组成。主要passes称为......
  • 如何登录锐捷设备(无线篇)
    大家好,我是小杜,是不是很奇怪怎么小杜周六还在学习呢,哎,没办法啊,实在是时间紧任务重,趁着周六也学习下,正所谓“智”鸟先飞。加油,打工人。还是要先复习下前面的笔记,温故而知......
  • 《Unix/Linux系统编程》第十二章学习笔记 20201209戴骏
    第十二章、块设备I/O和缓冲区管理知识点归纳一、块设备I/O缓冲区I/O缓冲的基本原理非常简单。文件系统使用一系列I/O缓冲区作为块设备的缓存内存。当进程试图读取(dev,blk......
  • 第12章——块设备I/O和缓冲区管理
    引言摘要    普通文件的读写算法依赖于两个关键操作——put_block和get_block,这两个操作将磁盘块读写到内存缓冲区中。由于与内存访问相比,磁盘I/O速度较慢,所以不希望......