1.文件
文件是以计算机硬盘为载体的存储在计算机上的信息集合,可以是文本文档、图片、程序等。系统运行时,计算机以进程为基本单位进行资源的调度和分配。在用户输入输出时,以文件为基本单位。
2.文件系统
操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:与文件系统有关的软件、被管理文件及实施文件管理所需的数据结构。文件系统用于实现文件的权限访问,修改,查询和保存等功能。
3.文件的结构
(1)数据项:数据项是文件系统中最低级的数据组织形式
①基本数据项:用于描述一个对象的某种属性的一个值
②组合数据项:多个基本数据项组成
(2)记录:一组数据项的集合,用于描述一个对象在某方面的属性
(3)文件:创建者所定义的一组相关信息的集合
①有结构文件:相似的记录组成(记录式文件)(如数据库表Excel)
②无结构式文件:字符流组成(流式文件)(如文本文件txt)
4.文件的属性
(1)名称:同一目录下不允许有重名文件,由创建文件的用户决定文件名,主要是为了方便用户找到文件。文件名称以容易读取的形式保存。
(2)标识符:不同目录下允许文件重名,因此通过名称无法唯一确定一个文件。标识符文件的唯一标签,通常为数字,是对人不可读的一种用于区分各个文件的内部名称。
(3)类型:指明文件类型。如.txt
(4)位置:文件的存放路径(用户可见)、在外存中的地址(用户不可见)
(5)大小:文件当前的大小,包含文件允许的最大值
(6)保护:对文件进行保护的访问控制信息
(7)时间、日期和用户标识:文件创建、修改和上次访问的相关信息,用于保护和跟踪文件的使用
5.文件的基本操作/操作系统向上提供哪些功能
(1)创建文件(create系统调用)
①在外存找到文件所需的空间
②根据文件存放路径的信息找到该目录对应的目录文件,在目录中创建该文件对应的目录项。目录项中包含了文件名、文件在外存中的存放位置等信息
(2)写文件(write系统调用)
需要指明是哪个文件(用编号即可指定,不需要用文件名)、写出多少数据、写回外存的数据放在内存中的什么位置。操作系统在处理write系统调用时,会从用户指定的内存区域中,将指定大小的数据写回写指针指向外存
(3)读文件(read系统调用)
需要指明是哪个文件(用编号即可指定,不需要用文件名)、读入多少数据、读入的数据要放在内存中的什么位置。操作系统在处理read系统调用时,会从读指针指向的外存中,将用户指定大小的数据读入用户指定的内存区域中
(4)文件重定位(文件寻址)
按照某种条件搜索目录,将当前文件位置设为定值。并且不会读、写文件
(5)删除文件(delete系统调用)
①根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的目录项
②根据该目录项记录的文件在外存的存放位置、文件大小等信息,回收文件占用的磁盘块
③从目录表中删除文件对应的目录项
(6)截断文件
允许文件的所有属性不变,并删除文件内容,即将其长度设为0并释放其空间
(7)打开文件(open系统调用)
首次使用文件,会调用open请求指明文件的属性(包括其物理位置)从外存复制到内存打开文件表的一个表目中,并将该表目的编号(索引)/文件描述符返回给用户。
操作open会根据文件名搜索目录,并将目录条目复制到打开文件。调用open请求(创建、只读、读写、添加等)得到允许,进程就可以打开文件,open会返回一个指向打开文件表中的一个条目的指针。通过使用该指针进行I/O操作,简化步骤并节省资源。
(8)关闭文件(close系统调用)
①将进程的打开文件表相应表项删除
②回收分配给该文件的内存空间等资源
③系统打开文件表的打开计数器count减1,若count=0则删除对应表项
6.当一个文件系统含有多级目录时,每访问一个文件,都要使用从树根开始到树叶为止、包括各中间结点名的全路径名。当前目录又称工作目录,进程对各个文件的访问都相对于当前目录进行,而不需要从根目录一层一层地检索。因此设置当前工作目录是为了加快文件的检索速度。而文件的读/写速度取决于磁盘的性能。
文件内部的数据是一系列二进制流或字符流组成。如txt文件
无结构文件是最简单的文件组织形式,由于其没有结构,所以只能采用更穷举搜索。管理简单,方便用户对其操作。
由一组相似的记录组成,每条记录由若干数据项组成。如数据库表,每一条记录都有一个数据项作为关键字。
文件中的记录一个接一个地顺序排列,记录通常是定长的,可以顺序存储或以链表形式存储,在访问时需要顺序搜索文件。
对于链式存储和顺序存储可变长记录,都无法实现随机存取,需要从第一个记录往后依次查找。
定长记录的顺序文件,若物理上采用顺序存储,则可实现随机存取;若能再保证记录的顺序结构(按照关键字顺序排列),则可实现快速检索(根据关键字快速找到对应记录);若不能保证记录的顺序结构(如采用串结构),则无法快速找到某关键字对应的记录。
一般来说,“顺序文件”指的是物理上顺序存储的顺序文件,即可以随机存取
建立一张索引表,每个记录对应一个表项,各记录不用保持顺序,增加删除容易,支持随机存取,但可能占用更多空间。
索引表本身是定长记录的顺序文件,支持随机访问。因此可以快速找到第i个记录对应的索引项。可将关键字作为索引号内容,若按关键字顺序排列,则还可以支持按照关键字折半查找。
是顺序和索引两种组织形式的结合,将记录分组,每组对应一个索引表项。索引文件将顺序文件中的所有记录分成若干组,为顺序文件建立起一张索引表,在索引表中为每组中的第一条记录建立一个索引项,其中含有该记录得关键字值和指向该记录的指针。
索引顺序文件提高了查找效率,但是索引表也占用了存储空间
多级索引顺序文件:为了进一步提高检索效率,可以为顺序文件建立多级索引表
给定记录的键值或通过散列函数转换的键值直接决定记录的物理地址。这种映射结构不同于顺序文件或索引文件,没有顺序的特性。散列文件有很高的存取速度,但是会引起冲突,即不同关键字的散列函数值相同。
1.文件控制快FCB
为了实现“按名存取”,在文件系统中为每个文件设置用于描述和控制文件的数据结构,称之为文件控制块(FCB)。FCB是用来存放控制文件需要的各种信息的数据结构。
一个文件的目录项应该包括哪些信息?
(1)基本信息:文件名、文件的物理位置、文件的逻辑/物理结构
(2)存储控制信息:文件的存取权限
(3)使用信息:文件的建立/修改时间
2.文件目录与目录项
(1)文件目录:FCB的有序结合
(2)目录项:为了创建一个新文件,系统将分配一个FCB并存放在文件目录中,成为目录项
3.文件目录的作用
实现按名存取,提高对目录检索的速度,文件重名、文件共享、访问限制
4.需要对目录进行哪些操作
(1)搜索:当用户要使用一个文件时,系统要根据文件名搜索目录,找到该文件对应的目录项
(2)创建文件:创建一个新文件时,需要在其所属的目录中增加一个目录项
(3)删除文件:当删除一个文件时,需要在目录中删除相应的目录项
(4)显示目录:用户可以请求显示目录的内容,如显示该目录中的所有文件及相应属性
(5)修改目录:某些文件属性保存在目录中,因此这些属性变化时需要修改相应的目录项(如:文件重命名)
5.目录结构
(1)单级目录结构
单级目录实现了“按名存取”,但是不允许文件重名。单级目录结构不适用于多用户操作系统。
(2)两级目录结构
分为主文件目录和用户文件目录。允许不同用户的文件重名、实现访问限制。但两级目录结构依然缺乏灵活性,用户不能对自己的文件进行分类
(3)多级目录结构/树形目录结构
允许不同目录下的文件可以重名
树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。但是,树形结构不便于实现文件的共享。
(4)无环图目录结构
在树形目录结构的基础上,增加一些指向同一节点的有向边,使整个目录成为一个有向无环图。可以用不同的文件名指向同一个文件,甚至可以指向同一个目录(共享同一目录下的所有内容)。因此,可以更方便地实现多个用户间的文件共享。
在删除时,需要为每个共享结点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除结点的请求时,只是删除该用户的FCB、并使共享计数器减1,并不会直接删除共享结点。只有共享计数器减为0时,才能删除结点。
6.索引结点
在查找各级目录的过程中只需要用到“文件名”这个信息,只有文件名匹配时,才需要读出文件的其他信息。因此可以把除文件名外的其他信息放在索引结点中,每一个文件都会有一个唯一的索引结点。目录表占用的空间减小,加快了查找一个文件的效率。
当找到文件名对应的目录项时,才需要将索引结点调入内存,索引结点中记录了文件的各种信息,包括文件在外存中的存放位置,根据“存放位置”即可找到文件。
存放在外存中的索引结点称为“磁盘索引结点”,当索引结点放入内存后称为“内存索引结点”。相比之下内存索引结点中需要增加一些信息,比如:文件是否被修改、此时有几个进程正在访问该文件等。
类似于内存分页,磁盘中的存储单元也会被分为一个个“块/磁盘块/物理块”。很多操作系统中,磁盘块的大小与内存块、页面的大小相同。
文件的逻辑地址可以表示为(逻辑块号,块内地址)的形式
操作系统为文件分配存储空间都是以块为单位的
用户使用逻辑块号和块内地址操作文件,操作系统负责将其转化为文件块实际存放的物理块号和块内地址。
(逻辑块号,块内地址)→(物理块号,块内地址)
要求每个文件在磁盘上占有一组连续的块
在文件目录表中继续文件起始块号和长度
当逻辑块号<长度时,物理块号=起始块号+逻辑块号
链接分配采用离散分配的方式,可以为文件分配离散的磁盘块,分为隐式链接和显示链接两种。
(1)隐式链接
除文件的最后一个盘块之外,每个盘块中都存有指向下一个盘块的指针。文件目录包括文件第一块的指针和最后一块的指针。这些指针对用户是透明的。
目录中记录了文件存放的起始块号和结束块号/文件长度
(2)显示链接
把用于链接文件各物理块的指针显示地存放在一张表中,即文件分配表。一个磁盘只会建立一张文件分配表,开机时文件分配表被放入内存,并常驻内存。
目录中只需要记录文件的起始块号
用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项。从目录项中找到起始块号,若i>0,则查询内存中的文件分配表FAT,往后找到i号逻辑块对应的物理块号。
如:某用户要访问文件aaa的2号逻辑块,操作系统找到文件aaa的0号逻辑块存放的物理块号2,系统查询内存中的文件分配表,0号逻辑块的下一块(1号逻辑块)存放在5号物理块中。1号逻辑块的下一块(2号逻辑块)存放在0号物理块中,因此aaa文件的2号逻辑块存放的物理块号为0。
通过FAT可以找到i号逻辑块的存放地址,而不需要逐个访问0~i-1号逻辑块,因此支持随机访问。逻辑块号转换成物理块号的过程不需要读磁盘操作,使得访问速度快得多。
索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。
如7号磁盘块是文件aaa的索引块
7号索引块中存放了文件aaa的索引表
2、5、13、9是文件aaa的数据块
一个文件对应一张索引表,而文件分配表FAT是一个磁盘对应一张。索引表中的逻辑块号是隐含的。
若用户访问逻辑块号i,系统找到文件对应的目录项,找到文件索引块的块号,从索引块中读出文件索引表的内容,通过逻辑块号查询索引表找到对应的物理块号。
索引分配方式支持随机访问和文件拓展,但索引表需要占用存储空间
(1)链接方案
如果索引表太大,一个索引块装不下,可以将多个索引块链接起来存放。
缺点:若文件很大,会导致索引表过长,需要将多个索引块链接起来,会导致磁盘I/O次数过多,查找效率低下(访问i,需要依次读入0~i-1)
文件的FCB中只需要记录起始索引块号
(2)多层索引
第一层索引块指向第二层索引块,以此类推。各层索引表的大小不能超过一个磁盘块
缺点:即使是小文件,k层索引结构访问一个数据块依然需要k+1次读磁盘
如:要访问1026号逻辑块,⌊1026/256⌋=4,1026%256=2
从一级索引表找到4号索引项对应的物理块,将其对应的二级索引表调入内存,再查询二级索引表的2号表项即可找到1026号逻辑块对应存放的磁盘块号。一共进行了3次磁盘I/O(一级索引表、二级索引表、数据块)。
n层索引,顶级索引表未调入内存时,共需要n+1次读磁盘操作。
(3)混合索引
多种索引方式的结合,如:在一个顶级索引表中包含直接地址索引(直接指向数据块)、一级间接索引(指向单层索引表)、两级间接索引(指向两层索引表)
优点:即使是小文件,访问一个数据块所需的读磁盘数更少
若顶级索引表还没读入内存
访问0~ 7号逻辑块:两次读磁盘
访问8~ 263:三次读磁盘
访问264~ 65799:四次读磁盘
这种结构的索引支持的最大文件长度=1024B×(8+256+256×256)=65800KB
总结
系统为外存上的所有空闲区建立一张空闲盘块表,每个空闲区对应于一个空闲表项,其中包括表项序号、该空闲区第一个盘块号、该区的空闲盘块数等信息。再将所有空闲区按其盘块号递增的次序排列
为一个文件分配连续的存储空间,可采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间。
(1)空闲盘块链
将磁盘上的所有空闲空间以盘块的单位拉成一条链。分配和回收过程简单,但为一个文件分配盘块时可能要重复多次操作。
操作系统保存着链头、链尾指针。若某文件申请K个盘块,则从链头开始依次摘下K个盘块分配,并修改空闲链的链头指针。回收的盘块依次挂到链尾,并修改空闲链的链尾指针。
(2)空闲盘区链
将磁盘上的所有空闲盘区拉成一条链。每个盘区中的第一个盘块内含有用于指示下一个空闲盘区的指针和本盘区大小的信息。离散分配、连续分配都适用。为一个文件分配多个盘块时效率更高
操作系统保存着链头、链尾指针。若某文件申请K个盘块,则可以采用首次适应、最佳适应等算法,从链头开始检索,按照算法规则找到一个大小符合要求的空闲盘区,分配给文件。若没有合适的连续空闲块,也可以将不同盘区的盘块同时分配给一个文件,注意分配后可能要修改相应的链指针、盘区大小等数据。若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若回收区没有和任何空闲区相邻,将回收区作为单独的一个空闲盘区挂到链尾。
利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上所有的盘块都有一个二进制位与之对应(“0”代表盘块空闲,“1”代表盘块已分配。顺序扫描找到0的二进制位,转换成与之对应的盘块号,修改位示图)。连续分配、离散分配都适用。
(字号,位号)对应一个盘块号,也可用(行号,列号)对应一个盘块号。当字号位号从0开始时,(字号,位号)=(i,j)的二进制位对应的盘块号b=ni+j。b号盘块对应的字号i=⌊b/n⌋,位号j=b%n
把顺序的n个空闲扇区地址保存在第一个空闲扇区内,其后一个空闲扇区内则保存另一顺序空闲扇区的地址,如此继续,直至所有空闲扇区均予以链接。
文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致。
超级块记录了下一组空闲间盘块数,以及这些盘块的盘块号。通过这些盘块号就可以找到下一个分组的各个盘块。
300号磁盘块做为该组的第一个磁盘块,还需要记录下一组空闲盘块的信息。
(1)分配
若需要1个空闲块
①检查第一个分组的块数是否足够。1<100,因此是足够的。
②分配第一个分组中的1个空闲块,并修改相应数据。将201号块分出,修改超级块“下一组空闲块数”为99
若需要100个空闲块
①检查第一个分组的块数是否足够。1=100,因此是足够的。
②由于300号块内存放了再下一组的信息,因此300号块的数据需要复制到超级块中。
③分配第一个分组中的100个空闲块,并修改相应数据。
(2)回收
①假设每个分组最多为100个空闲块,此时第一个分组已有99个块,还要再回收一块。
如:可以将201号块插入第一个分组中,修改超级块“下一组空闲盘块数”为100
②假设每个分组最多为100个空闲块,此时第一个分组已有100个块,还要再回收一块。
新增一个分组,将超级块内存复制过来
为新块设置指针,指向下一个分组的链接指针
修改超级块指针,指向第一个块(新块),并修改相应数据
各个用户的目录指向同一索引结点,索引节点中设置一个链接计数变量count用于表示链接到本索引结点上的用户目录项数。
等同于Windows系统下的快捷方式,仅仅包括所含链接文件的路径名字
为了防止文件共享导致文件被破坏或者未经允许修改文件,文件系统必须控制用户对文件的存取,解决对文件的读、写、执行的许可问题。
(1)口令保护
口令一般存放在文件对应的FCB或索引结点中。用户访问文件前需要先输入“口令”,操作系统会将用户提供的口令与FCB中存储的口令进行对比,如果正确,则允许该用户访问文件。
优点:保存口令的空间开销不多,验证口令的时间开销也很小
缺点:正确的“口令”存放在系统内部,不够安全
(2)加密保护
使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密。
优点:保密性强,不需要在系统中存储“密码”
缺点:编码/译码,或者说加密/解密要花费一定时间
3.访问控制
在每个文件的FCB(或索引结点)中增加一个访问控制列表,该表中记录了各个用户可以对该文件执行哪些操作。
精简的访问列表:以“组”为单位,标记各“组”用户可以对文件执行哪些操作。当某用户想要访问文件时,系统会检查该用户所属的分组是否有相应的访问权限。