• UNIX_Linux内核结构(二)


    现在UNIX的文件系统通常由三大模块组成

    • 本地文件系统(UFS)——User File System
    • 网络文件系统(NFS)——Network File System
    • 虚拟文件系统(VFS)——Virtual File System

    本地文件系统(UFS)
    是UNIX系统中的基本文件系统,它通常固定存放在本地机器的存储设备上。(任何一种结构形式的文件系统都必然会直接或间接地域某个本地文件系统相联系。)

    本地文件系统的构成
    一个根文件系统 + 若干子文件系统。

    根文件系统:

    • 存放操作系统的最主要和最基本的部分。
    • 可独立启动运行。
    • 系统启动后,根文件系统就不能卸下来。

    子文件系统:

    • 主要存放应用程序和用户文件。
    • 一般不能独立启动。
    • 系统运行过程中可随时安装和卸下。

    网络文件系统
    是本地机器上的文件系统和远地机器上的文件系统之间的介质,它管理和控制所有有关对远地文件的各种操作,给本地用户提供一个访问远地文件的使用方便的高层接口,避免用户直接设计网络通讯方面的具体细节。
    在这里插入图片描述
    虚拟文件系统(VFS)
    VFS是整个操作系统的用户界面,它给用户提供一个统一的文件系统使用接口,避免用户涉及各个子文件系统的特征部分。

    用户感觉使用的是一个整体的,比本地机器上实际硬盘空间大得多的文件系统。

    虚拟文件系统接受来自用户的操作请求,根据该操作所访问的文件是存放在本地机器上,还是存放在远地机器上,而把操作交给本地文件系统还是网络文件系统。本地文件系统或网络文件系统(实际上再传给远地机器上的本地文件系统)进行相应的操作,将结果返回到虚拟文件系统中,再传回给用户。

    在这里插入图片描述

    文件系统的存储结构

    在UNIX系统中,一个物理磁盘通常被划分为一个或多个逻辑文件系统(简称文件系统或子文件系统),每个逻辑文件系统都被当做一个由逻辑设备号标识的逻辑设备。

    UNIX的普通文件和目录文件就保存在这样的文件系统中。
    逻辑文件系统的存储结构可分为两类型:

    • 一级存储结构型:常用于运行环境较小的文件系统中。
    • 二级存储结构型:常用于运行环境较大(特别是硬盘空间较大)的文件系统中。

    UNIX操作系统的体系结构

    “文件”和“进程”是UNIX系统的两个最基本实体和中心概念,UNIX系统的所有操作都是以这两者为基础的。整个系统核心分为以下五个部分:

    • 文件系统:文件管理和存储空间管理(节点和空间管理)。
    • I/O设备管理:核心->缓冲->块设备(随机存取设备);核心->原始设备(raw设备,字符设备,裸设备)。
    • 进程控制:进程的调度、同步和通讯。
    • 存储管理:在主存与二级存储之间对程序进行搬迁。
    • 时钟管理:把CPU的世界分配给当前最高优先级的进程。
      在这里插入图片描述

    系统概念

    索引节点(index node——inode)
    inode特征:

    • 文件的内部名称(或代号),方便机器操作。
    • 每个文件都有且仅有一个inode与之对应。
    • inode存放文件的静态参数:存放地点,所有者,文件类型,存储权限,文件大小等。
    • 每个文件都可以有多个名字,但都映射到同一个inode上。
    • 各inode之间以inode号相区分。

    链接(link)——ln
    在这里插入图片描述

    • 一个文件可以有多个名字,多个名字都对应于同一个文件i节点,每个名字就是该文件节点的一个链接。
    • 一个普通文件的名字个数,就是该文件的链接数。
    • 每个链接名可以存放在不同目录下(同一个文件系统中)。
    • 删除一个链接名时,文件链接数减一。如果链接数不为零,则文件(节点)依然存在。

    使用文件链接的目的:

    • 方便用户的使用习惯,如列出目录,可以用ls、dir、list、lc。
    • 误删文件时可以补救,又不占用多余空间。
    • 减少移植应用程序时,因使用指定位置的文件,而拷贝该文件到指定位置去的麻烦。

    符号链接(symbol link——ln-s)
    在这里插入图片描述

    • 给文件的名字取一个名字。
    • 链接的是符号而不是文件,因此符号可以是不存在的文件,即无意义的字符串。
    • abc和xyz具有不同的inode号,xyz的内容是它所指向的名字的字符串,大小为3字节。
    • 普通链接中各名字必须在同一文件系统中,符号链接可在不同的文件系统中。

    活动i节点表(索引节点表)——inode表
    在内存中存放当前要使用的文件inode的表(或成为活动i节点表),表中的每一个表项对应于一个当前正在被使用的文件的状态信息。这样要使用(打开)同一个文件的进程不必再到盘上去寻找了。

    用户打开文件表(用户文件描述符表)
    在系统中每一个进程都有一个描述该进程的数据结构user(类似于描述文件的i结点),在user中有一个数组,存放一组指针指向系统打开文件表中该进程打开的文件所对应的表项。

    struct file *u_ofile[NOFILE]
    
    • 1

    NOFILE 为每个进程最多可同时打开的文件数,这与系统中的进程数和内存大小以及交换区大小等有关,一般为20~200.
    这个u_ofile数组就是该进程的打开文件表。

    系统打开文件表(file表)
    系统打开文件表主要存放被打开文件的读写指针。
    因为一个进程在一个时间片内可能读写不完所需内容,需要在下一个时间片继续从上一个时间片结束的读写位置开始读写,因此进程生存期间应该保持一个读写指针。
    此外file表中还存放被打开文件的动态信息:如文件状态、引用计数(当前使用该文件的进程数)等。
    在这里插入图片描述
    为什么要单独设立一个file表来存放读写指针?
    由于有多个进程要共享一个被打开文件的inode,而每个进程的读写指针都不相同,故不能放在inode表中。
    另一方面,要使不同进程的打开文件指针或同一进程的不同打开文件指针能够共享一个打开文件指针(协同操作),就不能把读写指针放进某一个进程的用户打开文件表中。

    UNIX操作系统共享活动文件的方法:
    在内存中,某个活动文件的副本只有一个,不同的进程采用不同的指针指向这个文件的副本。
    由于任一时刻只有一个进程在运行,该文件也只要求内存中有一个副本即可,只是各个进程有自己的读写指针而已。

    **映像:**程序以及与动态执行该程序有关的各种信息的集合(类似于历史档案)。它包括存储器映像,通用寄存器映像,地址映射空间、打开文件状态等。
    **进程:**对映像的执行。对映像的执行也就是一个程序在虚拟机上动态执行的过程。

    可执行文件的构成:
    进程是可执行文件的一次执行实例,高级编程经过编译或汇编语言程序经过汇编后产生的缺省名为a.out的可执行文件的结构包括四个部分:
    在这里插入图片描述

    • 文件头:文件的幻数(magic number)、编译器的版本号、机器类型,正文段、数据标识段、其它信息段的大小、程序入口点。
    • 正文段:程序的功能代码。
    • 数据标识段:标识未初始化的数据要占用的空间大小。
    • 其它信息段:主要用于存放符号表。

    思考题
    1.结构上数据缓冲池是由若干个数据缓冲区Hash链表所构成,每个hash链表中的缓冲区具有相同的hash值。
    当hash值的取值范围增大时,hash链的个数增加,每个hash链的平均长度减少,在链中的查询时间就会降低。问hash值的取值范围是否越大越好?为什么?
    答:hash值的取值范围不是越大越好,原因如下:
    (1)因为hash值取值范围越大,数据缓冲池中的数据缓冲区hash链表也就越多,由于每一个hash链都有一个表头,当hash链越多时,系统为表头分配的内存空间也就越多,每个hash链上的缓冲区也就越少(缓冲区数量固定时)。有可能每个hash链上只有1、2个缓冲区,却要为这一hash链分配一个表头,整个hash链所占用的将近一半的内存被用来分配表头,内存空间利用效率极低。
    (2)hash链越多,管理数据缓冲池也就越麻烦,散列函数把缓冲区均匀地分布在一组hash链上,根据数据块对应的设备号和块号计算其hashno值,再根据hashno值放入到相应hash链表的链头,当hash链越多,每个hash链上缓存区数量的均匀性无法保证。

    2.在一个较大的物理磁盘空间上建立文件系统时,一种方法是建立一个单一的采用两级存储结构的文件系统,另一种方法是建立多个采用一级存储结构的文件系统。分析两种方法的优缺点。
    答:
    (1)单一的采用两级存储结构的文件系统:文件系统由两级组成,第一级由超级块和若干个柱面块组成(若是根文件系统还包含引导块);第二级是由超级块拷贝块、柱面组信息块、i节点表块和数据区组成。这种结构是二维的。
    优点:1)快速定位数据块,数据读写效率高。在两级存储结构的文件系统中,通过柱面组号、柱面号i节点表等信息能快速查找所需数据块。2)文件系统安全性能高。每个柱面组块中存放有一个超级块拷贝块。使系统在超级块被意外破坏时,能从任何一个柱面组中进行恢复,而不致使整个文件系统陷入瘫痪。此外,每个柱面组中的超级块拷贝块的存放位置为安全起见不一定都装在柱面组中的最前面,而是可浮动地装在柱面组中的任何位置。3)能够快速定位系统中的空闲资源。系统只需要维护一张较小的表,即位示图,可以快速地检测指定资源的忙闲状态,或快速查找可用的空闲资源。
    缺点:1)两级存储结构实现复杂,需要将物理磁盘空间划分为若干柱面组块,每个柱面组块由被划分为多个柱面块。2)每个柱面组块存放一个超级块拷贝块,且这些超级块拷贝块浮动地装在柱面中的任何位置,耗费大量存储资源。3)若文件系统被破坏,那么系统将不能使用。

    (2)多个采用一级存储结构的文件系统:一级存储结构的文件系统由超级块、索引节点表块和数据区组成,(若是根文件系统,还包括引导块)。整个文件系统存储结构是一维的。
    优点:1)结构简单,易于实现。2)单个文件系统被破坏时,不会影响其它文件系统的正常使用。
    缺点:1)单个文件系统安全性不高。对于单个文件系统而言,由于是一级存储结构,没有超级块拷贝块,因此,当文件系统的超级块被破坏时,整个文件系统都无法恢复。

    3.在较大的系统(如大型机、巨型机)中为了提高数据I/O的速度,没有采用单一总线串行进行I/O的结构,而是采用多通道并行进行I/O的机构,问在这类系统中建立UNIX文件系统,则文件系统(特别是数据I/O部分)可能要做哪些改变?
    答:单一总线串行I/O在同一时刻只能传输一位数据,而多通道的并行I/O可以在同一时刻传输多位数据。从单一总线的串行I/O到多通道的并行I/O,UNIX文件系统需要改变数据缓冲池中的缓冲区大小、结构和读入调用方法,每次在同一时刻读取磁盘中的多位数据,将之写入缓冲区中,使得读入前的数据位与读入后的数据位相一致。并且如果能够将缓冲区中数据块的大小按通道数的整数倍来组织,使得每次缓冲区和磁盘间的一次I/O刚好都是一个完整的操作,相应的,在磁盘上也将数据按这种方式组织,将数据块的大小定位一次I/O数据量的整数倍,从而大大提高了数据I/O的效率和速度。

  • 相关阅读:
    爱上开源之golang入门至实战第四章函数(Func)(二)
    轻量级的项目管理看板工具-Leangoo领歌
    码住这些视频配音软件,一键完成配音
    20241028软考架构-------软考案例8答案
    如何注册Liberty大学并获取Perplexity Pro
    【JS】前端面试常见手写题总结
    【算法分析与设计】分支限界法(下)
    手把手教你maven的安装与配置(windows)
    【无重复字符的最长子串--三种方法】
    Codeforces Round #835 (Div. 4) F. Quests
  • 原文地址:https://blog.csdn.net/Caramel_biscuit/article/details/127480376