操作系统-文件管理.pptVIP

  1. 1、本文档共48页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
内存打开文件结构关联 静态共享:一个文件被链接到多个目录上 动态共享(文件打开时共享): 1、共享内存inode  2、共享系统打开文件表(共享读写指针) UNIX文件共享 5.6 文件系统主要功能的实现 5.6.1 打开文件系统调用的实现 open(char *fn, int omode) 的主要步骤: 1) 按文件名沿目录树查找文件,确定该文件的外存 inode编号(记为dinode_no) 2)检查dinode_no是否已在内存inode表区。若是则共享,否则分配一个空闲内存inode,把dinode_no填入其中的i_number项(本步骤取得的内存inode编号记为inode_no) 3)检查omode是否符合存取权限、、、 4)查file表分配一空闲表项,若分配到,下标记为file _no , inode_no 记入file[file _no ]. f_inode,否则、、、 5)在该进程的u_ofile中分配一空闲表项,若分配到 下标记为fd ,file _no记入u_ofile[fd] ,否则、、、 6)返回打开文件号fd 提问:打开文件不成功的原因有几种?  上面的步骤1)到5)都有可能(暂时)进行不下去,但步骤2)和4)进行不下去会导致进程封锁等待(相应的资源被释放),步骤1)、3)、5)会导致不能打开文件并分别给出下列提示: 文件不存在; 权限不够; 打开文件过多。  步骤1)至5)的顺序可以颠倒,但步骤6)必须放在最后 open(、、、)函数的返回值为分配到的进程打开文件表项的编号( u_ofile[]数组下标),被称为打开文件号。 系统装入可执行程序对其进行初始化时就把u_ofile[]数组的前三项分别对应标准输入、标准输出、标准错误输出文件, 这样0、1、2分别是标准输入、标准输出、标准错误输出的打开文件号)。 一般依次调用open(、、、)函数(没有调用close (、、、)函数)的返回值依次为3、4、5、、、、 一个进程可以多次打开一个文件,一个文件的两次打开算是两个打开文件,有不同的读写指针;对应不同的file 表项,  例如:用语句“fd1=open(“abc”,0);”和“fd2=open(“abc”,1);”分别将abc文件以读的方式打开和以写的方式打开。 打开文件的功能:找到文件控制块将其读入内存 5.6.2 读文件系统调用的实现 read(fd,ca,n)(从fd打开文件读n个字节段送ca指向的用户内存区)系统调用的主要工作步骤: 1)在inode[file[u_ofile[fd]].f_inode]中查出文件所在的(逻辑)设备号dev、文件长度flen等,在file[u_ofile[fd]]查出文件读写指针值offset、打开标志f_flag等。 2)如根据f_flag判断是读管道文件,则调用readp(、、、)后返回。 3) off9- offset,n9- n,ca9- ca。 4)如果off9=flen,则转10)。 5)本次读写地址变换、读写字节段大小及读写区域地址确定 a)计算文件的读写指针当前位置对应的逻辑块号ln=[off9/BSIZE](BSIZE为存放文件内容的外存物理块的大小,通常为512B或者其整数倍) b)查找出逻辑块号ln对应的物理块号pn(查文件索引表或者连接指针) c)本次读字节段大小为m=min{(ln+1)*BSIZE-off9,n9,flen-off9},字节段区间地址为[off9,off9+m-1] 5.6.2 读文件系统调用的实现 read(fd,ca,n) 系统调用的主要步骤: 6)调用bufp=bread(dev,pn)(把dev号设备上的pn号物理块读入bufp指向的系统缓冲区)。 7)从bufp指向的系统缓冲区中相应位置取出m个字节送ca9所指向户内存区。 8)off9-off9+m,n9-n9-m,ca9的指向向后移动m个字节。 9)如果n90,则转5)。 10)修改读写指针为off9等。 11)返回实际读到的字节数off9-offset。 bread(dev,blkno) 的主要步骤: 1) rbp=getblk(dev,blkno)(根据dev,blkno申请缓存) 2)判断欲读块是否已在rbp所指向的缓存中,若是则返回rbp 3) 填写rbp所指向的缓存控制块使之成为读请求块 4)将该请求块加入到该dev设备的I/O等待队列中,若该dev设备空闲则立即启动之执行本次读请求(否则等其它I/O请求执行完毕后由中断处理程序启动执行本次读请求) 5)iowait(rbp) (等待本次读请求执行结束) 6)返回rbp i

文档评论(0)

xxj1658888 + 关注
实名认证
文档贡献者

教师资格证持证人

该用户很懒,什么也没介绍

领域认证该用户于2024年04月12日上传了教师资格证

1亿VIP精品文档

相关文档