apache 静态网站,如何优化网站关键字,网站编辑 seo是什么 百度知道,湖南网站设计费用【README】
1.本文内容总结自 B站 《操作系统-哈工大李治军老师》#xff0c;内容非常棒#xff0c;墙裂推荐#xff1b;
2.第4层抽象#xff1a;抽象整个磁盘到文件系统 【1】文件系统#xff0c;抽象整个磁盘#xff08;第4层抽象#xff09; 【图解】整个磁盘抽象1…【README】
1.本文内容总结自 B站 《操作系统-哈工大李治军老师》内容非常棒墙裂推荐
2.第4层抽象抽象整个磁盘到文件系统 【1】文件系统抽象整个磁盘第4层抽象 【图解】整个磁盘抽象1磁盘存储的是一堆文件一堆文件形成树状结构
具体实现是把整个磁盘的所有盘块进行抽象组织所谓抽象就是用数据结构进行组织如一个文件对应一个inode一个inode组织文件所有盘块形成字符序列
整个磁盘的文件以上述方式进行组织和抽象形成给用户一个抽象的树状结构
2整个磁盘抽象为文件系统
文件系统就是映射 从字符位置到盘块的映射底层结构是对上层的实现 上层是对底层的抽象 【2】整个磁盘的一堆文件如何映射
【2.1】目录树
1多个文件如何组织
方式1 所有文件放在一层目录下即所有文件放在一个文件夹下 缺点不方便查找文件方式2 每个用户一个目录所有文件放在各自的用户目录下 缺点但每个用户的文件数量也很多还是不方便查找
2目录树的文件组织方式 【图解】引入目录树之后把N个文件进行K次划分则划分后的子集的文件数量为 O(logkN) 划分算法可以参考分治思想
第1次划分 把N个文件平均划分为2个子集第2次划分 把每个子集再平均划分为2个子集共得到4个子集第K次划分 把 K-1次划分得到的每个子集再划分为2个子集共得到 2^K-1 个子集
3引入了目录
如 var, my , data 等叫做目录目录下面有子目录集合和文件集合多个目录构成目录树
4目录是什么
实现目录成为关键性问题 【2.2】目录的实现
1目录怎么用
文件路径 /my/data/a 多个路径就构成了目录树 其中非叶子节点 mydata是目录【图解】访问磁盘上的目录
步骤1 根据目录文件路径 /my/data/a 可以找到文件a的inode或FCBinode存储了字符到盘块号的映射关系步骤2 根据inode可以找到文件a对应的盘块号如果没有字符起始位置则起始位置是0步骤3把盘块号送入请求队列再由驱动程序取出盘块号计算出CHS发送out指令把CHS送入磁盘控制器
2如何根据路径或文件名目录名找到文件 inode
或目录存储了什么信息可以根据路径找到具体的文件
【例】根据/my/data/ a 如何找到 a文件的inode my目录下面有3个文件或目录data下面还有a文件
方法1目录存放该目录下的所有子目录文件的inodeFCB
对于查找 /my/data/a 的inode 需要列出 my目录下的所有子目录包括datacountmail然后所有子目录与data做比较并选择得到data目录的inode再列出data目录下的所有子目录然后以此类推。方法1的问题 查找速度比较慢因为 读取了 countmail的fcb但这2个目录的fcb是用不到的造成了浪费。
方法2目录存放该目录下的所有子目录文件的inodeFCB的编号指针 如下图所示。 【图解】目录的实现 重要*
当前目录存放子目录文件的inodeFCB的编号指针。磁盘抽象结构如下FCB数组指针 数据盘块集合 [FCB0, FCB1, FCB2, FCB3, FCB4, FCB5, FCB6, FCB7, FCB8, FCB9, FCB10, ...] var,13my,82 其中 FCB0 存储了根目录的FCB第一个FCB就是根目录的FCB FCB1存储了 var目录的FCB FCB2存储了 my目录的FCB ......
【例】目录的数据结构结构体 对于查找路径 /my/data/a表示的a目录的盘块号步骤
步骤1把所有根目录”/” 下的子目录项列表查询出来步骤2根据目录项列表查找my目录的编号13或下标13步骤3根据编号13查找FCB数组就可以找到并读入目录my的FCB13步骤4根据目录my的FCB13的数据块中的子目录项列表 找到目录data的FCB编号103my目录结构如下FCB数组指针 数据盘块集合子目录项列表 [FCB0, FCB1, FCB2, FCB3, FCB4, FCB5, FCB6, FCB7, FCB8, FCB9, FCB10, ...] data,103 cont,225 mail, 77
根据编号103到FCB数组找到并读入103号下标的FCB即data目录的FCB103步骤5根据目录data的FCB103的数据块中的子目录项列表 找到目录a的FCB编号205a 目录结构如下 FCB数组指针 数据盘块集合子目录项列表 [FCB0, FCB1, FCB2, FCB3, FCB4, FCB5, FCB6, FCB7, FCB8, FCB9, FCB10, ...] a,205 根据编号205到FCB数组找到205号下标的FCB即a目录文件的FCB205即FCB205就是路径 /my/data/a 的FCB
补充接下来磁盘读写步骤
FCB存储了盘块号把盘块号送入请求队列磁盘驱动通过电梯算法从请求队列获取盘块号并计算出CHS送入磁盘控制器磁盘控制器根据CHS操作磁盘进行读写
3根目录”/”信息从哪里来
即 根目录下的子目录列表的FCB数组从哪里获取 【注意】上图非常重要它显示的是 整个磁盘格式化后的组成部分非常重要*
【图解】根目录信息存储了什么数据。1整个磁盘格式化以后就会形成目录树结构包括
引导块超级块i节点位图inode位图盘块位图i节点inode数组第1项就是根目录inode数据区
2整个磁盘格式化后各个部分的内容构成
引导块操作系统引导扇区 超级块记录了 i节点位图盘块位图的盘块大小超级块起始盘块号加上i节点位图盘块大小再加上盘块位图盘块大小就可以得到i节点的起始盘块而i节点的第1块存储的就是根目录信息根目录存储了 FCB数组指针子目录项列表i节点位图Inode位图新建一个文件即新建一个inode把该文件对应的inode设置为1相反删除一个文件或inode则该inode设置为0盘块位图 各个盘块使用情况0-空闲1-占用
补充 superblock 超级块非常重要
mount原理要想使用一个磁盘或u盘需要先把u盘 挂载 mount到系统mount的作用就是读取磁盘或u盘的超级块到内存解析出 i节点位图盘块位图根据 i节点位图和盘块位图可以 计算出i节点的起始盘块号读取i节点的第1个盘块的内容即根目录FCB的信息根目录FCB存储了子目录项列表
【小结】
以上内容介绍了一个目录树逻辑如何实现在磁盘物理上的【3】整个磁盘的映射 【图解】 读取 test.c文件的202~212 范围的字节流
步骤1打开 test.c 文件 根据超级块找到 inode节点的起始盘块号读取inode节点部分的第1个盘块即根目录PCB根据根目录PCB可以找到 test.c文件的PCBinode具体细节参见 对于查找路径 /my/data/a 表示的 a 目录的盘块号步骤步骤2通过inode获取文件描述符 fd把fd传入 read() 函数找到盘块789步骤3把盘块号789 添加到请求队列步骤4磁盘完成上一次读写后发出中断磁盘驱动的中断处理程序从请求队列中获取盘块号789并计算出CHS柱面号磁头号扇区号步骤5把CHS作为 out命令的参数送入磁盘控制器步骤6磁盘控制器根据CHS读入对应扇区的数据到内存缓冲区步骤7读入完成后发出中断中断处理程序唤醒睡眠的用户线程步骤8用户线程被唤醒后把内存缓冲区的数据根据用户程序的指令送入cpu做进一步处理