20211316郭佳昊 《信息安全系统设计与实现(上)》 第十周学习总结 块设备I/O和缓冲区处理

发布时间 2023-11-18 11:21:53作者: 20211316郭佳昊

一、任务要求

[ 1 ] 知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容 (4分)
我在学****知识点,请你以苏格拉底的方式对我进行提问,一次一个问题

核心是要求GPT:请你以苏格拉底的方式对我进行提问

然后GPT就会给你提问,如果不知道问题的答案,可以反问AI:你的理解(回答)是什么?

如果你觉得差不多了,可以先问问GPT:针对我XXX知识点,我理解了吗?

GPT会给出它的判断,如果你也觉得自己想清楚了,可以最后问GPT:我的回答结束了,请对我的回答进行评价总结,让它帮你总结一下。

[ 2 ] 问题与解决思路,遇到问题最先使用chatgpt等AI工具解决,并提供过程截图(3分)

[ 3 ] 实践过程截图,代码链接(2分)

[ 4 ] 其他(知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等)(1分)

二、知识点总结

块设备I/O缓存区

  • I/O缓冲原理

image

  • 术语

BUFFER是缓冲区的结构类型,getblk(dev,blk)从缓冲区缓存中分配一个指定给(dev,blk)的缓冲区。定义一个bread(dev,blk)函数,它会返回一个包含有效数据的缓冲区(指针)。

BUFFER *bread(dev,blk)
{
   BUFFER *bp = getblk(dev,blk);
   if (bp data valid)
       return bp;
   bp->opcode = READ;
   start_io(bp);
   wait for I/O completion;
   return bp;
}

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

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

其中bwrite(bp)表示同步写入,dwrite(bp)表示延迟写入
image

  • 物理块设备I/O

每个设备都有一个I/O队列,其中包含等待I/O操作的缓冲区,缓冲区上的start_io:

start_io(BUFFER *bp)
{
    enter bp into device I/O queue;
	if (bp is first buffer in I/O quene)
	   issue I/O command for bp to device;
}

中断处理程序算法:

InterruptHandler()
{
   bp = dequeue(device I/0 queue); 
   (bp->opcode == ASYNC)? brelse(bp) : unblock process on bp;
   if (!empty(device I/0 queue))
      issue I/0 command for first bp in I/0 queue;
}

Unix I/O缓冲区管理算法

系统构成

  • I/O缓冲区

内核中的一系列NBUF缓冲区用作缓冲区缓存,每个缓冲区用一个结构体表示。
image

  • 设备表

每个块设备用一个设备表结构表示,每个设备表都有一个dev_list,包含当前分配给该设备的I/O缓冲区,还有一个io_queue,包含设备上等待I/O操作的缓冲区,Unix使用FIFO I/O队列。
image

  • 缓冲区初始化
  • 缓冲区列表
  • Unix getblk/brelse算法

image

Unix算法缺点

  1. 效率低下,算法依赖重试循环。
  2. 缓存效果不可预知。
  3. 可能出现进程饥饿。
  4. 只适用于单处理器系统的休眠/唤醒操作。

I/O缓冲区管理新算法

信号量的优点

  1. 计数信号量可用来表示可用资源的数量
  2. 多个进程等待一个资源时,信号量上的V操作只会释放一个等待进程,该进程不会重试。

PV算法

image
image
该算法满足以下需求:

  1. 缓冲区唯一性
  2. 无重试循环
  3. 无不必要唤醒
  4. 缓存效果
  5. 无死锁和饥饿

三、苏格拉底挑战