机械磁盘是计算机中唯的一个机械设备,
特点是慢,容量大,价格便宜。
磁盘上面的光面,由数不清的小磁铁构成,我们知道磁铁是有n/s极的,这刚好与二进制的01相对应,操作系统也是以01来读写,所以改变数据等于对01做改变,也就是在对小磁铁的n/s极做改变。
可以看到磁盘中有一条杠在盘面上,这就是磁头,磁头与盘面不接触。
磁头摆动,定位磁道。
磁盘盘片旋转:定位扇区
扇区:是磁盘存储数据的基本单位(基本上512字节)
读写磁盘,是从一扇区来读的而不是字节,所以磁盘是块设备。
磁盘的每一面都有一个磁头,读写哪一个磁头的本质就是读写哪一面!
先定位磁头(heander)
磁头移动要访问哪一个柱面(磁道)(cylinder)
定义一个扇区(sector)
上面指令可以查看自己的盘
我们拿磁带举例子:
磁带是通过卷在一起的方式存储起来,但我们可以认为手动的把它拉直,磁盘也是一样,磁盘就是一个卷起来的磁带,可以把它拉成线性结构,抽象成线性结构。
但是磁盘真实的物理运动过程还是通过CHS的方式,但是这里面有一个细节:
传动臂的磁头是共进退的
磁盘整体是由柱面卷起来的,所以真实情况就是某一个磁道展开就成了一个一维数组:
柱面是由多个磁道构成,对柱面展开就是一个二维数组:
整个磁盘由n个柱面组成,展开就相当于三维数组:
那么三维数组需要三个参数来定位,因此就有了CHS!!!
所以定位磁面就抽象成了找哪个二维数组
定位磁道就抽象成了找二维数组中哪个以为数组
然后就是定位扇区
又因为各二维数组本质其实也是一维数组,所以定位数组可以用到下标,也就是LBA
通过LBA给的指引,原理上可以找到块,但是因为磁盘物理结构就是这样不变,所以要把LBA转变成CHS,这个过程由磁盘自己做,磁盘里由固件(硬件电路,伺服系统)会帮我们完成这项任务。
LBA = 柱面号*单个柱面扇区总数 + 磁头号 * 每磁道扇区数 +扇区号s -1;
由于(磁头数*每磁道扇区数)< 每磁道扇区数 < 扇区
所以LBA->CHS:
柱面号(C) = LBA / (磁头数*每磁道扇区数) 余数就是柱面号
磁头号(H) = LBA % (磁头数*每磁道扇区数)
扇区(S) = (LBA % 每磁道扇区数)+1;
os和磁盘进行io的时候,如果以扇区为基本单位进行io,512字节那就太少了效率太低了,
一般以1kb ,2kb,4kb,8kb等进行io,现在大部分都是以4kb进程io,4kb这一内存开出来叫做一个数据块,由八个扇区组成。
所以io的基本单位是八个扇区--》4kb -- 》数据块
那么就可以引入块号的概念:
所以可以抽象成:磁盘是以块为单位的一维数组。
一个盘里由500GB如何做管理?
这就和一个国家如何管理一片国土一样,需要划分各个区域,比如说每个划分为多个省,省可以划分为多个市。
磁盘也可以分区,如果做过分盘的知道一个电脑只有一个盘,但是它可以分成c盘d盘。
这样我们只用管理好一个分区就可以同一个方法管理好多个分区
磁盘分完区之后可以分组!
这样就可以细化为只用管理好一组其他复制其管理方式就行。
我们知道,一个文件等于内容加属性
属性也是数据,是通过结构体的方式构建出来(inode)
一个文件只有一个inode,inode是一个文件数据属性的集合。
每个inode都有自己的唯一编号(不重复):
组内有一个区域叫inodetable,里面管理了一组里的所有属性集,
数据就存在datablock中,里面全是划分好的4kb大小的块
Linux中文件属性和文件内容分开存储。
图中BootBlock里存与开机相关我们不管,剩下的Block group中就是存数据的地方。