一、学习任务
自学教材第12章,提交学习笔记(10分),评分标准如下
1. 知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容 (4分)
“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”
核心是要求GPT:“请你以苏格拉底的方式对我进行提问” 然后GPT就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”
如果你觉得差不多了,可以先问问GPT:“针对我XXX知识点,我理解了吗?” GPT会给出它的判断,如果你也觉得自己想清楚了,可以最后问GPT:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。
2. 问题与解决思路,遇到问题最先使用chatgpt等AI工具解决,并提供过程截图(3分)
3. 实践过程截图,代码链接(2分)
4. 其他(知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等)(1分)
二、知识总结
12.1块设备I/O缓冲区
基本原理
I/O 缓冲的基本原理非常简单。文件系统使用一系列I/O缓冲区作为块设备的缓存内存。当进程试图读取(dev,blk) 标识的磁盘块时,它首先在缓冲区缓存中搜索分配给磁盘块的缓冲区。如果该缓冲区存在并且包含有效数据,那么它只需从缓冲区中读取数据,而无须再次从磁盘中读取数据块。如果该缓冲区不存在,它会为磁盘块分配一个缓冲区,将数据从磁盘读人缓冲区,然后从缓冲区读取数据。当某个块被读入时,该缓冲区将被保存在缓冲区缓存中,以供任意进程对同一个块的下一次读/写请求使用。同样,当进程写入磁盘块时,它首先会获取一个分配给该块的缓冲区。然后,它将数据写入缓冲区,将缓冲区标记为脏,以延迟写入,并将其释放到缓冲区缓存中。由于脏缓冲区包含有效的数据,因此可以使用它来满足对同一块的后续读/写请求,而不会引起实际磁盘I/O。脏缓冲区只有在被重新分配到不同的块时才会写入磁盘。
算法
bread(dev,blk) 函数:它会返回一个包含有效数据的缓冲区(指针)
BUFFER *bread(dev,blk) { BUFFER *bp s getblk(dev,blk) if(bp data valid) return bp; bp->opcode = READ; start_io(bp); wait for I/0 completion; return bp; }
write_block(dev,blk,data)函数:其中bwrite(bp)表示同步写入, dwrite(bp)表示延迟写入
write_block(dev,blk,data) { BUFFER *bp = bread(dev,blk); write data to bp; (synchronous write)?bwrite(bp):dwrite(bp); }
物理块设备I/O:每个设备都有一个I/O队列,其中包含等待I/O操作的缓冲区
start_io(BUFFER *bp) { enter bp into device I/0 queue; if(bp is first buffer in I/0 queue) issue I/0 command for bp to device; }
12.2Unix I/O缓冲区管理算法
Unix 缓冲区管理子系 统由以下几部分组成:
(1)I/O缓冲区:内核中的一系列NBUF缓冲区用作缓冲区缓存。每个缓冲区用一个结构体表示。
(2)设备表:每个块设备用一个设备表结构表示。
(3)缓冲区初始化:当系统启动时,所有I/O 缓冲区都在空闲列表中,所有设备列表和 I/O队列均为空。
(4)缓冲区列表:当缓冲区分配给 (dey,blk)时,它会被插入设备表的dev_list 中。
(5)Unix getblk/brelse 算法。
关于Unix算法的具体说明:
(1)数据一致性:为了确保数据一致性,getblk一定不能给同一个(dey,blk) 分配多个 缓冲区。
(2)缓存效果
(3)临界区:设备中断处理程序可操作缓冲区列表。
Unix 算法的缺点
(1)效率低下
(2)缓存效果不可预知
(3)可能会出现饥饿
(4)该算法使用只适用于单处理器系统的休眠/唤醒操作
12.3 新的I/O缓冲区管理算法
使用信号量的缓冲区管理算法
假设有一个单处理器内核(一次运行一个进程)。使用计数信号量上的P/V来设计满足 以下要求的新的缓冲区管理算法:
(1)保证数据一致性。
(2)良好的缓存效果。
(3)高效率:没有重试循环,没有不必要的进程“唤醒”。
(4)无死锁和饥饿。
12.4 PV算法
BUFFER *getblk(dev,blk) ( while(1)( (1). P(free); //get a free buffer first (3). if(bp not BusY){ remove bp from freelist; P(bp); /1 lock bp but does not wait return bpi ) //bp in cache but BusY V(free)i //give up the free buffer (4). P(bp); //wait in bp queue return 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 AsrNc,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).it(bp dirty &&free queue has waiter)(awrite(bp);return;) (10).enter bp into (tail of)freelist;V(bp);V(free); }
12.5 编程项目:I/O 缓冲区管理算法比较
该编程项目将会实现一个模拟系统。
12.5.1 系统组织
12.5.2 多任务处理系统
多任务处理系统的CPU端,模拟单处理器(单CPU)文件系统的内核模式。 当系统启动时,它会创建并运行一个优先级最低的主任务,但它会创建 ntask 工作任务,所有任务的优先级都是1,并将它们输人readyQueue。然后,主任务执行以下代码,该代码将 任务切换为从readyQueue运行工作任务。
while(1){ while(task &k readyQ ==0); if(readyQ) kswitch(); else end_task(); }
#define CMDLEN 10 int cmdfile[NTASK];//opened command file descriptors int task =ntask; //number of active tasks int body() { int dev,blk; char opcode,cmd[CMDLEN] while(1){ if(read(cmdfile[running->pid],cmd,CMDLEN)==0){ running->status =DEAD; //task ends task--; //dec task count by 1 tswtich(); } sscanf(cmd,"%c%4d%5d",&opcode,&dev,&blk); if(opcode=='r') //read(dev,blk) readBlk(dev,blk); if(opcode=='w') writeBlk(dev,blk); //write(dev,blk) }
12.5.3 缓冲区管理器
缓冲区管理器实现各缓冲区管理函数。
12.5.4 磁盘驱动程序
(1)start_io():维护设备I/O队列,并对I/O队列中的缓冲区执行1/0操作。
(2)中断处理程序:在每次IO 操作结束时,磁盘控制器会中断CPU。当接收到中断 后,中断处理程序首先从IntStatus中读取中断状态。
12.5.5 磁盘控制器
12.5.6 磁盘中断
12.5.7 虚拟磁盘
三、苏格拉底问答
标签:10,blk,12.5,笔记,bp,dev,20211303,缓冲区,磁盘 From: https://www.cnblogs.com/liTCabcAbc/p/17837196.html