24.原生磁盘的使用

【README】

1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐;

2.磁盘操作抽象

  • 第1层抽象:通过盘块号读写磁盘(或逻辑盘块号);
  • 第2层抽象:用队列缓存多个进程读写的盘块号;
  • 第3层抽象:文件(或通过文件操作磁盘);参见第25讲内容;

3.盘块号调度算法

  • 先来先服务- FCFS;
  • 最短寻道优先-SSTF;
  • 扫描调度-SCAN ;
  • 电梯调度-C-SCAN;(推荐,性能最优)

【1】磁盘工作原理

【1.1】 磁盘结构  


【图解】

  • 1)磁盘由叠起来的盘片组成,1个盘片的2个面都有磁材料,都可以存储信息;
  • 2)1个盘面划分为多个圆环,每个圆环叫做磁道;
  • 3)每个磁道划分为多个扇区,每个扇区固定512字节;扇区是读写磁盘的基本单位
  • 4)磁头:每当有磁盘读写请求时,在磁盘控制器下,磁头就会移动去寻找磁道,磁道再自身旋转进而定位到扇区;

【1.2】磁盘读写过程

【图解】

  • 步骤1:磁盘控制器控制磁头移动,找到正确磁道;  
  • 步骤2:磁道自身旋转,使得对应扇区旋转到磁头下,方便磁头读写;
  • 步骤3:磁头把当前扇区的数据读入到内存缓冲区;(磁信号转为电信号);
  • 步骤4:程序把内存缓冲区中的某字节送入cpu,cpu修改字节内容并把数据返还到内存缓冲区;
  • 步骤5:把内存缓冲区中数据写出到磁盘(同读磁盘相同,写磁盘也需要磁头移动,磁道自身旋转到对应扇区,最后写操作);(电信号产生磁信号);

小结:

  • 磁盘IO过程: 磁盘控制器 -> 磁头寻道 -> 磁道旋转 -> 传输(读写操作)

【1.3】 使用磁盘

1)根据上述内容,我们知道磁盘工作原理,即磁头移动找到对应磁道,磁道自身旋转把对应扇区旋转到磁头下;
补充:

  • 不同盘片且具有相同投影的圆环组成1个磁柱,即不同盘片上的多个磁道组成1个磁柱;
  • 所以,cpu只需要把 磁柱号,磁头号,扇区号(可以算出磁道号),映射的内存地址,连续读写的扇区数  等多个参数 送入磁盘控制器,然后使用 DMA控制器 盗用总线把磁盘数据读入内存;

2)用out 指令 把上述4个参数送入磁盘控制器;

 

 【图解】
1)符号表示

磁柱号

Cyl == cylinder

磁头号

head

扇区号

Sect == sector

内存地址

上述把多个参数直接送入磁盘控制器,编码复杂,太麻烦,所以进行了如下抽象


【2】磁盘操作抽象

  • 第1层抽象:通过盘块号读写磁盘;
  • 第2层抽象:用队列缓存多进程读写的盘块号

【2.1】第一层抽象:通过盘块号读写磁盘

(图1)
【图解】

  • 1)程序给出盘块号 block ,送入磁盘驱动程序;
  • 2)磁盘驱动根据给定的盘块号block和磁盘参数计算出  磁柱 cyl, 磁头号 head,扇区号sec 等参数并送入磁盘控制器;(CHS参数
  • 3)磁盘控制器操作 磁头,盘面等进行工作;

问题:

  • 如何把block 计算出 磁柱号,磁头号,扇区号,即一维地址 推导出3维地址;
  • 扇区号如何编址? 为什么这样编址 ?

设计思想:

  • 考虑到程序执行的局部性原理,给定的block号相邻的盘块可以快速读出;

1)磁盘访问时间

  • 磁盘访问时间 = 写入控制器时间 + 寻道时间 + 旋转时间 + 传输时间 

时间类型

描述

耗时

写入控制器时间

磁盘驱动根据block推导出 磁柱号,磁头号,扇区号等参数,并把上述参数送入控制器;

寻道时间

磁头移动寻找到磁柱上的对应磁道;

(或移动磁臂时间)

12ms 到 8ms (最耗时,机械运动,直线移动)

旋转时间

磁道自己旋转使得对应扇区在磁头下

半周4ms

传输时间

磁头读写时间(磁信号产生电信号或电信号产生磁信号)

50M/秒,约 0.3ms

 小结:

  • 可以看到耗时最长的阶段是寻道时间,所以在访存时,我们应该减少寻道时间(或减少寻道次数)

2)如何做到减少寻道时间(或减少寻道次数)

  • 首先,把相邻block的盘块放在同一个磁道上(或相邻扇区上);
  • 然后,根据给定block盘块号,把相邻盘块(或相邻扇区)一起读入到内存;
  • 补充:block是逻辑盘块号,最终是要映射到物理磁盘扇区上的;

3)扇区编址

 (图2)
【图解】综上,根据以上分析,我们对磁盘扇区就知道如何编址了。(相邻扇区号是连续的) ,参见图1和图2。

  • 若每个磁道7个扇区,可以看到 0号扇区与7号扇区的投影是重合的;
  • 如 0号扇区在盘片1的地址 0~512字节;7号扇区在盘片2的地址0~512字节;
  • 因为磁臂上的多个磁头(每个盘片1个磁头)是作为一个整体一起移动的;即 盘片1的磁头移动到 0~512字节的扇区,盘片2的磁头也移动到了 0~512字节的扇区,......;

4)通过 CHS(柱面号C,磁头号H,扇区偏移号S)计算目标扇区号

  • 目标扇区号 = C*(heads*sectors) + H *Sectors + S; (公式1)
  • 其中 head 表示每个柱面的磁头数量,sector 表示每个磁道的扇区数量;

5)每次读写的扇区数量增多,读写速度会上升(一定程度上);
6)每次读写1K, 每次读写1M, 区别如下表所示。

每次读写数据量

扇区数

读写速度

磁盘碎片

磁盘空间利用率

1K

2

100K/秒

0.5K

1M

2K

40M/秒

0.5M

低(因为浪费多)

目前,磁盘容量可以做到很大,完全可以用空间去换时间效率,即把读写单位变大,每次读写1M,而不是1K;
7)对应到读写扇区的高效方案是

  • 每次读写多个相邻连续扇区,这些扇区组成1个逻辑盘块;而不是仅读写一个扇区;

小结:

  • 操作系统把磁盘读写单位从扇区 转换为盘块,提高了磁盘读写效率;(一个盘块是连续的几个扇区)

【例】以盘块为单位读写磁盘(重要)

  • 步骤1:当操作系统收到 磁盘读写请求时,首先把 盘块号 转为 多个连续扇区的扇区号;
  • 步骤2:磁盘驱动根据扇区号算出 CHS(柱面号,磁头号,扇区号偏移),并通过out指令把CHS值送入磁盘控制器;
  • 步骤3:磁盘控制器读写目标扇区号数据到内存缓冲区,并返回给上层应用程序;

综上:应用程序可以通过盘块号来读写磁盘

 

 【图解】

  • Req->sector = bh->b_blocknr << 1 ;扇区号等于盘块号左移一位,即乘以2; 所以每个盘块会读写2个扇区数据;
  • Do_hd_request方法:根据盘块号算出 公式1的变量,如 CHS-柱面号,磁头号,扇区号偏移,每个磁道的扇区数nsect,每个柱面的磁头数量head等;
  • hd_out方法:向磁盘控制器 发出out指令,控制器根据参数读写目标扇区数据;

【2.2】第二层抽象:(用队列缓存多进程读写的盘块号)

操作系统是多进程图像,存在多个进程使用盘块号读写磁盘的情况。
当有多个进程时,需要使用缓冲队列存储不同进程的盘块号
1)盘块请求队列

 【图解】
1)请求队列用于存储不同进程访问磁盘的盘块号
2)磁盘驱动什么时候从队列中取出盘块号?

  • 当磁盘驱动读写完上一个盘块号的数据,就会发出磁盘中断;则磁盘中断处理程序会从请求队列中取出下一个盘块号;

3)问题:多个磁盘访问请求出现在请求队列怎么办?

  • 考虑用磁盘调度 。

4)问题:调度的目标是什么? 调度时主要考察什么 ?

  • 调度目标:平均访问延迟小;
  • 调度时考察:寻道时间是主要矛盾

解决方法:

  • 在磁盘驱动中编写一个算法,选择下一个要读取的盘块号,使得磁盘工作速度快
  • 如 ppt,word都有读写盘块请求,那如何让磁盘工作速度更快;
  • 而磁盘读写最耗时的是寻道时间,即如何最小化寻道时间

补充:

  • 生磁盘:根据盘块号使用磁盘;
  • 熟磁盘:根据文件使用磁盘;

【3】磁盘调度算法(如何选择盘块)

【3.1】FCFS -磁盘调度算法

1)FCFS: 先来先服务;即盘块调度顺序,与盘块在队列的顺序一致;

 【图解】
1)请求队列: 请求队列= [ 98, 183, 37, 122, 14, 124, 65, 67 ] ,队列里存储的是盘块号,也可以理解为磁道号(因为盘块号会被磁盘驱动计算出 磁头号,柱面号,扇区号偏移 )。
2)根据 FCFS 先来先服务的盘块调度算法,盘块调度顺序与队列顺序一致。
磁头移动路径如上图折线所示,总结如下(磁头起始位置在53,可以理解为在第53号磁道):

调度盘块

98

183

37

122

14

124

65

67

移动磁道数量

45

85

146

85

108

110

59

2

小结:磁头总共移动了 640 个磁道


【3.2】 SSTF-最短寻道优先

1)SSTF: Shortest seek time first ,最短寻道优先;

  • 选择与当前磁道距离最短的磁道进行访问;

 【图解】
根据最短寻道优先算法,选择与当前磁道距离最短的磁道访问请求,显然盘块调度顺序与队列中的盘块顺序不一致。队列= [ 98, 183, 37, 122, 14, 124, 65, 67 ]
磁头移动路径如上图折线所示,总结如下(磁头起始位置在第53号磁道):

调度盘块

65

67

37

14

98

122

124

183

移动磁道数量

12

2

30

23

84

24

2

59

小结:磁头总共移动了 236个磁道

2)比较结果:

  • 显然 最短寻道优先算法 优于 先来先服务算法

3)最短寻道优先的问题  

  • 因为该算法是选择与当前磁道距离最短的磁道进行访问,所以访问路径是在中间移动,即磁头频繁在磁道中间位置,而会造成 边缘磁道 长时间不访问的现象,即 导致边缘磁道的饥饿问题

所以需要对 最短寻道优先算法进行优化改进。


【3.3】SCAN-扫描调度算法

1)SCAN:扫描调度算法;

  • SCAN算法是 SSTF(最短寻道优先)的变体,是由 SSTF + 中途不回折 的思想;
  • 即 SCAN算法先是向某一边(如左边)移动直到边界,移动同时访问盘块号;然后在向另一边(右边)移动直到边界。

 【图解】
根据SCAN算法,先向某一边移动直到边界,然后向另一边移动直到边界。队列= [ 98, 183, 37, 122, 14, 124, 65, 67 ]。
则磁头移动路径如上图折线所示,总结如下(磁头起始位置在第53号磁道):

调度盘块

37

14

65

67

98

122

124

183

移动磁道数量

16

23

51

2

31

24

2

59

 总计:磁头总共移动了 208个磁道。(上图给出的是236,原因在于它访问了 第0号磁道,从第14号磁道到第0号磁道双向需要移动28个磁道)


【3.4】C-SCAN-电梯调度算法

1)C-SCAN:现实生活中的电梯算法;

  • SCAN算法是 SSTF的变体,是由 SSTF + 中途不回折 的思想;

2)步骤:

  • 步骤1:C-SCAN算法中先是向某一边(如左边)移动直到边界,移动的同时访问盘块号;
  • 步骤2:然后立即移动到另一边的边界(如最右边183),仅移动但不做任何盘块访问(这是电梯调度算法与 SCAN算法的区别)
  • 步骤3:同步骤1类似,以右边的边界为起点,向左边移动并访问盘块号直到左边边界

补充:同电梯类似,电梯每次都会移动到到最高楼层接人,并把人送达目的地直到最低楼层;所以称电梯算法。

 【图解】
根据SCAN算法,队列= [ 98, 183, 37, 122, 14, 124, 65, 67 ],
则磁头移动路径如上图折线所示,总结如下(磁头起始位置在第53号磁道):

调度盘块

37

14

183

124

122

98

67

65

移动磁道数量

16

23

169

59

2

24

31

2

 总计:磁头总共移动了326个磁道。但磁头从第14号移动到第183号磁道是非常快速的(不做任何访问),所以 326 - 169 = 157个磁道。


【小结】磁盘调度算法

盘块队列= [ 98, 183, 37, 122, 14, 124, 65, 67 ];

算法名称

移动磁道个数

性能

FCFS-先来先服务

640

SSTF-最短寻道优先

236

SCAN-扫描调度

208

C-SCAN-电梯调度

157

最优(推荐)


【4】多个进程共同使用磁盘

 【图解】多个进程共同使用磁盘步骤(重要*)

  • 步骤1:多个进程在访问磁盘的时候,多个进程要产生请求放入请求队列;
  • 步骤2:然后磁盘中断触发中断处理程序从队列中取出请求盘块号;
  • 步骤3:根据盘块号换算出CHS,通过out指令发送给磁盘控制器以进行读写多个扇区;

总结:这就是使用生磁盘的完整故事

【代码】进程访问磁盘创建请求

// 进程访问磁盘创建请求 
static void make_request() 
{...// 把盘块号换算为扇区号;(乘以2)req->sector = bh-> b_blocknr << 1;// 把盘块请求添加到队列中 add_request(major + blk_dev, req);	
}// add_request 把请求添加到队列 
static void add_request(struct blk_dev struct *dev, struct request *req) 
{cli(); // 关中断for(;temp->next; temp = tmep->next) {if (( IN_ORDER(temp, req) || !IN_ORDER(temp, temp->next) ) && IN_ORDER(req, temp->next)) break; }req->next = temp->next; temp->next = req; sti(); // 开中断
}// 补充 cli 与 sti 构建起临界区,只允许一个进程进入。
// IN_ORDER 方法 : 判断 s1 小于 s2 (比较扇区号大小)
#define IN_ORDER(s1, s2) 
{(( s1->dev < s2->dev )|| (s1->dev == s2->dev && s1->sector < s2->sector ))
}

【代码解说】

  • 当 temp 小于req 且 req小于temp->next; 或 temp 大于 temp->next 且 req小于temp->next 时,循环退出;

【4.1】生磁盘的使用整理

 【图解】
1)进程得到盘块号, 算出扇区号

  • 如何得到盘块号? 进程或程序是操作文件的,那就是通过文件得到盘块号;
  • 并根据盘块号算出扇区号,因为一个盘块对应多个扇区,所以可以看做是起始扇区号;

2)用扇区号 make req(制作磁盘请求),用电梯算法 add_request (选择下一个盘块号)

  • 用扇区号 make req,制作一个磁盘扇区访问请求,这个制作请求的代码包含了 内存缓冲区申请与管理的代码(对真实磁盘读写性能提升非常大);
  • 用电梯算法把该请求放入请求队列中;

3)进程sleep_on  

  • 用户进程把 磁盘访问请求 放入队列后就睡眠了;磁盘具体的读写操作由硬件去完成; (即进程间的相互协作)

4)磁盘中断处理

  • 磁盘控制器执行完上一个请求后,会发出中断;
  • 中断处理程序会从请求队列中获取请求(获取下一个盘块号);

5)do_hd_request 算出 柱面号,磁头号,扇区号;

  • 步骤1:磁盘驱动根据 out 命令发出磁盘读写指令;
  • 步骤2:读写完成后(或把数据读取到内存缓冲区),会再次发出中断,中断处理程序会调用 read_intr() 方法;
  • 步骤3:read_intr()方法会结束请求并唤醒进程;
  • 步骤4:进程被唤醒后,就可以在内存缓冲区中读取想要的数据了,进程就可以继续工作了;(从进程发出磁盘读写请求,到被唤醒这段时间,进程是阻塞或睡眠的,显然读写磁盘的程序执行是比较慢的,重要一点是磁盘寻道耗时长)

6)hd_out 调用 outp(...) 完成磁盘端口读写

小结:到这里,生磁盘的使用就完整介绍完了;

  • 我们把磁盘的使用抽象为盘块号,然后再在此基础上抽象为 多进程共同使用磁盘的方式;使得磁盘使用更加高效;

补充:如何得到盘块号?

  • 上文讲到通过文件来获取盘块号;
  • 那通过文件如何来获取盘块号呢。所以引出了 生磁盘到文件 的内容(参见第25章内容)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle入门(十三C)之高级查询(下)

上章&#xff1a;Oracle入门&#xff08;十三B&#xff09;之高级查询&#xff08;上&#xff09; 四、常见组函数 SUM、AVG、COUNT、MIN、MAX分组函数忽略null 值。不能在WHERE 子句中使用组函数。MIN 和MAX 可用于任何数据类型&#xff1b;SUM、AVG只能用于数字数据类型五、子…

微软将降低Visual Studio对操作系统的影响

在过去几年中&#xff0c;为了将Visual Studio变成Windows上的第一开发工具&#xff0c;而不管用户的目标平台是什么&#xff0c;微软作出了重大努力。最近收购Xamarin及通过大力支持开源工具来支持非Windows设备&#xff0c;极大地增加了它对于各类开发人员的用处。这一做法的…

代码设置margintop_关于元素设置margin-top能够改变body位置的原因及解决(子元素设置margin-top改变父元素定位)...

关于元素设置margin-top能够改变body位置的原因及解决(子元素设置margin-top改变父元素定位)起因&#xff1a;在进行bootstrap的.navbar-brand内文字设置垂直居中时采用line-height高度&#xff0c;无法居中&#xff0c;发现源码.navbar-brand 设置了 padding: 15px 15px;(默认…

Oracle入门(九A)之用户的权限或角色

转载自 查看Oracle用户的权限或角色 前几天被问到一些关于权限和角色的问题&#xff0c;今天抽时间总结一下如何查看Oracle用户的权限或角色&#xff0c;在之前的博文中&#xff0c;写过 SYS,SYSTEM,DBA,SYSDBA,SYSOPER的区别与联系 以及 Oracle中定义者权限和调用者权限案例分…

25.从生磁盘到文件

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》&#xff0c;内容非常棒&#xff0c;墙裂推荐&#xff1b; 2.文件&#xff1a;煮熟的磁盘&#xff0c;或熟磁盘&#xff1b; 本节的主要内容是讨论 如何从文件得到盘块号&#xff1b; 3.磁盘操作抽象&#xf…

Storm 1.0.1发布 .NET 适配也已到来

Apache Storm 1.0.0刚发布不久&#xff0c;1.0.1版本也在几天前到来&#xff1b;该版本主要是完成一些BUG修复和小的改进&#xff0c;通过一段时间新版本的使用&#xff0c;特将个人感受和一些遇到的问题归纳如下&#xff1b;另外 .NET 版本的 Storm 适配器也已经发布&#xff…

布隆过滤器速度_详解布隆过滤器的原理、使用场景和注意事项

今天碰到个业务&#xff0c;他的 Redis 集群有个大 Value 用途是作为布隆过滤器&#xff0c;但沟通的时候被小怼了一下&#xff0c;意思大概是 “布隆过滤器原理都不懂&#xff0c;还要我优化&#xff1f;”。技术菜被人怼认了、怪不得别人&#xff0c;自己之前确实只是听说过这…

Oracle入门(十四)之PL/SQL

一、PL/SQL 基本语法 PL/SQL语言是模块式的过程化SQL,是oracle公司对SQL的扩展。 &#xff08;1&#xff09;&#xff08;2&#xff09;&#xff08;3&#xff09;&#xff08;5&#xff09;&#xff08;6&#xff09;&#xff08;7&#xff09;数据类型Number 数字型Varchar2 …

26.文件使用磁盘的代码实现

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》&#xff0c;内容非常棒&#xff0c;墙裂推荐&#xff1b; 2.文件内容复习&#xff1a; 1&#xff09;如何从生磁盘抽象为文件&#xff1f; 核心是从字符流位置算出盘块号&#xff1b;2&#xff09;如何算出盘…

.NET Core全新的配置管理[共9篇]

提到“配置”二字&#xff0c;我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影&#xff0c;那就是我们再熟悉不过的app.config和web.config&#xff0c;多年以来我们已经习惯了将结构化的配置信息定义在这两个文件之中。到了.NET Core的时候&#xff0c;很多我们…

redis存opc_KEPServerEX6完整免费版

KEPServerEX6完整免费版是一款先进的连接平台&#xff0c;主要用于为您的应用程序提供单一来源的工业自动化数据&#xff0c;通过连接、管理、监视和控制不通的自动化设备和应用程序来实现工业数据。具有严谨的技术特征&#xff0c;支持多达250种以上的通讯协定&#xff0c;可连…

Oracle入门(十四B)之PL/SQL异常处理

定义&#xff1a;程序执行过程的警告或错误成为例外(Exception) 一、常见预定义错误 二、非预定义错误及用户定义错误 &#xff08;1&#xff09;非预定义oracle错误其他标准的oracle错误,可以自定义异常名&#xff0c;将其与指定oracle错误关联&#xff0c;由系统触发。 例子…

C#读书雷达 | TW洞见

大家都知道&#xff0c;ThoughtWorks的技术雷达每年都会发布两到三次&#xff0c;它不但是业界技术趋势的标杆&#xff0c;更提供了一种卓有成效的方法论&#xff0c;即打造自己的技术雷达。在这种思想的驱动下&#xff0c;我们诞生了自己的读书雷达。但这份雷达略显high level…

27.目录与文件系统

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》&#xff0c;内容非常棒&#xff0c;墙裂推荐&#xff1b; 2.第4层抽象&#xff1a;抽象整个磁盘到文件系统 【1】文件系统&#xff0c;抽象整个磁盘&#xff08;第4层抽象&#xff09; 【图解】整个磁盘抽象1…

dd命令打包多个文件_linux的tar命令详情;linux多个文件压缩打包到一个压缩文件...

tar命令可以用来压缩打包单文件、多个文件、单个目录、多个目录。Linux打包命令_tartar命令可以用来压缩打包单文件、多个文件、单个目录、多个目录。常用格式&#xff1a;单个文件压缩打包 tar czvf my.tar.gz file1多个文件压缩打包 tar czvf my.tar.gz file1 file2,...(file…

28.文件目录解析代码实现

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》&#xff0c;内容非常棒&#xff0c;墙裂推荐&#xff1b; 背景&#xff1a; 磁盘格式化后&#xff0c;其组成部分包括引导块&#xff0c;超级块&#xff0c;inode使用位图&#xff0c;盘块使用位图&#xff0…

Oracle入门(十四A)之PL/SQL 基本结构

一、条件控制语句 &#xff08;1&#xff09;条件语句Iif…then…end if形式1:if <布尔表达式> then…(pl/sql和sql)…end if;&#xff08;2&#xff09;条件语句II if…then…else … end if 形式2&#xff1a;if <布尔表达式> then…(pl/sql和sql)else…end if;…

利用记事本创建一个ASP.NET Core RC2 MVC应用

步骤一、安装最新的.NET Core SDK 我们可以根据自身的操作系统环境从https://github.com/dotnet/cli上下载.NET Core最新的SDK&#xff0c;这个SDK包含.NET Core Runtime和一些有用工具&#xff08;比如命令行&#xff09;。如果你已经安装了老旧的版本&#xff0c;我个人建议你…

datatable中某一列最小值_获取DataTable 某一列所有值

//获取某一列值string orderids (from d in dt.AsEnumerable() select d.Field("OrderID")).ToList().ListToString();/// /// 判断字符串是否在某字符串数组当中/// /// /// /// public static bool In(this string value, params string[] items){return items.An…

29.操作系统对磁盘的4层抽象小结

【README】 本文总结了操作系统 对磁盘的4层抽象&#xff0c;并给出了详细介绍的post 链接&#xff1b; 【1】对磁盘的4层抽象 【1.1】对磁盘的第1层抽象 通过盘块号读写磁盘&#xff08;读写多个扇区&#xff09;&#xff1b; 因为磁盘底层操作的单位是扇区&#xff08;51…