操作系统-爱代码爱编程
文件一一就是一组有意义的信息/数据集合,创建文件其实就是用·一个数据结构来表示该文件的信息,这些信息就是文件本身。文件有许多的属性为文件名,文件标识符,类型,位置,大小,创建时间、上次修改时间,文件所有者信息,保护信息。
文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名
文件标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称。
类型:指明文件的类型
位置:文件存放的路径(让用户使用)在外存中的地址(操作系统使用,对用户不可见)
大小:指明文件大小。
创建时间:指明文件的创建时间
上次修改时间:指明文件的修改时间
文件所有者信息:指明该文件的拥有者是那个用户
保护信息:对文件进行保护的访问控制信息(隔绝没有权限的用户访问文件)
文件按类型划分为有结构文件和无结构文件(这种划分是逻辑上的划分是对用户来说的,从用户视角上看的,详细解释看后面部分)。
无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”。如: Windows操作系统中的.txt文件。
有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录又若干个数据项组成。如:数据库表文件。一般来说,每条记录有一个数据项可作为关键字。根据各条记录的长度(占用的存储空间)是否相等,又可分为定长记录和可变长记录两种。
有结构文件在逻辑上划分(即在用户看来是这样的但实际存储可能不是这样,可以理解为虚假的)为顺序文件,索引文件,索引顺序文件。
顺序文件:文件中的记录一个接一个地顺序排列(从用户视角上看),记录可以是定长(每条记录的大小相同)的或可变长的(每条记录的大小不确定)。各个记录在逻辑空间中可以顺序存储(用户看起来该文件是顺序排列的在逻辑空间中也是顺序排列,类似于顺序表)或链式存储(用户看起来相邻的记录在逻辑空间中不一定相邻,类似于链表)。顺序文件按照是否以关键字来排列又可以分为串结构和顺序结构。串结构:记录之间的顺序与关键字无关。顺序结构:记录之间的顺序按关键字顺序排列。
串结构相对简单是因为采用串结构管理文件的话如果要增加一条记录的话只需要在末尾添加即可不需要考虑排序问题。快速查找是指可以直接定位该条记录所在外存的位置,不需要从该文件的第一条记录开始往下依次查找。
索引文件:为了实现在顺序存储快速查找采用可变记录的文件的记录,实现方式是通过增加了索引表(所以说索引文件就是在顺序文件的基础上增加了索引表)。索引表本身属于定长记录顺序存储的顺序文件所以可以实现快速查找对应的索引号的位置,从而获取该条记录所在外存的位置实现快速查找。
索引顺序文件:索引顺序文件是索引文件和顺序文件思想的结合。索引顺序文件中,同样会为文件建立一张索引表,但不同的是:并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项。所以需要对文件中的每一条记录进行分组。其中索引表是定长记录顺序存储的串结构文件。
数据通过文件进行管理,而文件通过目录进行管理(创建目录就是创建目录文件,用一个数据结构来记录相应的信息)。文件储存的是数据,所以文件信息中的外存块号指的是里面数据的储存位置。而目录储存的是目录文件,目录文件就是一张记录了储存在目录中的其它目录数据或则是文件数据的表格,而目录文件中的每一项称为文件控制块(FCB)。目录中之所以可以存储目录是因为目录本身就是一种有结构文件,由一条条记录组成。每条记录对应一个在该放在该目录下的文件。当你双击打开一个目录下的文件时,操作回去当前目录所对应的目录文件中根据文件名进行查找对应的文件控制块,之后根据文件控制块记录的外存块号找到相应的数据,如果打开的是目录则找到的就是目录文件。
一般来说需要对目录进行以下几种操作。搜索:当用户要使用一个文件时,系统要根据文件名搜索目录,找到该文件对应的目录项。创建文件:创建一个新文件时,需要在其所属的目录中增加一个目录项。删除文件:当删除一个文件时,需要在目录中删除相应的目录项。显示目录:用户可以请求显示目录的内容,如最示该目录中的所有文件及相应属性。修改目录:某些文件属性保存在目录中,因此这些属性变化时需要修改相应的目录项(如:文件重命名)。
随着技术的发展目录结构也在变化,目录结构共有四种为单级目录结构,两级目录结构,无环图目录结构,多级目录结构。
单级目录结构:早期操作系统并不支持多级目录,整个系统中只建立一张目录表,每个文件占一个目录项。
两级目录结构:早期的多用户操作系统,采用两级目录结构。分为主文件目录(MFD,Master File Directory)和用户文件目录(UFD,User Flie Directory)。
多级目录结构:不在限制目录的层级数,用户可以任意创建多级的目录结构,大大提高了管理的灵活性,让用户可以对自己的文件进行分类。
无环图目录结构:
索引结点(FCB的改进):在进行文件查找时只需要关注文件名是否一样即可,所以FCB中无需存储除文件名以外的信息,其它信息可以单独出来进行储存,然后在FCB中记录文件名和其它信息所在的物理地址即可(这些信息的大小都是相等的,所以储存它们的起始地址即可)。
操作系统需要对外存进行管理,管理文件的分配。外存也像内存的分页管理一样把外存划分成一个个磁盘块,每个磁盘块都有一个编号。并且为了方便把磁盘块调入内存,操作系统会根据内存划分的页框大小来划分磁盘块的大小。 所以说文件管理是用于管理外存数据,内存管理是用于管理内存空间,而外存管理就是为了管理外存空间,进程管理是用于管理内存数据。外存管理分为三种,连续分配,链接分配,索引分配。为了方便程序员编程,在内存管理中引入了逻辑空间的概念。而在外存管理中为了方便对文件数据的管理也引入了逻辑空间的概念,里面的数据使用的地址也是逻辑地址(逻辑地址也能像内存管理一样变为文件号和偏移量)。操作系统会把逻辑空间根据磁盘块的大小划分文件块。
连续分配:文件在外存中占用连续的磁盘块。用户通过逻辑地址来操作文件内的数据,操作系统负责把逻辑地址转化为物理地址在去操作相应的数据。在连续分配中,目录文件的每一个文件控制块中都记录了该文件的起始磁盘块号和文件长度(因为是连续分配,所以只需记录这两个数据即可)。优点:支持顺序访问和直接访问(即随机访问);连续分配的文件在顺序访问时速度最快。缺点:物理上采用连续分配,存储空间利用率低,会产生难以利用的磁盘碎片可以用紧凑来处理碎片,但是需要耗费很大的时间代价。
链接分配:链式分配分为隐式链接和显示链接,隐式链接是指磁盘块之间的顺序是记录在除去最后一个磁盘块外的其它磁盘块的数据内的。优点:很方便文件拓展,不会有碎片问题,外存利用率高。缺点:只支持顺序访问,不支持随机访问,查找效率低,指向下一个盘块的指针也需要耗费少量的存储空间。显示链接是指把用于链接文件各物理块的指针(即物理地址)显式地存放在一张表中,即文件分配表(FAT,File Allocation Table)。优点:很方便文件拓展,不会有碎片问题,外存利用率高,并且支持随机访问。相比于隐式链接来说,地址转换时不需要访问磁盘,因此文件的访问效率更高。缺点:文件分配表的需要占用一定的存储空间。
下一块的块号记录为-1标志则该块是最后一块了。操作系统在为文件块分配磁盘块时会在FAT中记录该物理块的下一块的块号,当操作系统读取完该磁盘块后会去FAT中查找下一块的块号从而继续读取直到该磁盘块的下一块的块号为-1才会停止。
索引分配:索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表一一建立逻辑页面到物理页之间的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。当用户想要访问某个文件块时,操作系统会先去该文件所在的目录文件中找到该文件的文件控制块,从中查询索引块的信息之后根据该信息找到索引表把该表读入内存之后读取该文件块号对应的磁盘块号完成访问。若每个磁盘块1KB,一个索引表项4B,则一个磁盘块只能存放256个索引项。无法用一个磁盘块储存完整张索引表,为了解决这个问题人们提出了三种方法链接方案,多层索引,混合索引。
链接方案:
多层索引:
跟多级页表类似,经典空间换时间的方案(因为多加了个表)。当用户想要访问文件块号为1026的数据时,操作系统怎么找到对应的磁盘块呢?文件数据在逻辑空间中是依次从低地址到高地址进行存储的,逻辑空间是按照相同的大小依次划分文件块的并且每个二级索引表最大能储存的块是有限制的,所以当知道文件块的块号后只需用文件块号/索引表能最大储存块的数目。
混合索引:
该方式会为每个文件创建一个顶级索引表,并把该表的地址储存在文件控制块中。
逻辑一词在操作系统中的意思是从用户视角看的、虚拟的。逻辑空间是虚拟的空间它不是真实存在的,它是为了方便用户操作内存或外存而创建的概念,每个文件都有一片从零开始的逻辑空间,用户需要自己管理该空间,用户对数据的所有操作都是对逻辑空间而言的。操作系统负责管理物理空间同时负责把用户对于逻辑空间的操作映射进物理空间当中。文件的逻辑结构指的是从用户的角度来看文件可以分为有结构文件和无结构文件(区别就是在用户看来有无结构划分),而顺序存储和链式存储指的是用户对逻辑空间的管理方式(顺序存储就是指数据在逻辑空间中安顺序排列而链式存储就是离散排列),管理数据怎么储存到逻辑空间中。不管采用何种方式管理逻辑空间操作系统都不会理会,操作系统需要做的就是把逻辑空间映射进物理空间中,当用户想要读写数据时只需把逻辑地址告诉操作系统即可。文件的物理结构指的是操作系统对文件的管理方式,关注的是如何给文件分配物理空间的问题,同时还要关注如何把逻辑地址转化为物理地址的问题。总的来说文件的逻辑结构是从用户角度上看的,是对逻辑空间的操作,而文件的物理结构是从操作系统的角度上看的,是对物理空间的操作也就是如何给文件分配物理空间的问题。
文件的存储空间管理:操作系统想要实现对外存的分配与回收的前提是必须得知道当前外存的空间使用情况,有哪些块是空闲的有那些块是被使用的(内存管理也是一样,里面也有一部分程序是实现该功能的为内存的分配与回收提供数据基础)。
存储空间的划分与初始化:为了给文件分配外存空间,操作系统需要对外存进行管理(这一部分的程序属于文件系统的一部分)。所以说无论是什么存储设备比如硬盘,u盘在存储数据之前都需要安装文件系统并运行对硬盘进行划分管理,之后才能存储数据否则即使存储了也不知道如何管理。一个新买的硬盘想要安装windows操作系统的步骤是,先把操作系统的代码下载到u盘中(u盘出厂时就已经安装并运行了文件系统对u盘进行管理了),之后把u盘插入电脑中。主板上的bios芯片会让cpu去执行u盘所下载的操作系统代码(一般都有引导界面帮助用户划分硬盘空间),此时文件系统被运行对硬盘进行划分管理之后便把u盘中的操作系统代码给复制到c盘中,完成操作系统的安装。
空闲表法:
空闲链表法:分为空闲盘块链和空闲盘区链,空闲盘块链是以盘块为单位组成一条空闲链,空闲盘区链是以盘区为单位组成一条空闲链
空闲盘块链:
空闲盘区链:
位示图法:
成组链接法:超级块由两部分组成,下一组的空闲块数,和下一组的块号。在这些块号中有一个块跟超级块类似存储着下一个组的信息,而其它块则是空闲块。注意每一个分组的块数是有上限的。
分配方式:如果需要1个空闲块①检查第一个分组的块数是否足够。1<100,因此是足够的。②分配第一个分组中的1个空闲块,并修改相应数据(把超级块中下一组的空闲盘块数减1并删除对应的空闲块号)。如果需要100个空闲块①检查第一个分组的块数是否足够。100=100,是足够的。②分配第一个分组中的100个空闲块。但是由于300号块内存放了再下一组的信息,因此 300号块的数据需要复制到超级块中(由于超级块所指向的那个分组的空闲块数已经分配完毕,所以空闲块应该指向下一个分组所以需要把300号块的数据需要复制到超级块中,不管怎么样超级块一定是搜索的链头)。
回收方式:1.假设每个分组最多为100个空闲块,此时第一个分组已有99个块,还要再回收一块那么可以直接把该块的块号信息插入第一个分组中。2.假设每个分组最多为100个空闲块,此时第一个分组已有100个块,还要再回收一块。需要将超级块中的数据复制到新回收的块中,并修改超级块的内容,让新回收的块成为第一个分组。总的来说回收块时先看第一个分组是否足够接纳这一个块如果够则直接添加,如果不够则新建一个分组并作为第一分组(链头插入法)。
操作系统为操作文件提供了以下几个功能:创建文件(create系统调用) ,删除文件(delete系统调用),读文件(read系统调用),写文件(write系统调用),打开文件(open系统调用),关闭文件(close系统调用)。当用户通过图形化管理程序操作文件时,该程序背后会自动调用这些程序。
创建文件:
删除文件:
打开文件:
在对文件进行读写操作前需要对文件执行打开操作,把文件的TCB复制到进程的打开文件表中。
当进程想要打开文件时先通过系统调用并传递所需的参数告诉操作系统,之后操作系统在外存中读入该文件的TCB信息并记录在自己的打开文件表中,并对该条记录做些修改(增加访问权限项等等)后返回给进程。进程拿到该TCB数据后就把数据写入到自己的打开文件表中。
关闭文件:
读文件:
写文件:
文件共享指的是多个用户共享一个文件,这个文件的数目只有一个。当一个用户修改了此文件其它用户也能看到。而复制指的是创建了另一个文件这个文件的内容和原文件一模一样。文件共享有两种实现方式为基于索引结点的共享方式(硬链接),基于符号链的共享方式(软链接)。
基于索引结点的共享方式(硬链接):
基于符号链的共享方式(软链接):
软链接是指索引节点指针指向的索引节点的的物理块里储存的文件里储存的是共享文件的文件路径,操作系统会根据该路径依次寻找。硬链接里索引节点指向的物理块中储存的就是共享文件。快捷文件就是采用了软链接的方式共享了文件,共享的原理是指向了其它目录下的某个TCB。
操作系统实现了用户管理的功能,在进入操作系统时都需要进行用户登录。每一个用户都有一个用户目录,它存放在c盘的用户目录下。在用户目录里创建的文件属于该用户的独有文件,除了管理员用户以外,其它用户如果没有获得权限是无法打开独有文件的。桌面显示的内容就是用户目录中桌面目录内的内容,你在桌面创建的文件就是属于此用户的。
文件保护是为了保护文件数据的安全,共有三种方式口令保护,加密保护,访问控制。
口令保护:
加密保护:
访问控制 :
操作系统文件结构:
一块硬盘需要经历物理格式化和逻辑格式化两个步骤后才会变成我们日常使用的样子。
物理格式化:一般由硬件的厂家完成,它把硬盘划分成了一个个的扇区,每个扇区都有一个编号称为扇区号,操作系统需要使用物理地址(这里的物理地址跟内存的不一样,本质上也是个逻辑地址,最后转化为物理地址的工作是由硬盘内部的芯片完成的)来操作该硬盘。
逻辑格式化:这是在逻辑层面对硬盘格式化,不会从物理上对硬盘做任何事,单纯使用数据完成对硬盘的划分。逻辑格式化会把硬盘划分为一个个的分区,这些分区就是就是我们常见c盘,d盘。分区的范围会记录在主引导记录区当中。
文件系统:即实现文件管理功能的那一部分程序,包括外存管理。这部分的功能是为了实现文件的管理,所以说如果想要对硬盘进行管理只需要这部分程序就够了,所以说像u盘等这些外部存储设备里面也安装了文件系统进行文件管理。但是文件系统并不是只有一种它有很多种,而不同的文件系统对文件管理功能的实现方式可能会不同,函数的命名也可能不一样。那么在这种情况下,如果计算机装有多个硬盘并且每个硬盘安装的文件系统不相同,那么操作系统根本无法提供一个统一接口供上层用户使用,因为每个不同的文件系统的函数命名可能不一样。所以为了解决这个问题引入了虚拟文件系统,虚拟文件系统对上层用户提供了一个统一的接口,同时规定了不同的文件系统想要在本操作系统上运行就必须实现虚拟文件系统所规定的功能同时函数命名也得按照规定。
不同的文件系统所定义的TCB结构是不同的,所以虚拟文件系统在使用不同的文件系统时要创建一个新的TCB结构并把文件系统的TCB中的信息给复制到新创建的TCB中完成对数据结构的统一。函数功能指针指向的是文件系统提供的函数列表,目的是为了告诉虚拟文件系统它对外提供的函数接口是什么。