




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二次上机实验指导(文件系统调用编程练习)实验目的:学习打开文件(open)、关闭文件(close)、读文件(read)、写文件(write)和移动读写指针(lseek)等系统调用的使用方法,为编写并发拷贝程序并真正理解并发拷贝程序的工作过程做准备。建立起对流式文件的理解,特别是读写指针的理解,以便为将来为对文件的逻辑读写和磁盘的物理读写的关系理解奠定基础。实验要求:使用打开文件(open)、关闭文件(close)、读文件(read)、写文件(write)和移动读写指针(lseek)来编写各种C语言程序以达到对这些系统调用的使用方法的熟练掌握,了解流式文件的概念。进一步地思考文件的逻辑读写和磁盘的物理读写的关系,文件的逻辑读写为什么必须经过系统缓冲区?为什么通常情况下程序读文件需要同步而写文件可以不同步(异步)?读文件的语句的执行时间与写文件语句的执行时间有怎样的差异?实验步骤和内容的基本建议和提示:1、进入turbo-c目录,执行其中的“TCFORWIN.EXE”即进入了turbo-c的语言编程环境。点击“帮助C库函数速查”可以查看打开文件(open)、关闭文件(close)、读文件(read)、写文件(write)和移动读写指针(lseek)等系统调用的使用方法。2、运行教材P34图2.7的C语言程序以进一步熟悉上列系统调用的使用方法。3、编写一个C语言程序程序实现type命令的功能,生成 .EXE文件(例如type12.exe)并运行检验是否可以达到输出转向的效果。4、编写一个实现copy命令基本功能的程序,生成 .EXE文件(例如copy12.exe),并体会“Ccopy12 con abc.txt” 命令(Ctrl+Z结束屏幕输入编辑操作)的运行效果。准备材料:1、“turbo-c”软件下载可以进入学校主页“网络办公”中“教案”网页,打开信息学院李勇的“第二次上机实验指导(文件系统调用编程练习)”教案,下栽其中的“turbo-c压缩包”,解压后形成turbo-c目录。2、修改调试下列程序,生成可执行程序(例如test123.exe),在命令行方式下远行可执行程序(例如C test123 a.txt b.txt c.txt),检查远行结果(argv1、argv2、argv3是命令行参数,若在命令行输入了test123 a.txt b.txt c.txt,则argv1、argv2、argv3分别对应字符串“a.txt”、“b.txt”、“c.txt”)。(open、close、read、write系统调用的用法参见教材P34的C语言程序)#include #include #define BSIZE 512main(argc,argv)int argc;char *argv; int fd1,fd2,fd3,n; char bufBSIZE,ch=n; fd1=open(argv1,O_RDONLY); /*以只读方式打开argv1对应的输入文件,返回标识符fd1*/ fd2=open(argv2,O_RDONLY); /*只读方式打开argv2对应的输入文件,返回标识符fd2*/ /* fd3=creat(argv3,0644); 创建argv3应的文件,返回标识符fd3*/ Fd3=creat(argv3, (O_RDWR|O_CREAT|O_TRUNC),、); /*以读写方式创建一个输出文件(文件名由argv3指定),返回标识符fd3*/ while(n=read(fd1,buf, BSIZE)0) /*从fd1中读n0) /*从fd2中读n= BSIZE个字节*/write(fd3,buf,n); close(fd1); close(fd2); close(fd3);3、期末考试可能出现的题目选择题题型1:下列程序执行前文件xy.txt的内容为“123456”,下列程序执行完后,该文件的内容是( )A. “ab3456” B. “a2b456” C. “a23b56” D. “a234b6”E. “123456ab” F. “ab123456” G. “12ab3456” H. “ab”#include io.hmain()int fd;fd=open(“xy.txt”,2);write(fd,”a”,1);lseek(fd,2,SEEK_CUR);write(fd,”b”,1);close(fd); 选择题题型2:主要检验对lseek(、)的理解文件xy.txt的内容为“123456”,打开后执行( )三条语句后变为“a2345b”A. write(fd,”a”,1);lseek(fd,4,SEEK_CUR);write(fd,”b”,1);B. write(fd,”a”,1);lseek(fd,3,SEEK_CUR);write(fd,”b”,1);C. write(fd,”a”,1);lseek(fd,2,SEEK_CUR);write(fd,”b”,1);D. write(fd,”a”,1);lseek(fd,1, SEEK_CUR);write(fd,”b”,1);E. write(fd,”a”,1);lseek(fd,4, SEEK_SET);write(fd,”b”,1);F. write(fd,”a”,1);lseek(fd,3, SEEK_SET);write(fd,”b”,1);G. write(fd,”a”,1);lseek(fd,2, SEEK_SET);write(fd,”b”,1);H. write(fd,”a”,1);lseek(fd,1, SEEK_SET);write(fd,”b”,1);I. write(fd,”a”,1);lseek(fd,2, SEEK_END);write(fd,”b”,1);J. write(fd,”a”,1);lseek(fd,3, SEEK_END);write(fd,”b”,1);此题目为对lseek(、)的理解的检验,前提是read(、)和write(、)的理解,而对read(、)和write(、)的理解又首先依赖于对open(、) 的理解选择题题型2: 对open(、)理解这个知识点的测试:下面叙述正确的是( )。A. open(、)就是把文件内容读入内存B. open(、)就是找到文件在外存的位置C. open(、)就是找到文件控制块并且把它读入内存后返回指针D. open(、)就是找到文件控制块并且把它读入内存返回打开文件句柄4、期末考试曾经出现过的题目:文件f1.txt的内容为“xy345、”,下列程序片段执行完后,该文件的内容是什么?如果系统中只有这一个程序在运行,后三条语句对应页号 状态 页面号0 Y 21 Y 32 Y 8着怎样的磁盘操作?fd=open(“f1.txt”,2);write(fd,”1”,1);write(fd,”b”,1);close(fd);5、可以逐步阅读理解的论文操作系统课程教学研究(一)-核心内容的教学方法探讨李勇(大连海事大学信息科学技术学院,辽宁 大连 116026)摘要:并发与共享是操作系统课程教学的难点和重点问题。本文基于完成基本文件拷贝功能的并发拷贝程序这样一个学生容易理解的实际问题,展示从顺序程序设计到并发程序设计转变的实际需求和实现方法,把操作系统主要章节的核心内容串联起来,总结出一套连贯的有助于学生对并发与共享相关核心内容掌握的教学方法。关键词:操作系统;教学方法;并发;共享 计算机操作系统的主要目标之一是提高系统资源利用率,并发与共享是实现这一目标主要手段,也是现代计算机操作系统的最基本特征。要实现并发与共享需要一定的硬件技术支持作为基础,更需要操作系统中各种数据结构和算法的设计及程序的实现来实施,可以说操作系统各模块的设计都是为了在系统中更好地实现并发与共享。并发与共享相关技术是操作系统课程的核心内容,其理解和掌握是操作系统课程教学的主要目标。并发与共享相关技术的理解和掌握要求学生比较扎实地掌握前续课程的相关知识,特别是要求学生从顺序程序设计到并发程序设计的思想观念的转变。为了解决这一难点和重点问题,本文基于完成基本文件拷贝功能的并发拷贝程序这样一个学生容易理解的实际问题,展示从顺序程序设计到并发程序设计转变的实际需求和实现方法,并且把操作系统多个章节的核心内容串联起来,总结出一套连贯的讲述内容和方法。1、 完成基本文件拷贝功能的顺序拷贝程序DOS系统的文件拷贝命令的最基本功能就是把一个源文件复制为目标文件。下面是完成基本文件拷贝功能的顺序拷贝程序内存目标文件源文件D1D2abuff用户程序区操作系统区图1 文件顺序拷贝程序的简化工作效果图#include #define PMODE 0644#define BSIZE 512main(int argc,char *argv)int fdr,fdw,n,fdp2; char abufBSIZE; fdr=open(argv1,0); fdw=create(argv2, PMODE);while(n=read(fdr,abuf,BSIZE)0) write(fdw,abuf,n);源文件目标文件D1D2用户程序区操作系统区缓冲区1缓冲区2abuff内存图2 文件顺序拷贝程序的实际工作步骤图如果源文件和目标文件分别在驱动器不相同的两个磁盘D1和D2上,那么文件顺序拷贝程序的简化工作效果如图1所示,步骤对应read(、),是将磁盘D1中的源文件内容读到内存的用户程序区中的abuf;步骤对应write(、),是将内存的用户程序区中abuf的内容写到磁盘D2目标文件中。步骤和分别对应流式文件的读和写,通过多个循环步完成,除最后一次读或写剩余字节外,前面各次每次读或写BSIZE个字节。D2D1CPU部件D1R1D1R2D1R3D2W1D2W2D2W3、图3 文件顺序拷贝时各部件动作序列T、文件顺序拷贝程序的实际工作步骤和效果如图2所示,图1的步骤被细分为图2的步骤和,图1的步骤图被细分为图2的步骤和。要真正理解图2,需要知道read(、)和write(、)系统调用的主要工作步骤和过程。文件顺序拷贝程序工作时各部件(CPU、磁盘D1、磁盘D2)的动作序列如图3所示,其中D1Ri和D2Wi(i=1、2、3、)分别表示第i次循环读源文件和写目标文件所在磁盘的一个物理块(扇区)的动作。需要提醒学生的是相对于D1Ri和D2Wi所需要的时间来说,CPU的动作时间可以忽略不计。 D2D1CPU部件D1R1D1R2D1R3D2W1D2W2D2W3D1R4图4 文件并发拷贝时CPU和磁盘D1、D2的可能动作序列、2、 完成基本文件拷贝功能的并发拷贝程序可以引导学生从逻辑上分析出D1Ri+1与D2Wi在时间上可以重叠,进而画出并发拷贝程序工作时的CPU和磁盘D1、D2可能的动作序列如图4所示。正是因为假定D1, D2分别是不同驱动器上的两个磁盘,所以它们的动作可以并行,但D2Wi必须在D1Ri完成后才能开始。如果从D1读和向D2写的速度差不多,则D1Ri+1与D2Wi在时间上几乎可以重叠。要达到图4并发拷贝工作效果,程序如何编写?abufabufPsPf源文件目标文件D1D2用户程序区操作系统区内存图5 错误的文件并发拷贝程序工作效果图首先提示学生,要并发必须有两个或以上进程(当然线程也可以),必须要能够创建进程。使用Unix系统的fork()系统调用来改写前面的完成基本文件拷贝功能的顺序拷贝程序,很大一部分学生写出了下列错误程序。#include #define PMODE 0644#define BSIZE 512main(int argc,char *argv)int x,fdr,fdw,n;char abufBSIZE;fdr=open(argv1,0);fdw=creat(argv2, PMODE);while(x=fork()=-1);if (x=0)共享正文段用户程序区操作系统区内存图6 fork()的执行结果Pf的数据段Ps的数据段Pf的procPs的proc基本上复制区基本上复制区 while(n=read(fdr,abuf,BSIZE)0)else while( write(fdw,abuf,n) );图5直观地展示了程序错误(目标文件永远是空的)的原因,关键在于对fork()系统调用执行结果的理解是否到位。即使粗略地理解父进程(Pf)执行上面的程序中的fork()的结果是在内存的另一个区域创建了一个子进程(Ps,其执行的程序可以认为是从父进程复制过来的),之后父进程和子进程独立地并发地从if语句开始执行。当然在父进程中fork()的返回值大于0(为子进程编号),在子进程中fork()的返回值等于0,所以父进程和子进程分别执行if语句的不同分支。对fork()系统调用执行结果的进一步严格理解见图6,其中又涉及进程实体(映象、图象或者说上下文)构成的理解。图6中Pf的进程实体由Pf的proc、共享正文段和Pf的数据段三部分组成,Ps的进程实体由Ps的proc、共享正文段和Ps的数据段三部分组成,Pf和Ps各有一个不同的abuf分别在Pf的数据段和Ps的数据段区域中。总之,对进程创建系统调用的理解是并发与共享核心内容掌握的关键。对图5错误原因的进一步分析就产生了对进程通信的需求。借助于无名管道的手段可以画出图7。基于图7使用无名管道的系统调用就不难写出下面正确的文件并发拷贝程序(用C语言编写,在Linux系统下调试通过)。#include #define PMODE 0644abufabufPsPf源文件目标文件D2管道用户程序区图7 正确的文件并发拷贝程序工作效果图操作系统区内存D1#define BSIZE 512ain(int argc,char *argv)int x,fdr,fdw,n,fdp2;char abufBSIZE;fdr=open(argv1,0);fdw=creat(argv2, PMODE);pipe(fdp);while(x=fork()=-1);if (x=0) while(n=read(fdr,abuf,BSIZE)0) write(fdp1,abuf,n);else while(n=read(fdp0,abuf,BSIZE)0) write(fdw,abuf,n);3、 完成基本文件拷贝功能的并发拷贝程序的工作过程描述图4和图7只是粗线条地展示了完成基本文件拷贝功能的并发拷贝程序的工作原理和工作效果。是否能够真正理解并发拷贝程序的工作原理进而真正地理解和掌握并发的概念和原理,对图8的理解掌握是一个很好的检验。 RP1 S R1 S ID S R1WP1 R2 S RP1W1 RP2 S ID S R2WP2 R3 S RP2W2 RP3 S ID S ID CPU D1R3D1R2D1R1D1D2W2D2W1D2 t0 t1 t2t3 t4t5 t6 t7 t8 t9 ta tbtc td te tftg th titj tktl父进 子进 子进 父进 子进 父进 子进 父进 子进 父进 子进 T程封 程封 程就 程就 程封 程封 程就 程就 程封 程封 程就锁 锁 绪 绪 锁 锁 绪 绪 锁 锁 绪图8 进程并发拷贝程序工作时各部件动作序列及进程状态变化图示片断图8中D1、D2分别代表不同的可以并行工作的两个物理磁盘,假设D1读比D2写略快一点;S表示进程调度切换;ID表示磁盘中断处理;第i次(i=1、2、3、,下同)读源文件的系统调用read(fdr, 、)分为Ri和Ri两段完成;Wi代表第i次写目的文件的系统调用write (fdw, 、);第i次读管道文件的系统调用read(fdp0, 、)分为RPi和RPi两段完成,管道非空时RPi为空;第i次写管道文件的系统调用write (fdp1, 、)分为WPi和WPi两段完成,管道非满时WPi为空。4、 理解并发拷贝程序的工作过程所涉及的操作系统程序的主要工作步骤要理解图8必须学习和理解文件读写和管道读写的工作步骤和过程,而这些内容恰恰是操作系统课程应该讲授的内容,遗憾的是除了尤晋元1985编写出版的UNIX操作系统教程对这些内容有比较详细的讲述外,现有的各种操作系统教材(234等)对这些内容或者没有讲述或者讲述得不足于让学生真正理解并发拷贝程序的工作原理。下面是在1的基础上为了便于学生理解图8整理出来的文件读写及其所调用的下层程序的主要工作步骤。read(fd,ca,n)(从fd打开文件读n个字节段送ca指向的用户内存区)系统调用的主要步骤:1)根据fd查内存打开文件结构获得文件所在的(逻辑)设备号dev、文件长度flen、文件读写指针值offset、打开标记f_flag等。2)如果f_flag= FPIPE+ FREAD(读管道文件),则调用p=readp(、) ,带p值返回。3)off9-offset,n9-n,ca9=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 。6)调用bufp=bread(dev,pn)(把dev号设备上的pn号物理块读入bufp指向的系统缓冲区)。7)从bufp指向的系统缓冲区中相应位置取出m个字节送ca9所指向户内存区。8)off9-off9+m,n90,则转5)。10)修改读写指针为off9。 11)返回实际读到的字节数off9-offset。bread(dev,blkno)(把dev号块设备上的blkno号物理块读入系统缓冲区)的主要步骤:1)rbp=getblk(dev,blkno)(根据dev,blkno申请缓存)2)判断欲读块是否已在rbp所指向的缓存中,若是则返回rbp3)填写dev、blkno等数据项到rbp所指向的缓存控制块使之成为读请求块4)将该读请求块加入到dev设备的I/O等待队列中,若该设备空闲则调用devstar(rbp)启动本次读盘操作(否则等其它I/O操作完毕后由中断处理程序启动本次读盘操作)5)iowait(rbp)(等待本次读盘操作执行结束)6)返回rbp设备启动程序devstar(IORP) 的主要步骤:1)对块设备要进行地址变换(物理块号磁头号、磁道号、扇区号)2)填写有关寄存器(控制寄存器启动位置1即启动了设备)3)返回iowait(IORP) 的主要步骤:1)将当前进程加入到该IORP等待队列中,并将其状态置为封锁2)调用进程调度程序sched()3)返回(再次被进程调度程序选中后)I/O中断处理iointerrupt(包括磁盘中断处理)的主要步骤:1)把刚完成I/O传输的IORP从I/O等待队列中摘下来2)把该IORP等待队列中的所有进程置为就绪状态(唤醒)3)如果I/O等待队列还有等待启动传输的IORP则调用devstar(IORP)启动下一个I/O传输write(fd,ca,n)(把用户内存区ca指向位置开始的n个字节段送fd打开文件)的主要步骤:1)根据fd查内存打开文件结构获得文件所在的(逻辑)设备号dev、文件长度flen、文件读写指针值offset、打开标记f_flag等。2)如果f_flag= FPIPE+ FWRITE(写管道文件),则调用p=writep (、) ,带p值返回。3)off9-offset,n9-n,ca9-ca。4)如果n9=0,则转10)。5)本次读写地址变换、读写字节段大小及读写区域地址确定a)计算文件的读写指针当前位置对应的逻辑块号ln=off9/BSIZE(BSIZE为存放文件内容的外存物理块的大小,通常为512B或者其整数倍)b)查找出逻辑块号ln对应的物理块号pn(查文件索引表或者连接指针,如果找不到则要分配外存物理块并修改文件索引表或者连接指针)c)本次写字节段大小为m=min(ln+1)*BSIZE-off9,n9),区域地址为off9,off9+m-1。6)如果本次欲写的这段信息对应的逻辑块ln整块写到物理块pn上会破坏原来文件的内容,进一步判断原来文件的逻辑块ln的内容是否已经在系统缓冲区,如果在则获得该系统缓冲区的指针bufp,如果不在则调用bufp=bread(dev,pn)(把dev号设备上的pn号物理块先读入bufp指向的系统缓冲区);如果本次欲写的这段信息对应的逻辑块ln整块写到物理块pn上不会破坏原来文件的内容,则调用bufp=getblk(dev,pn)(根据dev,pn申请系统缓冲区)。7)填写dev、pn等数据项到bufp所指向的缓存控制块使之成为写请求块;将用户内存区中从ca9所指向位置开始的m个字节送bufp指向的系统缓冲区中相应位置。8)如果off9+m恰为下一个逻辑块的起始位置则调用bawrite(bufp)(将bufp所指向的系统缓冲区内容写到磁盘上);否则调用bdwrite(bufp)(延迟写)。9)off9-off9+m,n9 b-flags|=B-ASYNC;(在wbp指向的缓冲控制块的b_flag数据项上设置异步写标志B-ASYNC)2)bwrite(wbp)(调用bwrite(、)按照wbp指向的缓冲控制块的系统缓冲区内容写到磁盘上);3)返回bwrite(bp)(把bp指向的系统缓冲区内容写到相应块设备相应物理块)的主要步骤:1) 将bp对应的写请求块加入到相应设备的I/O等待队列中,若设备空闲则调用devstar(bp) 启动本次写盘操作(否则等其它I/O操作完毕后由中断处理程序启动本次写盘操作)2)如果是同步写则iowait(bp)(等待本次写盘操作执行结束) brelse(bp) (释放bp对应的系统缓冲区和缓冲区控制块)3)返回bdwrite(wbp)(延迟写,等到wbp指向的系统缓冲区和缓冲区控制块需要再次被分配出去之前启动设备进行真正的物理输出)的主要步骤:1)wbp-b-flags|=B-DELWRI| B-NODE;(在wbp指向的缓冲控制块的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年方剂学考试试题及答案
- 设备安装后的运行调试与维护方案
- 招聘笔试客观题库及答案
- 集体土地租赁合同范本
- 碳陶复合半导体材料生产线建设项目节能评估报告
- 草剂柔性生产项目施工方案
- 离职员工离职后原公司项目交接及责任划分协议
- 南京市仓库租赁合同样本(含仓储管理条款)
- 夫妻离异后共同人寿保险合同修订协议
- 离婚财产分割及子女抚养责任、监护权转让合同
- 人音版小学六年级上册音乐教案(本)
- 19S406建筑排水管道安装-塑料管道
- 《福建省泰宁县》参考课件
- DIP 焊锡外观教材
- 中国儿童青少年身体活动指南
- 加油站人员培训和安全意识教育
- 全国职业大赛(中职)ZZ006水利工程制图与应用赛项赛题库共计10套
- 变压器租赁协议书x
- 高压电气设备试验的基本知识
- 整理我的小书桌(课件)小学劳动二年级通用版
- 危重产科患者麻醉管理
评论
0/150
提交评论