OS | 磁盘地址结构 、柱面号 盘面号 扇区号的计算
0号盘面是在1号盘面的正上方,也就是说0号盘面的0号程序它的正下方对应的应该是1号盘面的7号程序。由于磁头还没有准备好读写数据,因此1号盘面的0号程序,也就是物理地址为8的这个程序,从磁头下面划过的这个过程当中,并不能直接把这块的数据给读入。也就是说要在磁盘上访问一个扇区,必须给出其柱面号、盘面号和扇区号,这称为扇区的物理地址,即物理扇区号。那转了两圈之后,由于相应的一号盘面和0号盘面也是同步旋转
一、前情回顾
1、磁盘读写时间
问题:
2、减少延迟时间的方法:交替编号
3、磁盘地址结构的设计
书里推荐的这种物理地址结构,也就是柱面号放在盘面号之前会发生什么情况呢?
为什么磁盘的物理地址是(柱面号,盘面号,扇区号)而不是(盘面号,柱面号,扇区号)?
答:读取地址连续的磁盘块时,采用(柱面号,盘面号,扇区号)的地址结构可以减少磁头移动消耗的时间。
4、减少延迟时间的方法:错位编号
我们先来分析一下不采用错位命名方式在读取这种编号连续的这些扇区的时候会发生什么情况。
需要转两圈才可以把最内侧的这个磁道给读完。
那转了两圈之后,由于相应的一号盘面和0号盘面也是同步旋转的,所以1号盘面应该也是指向了它自己的0号扇区所对应的这个位置。
由于磁头还没有准备好读写数据,因此1号盘面的0号程序,也就是物理地址为8的这个程序,从磁头下面划过的这个过程当中,并不能直接把这块的数据给读入。如果要读入这块的数据,那只能等到这个磁盘再转一圈让这个扇区再次划过磁头下方。
也就是说,如果我们把这些盘面它们相对位置相同的这些扇区都设置为相同的编号,那么可能会增加延迟时间。
所以为了解决这个问题,可以用错位命名的方式来进行。
0号盘面是在1号盘面的正上方,也就是说0号盘面的0号程序它的正下方对应的应该是1号盘面的7号程序。而0号盘面的4号程序它的正下方对应的应该是1号盘面的0号程序。也就是说这些扇区的编号它们是错开的,所以这也是为什么叫错位命名的原因。
5、磁盘读写过程
磁盘块的物理地址是用三个参数来表示的。也就是说要在磁盘上访问一个扇区,必须给出其柱面号、盘面号和扇区号,这称为扇区的物理地址,即物理扇区号。
由物理扇区号表示的扇区称为绝对扇区。为了方便,操作系统通常将其转变为连续的逻辑扇区号加以管理。
编址方式为:对整个磁盘从柱面0到最后一个柱面增加,在柱面上按磁道号增加,在磁道上按扇区号增加。
总结如下:
扇区编址方式
- CHS(柱面/磁头/扇区)方式:
- ××磁道(柱面),××磁头,××扇区
- DOS中称为“绝对扇区”表示法。
- LBA(相对扇区号)方式:
- 以磁盘第一个扇区(0柱面、0磁头、1扇区)作为LBA的 0 扇区,后面的扇区依次编号
二、磁盘块号的组成形式
柱面号 盘面号 扇区号
设一块(unix称为块,windows称为簇)为一扇,则磁盘块号及其物理三地址之间可按以下式子转换:(结合下图解释了为什么算块号的时候我们总是在算扇区)
注意这里的磁头数是磁道数,也就是说这里的磁盘是固定头磁盘,每一个磁道都有一个磁头。
由于所有磁头是固定在一起的,因此在存放数据时,先存满扇区,后存满磁道,再存满柱面。
存储容量= 磁头数×磁道(柱面)数×每道扇区数 ×每扇区字节数
记 每个柱面上的磁道数 × 每个磁道上的扇区数 = 每个柱面上磁盘块数
(1)已知块号,则磁盘驱动用的三地址:
柱面号= [ 块号 / (每个柱面上磁盘块数) ]
磁头号= [ 块号 % (每个柱面上磁盘块数) ] / 每个磁道上的扇区数
扇区号= [ 块号 % (每个柱面上磁盘块数) ] % 每个磁道上的扇区数
(2)已知磁盘块物理地址,则磁盘块号:
块号=柱面号 × (每个柱面上磁盘块数)+磁头号 × 每个磁道上的扇区数+扇区号
块号 的公式 可由由磁盘块号的组成形式快速理解
设磁盘组共有n个柱面,编号顺序为0、1、2、…、n-1;
共有m个磁头,编号顺序为0、1、2、…、m-v1;
每个磁道内的k个信息块从1开始编号,依次为1、2、…、k。
现用x表示逻辑磁盘块号,用a,b,c分别表示任一逻辑磁盘块的柱面号、磁头号、磁道内块号,则x与a,b,c可通过如下公式进行转换:
x=k*m*a+k*b+c
a=(x-1) DIV (k*m)
b=((x-1) MOD (k*m)) DIV k
c=((x-1) MOD (k*m)) MOD k (+1)
注意这里扇区的编号是从1开始的,所以x需要-1
例题:
内容参考于
王道
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)