学习笔记10——20211303

发布时间 2023-11-16 20:29:40作者: 是TC

一、学习任务

自学教材第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  虚拟磁盘

三、苏格拉底问答