一、任务要求
[ 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缓冲原理
-
术语
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)表示延迟写入
-
物理块设备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缓冲区用作缓冲区缓存,每个缓冲区用一个结构体表示。
-
设备表
每个块设备用一个设备表结构表示,每个设备表都有一个dev_list,包含当前分配给该设备的I/O缓冲区,还有一个io_queue,包含设备上等待I/O操作的缓冲区,Unix使用FIFO I/O队列。
-
缓冲区初始化
-
缓冲区列表
-
Unix getblk/brelse算法
Unix算法缺点
- 效率低下,算法依赖重试循环。
- 缓存效果不可预知。
- 可能出现进程饥饿。
- 只适用于单处理器系统的休眠/唤醒操作。
I/O缓冲区管理新算法
信号量的优点
- 计数信号量可用来表示可用资源的数量
- 多个进程等待一个资源时,信号量上的V操作只会释放一个等待进程,该进程不会重试。
PV算法
该算法满足以下需求:
- 缓冲区唯一性
- 无重试循环
- 无不必要唤醒
- 缓存效果
- 无死锁和饥饿
三、苏格拉底挑战