390 likes | 550 Vues
信息项 信息项 … 信息项 … 信息项. 读 ( 写 ) 指针. 第七章 文件系统. 7.1 文件与文件系统 文件 具有符号名而且在逻辑上具有完整意义的信息项的序列。 文件系统 文件与管理文件的程序集合。. UNIX 文件分类. UNIX 文件分类 普通文件 内容可以是程序、数据、图象等,保存在磁盘块中 目录文件 ( 文件名,文件号 ) 序列,保存在磁盘块中 特殊文件 设备 设备作为文件管理. 7.2 文件的访问方式. 顺序访问 从文件起始位置开始顺序访问 从文件中间某处开始顺序访问 随机访问
E N D
信息项 信息项 … 信息项 … 信息项 读(写)指针 第七章 文件系统 • 7.1 文件与文件系统 • 文件 • 具有符号名而且在逻辑上具有完整意义的信息项的序列。 • 文件系统 • 文件与管理文件的程序集合。
UNIX文件分类 • UNIX文件分类 • 普通文件 • 内容可以是程序、数据、图象等,保存在磁盘块中 • 目录文件 • (文件名,文件号)序列,保存在磁盘块中 • 特殊文件 • 设备 • 设备作为文件管理
7.2 文件的访问方式 • 顺序访问 • 从文件起始位置开始顺序访问 • 从文件中间某处开始顺序访问 • 随机访问 • 按记录编号随机访问 • 按关键字(key)随机访问
7.3 文件的组织 • 逻辑组织 • 用户看到的文件组织形式 • 记录式文件:记录的序列 • 等长记录 • 不等长记录 • 流式文件:字节的序列 • 物理组织 • 逻辑组织到磁盘块的映射 • 文件:记录(字节)序列 • 磁盘:块(block)序列 变换关系
7.3.2 文件的物理组织 • 考虑因素 • 记录格式 • 等长或不等长, 流式不必考虑 • 空间开销 • 除保存文件内容之外的存储开销 • 访问速度 • 随机访问速度 • 长度变化 • 动态增长
磁盘空间 … 块18 块19 块20 块21 块22 ... … 首块=18 块数=5 ... FCB 顺序结构: 一个文件占有若干连续的磁盘块。 优点:速度快,节省空间 缺点:长度变化困难
磁盘空间 … 块18 ... 块80 ... 块92 ... … 首块=18 块数=3 ... FCB 链接结构: 一文件可存于不连续块中,块间以指针相连。 优点:节省空间,长度变化容易。 缺点:随机访问速度慢。
… 块18 块19 ... 块26 ... 块30 ... 索引结构: 一文件可存于不连续块中,块号记在索引块中。 优点:速度快,长度变化容易。 缺点:索引块占空间。 磁盘空间 … 索引块=29 块数=4 ... 索引块29 FCB
Hash结构: 计算地址: hash(key)=addr (在磁盘或文件中的存放位置) 问题:给定key1key2 hash(key1)=addr1; hash(key2)=addr2; addr1=addr2 (conflict) Conflict resolution: 顺序探查法: 如发生冲突,则在冲突位置开始顺序探查第一个空闲的存储位置。
UNIX文件物理结构(索引+链接) 最大=10+256+2562+2563(块) ... … i_addr[0] ... i_addr[9] i_addr[10] i_addr[11] i_addr[12] ... ... ... ... ... ... inode ...
7.4 文件目录 • 文件控制块与目录项 • 文件控制块(FCB) • 文件存在的标志,其中保存系统管理文件需要的全部信息 • 目录项 • 目录文件中的一项,内容为FCB • 文件目录与目录文件 • 文件目录 • 用于检索文件的目录 • 目录文件 • 内容为目录项的文件
FCB(File Control Block) 文件名 文件号 文件主 文件类型 文件属性 共享说明 文件长度 文件地址 建立日期 最后修改日期 最后访问日期 口令 其它 FCB创建:建立文件时 FCB撤消:删除文件时
单级目录(Single-Level Directory) A single directory for all users. 缺点: 1. Naming problem 2. Grouping problem
两级目录(Two-Level Directory) Separate directory for each user.
多级目录(Multi-Level Directory as in UNIX) root bin usr lib dev etc unix users bin Li Wang console lp passwd cc vi d2 s d1 yacc f2 f1
Multi-Level Directory(UNIX) • 特点: • Efficient searching • Grouping Capability • Current directory (working directory) • cd /root/usr/users/wang/d1 • type f1
文件目录的查找 • 查找路径 • 由根目录开始查找 • 由当前目录开始查找 • 查找算法 • 顺序查找(UNIX) • hash查找 • 对分查找(要求文件名排序)
文件目录的改进 • FCB • 次部:(文件名, 文件号) • (UNIX 16 bytes) • 保存在目录文件中 • 主部:(其它, 链接记数) • (UNIX 32 bytes) • 保存在外存inode区域 • 改进的好处 • 可以提高查找速度(顺序查找) • 可以实现文件链接(link)
7.5 文件的共享 • 共享目的 • 节省存储空间 • 进程相互通讯 • 文件共享模式 • 不同时使用 • 根据共享说明 • 同时使用 • 根据共享说明和(relaxed)R/W规则
users li wang f2 15 f1 15 f2 f1 i_number=15 文件的共享 • 文件共享的实现 • 公共目录 • 共享说明 • 连接 d1 link(“/usr/users/wang/d1/f1”, “/usr/users/li/f2”) unlink(“/usr/users/wang/d1/f1”)
7.6 文件的保护、保密与安全 • 保护 • 防止用户对文件进行非授权的访问 • 保密 • 防止文件内容泄露 • 安全 • 防止文件被破坏 • 自然因素 • 人为因素
7.6.1文件的保护(Protection) • File owner/creator should be able to control: • what can be done • by whom • Types of access • Read • Write • Execute • Append • Delete • List
f1 …… fj …… fn u1 a11….… a1j ……. a1n … … …… … …… ... ui ai1 …… aij ….… ain … … …… … …… ... um am1 ….. amj ….… amn R W E A M D 1. 存取控制矩阵 aij: 特点: 权限规定细,过于繁琐
R W E R W E R W E 文件主 同组用户 其他用户 2. 访问权限说明(UNIX)i_mode i_mode在创建文件时给出,creat(filename, mode) 其后文件主可以修改:chmod(filename, new_mode)
7.6.2 文件保密 • 口令 • 创建文件时用户规定一个口令,系统将其记在FCB中 • 访问文件要求给出口令,并与FCB中口令比较 • 密码 • 保存时加密(key) • 读取时解密(key)
7.6.3 文件系统的安全 • Backup • 定期将磁盘上文件复制到磁带上 • 发生故障时由磁带恢复(limited recovery) • 实现方法 • 海量转储:定期将磁盘上文件全部复制到磁带上 • 增量转储:每次只复制修改部分 • 磁盘整理 • 利用转储和恢复可以对磁盘进行整理(使文件物理块连续,空闲盘块连续)
7.7 文件系统的实现 • 内存所需表目(UNIX) • 用户打开文件表 • u_ofile (每个进程一个) • file (整个系统一个) • 系统打开文件表 • Inode (整个系统一个) • 外存空间的管理 • 空闲块表 • 字位映像图(Linux) • 成组连接 (UNIX approach)
UNIX内存表目: 1. u_ofile (每进程一个) struct user { … int u_ofile[NOFILE]; … } #define NOFILE 15 2. file (系统一个) struct file { char f_flag; //R,W,PIPE char f_count; int f_inode; char *f_offset[2]; }file[NFILE] #define NFILE 100
3. inode struct inode { int i_flag; char i_count; 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_addr[8]; int i_lastr; }inode[NINODE]; 表间联系: u_ofile file (n) (1) file inode (n) (1)
表间联系 read(4,…) ... u_ofile 数据块 … … ... read(4,…) … write(2,…) file i_node u_ofile i_list 用户空间 磁盘空间 系统空间
Creat open Close seek Read write Link unlink 7.8 文件系统界面(UNIX系统调用)
fd=creat(pathname,mode) • pathname: 路径名; • mode: 共享说明; • 分配一个inode, 初始化(i_size=0, i_mode=mode, • i_nlink=1, i_count=1) • 2. 填写目录项(name, i_number); • 3. 以写方式打开(填写file 表和u_ofile表); • 4. 返回文件描述符。
fd=open(pathname,mode) pathname: 路径名;mode: 打开方式; fd: 文件描述符(u_ofile表的入口) 1. 查目录找inode(移入内存i_count=1, 如已在内存i_count+1); 2. 权限检查(mode, i_mode, i_uid, i_gid, u_uid, u_gid); 3. 在file表中分配一个表项,指向该内存i_node; 初始化 f_count=1; f_offset=0; f_flag=mode; 4. 在u_ofile中取一表目,指向file表中对应表目; 5. 返回文件描述符fd(在u_ofile表中的入口)。
close(fd) fd: 文件描述符; 1. 由fd查u_ofile找到对应入口; 2. 由u_ofile[fd]找到file表对应入口; 3. f_count--, 如为0, 由f_inode找到对应inode; 4. i_count--, 如为0,i_flag标志有修改,写回外存inode区; 5. u_ofile[fd]=-1(空闲标志)。
seek(fd, whence, offset) fd: 文件描述符; whence: 相对位置(0,1,2,3,4,5)=(头,当前位置,尾) offset: 移动量; 1. 由u_ofile[fd]找到file表入口; 2. 由f_inode找到内存inode; 3. 检查参数合法性(i_size0, i_size1, f_offset, offset); 4. 按参数要求调整f_offset指针。
nrd=read(fd,buf,count) fd: 文件描述符;buf: 进程空间接收区地址; count: 读字节数; 1. 由u_ofile[fd],找到file表对应入口; 2. 检查访问权限(f_flag, READ); 3. 由f_inode找到内存inode入口; 4. 由f_offset, count和i_addr计算磁盘块号; 5. 启动IO设备读取盘块到系统缓冲区中 6. 缓冲区信息复制到进程空间(iomove); 7. 返回实际传输字节数nrd。
nwt=write(fd,buf,count) fd: 文件描述符;buf:进程空间发送地址;count: 写字节数; 1. 由u_ofile[fd],找到file表对应入口; 2. 检查访问权限(f_flag, WRITE); 3. 由f_inode找到内存inode入口; 4. 由f_offset, count和i_addr计算磁盘地址块号 5. 申请系统缓冲区,将buf起始count数据送到缓冲区 6. 缓冲区链到设备IO链上, 如设备空闲启动设备; 7. 修改i_node中文件长度i_size; 8. 返回实际传输字节数nwt。
link(oldpathname, newpathname) oldpathname: 已存在文件名;newpathname: 待连接文件名; 1. 查目录找到oldpathname(inode); 2. 查目录找到newpathname的末级目录; 3. 检查操作合法性; 4. Inode的i_nlink++; 5. (name, i_number)末级目录。 例子:link(“d1/d2/f1”,“d1/d3/f2”) d1,d2,f1: 存在; d1,d3: 存在,f2: 不存在,
unlink(pathname) pathname: 文件路径名; 1. 查目录找到pathname(inode); 2. i_nlink--; 如结果为0, 释放所有磁盘块 (删除文件); 3. 清除末级文件名在末级目录中的登记。 例子: unlink(“d1/d2/f1”) 假定:f1文件号i_number=15; 操作后:d2中原(f1, 15)改为(f1, -1)