411_初识文件管理
# 4.1_1_初识文件管理
从这个小节开始,我们会开始学习文件管理相关的章节,那么在正式开始学习之前,我们会用小节带领大家看一下平时咱们熟悉的一些文件系统,希望通过小节的学习,能够消除对文件管理这一系列知识点的一个陌生感,还有恐惧感,并且对整个章节的知识框架有一个初步的认识。
在之前的学习中,我们已经知道操作系统它作为系统资源的管理者,也需要对文件进行管理,文件也属于一种系统资源,它其实就是一组有意义的信息或者说数据的集合。平时我们在生活当中也使用过各种各样的文件,比如说手机拍的照片,还有像 word 文档,还有像老师上课的时候给大家发的那些 PPT 讲义,PDF 文件,这些都是各种各样的文件,但是各种各样的文件它又在我们面前呈现出了不一样的一些特性,这些特性其实也需要操作系统来关心。
比如说当我们打开 PDF 文件的时候,一般都是用 Adobe reader 软件来读取这个文件的数据的。另外像我们打开照片这种文件的时候,一般来说都是用操作系统自带的那种图片浏览的软件来进行打开的,所以其实不同的文件它有不同的属性,而因为文件的属性不同,所以我们在使用文件的时候也会有各种各样的差别,
所以我们第一个要讨论的问题,在计算机当中有各种各样的文件,这些文件一般来说都拥有哪些属性?
第二个问题,既然文件它是一组有意义的信息或者说数据的集合,那么这些信息在内部是怎么被组织起来的,也就是文件内部的这些数据的组织形式的问题,这是我们第二个要探讨的问题。
第三个问题,在我们的系统当中有很多的文件,但是这些文件因为有组织的把它们存放在一起,所以平时我们使用它们的时候也会很方便。所以第三个我们需要讨论的是这些文件之间应该怎么被组织起来。
第四个问题,从下往上看,操作系统的上层应该是应用程序和用户,所以操作系统应该为它的上层提供简单易用的一些接口,用来方便的操作各种各样的文件,那操作系统应该为上层提供哪些功能?这是我们之后会探讨的问题
最后一个问题,从上往下看,操作系统的下面层是硬件,所以操作系统也需要对硬件进行管理。而我们知道一般来说文件是存放在我们的磁盘,也就是外存当中的,而外存作为一种计算机的硬件,肯定也需要操作系统对它进行管理,那么这些文件的数据应该怎么被存放在外存上,这是我们最后一个会探讨的问题。
# 文件应该有哪些属性
我们首先来看一下一个文件应该有哪些属性,从我们最熟悉的 windows 操作系统出发,我们可以在我们自己的电脑当中随便找到一个文件,然后右键点击属性,之后就会弹出这样的一个窗口,在这个地方就可以看到一个文件到底拥有哪些属性。
首先我们作为普通的用户,其实平时最常关注的应该是文件名属性,因为平时我们在找一个自己想要的文件的时候,那都是根据这些目录一层一层往下找,并且跟找到我们想要的文件的文件名,再打开这个文件,使用这个文件,所以文件名属性对于用户来说是极其重要的,我们普通用户都是按照我们,文件名来寻找文件的,
不过需要注意的是同一个目录下是不允许有同重名文件的,比如说此时我尝试在 demo 这个文件夹下,再建立一个也叫 test.txt 的文件,但是当我点确定的时候,操作系统会提示我此位置已经包含同名文件,他建议我把这个文件重命名为 test2.txt,也就是说它其实并不允许我在同一个目录下拥有两个名字相同的文件,为什么不允许有重名文件?这一点咱们会在之后的小节当中再进行进一步的解释。总之文件名对于用户来说是很重要,甚至说是最重要的一个属性,因为我们都是根据文件名来找到一个文件的
那文件第二个重要的属性是标识服务,其实在一个系统当中肯定是有很多重名文件的,虽然说在同一文件夹下不允许有重名的文件,但是我在这个地方虽然不能建立一个叫做 test 的文件,不过我可以在我的桌面上建立一个也叫 test 的文件,所以其实用文件名并不能唯一的区分出每一个文件到底是哪一个,因此操作系统会在背后为各个文件设置一个标识符,每个文件的标识符都是唯一的,只不过标识符对用户来说毫无可读性,一般来说就是一连串没有意义的数字字母的组合。所以在这个界面也没有向用户展示出一个文件的标识符,它只是操作系统用于区分各个文件的一种内部的名称。
第三,每个文件会有一个叫做文件类型的属性,比如说我们在常规这个页签,这可以看到 test 文件的文件类型,它是.txt 类型,指明文件的类型有很多好处,比如说操作系统可以为不同类型的文件设置一个默认的打开的应用程序,比如说.txt 文件就是默认用记事本这个应用程序打开的,那像.MP4 这样的文件一般来说就是默认用一个视频播放的应用程序来打开并且呈现给用户,所以文件类型也是一个很重要的属性。
第四个很重要的属性是文件的位置,这个位置包括文件的存放路径,这个存放路径是让用户使用的,比如说我的 test,文件它就是存在 d 盘的 demo 目录下,我们普通用户可以根据文件的存放路径来一步一步的找到我们想要找的文件。不过这个文件平时是存放在外存,也就是磁盘当中的,所以当我们双击打开这个文件的时候,其实操作系统需要从外存把文件的数据读入内存,因此操作系统也需要关心文件在外存当中存放的位置这个问题,只不过在外存当中存放的地址属性对于用户来说是不可见的,只有操作系统需要关心。
除了上面介绍的这些很重要的属性之外,还有文件的大小,比如说像这个文件它有 186 个字节这么大,另外文件在什么时候创立,上一次修改的时间是多少,这个文件的所有者也就是文件的创建者到底是谁,这些信息也是文件当中需要包含的一些属性。
另外还有一个很重要的属性就是文件的保护信息,只不过文件的保护信息这个属性,咱们平时在使用的过程当中几乎体会不到。大家可以看一下自己的文件属性安全标签页
大家会发现,其实操作系统对这个系统当中的各种用户进行了一个分组,不同分组的用户对于文件的操作权限是不同的,有的分组的用户可以对这个文件进行读和写,而有的分组甚至不能读也不能写,不能访问文件,所以文件的保护信息可以让操作系统更好的保护一个文件的安全。如果我们创建的文件不想让别的计算机用户来访问的话,那么我们就可以设置一下它的保护信息,就可以实现这件事。
其实我自己从小就是文件保护功能的一个受害者,因为平时我自己玩的那些游戏的启动程序,被我爸设置成了我这个用户读不可写的一种状态,所以只有在家里的电脑中登录我爸的账户的时候,我才能够玩游戏,因为我自己的账户是没有权限访问游戏的启动程序的,所以这是文件的保护信息的一个作用。
# 文件内部数据的组织
接下来我们来看一下文件内部的数据应该被怎样组织起来,大家在平时使用电脑的过程当中也使用过各种各样的文件,有的文件,比如说像.txt 这种文件,它是一种看起来没有很明显的结构特性的文件,这种文件它是由一些二进制或者说字符流组成,就是所谓的无结构文件,又称为流式文件。
另外在我们用户看来,还有一些文件表现出了很强的结构特性,比如说咱们使用的 Excel 表,还有有编程经验的同学可能也使用过一些数据库,数据库表也是一种有很明显的这种组织结构的一种文件。所以对于这种有结构文件来说,它是由一条一条的记录组成,像这个地方这样的一行就是一条记录,而每个记录又是由一组相关的数据项组成,比如说学号是一个数据项,姓名是一个数据项,性别和专业又是另外的数据项,所以数据项是文件系统当中最基本的一个数据单位
因此文件可以分为无结构文件和有结构文件这样两大类,无结构文件它就是由一系列二进制或者说字符流组成,它没有明显的结构特性,而对于有结构文件来说,它是由一个一个的记录组成,每一个记录又由一系列的数据项组成,这些记录应该如何组织的问题。也就是这些记录它们之间应该是顺序的存放,还是用一个索引表来表示它们之间的这种先后顺序,这些问题是咱们之后要讨论的文件的逻辑结构相关的一些问题,在这个地方暂时不展开。
所以文件的逻辑结构要探讨的问题,其实就是文件内部的这些记录,这些数据应该被怎么组织起来的一个问题,这是下一个小节当中会讲解的内容。
# 文件之间的被组织
接下来我们再来看一下文件之间应该怎样被组织起来。咱们随便打开一个逻辑磁盘,比如说打开一个 D 盘,那会发现里边有各种各样的文件夹,除此之外还会有各种类型的一些文件,我们随便打开其中的某一个文件夹,比如说照片这个文件夹里边还可以再有更多的文件夹,并且也可以有各种各样的文件,
所以其实我们平时使用的 windows 操作系统的文件之间的组织形式,看起来是一种树状的组织形式,一个根目录下可以有各种各样的文件目录,也可以有一些普通的文件,在各个目录下面,我们还可以创建给更深一层的目录,也可以存放一些普通的文件,其实这个地方所谓的目录,文件目录就是我们熟悉的文件夹,我们普通用户可以自己创建一层一层的目录,在各层目录当中存放我们想要存放的一系列的文件,所以我们的各种各样的文件,通过目录这种功能把他们有序的组织起来了。
其实我们平时看见的目录或者说文件夹,它也是一种特殊的有结构文件,它也是由一系列的记录组成,具体目录应该是怎么实现的,这也是咱们之后会重点探讨的问题,这儿先不展开,总之文件通过目录这样的功能,把他们有序的一层的组织起来了,这样很方便我们用户使用。
# 文件相关的系统调用
接下来我们来考虑一下操作系统应该对它的上层提供哪些功能。从我们平时的生活经验出发,比如说我们可以在随便一个文件目录下新建一个文本文档这样的文件,那点了新建之后,其实在背后是使用了操作系统提供的一个创建文件的功能,在我们点了新建按钮之后,这个图形化交互进程,其实是在背后调用了操作系统向上层提供的 create 系统调用,来完成这个文件创建的一个工作。
在我们创建了文件之后,这个文件的数据就已经在外存当中了,我们可以双击打开这个文件,为了读取这个文件的数据,我们需要把文件的数据从外存读入内存,因为只有读入内存之后才可以让 CPU 处理,所以这个地方就使用到了一个叫做读文件的功能,其实在我们双击 Test 文件之后,操作系统先是默认自动的打开了.txt 对应的那种应用程序,也就是记事本这个应用程序这个应用程序,又调用了操作系统向上提供的 read 系统调用来实现了读文件的功能。通过读文件的功能就可以把这个文件的数据放到内存,然后就可以呈现在用户面前。
另外当我们把文件编辑结束之后,我们可以保存文件,其实在我们点击了文件保存按钮之后,记事本这个应用程序在背后也做了一系列的事情,主要是调用了操作系统向上层提供的 write 系统调用,就实现了所谓的写文件功能。这个功能就是负责把文件的数据从内存再写回外存,因为平时我们编辑这个文件的时候,其实只是改变了文件在内存当中的副本的数据,所以为了保存文件的内容,我们必须再使用写文件的功能,这是第三个需要向上层提供的很基本的功能。
第四个既然我们可以创建一个文件,那么我们当然也可以删除一个文件,其实在我们点了删除这个按钮之后,图形化交互进程是在背后调用了操作系统提供的删除文件的功能,也就是 delete 的系统调用,这样的话就可以把文件的数据从外存当中抹除了。
除了咱们平时肉眼可见的这一系列对文件的操作功能之外,操作系统还需要提供打开文件和关闭文件这两个基本的功能。这个地方打开和关闭和我们平时所谓的双击,还有点关闭窗口的小叉叉,其实是不一样的两个东西。具体打开文件和关闭文件的时候需要做什么,咱们之后再进行探讨。
不过大家需要注意的是,在使用一个文件之前,也就是读写文件之前,一定需要先使用操作系统的 open 系统调用,也就是打开文件的功能,而当一个文件使用结束之后,也需要使用 close 系统调用来关闭文件。很多对文件的复杂操作可以用这些基本功能来进行组合,比如说如果要实现复制文件这样的事情的话,那么其实是可以先使用 create 系统调用来创建一个新的空文件,然后再把我们想要复制的文件,用读文件的功能,把它的内容读入内存之后,再把内存中的数据再写到新的空文件当中,所以这就写完成了一个复制文件的事情,因此可以看到其实更复杂的这些功能,也可以用这些基础的功能来进行实现。操作系统在处理这些系统调用的时候,在背后需要做哪些事情,这是咱们之后会再展开探讨的问题。
# 文件在外存的存放
接下来我们再来看一下,既然文件它是要存放在外存当中的,而外存又属于一种硬件,从上往下看,操作系统又是最接近硬件的一个层次,因此操作系统需要对硬件进行管理,相应的这些文件的数据应该被怎么放到外存硬件当中,当然也是操作系统需要关心和解决的问题。
首先大家需要知道的是外存也会像内存一样被分为一个的这种存储单元,每一个存储单元可以放一定量的数据,比如说是一个字节。并且每个存储单元会对应一个物理地址,
类似于内存,外存也会被分为一个大小相等的块,或者叫磁盘块物理块,每一个磁盘块的大小都是相等的,并且每个磁盘块一般会包含二的整数幂个地址,比如说在这个例子当中,一个磁盘块包含 1024 个地址,也就是 2 的 10 次方个地址,总共 1KB 这么大小,
相应的文件的逻辑地址也可以分为逻辑块号和块内地址这样的两个部分。操作系统同样也需要把文件的逻辑地址转换成外存的物理地址,也就是物理块号和块内地址这样的形式。
那块内地址的位数取决于磁盘块的大小,比如说在这个例子当中,一个磁盘块占 2 的 10 次方个字节这么多,所以要表示 2 的 10 次方个物理地址,总共就需要 10 个二进制位才可以表示,因此在这个例子当中,块内地址的位数应该是 10 位,
操作系统是以块为单位为各个文件分配存储空间的,所以即使我们的文件大小只有 10 个字节,但是它依然会占用一整个块,也就是 1KB 的磁盘块。另外操作系统在进行读写文件的时候,也是以块为单位进行这种数据交换的。
所以通过这个部分的学习,我们知道外存被分为一个一个的磁盘块,那么当文件比较大的时候,是不是应该连续的存放在这些一些相邻的磁盘块当中?或者能不能找某一种方法让文件离散的存放在各个磁盘块当中,然后用某一种方式来记录下这些磁盘块的先后顺序,这是咱们之后在文件的物理结构部分会探讨的内容。
除了分配给文件的这些磁盘块,应该怎么组织起来这个问题之外,操作系统还需要关心怎么管理这些空闲的磁盘块,怎么对这些磁盘块进行分配与回收这些问题,这些都是咱们之后会再展开讲解的问题。
所以其实文件的物理结构探讨的是文件,这些数据在物理上应该是怎么存放,怎么组织的一个问题。而刚才咱们提到的文件的逻辑结构指的是文件的各个记录在逻辑上应该是什么样的一种组织关系的问题,这些知识点通过之后的学习,大家会有更清晰的认识
# 其他文件的操作
除了咱们刚才探讨的这一系列的功能之外,操作系统还需要实现文件的共享,还有文件保护,这两个比较重要的功能,所谓的文件共享就是指多个用户可以共享的使用同一个文件,而文件保护是指怎么保证不同的用户对文件有不同的这种操作权限,咱们之前聊到的就是我的账户不能玩游戏,而我爸的账户可以玩游戏那个问题,这两个问题咱们会放在稍微靠后的位置进行讲解,并且会结合 windows 操作系统、文件共享,还有文件保护的实际应用来进行探讨。
# 小结
那么这个小节我们初步认识了文件管理大概需要做一些什么事情,我们简单的介绍了文件的定义,它无非就是一组有意义的信息的集合,这个理解就行了,不需要背。
另外对于用户来说,文件名属性是特别重要的,还有文件的类型,文件的位置,包括文件的存放路径,还有文件在物理上的存放位置,这两个信息都是特别重要的信息。
关于文件有哪些属性这个问题,建议大家在网上学习,累了的时候可以自己试试一下自己的电脑,随便找几个文件点开它的属性看一下,然后这样的话就可以加深对文件属性相关的一些理解,还有记忆。
在之后的讲解当中,我们会依次介绍文件的逻辑结构,还有目录的实现。另外操作系统对上层提供的一系列的系统调用的功能,在背后做了一些什么事情,这些都是之后会探讨的内容。
除了逻辑上的结构之外,文件在外存当中是怎么存放的,也就是文件物理结构的问题也十分重要,操作系统又应该怎么对文件的空闲块进行管理,这是存储空间管理相关的内容。
最后我们还会介绍文件共享和文件保护,这样两个呃很重要,但是平时咱们很少使用过的功能,这个小节的内容只是为了让大家能够对接下来的这一整张的框架有一个初步的了解,并且让大家知道其实文件管理的功能离我们生活并不遥远,我们每天都在使用操作系统提供的文件管理的功能,所以大家在学习这个章节的内容的时候,可以结合咱们平时的一些使用文件系统的一些经验,来思考各种各样的这些知识点到底是什么样的一种情况。