zoukankan      html  css  js  c++  java
  • 文件系统(I)

    文件:

    文件是具有符号名在逻辑上具有完整意义的一组相关信息项序列。(进程是对内存的抽象,那么文件就是对磁盘的抽象)

    符号名主要是文件名(用于标识文件),文件名还附加几个字符作为扩展名(用于标识文件特性)

    信息项是构成文件内容的基本单位(但构成文件也可以是记录):                               

                                文件内容

    信息项1(或者记录1) 信息项2(或者记录2) ...   ...   信息项n(或者记录n)

                                                                               ↑__ 读写指针(例如unix系统中的seek函数即为确定读写指针的位置)  

    文件系统

    定义:存取和管理信息的机构(为用户程序操作系统所用)

    用户想创建和删除文件都要通过跟文件系统打交道所以说为用户程序所用

    而为OS所用则是:操作系统程序代码和核心数据并非全部常驻内存,而将一部分操作系统的程序模块和数据存放在直接存取的文件存储器上,只有在用户需要用到某部分功能是,才将相应的OS例程调入主存,所以说OS也用到文件系统,同时这也是为什么之前电脑512MB内存却能跑几个G的操作系统,有用的调入主存执行,没用的先存在文件存储器上,需要时再调入。

    功能:从用户角度来看文件系统实现了按名存取的功能,同时文件系统需要解决数据的组织方法,即数据在辅存设备上的排列,分布构成了文件的物理结构(之后讨论),但是为了方便物理结构不会给用户使用,所以文件系统就要做好物理结构到逻辑结构的映射。同时文件系统也应提供适合的存取方法来适应不同的应用。

    文件的组织

    之前讲到了文件系统要解决数据的组织方法,那么文件的组织形式,分成逻辑文件(用户观点)物理文件(实现观点)

    逻辑文件从结构上又分成流式文件记录式文件

    流式文件:构成文件基本单位是字符,也就是此时文件是有逻辑意义但是没有结构的一串字符的集合

    记录式文件:由若干个记录组成,每个记录内部由若干字段组成(目录文件(管理文件系统的系统文件)就是该结构)

    存取方式 

    顺序存取:在前一次存取基础上进行,不必给出具体存取位置

    随机存取:指出起始存取位置(即读写指针的位置)

    文件存储介质

    物理块(又作块,簇(windows))概念:(信息存储,传输,分配的独立单位)即文件信息保存在其中,有了物理块概念,那么存储设备就是被划分大小相等的物理块,并且统一进行编号。

    机械磁盘结构:

    多个盘片,每个盘片有两个盘面(上下两面都可读,都可被划成扇区),每个盘面有一个读写磁头,读写磁头都固定到磁臂上,沿着半径方向运动。

    盘面上被划分成多个同心圆称为磁道,磁道划分成很多段,段即为扇区(信息存放处,1个物理块 = 2的整数倍扇区)

    那么假设有一块空硬盘我们要往其中写入一个文件,此时我们要知道文件是想将一个磁道的扇区填满,再往另一个磁道进行写入。而且填满磁道的顺序是从外到内的,但是由于不管是旧式还是新式记录方式,磁头在外部磁道的读写速度是大于在内部磁道的读写速度,例如在外部磁道读取10个扇区的时间,在内部只能读取一个扇区,所以这就导致了磁盘用久后读写速度变慢。此时就需要进行磁盘清理。


    什么是新式和旧式?

    旧式即为非分区记录方式(不同磁道扇区数相同),越往外面,转动的速度越快,因为每个扇区所能容纳的数据量都是512字节,而数据量需要平均分配在扇区面积的每个角落,所以外面扇区的面积大,数据密度低,里面扇区面积小,但数据密度高,所以为了读取外部扇区的数据,磁头在外面读写速度一定要快。为了防止浪费外部的面积,产生了新式分区记录方式(不同磁道扇区数不同),导致扇区面积一致,数据量也一致。

    任何时刻只有一个磁头处于活动状态

    输入输出数据流都以位串的形式出现

    而对于一个扇区存放的数据通常为512字节,但是扇区总的大小基本上是大于512字节,它包含标题10字节,数据512字节,校验信息若干字节

    划分后磁盘的物理地址可以分成:柱面号磁头号扇区号三个部分

    柱面:硬盘通常由重叠的一组盘片构成,每个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面

    那么一次访盘请求要包含以下信息:

    读/写  磁盘地址(设备号(对于多个磁盘来说),柱面号,磁头号,扇区号)  内存地址(将读出信息放入的地方或是要从此处读出的信息)

     

    由柱面号和磁头号即可确定哪个盘面的哪个磁道,然后用扇区号确定扇区

    --------------------------------------------------------以上均为机械硬盘的操作但是SSD不是这样。------------------------------------------

    那么对于一个磁盘空间我们要进行管理:

    1.位图:用一串二进制位反映磁盘空间中物理块分配使用情况,每个物理块对应一位,已分配的为0,还没分配的为1.

    2.空闲块表:所有空闲块记录在一个表中,且保存着两项内容,其实块号,连续有多少空闲块。

    3.空闲块链表:所有空闲块成一个链表

    块号到磁盘地址的转换:

    柱面号 = 块号/(磁头数*扇区数)

    磁头号 = (块号mod(磁头数 * 扇区数))/扇区数

    扇区号 = (块号mod(磁头数 * 扇区数))mod扇区数

     

    磁盘地址到块号的转换:

    块号 = 柱面号 * (磁头数 * 扇区数)+磁头号 * 扇区数 + 扇区号

     

    位图:已知字号i,位号j

    块号 = i * 字长 + j

    已知块号  字号 = 块号/字长  位号 = 块号mod字长

    成组链接法:

    解释:左边为专用块,这是它是图中唯一进入内存的区域,然后第一字段指的是当前组的空闲物理块数,然后接下来就是空闲物理块的编号,从高到低排序,分配时是从801该物理块开始取出,直到第一组只剩820这个物理块,因为此物理块它保存的是下一组的起始物理块块号和物理块数,那么一旦它被分配,它原先保存的内容就会被覆盖就会导致无法定位到下一组的物理块,所以在它要被分配之前,要将他的内容放到专用块中,即把图中第二组数据读到内存专用块所占区域,然后再将其分配出去。注意最后一组的0他表示没有下一组物理块了,物理块到此就被分配完了。回收时,若现在的专用块不满100块,则只需将回收块的块号填入专用块栈顶(下面),并将其中的空闲盘块数加1;若现在专用块中已有100块编号,则填入回收块前,先将专用块中空闲盘块数和空闲盘块号写入回收块中,然后将回收块号记入专用块中,并且专用块中空闲块数变成1。

                                       作者水平有限,文章肯定有错还请各位指点!!!感谢!!!

  • 相关阅读:
    leetcode 463. Island Perimeter
    leetcode 682. Baseball Game
    leetcode 566. Reshape the Matrix
    Python:SMOTE算法——样本不均衡时候生成新样本的算法
    北京Uber优步司机奖励政策(12月13日)
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(12月13日)
    北京Uber优步司机奖励政策(12月12日)
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(12月12日)
    北京Uber优步司机奖励政策(12月11日)
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(12月11日)
  • 原文地址:https://www.cnblogs.com/chaunceyctx/p/6859079.html
Copyright © 2011-2022 走看看