从磁盘中读写1个字节:移动磁头到指定磁道,旋转磁道直到指定扇区,通过磁生电/电生磁来读/取一个字节。只需要往控制器中写柱面,磁道,扇区,缓存位置,就能通过指令获取数据。
操作系统对这整个过程进行了封装抽象。
将多个扇区合成一个block,然后按照顺序排序,使得相邻盘号的block放在一起(这样连续读取相邻盘块可以花费较少的寻道时间),程序只需要传入一个block号,就能通过磁盘驱动自动取出多个相邻扇区的数据,block越大,空间浪费越多但是速度越快(每次寻道能读出更多的数据)。
因为有多个进程都要对磁盘进行读写请求,需要将每个进程的请求放到请求队列中,使用调度算法来进行调度,使得目标的平均访问延迟小。常见的磁盘调度算法:FCFS(先来先服务),SSTF(最短寻道优先),SCAN(电梯调度)
为使得用户使用的方便(总不可能让用户直接使用block吧),操作系统引入了文件来封装block(建立字符流到盘块集合的映射关系)。将整个磁盘抽象成了目录树结构。
文件在磁盘上的存储方式
- 连续存放:速度快,非常不灵活,对于文件增长有可能需要分配更大得连续盘块,FCB中保存文件得起始盘号以及长度
- 链式结构:各个盘块可以分开存放,速度慢,由指针连接起来,FCB只用保存起始盘号。
- 索引结构:专门拿一块来做索引块,中间存储了这个文件对应的盘块信息,FCB中存储索引块的块号。
unix使用的是多级索引(inode)
用户调用磁盘读写的过程
file_write(inode, file, buf, count):根据file中的一个读写指针(开始地址),加上count就是要读取的文件字符,然后使用inode找到要操作的盘号。
目录与文件系统
将目录(多个文件的集合)以及文件组成一个目录树结构,目录是一个特殊文件,存放了文件名+对应FCB的"地址"。根目录的FCB数组可以放在固定位置,FCB在磁盘中以数组形式存在,这样给出一个数组下标就能直接找出FCB的位置(根目录可以考虑放在第一个位置),通过FCB可以找到对应的数据块,目录在数据块中存放了在他目录下文件的文件名+对应FCB的“地址”。
根目录的信息从哪里来的:磁盘格式化,通过读取固定的块信息读出根目录的信息。