操作系统:07第七章 文件系统_第1页
操作系统:07第七章 文件系统_第2页
操作系统:07第七章 文件系统_第3页
操作系统:07第七章 文件系统_第4页
操作系统:07第七章 文件系统_第5页
已阅读5页,还剩120页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第七章 文件系统 OS 实现系统资源管理: 硬件资源、软件资源; 软件资源: 程序、数据; 文件管理: 软件资源以文件形式存于外存空间, 软件资源管理通常称为文件管理; 文件管理由文件系统来完成; 文件系统在设备管理之上。文件的概念 文件: 具有符号名而且在逻辑上具有完整意义的 信息项的有序序列。7.1 文件与文件系统7.1.1 文 件编号:01kn-1信息项信息项信息项信息项文件名: 符号名, 文件创建时确定, 访问时用;信息项: 构成文件的基本单位; 等长或不等长; 有顺序关系;读/写指针: 信息项的读/写位置;读/写指针文件分类系统文件, 用户文件; 临时文件, 永久文件; 只读文件,

2、只写文件, 读/写文件;磁盘文件, 磁带文件, 磁鼓文件; 目录文件, 普通文件; 程序文件, 数据文件;程序文件 源文件, 目标文件, 可执行文件, 头文件, 库文件。7.1.1 文 件 UNIX文件分类普通文件: 内容可以是程序、数据、图象等, 保存在磁盘块中;目录文件: 文件描述信息(文件名, 文件号)序列, 保存在磁盘块中;特殊文件: 将各种设备作为文件处理。 界面统一, 使用文件与使用设备命令相同, 申请设备open, 释放close, 读read, 写write; 利用文件保护功能可以保护设备。7.1.1 文 件7.1.2 文件系统文件系统: 文件与管理信息资源的程序集合 称为文件

3、系统。 为用户提供按名存取文件的手段; 文件的组织形式; 外存空间的管理; 处于设备管理上层。7.2 文件的访问方式7.2.1 顺序访问: 磁带 从文件起始位置开始顺序访问; 从文件中间某处开始顺序访问。7.2.2 随机访问: 磁盘、光盘 按信息项编号随机访问; 按关键字(key)随机访问。7.3 文件的组织 文件的组织: 又称文件结构; 逻辑组织: 外部组织形式, 用户看到的文件组织形式。 物理组织: 内部组织形式, 物理存储设备上的组织形式。 OS完成逻辑组织形式到物理组织形式的转换。7.3.1 文件的逻辑组织流式文件非结构形式的字节序列(UNIX, Windows, etc);构成文件的

4、基本单位是字节。用户可以对非结构的流式文件 按自定义的结构来处理。编号:01kn-1字节字节字节字节读/写指针7.3.1 文件的逻辑组织(Cont.)记录式文件: 记录的序列等长记录(优点: 处理方便, 速度快; 缺点: 空间浪费);不等长记录(优点: 省空间; 缺点: 处理不便, 速度慢);流式文件是记录式文件的特例。编号:01kn-1记录记录记录记录读/写指针7.3.2 文件的物理组织 物理组织: 逻辑组织到磁盘块的映射。文件: 记录(字节)序列磁盘: 块(block)序列考虑因素:记录格式: 等长或不等长, 流式不必考虑;空间开销: 除保存文件内容之外的存储开销;访问速度: 顺序/随机访

5、问速度;长度变化: 动态增长/减少。组织形式: 顺序结构、链接结构、索引结构、散列结构、倒排结构。7.3.2 文件的物理组织(Cont.) 顺序结构 又称连续结构。一个文件占有若干连续的磁盘块。FCB首块号28块数4块28块29块30块31磁盘空间优 点: 速度快, 节省空间; 缺 点: 长度变化困难。 链接结构:又称串联结构, 一文件可存于不连续块中, 块间以指针相连。7.3.2 文件的物理组织(Cont.)优 点: 长度变化容易。缺 点: 随机访问速度慢。FCB首块号28块数4块28块30块45块46磁盘空间7.3.2 文件的物理组织(Cont.) 索引结构 一文件可存于不连续块中, 块号

6、记在索引块中。优 点: 随机访问速度快; 长度变化容易。缺 点: 额外需要索引块, 存储开销大; FCB索引块号28块数4块43块87块97块98磁盘空间0431872973984索引块287.3.2 文件的物理组织(Cont.) 散列结构 适用于定长记录和按键随机查找的访问方式; 通常用于构造文件目录, 一个记录内容就是一个目录项。 计算地址: hash(key)=addr (在磁盘或文件中的存放位置)7.3.2 文件的物理组织(Cont.) 问 题: 给定 key1 key2 , 有 hash(key1) = addr1 , hash(key2) = addr2 , 若addr1=addr

7、2 , 则发生conflict 。 Conflict resolution: 顺序探查法: 如发生冲突, 则在冲突位置开始 顺序探查第一个空闲的存储位置。 记录中增加两个域: 冲突计数; 记录位置的空闲标志。7.3.2 文件的物理组织(Cont.) 保存记录: 保存记录的键值为 key .地址空闲标志冲突计数addr:12键值key记录内容1键值key1记录内容Hash(key)=addr文件空间保存记录 key计算hash(key) addr, adaddr对应的记录位置冲突记数加1位置 ad 空闲?ad指向下一个记录位置ad记录位置标记为占用记录key内容ad记录位置保存记录 key结束F

8、T7.3.2 文件的物理组织(Cont.) 查找记录: 查找键值为key的记录。查找记录keyhash(key)ad,addr取ad对应记录的冲突记数countad记录键值=keycount-count=0找到结束未找到结束ad记录空闲hash(ad.key)=addrcount=0ad指向下一个记录位置FFFFFTTTTT7.3.2 文件的物理组织(Cont.) 删除记录: 删除键值为key的记录。删除记录key调用“查找记录key”找到key?记录key不存在返回addr=hash(key)ad.空闲标志=0addr.冲突计数减1删除记录key返回FT特点:按关键字检索速度快。用途:常用于

9、目录检索。注意:Hash空间可循环使用, 满时保存失败。7.3.2 文件的物理组织(Cont.)倒排结构 键: 记录中的域称为键;主键: 记录中能唯一区分文件中所有记录的键 称为主键; 其它键称为次键。倒排结构: 以键值和记录地址构成的索引结构 称为倒排结构。主索引: 键值为主键的索引称为主索引;次索引: 键值为次键的索引称为次索引。7.3.2 文件的物理组织(Cont.)表7-1 各种文件物理结构的主要特性特性 物理 结构长度变化内存开销外存开销顺序访问速度按号随机访问速度按键随机访问速度定长变长定长变长定长变长顺序结构难小小快快快慢慢慢链接结构易小小快快慢慢慢慢索引结构易大大快快快慢慢慢散

10、列结构易小小快倒排结构易大大快快UNIX文件物理结构 P389390)i_addr0i_addr9i_addr10i_addr11i_addr12i_node文件最大长度=10+256+2562+2563(块)多级索引+链接结构信息块索引块7.3.2 文件的物理组织(Cont.)例:在UNIX系统中,设磁盘物理块大小为1KB,每个索引块可以 保存256个索引项。假设某UNIX文件大小为1028KB。 请画出该UNIX文件的物理结构; 计算访问以下逻辑块号(逻辑块号从0开始)时, 需要多少次I/O传输: 265; 266; 1025。解: 零级索引和一级索引能保存的块数10256266块; 剩下

11、的1028266762块,可用二级索引。 7622562+250,即占用二级索引的3个索引项。 该文件的UNIX物理结构如图所示。 根据文件的物理结构,访问逻辑块号 265需要2次I/O; 266需要3次I/O ; 1025需要3次I/O7.3.2 文件的物理组织(Cont.)i_addr0i_addr9i_addr10i_addr11i_addr12i_nodenull。逻辑块0逻辑块9逻辑块10逻辑块265。逻辑块266逻辑块521逻辑块522逻辑块777逻辑块778逻辑块1027。null250块256块256块256块给定的UNIX文件的物理结构7.3.2 文件的物理组织(Cont.)

12、7.4 文件目录7.4.1 文件控制块与目录项文件控制块(FCB) 文件存在的标志, 其中保存系统管理文件需要的全部信息; 每个文件一个FCB, 保存在外存; 建立文件时创建, 删除文件时撤销。 目录项 目录文件中的一项, 内容为FCB; 通常目录项名为文件名。7.4.2 文件目录与目录文件文件目录 用于检索文件的目录; 目录项构成的有序序列; 给定一个文件名, 通过查找文件目录找到相应的目录项(FCB)。 目录文件 内容为目录项的文件, 长度固定的记录式文件; 实现文件目录的管理。文件控制块FCB文件名文件号用户名文件地址文件长度记录大小文件类型文件属性共享说明文件逻辑结构文件物理结构建立日

13、期保存日期最后修改日期和时间最后访问日期和时间口令其它目录项1(FCB1)目录项2 (FCB2)目录项n (FCBn)目录文件 目录, 文件图示 :文件目录7.4.2 文件目录与目录文件(Cont.)7.4.3 单级目录与多级目录单级目录(Single-Level Directory) 整个系统只有一个目录, 所有文件均登记在该目录中。FCB1FCB2FCBiFCBnfile1file2fileifilen目录文件普通文件单级目录结构缺点: Naming problem; Grouping problem Protection problem.单级目录例:7.4.3 单级目录与多级目录(Con

14、t.) 二级目录(Two-Level Directory) 系统目录(公共目录), 用户目录(私用目录); 为每个用户单独设置目录。FCB1FCBj用户目录普通文件USER1USERiUSERkFCB1FCBmFCB1FCBn系统目录二级目录结构7.4.3 单级目录与多级目录(Cont.)二级目录例:特点: Path name; Can have the same file name for different user; Efficient searching; No grouping capability.7.4.3 单级目录与多级目录(Cont.) 多级目录(Multi-Level Di

15、rectory) 目录为树形结构; 叶结点是一般文件或目录文件; 非叶结节点是目录文件; 根结点称作根目录文件。优点: 便于文件分类; 查找速度快(由于每个文件目录下文件少); 可以实现文件连接(Link)。7.4.3 单级目录与多级目录(Cont.)多级目录例:rootUnixbinusrlibdevetcVIusersWangLiSd1d2f1flibclibCClpConsolebinYaccPasswordf27.4.3 单级目录与多级目录(Cont.) 将FCB分为次部和主部两部分。次部: (文件名, 文件号) 长度固定(UNIX 16 bytes);保存在目录文件中。主部: (其它

16、, 连接记数)记录长度固定(UNIX 32 bytes);保存在外存固定区域, 打开时读入内存;给定文件号, 可计算主部位置。改进的好处可以提高查找速度(顺序查找)可以实现文件连接(link)7.4.4 文件目录的改进改进的文件目录图示:文件号FCB主部1FCB1主部2FCB2主部nFCBn主部目录项1(FCB1次部)目录项2 (FCB2次部)目录项n (FCBn次部)文件目录目录文件7.4.4 文件目录的改进(Cont.)顺序查找n个记录, 找到一个记录的平均查找记录的次数 =(1+2+n)/n=(n+1)/2设未分次部和主部的FCB构成的文件目录占n个磁盘块, 则顺序查找文件目录,找到一个

17、文件目录的平均访问磁盘块的次数=(n+1)/2 设次部构成的文件目录占m个磁盘块,则顺序查找文件目录,找到一个文件的平均访盘次数(m+1)/2+17.4.4 文件目录的改进(Cont.)7.4.5 根目录与当前目录根目录 树状结构(多级目录)文件系统中, 根结点对应的目录称为根目录; 根目录保存在外存空间固定位置。当前目录 目前正在使用的工作目录称为当前目录。查找路径 由根目录开始查找; 由当前目录开始查找。查找算法 顺序查找(UNIX); hash查找; 对分查找(要求文件名排序)。7.4.6 文件目录的查找7.5 文件的共享文件共享: 多个进程共用系统中的同一个文件; 操作系统和文件使用者

18、共同完成文件共享控制。7.5.1 文件共享的目的 节省存储空间: cc, vi, yacc 的共享; 进程相互通信7.5.2 文件共享的模式异步使用同一文件: 任意时刻只能有一个进程使用一个文件;同时使用同一文件: 多个进程可以同时使用同一个文件(R/W规则)。7.5.3 文件共享的实现公共目录: 系统设若干所有用户都能访问的公共目录, 共享文件登记在公共目录中;连 接: 通过连接使一个文件具有多个名字, 不同用户通过不同名字访问同一个文件;共享说明: 创建文件时规定共享用户及其使用权限。7.5 文件的共享(Cont.)7.5 文件的共享(Cont.)文件共享实现链接例:rootusruser

19、swanglid1d2f1f2, 15f1, 15i_number=15link(“/usr/users/wang/d2/f1”, “/usr/users/li/f2”);unlink(“/usr/users/wang/d2/f1”);7.6 文件的保护、保密与安全 保护: 防止用户对文件进行非授权的访问。 保密: 防止文件内容泄露。 安全: 防止文件被破坏。 自然因素 人为因素7.6.1 文件的保护(Protection)File owner/creator should be able to control: what can be done; by whom .Types of acce

20、ss Read Write Execute Append Delete List7.6.1 文件的保护(Protection) 存取控制矩阵: amn , m个用户, n个文件。f1fjfnu1a11a1ja1nuiai1aijainumam1amjamnaij :rweamd特点: 权限规定细, 过于繁琐, 占较多存储空间。7.6.1 文件的保护(Protection) 用户分成若干类; 同类用户对同一文件访问权限相同; 不同类用户对同一文件访问权限不同; UNIX 用户分类 4类: 文件主, 同组用户, 其它用户, 特权用户。 访问权限说明 RWERWERWE文件主权限同组用户权限其他用户

21、权限特权用户权限访问权限说明7.6.1 文件的保护(Protection) 分级目录 多级目录系统中, 规定不同用户对同一子目录的访问权限; 如果用户不能访问某一目录, 即该用户不能访问该目录下的任何文件。7.6.2 文件的保密 口令 创建文件时用户规定一个口令, 系统将其记在FCB中; 访问文件要求给出口令, 并与FCB中口令比较。 特点: 简单; 保密性不强(eg. 对系统操作员不保密)。 密码 保存时加密(key); 读取时解密(key). 特点: 对文件内容加密, 速度慢; 效果好。文件加/解密简单实现 保存时, 用一个key启动一个随机数发生器, 产生一个 随机数序列, 将其依次“添

22、加”到文件的各个字中。 读取时, 用同一个key启动同一个随机数发生器, 产生 相同随机数序列, 将其依次由文件的各个字中”减去” 。 线性同余法产生伪随机数: void random(int *key) *key = (*key)*C1+C2) % C3; 7.6.2 文件的保密(Cont.)C1, C2是质数常量, C3是随机数范围(0C3-1);key通常叫随机源, 也叫种子, 它决定产生的随机数序列的随机性。7.6.3 文件系统的安全 Backup 定期将磁盘上文件备份到磁带上; 发生故障时由磁带恢复(limited recovery)。 实现方法 转储: 文件由磁盘备份到磁带的过程;

23、 完全转储: 定期将磁盘上文件全部备份到磁带上; 增量转储: 开始时做一次完全转储; 之后, 每次只对与上次不同的数据进行备份。 差分转储: 开始时做一次完全转储; 之后, 每次只对与第一次不同的数据进行备份。磁盘整理 利用转储和恢复可以对磁盘进行整理。 (使文件物理块连续, 空闲盘块连续)7.7 文件系统的实现7.7.1 内存所需的表目 系统打开文件表(系统一个): 存于OS空间FCB主部文件号共享计数修改标志 文 件 号 : 用于确定FCB主部在外存中的位置; 共享计数 : 记录使用该文件的进程个数, 为0时表示该表项为空表项; 修改标志 : 若FCB被修改过, 则关闭文件时需要把内存的F

24、CB写回外存。7.7.1 内存所需的表目(Cont.) 用户打开文件表文件描述符打开方式读写指针入口(地址)0n-1 文件描述符就是用户打开文件表项位置(非负整数), 打开文件时返回给进程; 用户打开文件表位置存在进程PCB中; 系统可以单设空间, 也可以放在进程的PCB中。读写指针应该是文件的逻辑地址,初值应为0,随着读写调整。 用户打开文件表/系统打开文件表的联系文件描述符打开方式读写指针入 口kl用户打开文件表进程Pi文件描述符k进程Pj文件描述符lPCB共享计数其它2系统打开文件表7.7.1 内存所需的表目(Cont.) 表项: (首空闲块号, 空闲块数); 表尾标记: 空闲块数为0;

25、 分配方式: 最先适应, 下次适应、最佳适应, 最坏适应等; 存放位置: 平时外存, 使用时读入内存系统区。 空闲块表: 适于连续物理组织结构的文件系统。 空闲块链 所有空闲块连成一个链; 申请/释放以块为单位, 都对链头操作; 节省空间, 但速度慢(申请/释放都需要1次I/O);7.7.2 外存空间的管理7.7.2 外存空间的管理(Cont.) 位示图: 字位映像图 位示图的 1 位表示外存一块的状态; 申请: 找到位示图中为 0 的字位, 将该字位改为 1 , 返回该字位对应的块号; 释放: 将位示图中释放块号对应的字位置 0; 存放位置: 平时外存, 使用时读入内存, 若有修改写回外存。

26、 成组链接(Unix): 空闲块链与空闲块表的结合。 多个(最多100个) 空闲块为1组, 组之间相互链接; 最前面的组缓冲到内存; 该组称作超级块。 超级块结构(P393394):struct filesys int s_nfree; /组中空闲块个数(100); int s_free100; /s_free0指向下一组; /其它为本组中空闲块号; super_block;7.7.2 外存空间的管理(Cont.)空闲块的成组链接图示:s_nfree100s_free0s_free1n11s_free99n199100n21n299100n31n399Knj1njK-1超级块空闲块组表空闲块的

27、成组链接例: P394图13.14空闲块组表空闲块组表7.7.2 外存空间的管理(Cont.)上述结构表示:磁盘中共有 1(j-1)100(K-1)个空闲块.初始超级块如下:s_nfree1s_free0s_free1nulls_free99null100n21n299100n31n399Knj1njK-1超级块空闲块组表空闲块组表空闲块组表100n11n199空闲块组表7.7.2 外存空间的管理(Cont.)s_nfree39s_free050s_free140s_free381210015014951#50100350349251#250100250249151#15087NULL4493

28、51#350#351#449#40#12#149#51#249#151#349#251内存超级块7.7.2 外存空间的管理(Cont.)成组链接的空闲块管理: 超级块已读入内存。 申请: s_nfree1, 取块号s_free-s_nfree分配; s_nfree=1, 将s_free0所指连接块读入内存 (作为超级块), 分配块号s_free0。 释放: s_nfree100, s_frees_nfree+=释放块号; s_nfree=100, 将s_nfree和s_free拷贝到释放块中, 将该块号记录到s_free0, s_nfree=1。7.7.2 外存空间的管理(Cont.)7.8

29、文件系统的界面 创建文件: creat(path_name, fcb_args)参数说明path_name: 文件路径名;fcb_args: FCB参数。执行步骤:为此文件分配一个FCB主部, 初始化;将文件名和文件号作为FCB次部填到末级目录中;以写方式打开。例如: creat(“/usr/li/d1/f1”, mode) 打开文件: fd=open ( path_name, mode )参数说明: path_name: 文件路径名; mode: 打开方式.执行步骤根据文件路径名查目录找到FCB次部;合法性检查(根据打开方式、共享说明、用户身份);根据文件号查系统打开文件表看该文件是否已被打

30、开, 如是则共享计数加1; 否则找一个空闲的系统打开文件表项, 并将外存中FCB主部等信息填入此表项, 共享计数置为1;在用户打开文件表中找一空表项, 填写打开方式和 读写指针(初值为0), 并指向系统打开文件表的对应表项。返回信息: fd: 文件描述符(用户打开文件表入口), 一个非负整数。7.8 文件系统的界面(Cont.) 关闭文件: close ( fd ) 参数说明: fd: 文件描述符。 执行步骤:由 fd 查用户打开文件表, 找到系统打开文件表入口;系统打开文件表中共享计数减 1 ; 如减 1 后的值为0且修改标志为 1 , 则将此 FCB 由内存写回外存FCB主部;将 fd 所

31、对应的用户打开文件表项置为空闲。 7.8 文件系统的界面(Cont.) 指针定位: seek ( fd, offset )参数说明: fd: 文件描述符; offset: 新的指针位置。执行步骤: 由 fd 查用户打开文件表, 找到对应的入口; 检查参数合法性; 将用户打开文件表中文件读写指针位置设定为offset, 后续读写命令由该指针处存取文件内容。7.8 文件系统的界面(Cont.) 读文件: read ( fd , nrd , buf ) 参数说明:fd: 文件描述符;nrd: 读入记录个数;buf: 内存起始位置。 执行步骤:由 fd 查用户打开文件表, 找到对应的系统打开文件表入口

32、;合法性检查(用户打开文件表中所记录的打开方式、存取方式);根据读写指针和文件物理结构,计算读写指针对应的磁盘物理地址 addr(物理块号, 偏移);把从addr开始的 nrd 个记录读入内存中由 buf 起始的区域;调整文件读写指针为:当前读指针sizeof(记录结构)nrd。7.8 文件系统的界面(Cont.) 写文件: write ( fd, nwt , buf )参数说明: fd: 文件描述符; nwt : 写出记录个数; buf: 内存起始位置。 执行步骤: 由 fd 查用户打开文件表, 找到对应的入口;合法性检查(用户打开文件表中所记录的打开方式、存取方式);根据读写指针及文件物理

33、结构计算当前读写指针对应的 磁盘物理地址(物理块号I, offset);如果:块号I=文件最末块号& offsetsizeof(记录结构)nwt磁盘块大小; 则需要: 申请磁盘块; 修改文件物理结构表;将内存中由 buf 起始的 nwt 个记录 写到地址(物理块号I, offset)起始的磁盘区域;调整读写指针:当前读写指针sizeof(记录结构)nwt 。7.8 文件系统的界面(Cont.) 建立连接: link (old_name , new_name )参数说明: old_name: 已存在的文件路径名; new_name: 欲连接的文件路径名。执行步骤: 查目录找到文件old_name

34、的FCB次部, 由此得到文件号; 查目录找到文件new_name的末级目录; 将文件号与new_name中末级名字合起来构成一个 新的目录项, 将其填入new_name的末级目录文件中; 将FCB主部中的连接计数加1. 例如: link(“/usr/Li/f1”, “/usr/Zhang/d2/f2”)7.8 文件系统的界面(Cont.) 断开连接: unlink ( path_name ) 参数说明: path_name: 文件路径名. 执行步骤:查目录找到文件 path_name 的FCB主部;将连接计数值减 1;如减 1 后的值为 0, 则归还该文件所占用的全部存储块, 该文件将被撤销;

35、将FCB次部由上级目录中清除. 例如: unlink(“/usr/Zhang/d2/f2”)7.8 文件系统的界面(Cont.)UNIX文件系统的实现内存所需表目(UNIX)用户打开文件表u_ofile (每个进程一个)file (整个系统一个)系统打开文件表Inode (整个系统一个)外存空间的管理空闲块表字位映像图(Linux)成组连接 (UNIX approach)UNIX内存表目:1. u_ofile (每进程一个)struct user int u_ofileNOFILE; #define NOFILE 15 2. file (系统一个)struct file char f_flag

36、; /R,W,PIPE char f_count; /使用该文件进程家族的进程个数 int f_inode; /指向inode表项 char *f_offset; /字符读写指针 fileNFILE#define NFILE 100UNIX文件系统的实现(Cont.)u_ofile的下标为文件描述符fd,u_ofilefd指向file表的表项。目录项为UNIX系统的FCBstruct inode /(P395;外存;共32 bytes,外存块大小512 bytes) int i_mode; /文件类型和用户权限 char i_nlink; /文件链接计数 char i_uid; /文件主id

37、char i_gid; /同组用户id char i_size0; /most significant of size char *i_size1; /least significant of size int i_addr8; /i_addr0 i_addr5为0级索引, / i_addr6为一级索引; i_addr7为二级索引; int i_atime2; /最后访问时间 int i_mtime2; /最后修改时间UNIX文件系统的实现(Cont.)UNIX文件系统的实现(Cont.)struct inode (内存:P395396 ) int i_flag; /主部修改标志 char i

38、_count; /打开该文件的次数;file表项指向该inode表项的个数 char i_dev; char i_number; char i_mode; char i_nlink; /连接计数 char i_uid; char i_gid; char i_size0; char *i_size1; int i_addr8; int i_lastr; i_nodeNINODE;表间联系:u_ofile file (n) (1)file inode (n) (1)read(4,)read(4,)write(6,)用户空间u_ofileu_ofilefilei_node磁盘空间系统空间.数据块.i

39、_list表间联系UNIX外存空间管理:0 1 2 k k+1 n-1导引块超级块 inode区域每块16个inode, 从0起依次编号 文件存储区域(普通文件,目录文件)超级块(super block): (1) 记载文件卷上k+1块到n-1块中所有空闲块, (2) inode区中100个空闲inode. (缓存) 文件安装(mount)后超级块读入内存。注:占用区域已经记载在各个文件的inode中。Struct filesys int s_isize; /size in blocks of i list int s_fsize; /size in blocks of entire volu

40、me int s_nfree; /number of in core free blocks int s_free100; /in core free blocks int s_ninode; /number of in core I list int s_inode100; /in core free I nodes char s_flock; /free list locking char s_ilock; /i list locking char s_fmod; /super block modified flag char s_ronly; /mounted read only fla

41、g char s_time2; /current date of last update int pad50;空闲块管理:100个空闲块为一组,组之间相互链接。s_nfree=88s_free0s_free1.s_free87.Super block .特点:速度快,空间省。空闲块管理:申请时: (1) s_nfree1, 取s_free-s_nfree; (2) s_nfree=1, 将s_free0所指连接块读入内存,分配s_free0.释放时: (1) s_nfree0, 取s_inode-s_ninode; (2) s_ninode=0, 由磁盘inode区顺取100个空闲I节点(i_

42、nlink=0) 将其编号填入s_inode表中,修改s_ninode,然后分配。释放时: (1) s_ninode100, s_inodes_ninode+=i_number (释放的); (2) s_ninode=100, 丢弃。文件系统界面(UNIX系统调用)creatopencloseseekreadwritelinkunlinkpipemknodesmountsumountchmodchownerstatefstatechdirfd=creat(pathname,mode)pathname: 路径名;mode: 共享说明;1. 在外存分配一个主部inodei_number, 初始化(

43、i_size=0, i_mode=mode, i_nlink=1,i_uid=u_uid, i_gid=u_gid ),;2. 填写目录项(name, i_number);3. 以写方式打开,填写系统打开文件表i_nodenum 和用户打开文件表、filen2表项:.f_inode=num; . f_flag=w; .f_offset=0; f_count=1; u_ofilefd=n2;4. 返回文件描述符fd。例子:creat(“d1/d2/f1”, mode) 假定分配i_number=15, (f1,15)d2中(?,-1)文件系统界面(UNIX系统调用)fd=open(pathnam

44、e,mode)pathname: 路径名;mode: 打开方式;返回值:fd: 文件描述符(u_ofile表的入口, u_ofile的下标)1. 查目录找inode(移入内存i_count=1, 如已在内存i_count+);2. 权限检查(mode打开方式, i_mode共享说明, i_uid, i_gid文件 主(组), u_uid, u_gid用户身份);3. 在file表中分配一个filen表项,指向该内存i_node; 初始化 f_count=1; f_offset=0; f_flag=mode;4. 取一空闲u_ofilefd表目,u_ofilefd=n指向file表中对应表目;5

45、. 返回文件描述符fd(在u_ofile表中的入口)。文件系统界面(UNIX系统调用)close(fd)fd: 文件描述符;1. 由fd查u_ofile找到对应入口;2. 由u_ofilefd找到file表对应入口;3. f_count-, 如0,则转6;(同一家族的其它进程还没结束)4. 由f_inode找到对应inode;4. i_count-, 如为0,i_flag标志有修改,写回外存inode区;6. u_ofilefd=-1(空闲标志)文件系统界面(UNIX系统调用)seek(fd, whence, offset)fd: 文件描述符;whence: 相对位置(0,1,2,3,4,5)

46、=(头,尾,当前位置)offset: 整数,移动量;1. 由u_ofilefd找到file表入口;2. 由f_inode找到内存inode;3. 检查参数合法性(i_size0, i_size1, f_offset, offset, whence);4. 按参数要求调整f_offset指针。文件系统界面(UNIX系统调用)Whence:0,1,2为字节,3,4,5为块nrd=read(fd,buf,count)fd: 文件描述符;buf: 进程空间接收区地址;count: 读字节数;1. 由u_ofilefd,找到file表对应入口;2. 检查访问权限(f_flag, READ);3. 由f_

47、inode找到内存inode入口;4. 由f_offset, count和i_addr计算访问磁盘块号(可能多个块) ; (bmap函数)5. 启动IO设备读取盘块到系统缓冲区中(如buffer无,切换进程);6. 缓冲区信息复制到进程空间(iomove);7. 返回实际传输字节数nrd;8. 调整读写指针f_offset:f_offset+=nrd.文件系统界面(UNIX系统调用)nwt=write(fd,buf,count)fd: 文件描述符;buf:进程空间发送地址;count: 写字节数;1. 由u_ofilefd,找到file表对应入口;2. 检查访问权限(f_flag, WRITE

48、);3. 由f_inode找到内存inode入口;4. 由f_offset, count和i_addr计算磁盘地址块号(可能分盘块);5. 申请系统缓冲区,将buf起始count数据送到缓冲区(可多次);6. 缓冲区链到设备IO链上, 如设备空闲启动设备;7. 修改inode中文件长度i_size; (覆盖时可能不修改)8. 返回实际传输字节数nwt;9. 调整读写指针f_offset:f_offset+=nwt.文件系统界面(UNIX系统调用)pipe(fd)int fd2;1. 分配一个inode(i_count=2);2. 分配2个file表目(f_flag分别为pipeR和pipeW,

49、读/写指针f_offset为0)3. 分配2个u_ofile表目, 分别指向2个file表目;4. 返回2个文件描述符fd0,fd1, 分别为u_ofile中的2个入口。文件系统界面(UNIX系统调用)Pipe文件同步与互斥pipe读写同步写满:写者等待,读出后唤醒读空:读者等待,写入后唤醒读写关闭所有读者关闭:写时返回错误信号所有写者关闭:读者立即返回读写互斥i_flag|ILOCK i_addr i_count (2) f_flag (R pipe)f_offset=0f_inodepf_count =1f_flag (W pipe)f_offset=0f_inodepf_count =1

50、内存inode表内存file表fd0fd1u_ofile表进程执行pipe(fd)之后 i_addr i_count (2) f_flag (R pipe)f_offset=0f_inodepf_count =2f_flag (W pipe)f_offset=0f_inodepf_count =2内存inode表内存file表fd0fd1u_ofile表fork创建子进程1(读者)之后fd0fd1父进程:子进程1: i_addr i_count (2) f_flag (R pipe)f_offset=0f_inodepf_count =3f_flag (W pipe)f_offset=0f_i

51、nodepf_count =3内存inode表内存file表fd0fd1u_ofile表fork创建子进程2(写者)之后fd0fd1父进程:子进程1:子进程2:fd0fd1 i_addr i_count (2) f_flag (R pipe)f_offsetf_inodepf_count =2f_flag (W pipe)f_offsetf_inodepf_count =2)内存inode表内存file表fd0fd1u_ofile表父进程close(fd0),close(fd1)fd0fd1父进程:子进程1:子进程2:fd0fd1 i_addr i_count (2) f_flag (R pi

52、pe)f_offset=0f_inodepf_count =2f_flag (W pipe)f_offset=0f_inodepf_count =1内存inode表内存file表fd0fd1u_ofile表子进程1(读者) : close(fd1)fd0fd1父进程:子进程1:子进程2:fd0fd1 i_addr i_count (2) f_flag (R pipe)f_offset=0f_inodepf_count =1f_flag (W pipe)f_offset=0f_inodepf_count =1内存inode表内存file表fd0fd1u_ofile表子进程2(写者) : clos

53、e(fd0)fd0fd1父进程:子进程1:子进程2:fd0fd1 i_addr i_count (2) f_flag (R pipe)f_offset=count0f_inodepf_count =1f_flag (W pipe)f_offset=count1f_inodepf_count =1内存inode表内存file表u_ofile表子进程2(写) : write(fd1,buf1,count1)子进程1(读) : read(fd0,buf0,count0)父进程:子进程1:子进程2:fd0fd1fd0fd1fd0fd1write(fd1,)read(fd0,) 盘块(有缓冲) i_ad

54、dr i_count (1) f_flag (R pipe)f_offsetf_inodepf_count =1f_flag (W pipe)f_offsetf_inodepf_count =0内存inode表内存file表u_ofile表子进程2(写完) :close(fd1)父进程:子进程1:子进程2:fd0fd1fd0fd1fd0fd1close(fd1)read(fd0,) 盘块(有缓冲) i_addr i_count (0) f_flag (R pipe)f_offsetf_inodepf_count (0)f_flag (W pipe)f_offsetf_inodepf_count

55、 (0)内存inode表内存file表u_ofile表子进程1(读完) :close(fd0)父进程:子进程1:子进程2:fd0fd1fd0fd1fd0fd1close(fd1)close(fd0)Pipe文件同步与互斥pipe读写同步写满:写者等待,读出后唤醒读空:读者等待,写入后唤醒读写关闭所有读者关闭:写时返回错误信号所有写者关闭:读者立即返回读写互斥i_flag|ILOCK管道通讯的局限性只有相关进程(同一家族进程)能通讯先创建管道再创建子进程, 子进程继承父进程打开的文件(包括管道文件)管道是没有名字的文件所有进程都关闭后即被撤销命名管道(FIFO)长久性通讯机构具有文件名可被打开、

56、读写、关闭和删除任何进程都能找到它即使是不同祖先的进程,也可以利用命名管道进行通信。读取和写入遵循FIFO原则阻塞:管道读: 假如没有线程实行写管道操作,读线程将一直阻塞,直到有线程往里面写为止;管道写: 假如没有线程实行读操作,写线程将一直阻塞,直到有线程读数据为止。不阻塞:管道读:假如没有线程实行写管道操作,读线程将立即返回;管道写:假如没有线程实行读操作,写线程将立即返回,返回不正确码-1。link(oldpathname, newpathname)oldpathname: 已存在文件名;newpathname: 待连接文件名;1. 查目录找到oldpathname(inode);2.

57、查目录找到newpathname的末级目录;3. 检查操作合法性;4. Inode的i_nlink+;5. (name, i_number)newpathname的末级目录。例子:link(“d1/d2/f1”,“d1/d3/f2”)d1,d2,f1: 存在;d1,d3: 存在,f2: 不存在,文件系统界面(UNIX系统调用)unlink(pathname)pathname: 文件路径名;1. 查目录找到pathname(inode);2. i_nlink-; 如结果为0, 释放所有磁盘块 (删除文件);3. 清除末级文件名在末级目录中的登记。例子:unlink(“d1/d2/f1”) 假定:

58、f1文件号i_number=15; 操作后:f1的i_nlink-, d2中原(f1, 15)改为(f1, -1)文件系统界面(UNIX系统调用)mknode(pathname, type and permissions, dev)pathname: 节点名;type and permissions: 节点类型和访问权限;dev: 主次设备号;1. 如非特权用户,失败;2. 建立一个i_node, 初始化(i_addr0=dev);文件系统界面(UNIX系统调用)struct mount int m_dev; int *m_bufp; /超级块 int *m_inodep;mountNMOUN

59、T;#define NMOUNT 5devrootrk01Makenode创建usrLid01安装: smount(“/dev/rk01”, “/usr/Li/d01”, 0)卸下: sumount(“/dev/rk01”)i_flag =| FMOUNT文件系统界面(UNIX系统调用)bit: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Set uidSet gid大文件00普通01字符10目录11块型i_mode: i_flag:ILOCKIUPDIACCIMOUNTIWANTITEXT执行该文件进程的身份暂时改为文件主的身份即: u_uid = i_uid

60、smount(special_pathname, directory_pathname, roflag)special_pathname: 特殊文件名directory_pathname: 目录文件名(安装节点)roflag: 只读标志1. 检查是否超级用户;2. 找到special_pathname文件的inode(用mknode建立);3. 合法性检查(特殊块型文件);4. 找到directory_pathname节点的inode;5. 如非目录或引用数大于,错返;6. 读入super block到buf,按filesys格式解释.7. 安装节点inode的i_addr0=设备文件i_ad

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论