计算机操作系统实验报告表格_第1页
计算机操作系统实验报告表格_第2页
计算机操作系统实验报告表格_第3页
计算机操作系统实验报告表格_第4页
计算机操作系统实验报告表格_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、=实验报告姓名 学号: 专业: 学年 第 学期年级班级: 阜阳师范学院Fuyang Teachers College 计算机与信息 学院实验课程:操作系统实验报告实验项目实验一:Linux入门实验目的1) 了解Linux运行环境的命令及使用格式 2) 熟悉Linux的常用基本命令3) 练习并掌握Linux下C语言程序的编写、编译、调试和运行方法。实验器材PC、虚拟机实验内容1) 熟悉Linux的常用基本命令如logout/exit、adduser、userdel、ls、cd、pwd、mkdir、rmdir、rm、cp、mv、cat、man等。2) 用vim编写一个简单的显示“hello wor

2、d!”的程序,用gcc编译并观察编译后的结果,运行生成的可执行文件。实验要求记录自己实验课上具体的操作内容、过程实验原理(指导)(一)介绍虚拟机安装以及使用方法利用软件技术,在母机hosts中虚拟出另外一台或者几台子机guests,而在子机中,可以随意进行任何操作,并且都不会影响主机。Vmware中创建的OS实际上是在硬盘上创建了一个文件夹,该OS中的所有东西都保存在这个文件夹中的文件里面。设置共享的路径:Windows: d:lin_shareLinux: /mnt/hgfs/sha_fd(二)常用基本命令的使用用root账号(超级用户)注册,口令为ubuntu(注意大小写)。注册成功出现#

3、号(超级用户系统提示符,普通用户的系统提示符为$)。命令格式:命令 选项 处理对象注意:(1)命令一般是小写字串。注意大小写有别 (2)选项通常以减号(-)再加上一个或数个字符表示,用来选择一个命令的不同操作 (3)同一行可有数个命令,命令间应以分号隔开 (4)命令后加上&可使该命令后台(background)执行命令名功能实例命令功能实例(三)使用编辑器vim 编辑文件vim提供二种工作模式:输入模式(insert mode)和命令模式(command mode)。1. 进入Linux的文本模式之后,在命令行键入vim filename.c 然后回车。首先vim命令是打开vim编辑器

4、。后面的filename.c是用户即将编辑的c文件名字,注意扩展名字是.c;也可以直接用vi打开一个新的未命名的文件,当保存的时候再给它命名,只是这样做不很方便。2. 最基本的命令I :当进入刚打开的文件时,不能写入信息,这时按一下键盘上的I键(insert),插入的意思,就可以进入编辑模式了(a与i是相同的用法)3. 当文件编辑完后,需要保存退出,这时需要经过以下几个步骤:1)按一下键盘上的Esc 键;2)键入冒号(:),紧跟在冒号后面是wq(意思是保存并退出)。如果不想保存退出,则在第二步键入冒号之后,键入!q(不带w,机尾部保存)。4. 在输入模式下,按ESC可切换到命令模式。命令模式下

5、,可选用下列指令离开vi:q!离开vi,并放弃刚在缓冲区内编辑的内容:wq将缓冲区内的资料写入磁盘中,并离开vi:ZZ同wq:x同wq:w将缓冲区内的资料写入磁盘中,但并不离开vi:q离开vi,若文件被修改过,则要被要求确认是否放弃修改的内容,此指令可与:w配合使用5. 退出vi编辑器的编辑模式之后,要对刚才编写的程序进行编译(四)GNU C编译器Linux上可用的C编译器是GNU C编译器。通常后跟一些选项和文件名来使用GCC编译器。GCC命令的基本用法如下: gcc options filenames。当不用任何选项编译一个程序时,GCC将建立(假定编译成功)一个名为a.out的可执行文件

6、。也可用-o选项来为即将产生的可执行文件指定一个文件名来代替a.out。例如:gcc o count count.c此时得到的可执行文件就不再是a.out,而是count。最后一步是运行程序,执行文件 格式: ./可执行文件名(五)GDB调试工具gdb是一个用来调试C和C+程序的强有力调试器。它使你能在程序运行时观察程序的内部结构和内存的使用情况。在编译时用 g 选项打开调试选项。命 令描 述file装入欲调试的可执行文件kill终止正在调试的程序list列出产生执行文件的源代码部分next执行一行源代码但不进入函数内部step执行一行源代码并进入函数内部run执行当前被调试的程序quit终止

7、gdbbreak在代码里设置断点,使程序执行到这里时被挂起make不退出gdb就可以重新产生可执行文件shell不离开gdb就执行UNIX shell 命令实验过程【任务】:编写一简单程序,对其编译、调试并执行程序体实验结果及分析注意事项实验小结教师评语实验成绩教师签名实验日期实验报告实验项目实验二:Linux进程控制实验目的1) 加深对进程概念的理解,明确进程和程序的区别; 2) 进一步认识并发执行的概念,区别顺序执行和并发执行;3) 掌握进程创建的方法4) 熟悉进程的睡眠,同步和撤销等进程控制方法5) 分析进程争用临界资源的现象,学习解决进程互斥的方法;实验器材PC、虚拟机实验内容1) 编

8、写一段程序,使用系统调用fork()创建两个子进程。各进程显示不同的信息,如父进程显示字符“a”,子进程分别显示字符“b”和“c”。多次运行观察显示结果,并分析产生这种执行效果的原因。2) 修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分析原因3) 一个父进程创建一个子进程,子进程通过exec系统调用执行另一个文件。各自的代码中显示不同的信息,从其运行结果可看出两个进程并发执行的效果。4) 利用wait()来控制进程执行顺序,并用exit()来终止进程执行,分析wait( )是如何实现进程同步的5) 选作:如果在程序中使用调用lockf()来

9、给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。实验要求1) 仔细观察实验中的各种现象及出现的问题。分析产生各种现象的原因。寻找解决问题的办法。2) 实验报告中给出程序的主要语句并且加入相应的注释即可,程序太多时不需要给出程序的全部语句,给出输出的结果及对各种现象的分析意见实验原理(指导)(一)所涉及的系统调用函数名功能调用格式1fork( ) 创建一个新进程。Int pid=fork( )说明:fork( )返回值意义如下:0:在子进程中,pid变量保存的fork( )返回值为0,表示当前进程是子进程。>0:在父进程中,pid变量保存的fork( )返回值为子进程的i

10、d值(进程唯一标识符)。-1:创建失败。如果fork( )调用成功,它向父进程返回子进程的PID,并向子进程返回0,即fork( )被调用了一次,但返回了两次。函数名功能调用格式2getpid( ) 取得目前进程的识别码(进程ID),int getpid()3getppid( ) 取得目前进程的父进程识别码int getppid()说明:头文件 #include<unistd.h>函数名功能调用格式4execl ( ) 把一个新程序装入内存,来改变调用进程的执行代码,从而形成新进程int execl(path,arg0,arg1,.argn,0);char *path,*arg0,

11、*arg1,.,*argn;说明:如果exec( )调用成功,调用进程将被覆盖,然后从新程序的入口开始执行,这样就产生了一个新进程,新进程的进程标识符id 与调用进程相同,exec( )没有建立一个与调用进程并发的子进程,而是用新进程取代了原来进程。系统调用exec和fork( )联合使用能为程序开发提供有力支持。用fork( )建立子进程,然后在子进程中使用exec( ),这样就实现了父进程与一个与它完全不同子进程的并发执行。头文件: #include<unistd.h>函数名功能调用格式5wait( ) 等待子进程运行结束int wait(status)int *status;

12、其中,status是用户空间的地址。说明:如果子进程没有完成,父进程一直等待。wait( )将调用进程挂起,直至其子进程因暂停或终止而发来软中断信号为止。如果在wait( )前已有子进程暂停或终止,则调用进程做适当处理后便返回函数名功能调用格式6exit( )终止进程的执行void exit(status) int status;其中,status是返回给父进程的一个整数,说明:exit(0)正常终止;exit(1)异常终止函数名功能调用格式7lockf(files,function,size)用作锁定文件的某些段或者整个文件。int lockf(files,function,size)int

13、 files,function;long size;其中:files是文件描述符;function是锁定和解锁:1表示锁定,0表示解锁。size是锁定或解锁的字节数,为0,表示从文件的当前位置到文件尾。(二) 进程创建程序实示例:#include<stdio.h> main() int p; while(p=fork()=-1); /*进程创建失败*/ if(p=0) printf(“This is a child process.”);/*在子进程中*/ else printf(“This is a parent process.”);/*在父进程中*/ 实验过程【子任务1】:使

14、用系统调用函数fork( )创建子进程,用getpid( )获取父子进程的ID号,用getppid( )获取子进程的父进程的ID,记录实验结果,观察并分析它们之间的关系。程序体实验结果及分析【子任务2】:修改程序,用fork( )建立子进程,然后在子进程中使用execl( ),记录实验结果,并对实验结果进行分析系统调用函数excel( )的工作原理。程序体实验结果及分析【子任务3】:修改程序,编写一段程序,使用系统调用fork()创建两个子进程。各进程显示不同的信息。多次运行观察结果,分析执行效果的原因,说明进程并发执行的特点。程序体实验结果及分析【子任务4】:修改程序,使用系统调用wait(

15、 )、exit( )和sleep( ),实现简单的进程同步,多次运行观察结果,分析执行效果的原因,说明如何使得进程实现简单的同步。程序体程序体实验结果及分析注意事项实验小结教师评语实验成绩教师签名实验日期实验报告实验项目实验三:Linux进程通信实验目的4) 了解什么是信号以及熟悉Linux系统中进程之间软中断通信的基本原理5) 了解什么是管道以及熟悉Linux支持的管道通信方式6) 了解什么是消息以及熟悉消息传送的机理实验器材PC、虚拟机实验内容任务一:进程的软中断通讯任务二:进程的管道通信任务三:消息通信实验原理(指导)(一)所涉及的系统调用函数名功能调用格式1kill( ) 发送者进程发

16、送信号。int kill(pid,sig) int pid,sig说明:其中,pid是一个或一组进程的标识符,参数sig是要发送的软中断信号。(1)pid>0时,核心将信号发送给进程pid。(2)pid=0时,核心将信号发送给与发送进程同组的所有进程。(3)pid=-1时,核心将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程。函数名功能调用格式2signal( ) 预置对信号的处理方式,允许调用进程控制软中断信号。signal(sig,function) int sig;void (*func) ( )说明:头文件 #include <signal.h>其中s

17、ig用于指定信号的类型,sig为0则表示没有收到任何信号,常用如下表:值名 字说 明01SIGHUP挂起(hangup)02SIGINT中断,当用户从键盘按c键或break键时03SIGQUIT退出,当用户从键盘按quit键时16SIGUSR1用户自定义信号117SIGUSR2用户自定义信号218SIGCLD某个子进程死function 的解释如下:(1)function=1时,进程对sig类信号不予理睬,亦即屏蔽了该类信号;(2)function=0时,缺省值,进程在收到sig信号后应终止自己;(3)function为非0,非1类整数时,function的值即作为信号处理程序的指针。函数名功

18、能调用格式3pipe( ) 建立一无名管道。int pipe(filedes);int filedes2;其中,filedes1是写入端,filedes0是读出端。说明:头文件: #include <unistd.h>#inlcude <signal.h>#include <stdio.h>函数名功能调用格式4read( ) 从fd所指示的文件中读出nbyte个字节的数据,并将它们送至由指针buf所指示的缓冲区中。如该文件被加锁,等待,直到锁打开为止。int read(fd,buf,nbyte);int fd;char *buf; unsigned nbyt

19、e;5write( )把nbyte 个字节的数据,从buf所指向的缓冲区写到由fd所指向的文件中。如文件加锁,暂停写入,直至开锁。int write(fd,buf,nbyte)int fd;char *buf;unsigned nbyte;函数名功能调用格式6msgget( )创建一个消息,获得一个消息的描述符。int msgget(key,flag)key_t key;int flag;说明:其中,key是用户指定的消息队列的名字;flag是用户设置的标志和访问方式。如:IPC_CREAT |0400 是否该队列已被创建。无则创建,是则打开;IPC_EXCL |0400 是否该队列的创建应是

20、互斥的。msgqid 是该系统调用返回的描述符,失败则返回-1。位置到文件尾。函数名功能调用格式7.msgsnd( )发送一消息。向指定的消息队列发送一个消息,并将该消息链接到该消息队列的尾部。int msgsnd(msgqid,msgp,size,flag)int msgqid,size,flag;struct msgbuf * msgp;说明:其中,msgqid是返回消息队列的描述符;msgp是指向用户消息缓冲区的一个结构体指针。缓冲区中包括消息类型和消息正文,即 long mtype; /*消息类型*/ char mtext ; /*消息的文本*/ size指示由msgp指向的数据结构中

21、字符数组的长度;即消息的长度。flag规定当核心用尽内部缓冲空间时应执行的动作,进程是等待(若在标志flag中未设置IPC_NOWAIT位),还是立即返回(若是设置IPC_NOWAI)。函数名功能调用格式8.msgrcv( )接受一消息。从指定的消息队列中接收指定类型的消息。int msgrcv(msgqid,msgp,size,type,flag) int msgqid,size,flag;struct msgbuf *msgp;long type;说明:其中,msgqid,msgp,size,flag与msgsnd中的对应参数相似,type是规定要读的消息类型,flag规定倘若该队列无消息

22、,核心应做的操作。如此时设置了IPC_NOWAIT标志,则立即返回,若在flag中设置了MS_NOERROR,且所接收的消息大于size,则核心截断所接收的消息。函数名功能调用格式9.msgctl( )消息队列的操纵。读取消息队列的状态信息并进行修改,如查询消息队列描述符、修改它的许可权及删除该队列等。int msgctl(msgqid,cmd,buf); int msgqid,cmd;struct msgqid_ds *buf;说明:其中,函数调用成功时返回0,不成功则返回-1。buf是用户缓冲区地址,供用户存放控制参数和查询结果;cmd是规定的命令实验过程【任务1】:修改参考程序,使用系统

23、调用fork()创建子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按DEL或ctrl+c键);当捕捉到中断信号后,父进程用系统调用kill()向子进程发出信号,子进程捕捉到信号后输出下列信息后终止: stop 子进程ID by signal 16(或17)! Child Processl is Killed! 父进程等待子进程终止后,输出如下的信息后终止 stop 父进程ID by signal 2! Parent Process is Killed!实验要求分析利用软中断通信实现进程同步的机理,signal()放在程序的不同位置处-,记录输出结果并分析原因,修改参考程

24、序,按任务中要求的输出结果形式输出,若需要修改程序,直接在参考程序上修改,并加注释。参考程序修改后程序# include<stdio.h># include<signal.h># include<unistd.h>int wait_mark;void waiting(),stop();main() int p1; while(p1=fork()=-1); if(p1>0) wait_mark=1;signal(SIGINT,stop);waiting();kill(p1,16);printf(“parent process is killed!n”);

25、else wait_mark=1; signal(16,stop);waiting();printf(“child process is killed!n”);void waiting() while(wait_mark!=0);void stop() wait_mark=0;实验结果及分析【任务2】:用系统调用pipe( )建立一管道,二个子进程P1和P2分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message!父进程从管道中读出二个来自子进程的信息并显示。实验要求(1)要求先接收P1,后P2(2)必须考虑其

26、中都有哪些同步和互斥,同时向管道输入端写的字节数必须和从输出端读的字节数一致,若不一致,则会出现什么问题。(3)修改参考程序,按任务中要求的输出结果形式输出,若需要程序,直接在参考程序上修改,并加注释。参考程序修改后程序#include <unistd.h>#include <signal.h>#include <stdio.h>main( ) int pid1,pid2;int fd2;char outpipe100,inpipe100;pipe(fd);while (pid1=fork( )= =-1);if(pid1= =0)sprintf(outpi

27、pe,"child 1 process is sending message!"); write(fd1,outpipe,50); elsewhile(pid2=fork( )= =-1);if(pid2= =0) sprintf(outpipe,"child 2 process is sending message!"); write(fd1,outpipe,50); else read(fd0,inpipe,50); printf("%sn",inpipe);read(fd0,inpipe,50);printf("%sn

28、",inpipe);实验结果及分析【任务3】:使用系统调用msgget( ),msgsnd( ),msgrev( ),及msgctl( )编制一长度为k的消息发送(client.c)和接收(server.c)的程序。实验要求(1) 二个程序分别编辑、编译为client与server。(2) 执行:./server&ipcs -q./client(3) 观察上面的程序,记录实验结果,说明控制消息队列系统调用msgctl () 在此起什么作用?(4) (选作:为了便于操作和观察结果,用一个程序为“引子”,先后fork()两个进程,server和client 进行通信。)若需要程序

29、,直接在参考程序上修改,并加注释。参考程序修改后程序1client.c#include <sys/types.h>#include <sys/msg.h>#include <sys/ipc.h>#define MSGKEY 75struct msgform long mtype; char mtext1000;msg;int msgqid;void client() int i;msgqid=msgget(MSGKEY,0777); for(i=10;i>=1;i-) msg.mtype=i;printf(“(client)sentn”);msgsnd

30、(msgqid,&msg,1024,0); exit(0);main( ) client( );2server.c#include <sys/types.h>#include <sys/msg.h>#include <sys/ipc.h>#define MSGKEY 75struct msgform long mtype; char mtext1000;msg;int msgqid;void server( )msgqid=msgget(MSGKEY,0777|IPC_CREAT); do msgrcv(msgqid,&msg,1030,0,

31、0); printf(“(server)receivedn”);while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0); exit(0);main( ) server( );实验结果及分析实验结果及分析注意事项实验小结教师评语实验成绩教师签名实验日期实验报告实验项目实验四:页面置换算法模拟实验目的1) 进一步掌握虚拟存储器的工作原理2) 通过实验理解和掌握FIFO,LRU,OPT三种页面置换算法3) 比较各种页面置换算法的优缺点实验器材PC、虚拟机实验内容任务一:编译opt.c和lru.c实现OPT和LRU置换算法任务二:参照前两个算法自行编写代码,实现FI

32、FO置换算法。任务三:在一个程序中同时实现OPT,LRU和FIFO三种置换算法。实验原理(指导)(一)所涉及的系统调用函数名功能调用格式1srand( )随机数发生器的初始化函数void srand(unsigned seed);说明:使用的头文件:#include <stdlib.h>用法:它需要提供一个种子,参数seed是rand()的种子,用来初始化rand()的起始值。有以下几种常用的方法:l srand(unsigned) time(NULL); 直接传入一个空指针l srand(int)getpid(); 使用进程的ID(getpid()来作为初始化种子,在同一个程序中

33、这个种子是固定的。函数名功能调用格式2rand( ) 产生随机数的一个随机函数。int rand();说明:(1) srand (seed)中指定的seed开始,返回一个seed, RAND_MAX(0x7fff))间的随机整数(2) rand()可以生成0RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlib.h 中定义的一个整数,它与系统有关。(3) rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)。(4) 如果给seed指定的是一个定值,那么每次程序运行时ran

34、d()产生的值都会一样,虽然这个值会是seed, RAND_MAX(0x7fff))之间的一个随机取得的值。(5) 如果在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)再调用rand()一样(1也是一个定值)。(6) 一个通用的公式是:要取得a,b)之间的随机整数,使用(rand() % (b-a))+ a (结果值将含a不含b)。实验过程【任务1】:编译opt.c和lru.c实现OPT和LRU置换算法实验要求多次执行,查看置换算法的详细置换过程及结果参考程序Opt.cLru.c#include <stdio.h> #include <s

35、tdlib.h>#include <time.h> #define N 12 #define B 3 #define P 5 int isInBuf(int buf, int x, int *p) int i, j = -1; for (i = 0; i < B; i+) if(bufi = x) j = i; break; else if (bufi = -1) (*p)+; bufi = x; j = i; break; if(j=-1) (*p)+; return j; int oldopt(int i, int buf , int list , int f )

36、int k, h, j=0, max=-1; for (k = 0; k < B; k+) for (h = i; h < N; h+) if (bufk = listh) fk = h; break; if(h=N) fk = N; for (k = 0; k < B; k+) if (max < fk) max = fk; j = k; return j;int main() int listN; int changeN; int bufB,fB,i,j,k; int resultBN; int old; int absent; srand(int)time(NUL

37、L);printf("n The Random List:n"); for (i = 0; i < N; i+) listi = rand() % P+1; printf("%3d", listi); printf("n-n"); printf("nOPT:n"); absent=0; for(i = 0; i < B; i+) bufi = fi = -1; for(i = 0; i < N; i+) j=isInBuf(buf, listi,&absent); if(j= -1) /需

38、置换页面 old=oldopt(i, buf, list, f); changei=bufold; bufold = listi; else changei=-1; for(k=0;k<B;k+) resultki=bufk; printf("the result is:n"); for(i=0;i<B;i+) for(j=0;j<N;j+) printf("%3d",resultij); printf("n"); printf("nthe page is changed:n"); for(i=0

39、;i<N;i+) if(changei= -1) printf(" "); else printf("%3d",changei); printf("nabsent:%dn",absent); printf("the absent vote is:%fn",(float)absent/N);#include <stdio.h>#include <stdlib.h>#include <time.h>#define N 12 #define B 3 #define P 5 int

40、 isInBuf(int buf, int x, int *p) int i, j = -1; for (i = 0; i < B; i+) if(bufi = x) j = i; break; else if (bufi = -1) (*p)+; bufi = x; j = i; break; if(j=-1) (*p)+; return j; int oldlru(int f ) int i, j = 0, max = -1; for (i = 0; i < B; i+) if(fi > max) max = fi; j = i; fi+; return j; int m

41、ain() int listN; int changeN; int bufB, fB, i, j,k; int resultBN; int old; int absent;srand(int)time(NULL); printf("n The Random List:n"); for (i = 0; i < N; i+) listi = rand() % P+1; printf("%3d", listi); printf("n-n"); printf("nLRU:n"); absent = 0; for(i

42、= 0; i < B; i+) bufi = fi = -1; for(i = 0; i < N; i+) j = isInBuf(buf, listi,&absent); old = oldlru(f); if(j= -1) changei=bufold; bufold = listi; fold = 0; else fj=0; changei=-1; for(k=0;k<B; k+) resultki=bufk; printf("the result is:n"); for(i=0;i<B;i+) for(j=0;j<N;j+) p

43、rintf("%3d",resultij); printf("n"); printf("nthe page is changed:n"); for(i=0;i<N;i+) if(changei= -1) printf(" "); else printf("%3d",changei); printf("nabsent:%dn",absent); printf("the absent vote is:%fn",(float)absent/N);实验结果及

44、分析【任务2】:参照前两个算法自行编写代码,实现FIFO置换算法。程序实验结果及分析【任务3】:在一个程序中同时实现OPT,LRU和FIFO三种置换算法。程序实验结果及分析注意事项实验小结教师评语实验成绩教师签名实验日期实验报告实验项目实验五:简单多用户文件系统实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现实验器材PC、虚拟机实验内容为LINUX 设计一个简单的二级文件系统。要求做到以下几点:1、可以实现下列几条命令(至少4条)Login用户登录Dir列文件目录Create创建文件Delete删除文件Open打开文件Close关闭文件Read读文件Write写文

45、件2、列目录时要列出文件名、物理地址、保护码和文件长度3、源文件可以进行读写保护实验原理(指导)(一)程序设计的思想系统采用两级目录,其中第一级对应于用户帐号,第二级对应于用户帐号下的文件。另外,为了简单本文件系统未考虑文件共享、文件系统安全以及管道文件于设备文件等特殊内容(二)主要文件操作的处理过程1、打开文件open 检索目录。内核调用namei从根目录或从当前目录,沿目录树查找指定的索引结点。若未找到或该文件不允许存取,则出错处理返回NULL,否则转入下一步; 分配内存索引结点。如果该文件已被其它用户打开,只需对上一步中所找到的i结点引用计数+1,否则应为被打开文件分配一内存i结点,并调

46、用磁盘读过程将磁盘i结点的内容拷贝到内存i结点中,并设置i.count=1;分配文件表项。为已打开的文件分配一文件表项,使表项中的f.inode 指向内存索引结点; 分配用户文件描述表项。 2、创建文件creat 核心调用namei,从根目录或当前目录开始,逐级向下查找指定的索引结点。此时有以下二种情况: 重写文件。namei找到了指定i结点,调用free释放原有文件的磁盘块。此时内核忽略用户指定的许可权方式和所有者,而保持原有文件的存取权限方式和文件主。最后打开。 新建。namei未找到。调用ialloc,为新创建的文件分配一磁盘索引结点,并将新文件名及所分配到的i结点编号,写入其父目录中,

47、建立一新目录项。 利用与open相同的方式,把新文件打开。3、关闭文件close 根据用户文件描述符fd,从相应的用户文件描述符表项中,获得指向文件表项的指针fp,再对该文件表项中的f.count-1。4、检索目录namei 用户在第一次访问某文件时,需要使用文件的路径名,系统按路径名去检索文件目录,得到该文件的磁盘索引结点,且返回给用户一个fd。以后用户便可利用该fd来访问文件,这时系统不需再去检索文件目录。 namei根据用户给出的路径名,从高层到低层顺序地查找各级目录,寻找指定文件的索引结点号。检索时,对以'/'开头的路径名,须从根目录开始检索,否则,从当前目录开始,并把

48、与之对应的i结点作为工作索引结点,然后用文件路径名中的第一分量名与根或与当前目录文件中的各目录项的文件名,逐一进行比较。由于一个目录文件可能占用多个盘块,在检索完一个盘块中所有目录项而未找到匹配的文件分量名时,须调用bmap和bread过程,将下一个盘块中的所有目录项读出后,再逐一检索。若检索完该目录文件的所有盘块而仍未找到,才认为无此文件分量名。 检索方式采用Hash方法。(三)主要数据结构1、i节点 struct inode2、磁盘i节点 struct dinode3、目录项结构 struct direct4、超级块 struct filsys5、用户密码 struct pwd6、目录 struct dir7、查找内存 i节点的hash表 struct hinode8、系统打开表 struct file9、用户打开表 struct user(四)主要函数1、i节点内容获取函数iget( ) 2、i节点内容释放函数iput( ) 3、目录创建函数mkdir( ) 4、目录搜索函数namei( )5、磁盘块分配函数balloc( )6、磁盘块释放函数bfree( )7、分配i节点区函数ialloc(

温馨提示

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

评论

0/150

提交评论