【操作系统·考研】目录

image.png

1.概述

与文件管理系统和文件集合相关联的是文件目录,它包含有关文件的属性、位置和所有权等。


2.目录的结构

2.1 单级目录结构

在整个FS中只建立一张目录表,每个文件占一个目录项。
当访问一个文件时,先根据文件名在目录表中找到相应的FCB,经合法性校验后,再去执行相应的访问操作。
当创建一个文件时,先根据文件名在目录表中检索一遍,以确保没有重名的情况,然后再目录表中添加新的表项,将新文件的属性信息填入其中。
当删除一个文件时,先根据文件名在目录表中找到相应的FCB,回收该文件占据的存储空间,然后移除掉该文件目录项。

该方式实现了按名存取,但其查找速度慢,文件不允许重名,不便于文件共享,且不适用于多用户的OS。

2.2 两级目录结构

将文件目录分为主文件目录(Master File Dirctory,MFD)用户文件目录(User File Directory,UFD)两级。
主文件目录用于记录用户名及其相应的用户文件目录所在的存储位置;用户文件目录则记录该用户的文件的FCB信息。
当用户搜索某一文件时,只需要在其UFD中进行搜索即可,这在一定程度上避免了文件的重名问题。

两级目录结构尽管提高了文件的检索速度,但是无法对文件进行分类,缺乏灵活性。

FS采用多级目录的目的是:满足多层次管理的需要、提高文件的查找速度、允许用户创建同名文件。

2.3 树形目录结构

用文件的路径标识文件,文件路径名是一个字符串,由从根路径出发到所找文件通路上所有目录名与数据文件名用分割符“/”分隔开(不同OS的分隔符可能不同),然后拼接而成。如:image.png
根目录出发的路径称为绝对路径,相对于当前工作目录出发的路径则称为相对路径。

在该树形目录结构下,层次结构清晰,能进行更有效的文件管理和保护,不同用户、不同性质的文件可呈现在系统目录树下的不同层次或不同子树中,很容易被赋予不同的存取权限。
但是在搜索文件时,需要根据路径名逐级访问中间节点,这增加了磁盘访问次数。
目前,Windows、UNIX、Linux系统均采用了树形文件目录。

2.4 无环图目录结构

在树形目录结构的基础之上,增加了指向同一结点的有向边,使整个目录成为一个有向无环图,以便于实现文件共享。
系统会为每个共享结点设置一个共享计数器,每当图中增加对该结点的共享链时,该计数值+1,若某用户提出删除该结点时,计数值-1,当计数值减至0时,才会真正删除该结点,否则就仅删除用户对该结点的共享链。
共享文件不同于文件拷贝,每个用户所看到的是该文件的原始文件,对其修改也是在本体上进行的。

该结构虽然方便了文件的共享,但使系统的管理更加复杂。

3.目录的操作

  • 搜索:当用户使用一个文件时,需要先搜索目录,以找到该文件对应的目录项。
  • 创建文件:当创建一个文件时,需要在目录中增加一个目录项。
  • 删除文件:当删除一个文件时,需要在目录中删除相应的目录项。
  • 创建目录:在树形目录结构中,用户可以创建自己的用户文件目录,还能再继续创建子目录。
  • 删除目录
    • 不删除非空目录:删除时必须先珊瑚目录中的所有文件,并递归地删除子目录。
    • 删除非空目录:将目录中的文件和子目录一并删除。
  • 移动目录:将文件或子目录在不同的父目录之间移动,文件的路径名也随之改变。
  • 显示目录:用户可以请求显示目录的内容。
  • 修改目录:某些文件属性保存在目录中,因而这些属性的变化将改变相应的目录项。

3.目录的实现

目录的实现就是为了实现文件的查找。

3.1 线性列表

最简单的目录实现方法是:采用文件名和数据块指针的线性列表。
创建文件时,会先检索目录以确定是否有同名文件已经存在,若没有则创建文件;删除文件时,同样先会检索目录以确定目标文件是否存在,若存在则删除。

对于删除文件的优化:可以将删除后的条目标记为不再使用或移入空闲链表中,还可以将最后一个条目复制到此,当然使用链表结构可大大节省删除文件的时间。

该方式的优点是实现简单,缺点是查找比较费时。

3.2 哈希表

哈希表会根据文件名通过散列函数得到一个值,并返回指向线性列表中的元素的指针。

该方式的优点是查找、删除比较简单,缺点是可能存在冲突(两个不同的文件名映射到了同一位置)。

4.文件的共享

4.1 基于索引结点的共享方式(硬链接)

在树形结构的目录中,当有两个或多个用户要共享同一个子目录或文件时,必须将共享文件或子目录链接到两个或多个用户的目录中去,才能方便的找到该文件。
在这种共享方式中,文件的物理地址和文件的其他属性信息将被存放在索引节点中,而不存放在目录项中。在索引节点中还配置了一个链接技术count,其作用和前面讲到的共享计数器的作用一致,这里不再赘述。

尽管多个进程可能同时指向同一个文件的索引节点,但进程各自独立维护自己的文件描述符fd(包含的信息:每个进程对该文件的读写位置指针等)。fd1和fd2分别指向进程自己的用户打开文件表中的表项,这两个用户打开文件表的表项又同时指向同一个系统打开文件表的表项。

4.2 利用符号链实现文件共享(软链接)

如果用户B想向用户A共享一个文件F,那么它将通知系统创建一个LINK类型的文件,同样取名为F,然后将文件创建在用户A的目录中去,新创建的文件包含被链接的文件的路径名。当用户A访问该LINK类型的文件时,发现为该文件为LINK类型,于是便根据该文件的路径名找到真正的文件F,然后对它进行读取。
该方式下,只有文件所有者拥有指向文件F的索引节点指针,而共享该文件的用户没有,这样,当宿主删除源文件F时,文件就会真被删除,而其他共享用户再次访问则会失败,并自动撤销该共享的符号链。
image.png

该方式下,共享用户读取共享文件时,最后会根据路径逐个查找目录,这期间可能需要进行数次的读盘操作,开销很大,此外,符号链的索引节点也会占据一定的存储空间。

硬链接的文件查找速度要快于软链接。

快捷方式image.png属于软链接的一种。

多个进程可同时对同一个共享文件进行读写操作,OS不负责写操作的互斥性,进程可通过系统调用来对文件加锁以实现互斥写。

对于符号链接,删除文件的操作对符号链接是不可见的,因此,删除操作不会对引用计数值产生影响。

目录也可以通过软硬链接的方式与普通文件建立联系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/248636.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构day7

1.思维导图 1.二叉树递归创建 2.二叉树先中后序遍历 3.二叉树计算节点 4.二叉树计算深度。 5.编程实现快速排序降序

Ubuntu-22.04上ToDest设置开机不弹出图形界面

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、开始操作1.设置图形端 总结 前言 有时候远程成为开发必不可少的工具,目前国内有很多相关的软件,比较有名的是向日葵、ToDesk、Rust…

Hutool导入导出用法

整理了下Hutool导入导出的简单使用。 导入maven或jar包&#xff08;注意这里导入的poi只是为了优化样式&#xff09; <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --> <dependency><groupId>cn.hutool</groupId><artifactId&g…

iOS17使用safari调试wkwebview

isInspectable配置 之前开发wkwebview的页面的时候一直使用safari调试&#xff0c;毕竟jssdk交互还是要用这个比较方便&#xff0c;虽说用一个脚本插件没问题。不过还是不太方便。 但是这个功能突然到了iOS17之后发现不能用了&#xff0c;还以为又是苹果搞得bug&#xff0c;每…

webassembly003 whisper.cpp的main项目-1

参数设置 /home/pdd/le/whisper.cpp-1.5.0/cmake-build-debug/bin/main options:-h, --help [default] show this help message and exit-t N, --threads N [4 ] number of threads to use during computation-p N, --processors …

PHP的线程安全与非线程安全模式选哪个

曾经初学PHP的时候也很困惑对线程安全与非线程安全模式这块环境的选择&#xff0c;也未能理解其中意。近来无意中看到一个教程对线程安全&#xff08;饿汉式&#xff09;&#xff0c;非线程安全&#xff08;懒汉式&#xff09;的描述&#xff0c;虽然觉得现在已经能够很明了透彻…

Leetcode—1828. 统计一个圆中点的数目【中等】

2024每日刷题&#xff08;一零五&#xff09; Leetcode—1828. 统计一个圆中点的数目 实现代码 class Solution { public:vector<int> countPoints(vector<vector<int>>& points, vector<vector<int>>& queries) {vector<int> a…

互联网金融时代下,SD-WAN如何与金融行业深度融合?

金融行业正处于数字化转型的关键时期&#xff0c;互联网金融作为推动这一转型的重要力量&#xff0c;正在改变金融行业的格局。互联网金融不仅提供了各种在线金融服务&#xff0c;如网上银行、第三方支付和电子商务&#xff0c;还涉及金融科技的应用&#xff0c;如智慧网点、人…

githacker安装详细教程,linux添加环境变量详细教程(见标题三)

笔者是ctf小白&#xff0c;这两天也是遇到.git泄露的题目&#xff0c;需要工具来解决问题&#xff0c;在下载和使用的过程中也是遇到很多问题&#xff0c;写此篇记录经验&#xff0c;以供学习 在本篇标题三中有详细介绍了Linux系统添加环境变量的操作教程&#xff0c;以供学习 …

jenkins发布失败

今天用jenkins发布项目时失败了&#xff0c;而前几天还好好的。 云控制台看了下&#xff0c;发现根本就没打包。 报错如下&#xff1a; 从控制台可以看出&#xff0c;项目依赖没有下载下来&#xff0c;所以打包失败了。 根本原因是&#xff1a;在配置中给yarn指定的淘宝仓库…

2024前端面试总结—JS篇(文档持续更新中。。。)

1、Event Loop&#xff08;事件循环&#xff09;机制 JS是单线程的非阻塞语言 为什么是单线程&#xff08;如果js是多线程&#xff0c;那么两个线程同时对同一个Dom进行操作&#xff0c;一个增一个删&#xff0c;浏览器该如何执行&#xff1f;&#xff09; 非阻塞&#xff08;…

6JS对象

6.1对象简介 对象是JavaScript的基本数据类型。对象是一种复合值&#xff1a;它将很多值&#xff08;原始值或者其他对象&#xff09;聚合在一起&#xff0c;可通过名字访问这些值。对象也可看做是属性的无序集合&#xff0c;每个属性都是一个名/值对。属性名是字符串&#xf…

动态分析C语言代码生成函数调用关系的利器——perf

大纲 环境准备安装开启监控 分析采集解析 可视化处理环境准备转换成dot转换为图片 参考资料 perf是一套linux操作系统上分析工具集&#xff0c;分析函数调用关系只是其一个子集功能。它并不像《动态分析C语言代码生成函数调用关系的利器——gprof》中介绍的需要在被分析程序的编…

Java关于Excel文件的导入导出

人生如梦 荣华富贵 如木槿之花 朝荣夕逝 需求 导出&#xff1a; 能够将库表内的数据导出多个Excel表&#xff0c;并且生成一个压缩包&#xff0c;提供用户下载导入&#xff1a; 能够将一个压缩包内的多个Excel表解压&#xff0c;并获取表内的所有数据 FileUtils 工具类 publi…

flutter+go构建的即时通讯app,ChatCraft

前言 Hi&#x1f44b;all.好久不见&#xff0c;已经两个多月没有发文章了&#xff0c;这段时间一直在反思过去的一年&#xff0c;有好有坏。对博客文章这块我对自己是不满意的&#xff0c;文章的质量参差不齐&#xff0c;有时候在没有好的题材时&#xff0c;我会选择写一些泛泛…

微信小程序(二十五)条件判断语句与结构隐藏

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.条件判断语句的演示 2.隐藏结构的演示 源码&#xff1a; index.wxml <view><!-- wx:if和wx:else为条件判断语句 --><text wx:if"{{isLogin}}">已登入的用户</text><tex…

《HTML 简易速速上手小册》第2章:HTML 的标签和元素(2024 最新版)

文章目录 2.1 文本格式化标签&#xff08;&#x1f3a9;✨&#x1f4dc; 网页的“时尚搭配师”&#xff09;2.1.1 基础示例&#xff1a;一篇博客的格式化2.1.2 案例扩展一&#xff1a;产品介绍页面2.1.3 案例扩展二&#xff1a;个人简历 2.2 链接和锚点&#xff08;&#x1f6a…

20240127在ubuntu20.04.6下配置whisper

20240131在ubuntu20.04.6下配置whisper 2024/1/31 15:48 首先你要有一张NVIDIA的显卡&#xff0c;比如我用的PDD拼多多的二手GTX1080显卡。【并且极其可能是矿卡&#xff01;】800&#xffe5; 2、请正确安装好NVIDIA最新的驱动程序和CUDA。可选安装&#xff01; 3、配置whispe…

【Linux】模拟实现一个简单的minishell

目录 从显示屏获取输入字符流 分割字符串 取出命令名称及选项 去除输入时多按的那个换行符 创建子进程&#xff0c;实现程序替换 如果替换失败&#xff0c;进程终止exit 查看子进程情况 实现echo $?功能 实现cd 最终代码 基本思路 让父进程创建一个子进程&#xff0c…

fullcalendar案例

fullcalendar案例 <script srchttps://cdn.jsdelivr.net/npm/fullcalendar6.1.10/index.global.min.js></script><script srchttps://code.jquery.com/jquery-3.6.0.min.js></script> <!-- 引入 jQuery CDN --><script>document.addEventL…