计算机基于Linux的操作系统实验指导书.doc

上传人:仙人指路1688 文档编号:2388353 上传时间:2023-02-17 格式:DOC 页数:30 大小:144.50KB
返回 下载 相关 举报
计算机基于Linux的操作系统实验指导书.doc_第1页
第1页 / 共30页
计算机基于Linux的操作系统实验指导书.doc_第2页
第2页 / 共30页
计算机基于Linux的操作系统实验指导书.doc_第3页
第3页 / 共30页
计算机基于Linux的操作系统实验指导书.doc_第4页
第4页 / 共30页
计算机基于Linux的操作系统实验指导书.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《计算机基于Linux的操作系统实验指导书.doc》由会员分享,可在线阅读,更多相关《计算机基于Linux的操作系统实验指导书.doc(30页珍藏版)》请在三一办公上搜索。

1、计算机操作系统课程实验实验授课计划序号实验项目学时要求实验类型实验要求实验时间1认识Linux 系统;Vi 编辑器、编译工具 gcc的使用 2必修验证上机练习1-2周2进程控制2必修验证运行命令、例程并分析结果3-4周3银行家算法的模拟实现 4必修综合编程并运行通过5-8周4Linux 内存管理 2必修验证运行命令、例程并分析结果9-10周5页面置换算法的模拟实现(存储管理)2必修综合编程并运行通过11-12周6Linux设备管理、Linux文件管理 4选修验证运行命令、例程并分析结果13-14周实验一:认识Linux 系统【实验目的】了解Linux的启动过程;了解Linux文件的组织结构;熟

2、悉X Window 环境;熟练掌握Linux 常用命令。【准备知识】登录 Linux是一个多用户多任务操作系统,多个用户可以拥有自己独立的用户账号登录提示: Red Hat Linux release 6.0 (Hedwing) Kernel 2.2.5-15 on an i686 Login:此时输入用户户名(账号)并键入回车,则系统显示“passward”。在输入密码和回车。登录后:roothawk/root#表示是按root方式登录,$表示是普通用户。Linux大小写敏感,用“-”加参数zlinux:# ls FHowTo/ HowToMin/ linux nag/ sag/获取帮助:L

3、inux带有联机手册,可以用man命令来阅读 Zlinux:$ man ls虚拟终端 Linux可有多个用户登录到同一个计算机,但一般微机只有一个终端难以体现。可以使用多个虚拟终端,用Alt+F1、 Alt+F2等来切换。退出系统 在停止使用系统时,要退出系统。具体方法:exit或logout,或Ctrl+D关机 如果没有用户在使用系统,可以关机。但是不能直接关闭电源,而要按正常顺序关机。一般用户是不能关机的,只有root用户可以关机。方法:可以使用halt或shutdown命令,也可以同时键入Ctrl+Alt+Del。Windows 虚拟机环境:登录到系统点击桌面“VMware”图标 Vmw

4、are Workstation窗口CommandsStart this virtual machine进入fedora后,用户名:root 口 令:123456【实验内容】(1) 熟悉开机、登录、退出、关机步骤。(2) 查看并记录所在机器Linux操作系统目录结构,特别是源代码所在的目录及文件。(3) 常用命令练习1 注销(退出)系统:logout 或exit2练习使用命令ls(注意Linux命令区分大小写。)使用ls 查看当前目录内容;使用ls 查看指定目录内容,如/目录,/etc目录使用ls all 查看当前目录内容;使用dir 查看当前目录内容 3使用cd改变当前目录cd . 回到上层目

5、录 ;cd / 回到根目录4pwd 显示当前路径 5建立目录mkdir mkdir 目录名 ; mkdir /home/s2001/newdir 6删除目录:rmdir;7复制文件cp: 如 cp 文件名1 文件名28移动文件或目录: mv 9删除文件 rm10. 显示文件内容:more (分页显示); 11. 显示文件:cat 文件名 建立文件:cat 文件名,ctrl+d结束输入 (4) 启动X WINDOW ,熟悉窗口界面环境。实验二:Vi 编辑器、编译工具 gcc的使用【实验目的】熟练使用Linux的Vi编辑器;掌握Linux 编译工具gcc 的使用方法。【准备知识】设计程序需要一个环

6、境编辑和编译器。Linux的Vi为一个编辑器,gcc是C的编译器。由他们实现源文件的的编辑和目标文件的编译执行。【实验内容】1 练习使用Linux 编辑器Vi,为今后输入源程序做准备。2 学习并掌握Linux 编译工具 gcc 的使用方法【实验指导】使用编辑器vi 编辑文件1. 进入linux的文本模式之后,在命令行键入vi filename.c 然后回车。下面作一些简单的解释:首先vi命令是打开vi编辑器。后面的filename.c是用户即将编辑的c文件名字,注意扩展名字是.c;当然,vi编辑器功能很强,可以用它来编辑其它格式的文件,比如汇编文件,其扩展名字是.s;也可以直接用vi打开一个新

7、的未命名的文件,当保存的时候再给它命名,只是这样做不很方便。2. 最基本的命令I :当进入刚打开的文件时,不能写入信息,这时按一下键盘上的I键(insert),插入的意思,就可以进入编辑模式了。如下图所示: 3. a与i是相同的用法4. 当文件编辑完后,需要保存退出,这时需要经过以下几个步骤:1)按一下键盘上的Esc 键;2)键入冒号(:),紧跟在冒号后面是wq(意思是保存并退出)。如果不想保存退出,则在第二步键入冒号之后,键入!q(不带w,机尾部保存)。如下图所示:5. 退出vi编辑器的编辑模式之后,要对刚才编写的程序进行编译。编译的命令是:gcc filename.c -o outputf

8、ilename,其中gcc是c的编译器。参数:filename.c 是刚才编辑的c 文件(当然也可以是以前编写好的c文件);后面中括号里面的参数是可选的,它是一个输出文件。如果不选,默认的输出文件是a.out ,选了之后输出文件就是outputfilename.out6. 最后一步是运行程序,方法如下:./outputfilename.out实验三:进程控制【实验目的】(1)加深对进程概念的理解,明确进程和程序的区别。 (2)进一步认识并发执行的实质。 (3)分析进程竞争资源现象,学习解决进程互斥的方法。【准备知识】(1)阅读Linux的sched.h源文件,加深对进程管理概念的理解。(2)阅

9、读Linux的fork.c源文件,分析进程的创建过程。(3)fork()函数:创建一个新进程int fork()其中返回int取值意义如下:0:创建子进程,从子进程返回的id值大于0:从父进程返回的子进程id值【实验内容】(1)进程的创建 编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察纪录屏幕上的显示结果,并分析原因。(2)进程的控制 修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分

10、析原因。 【思考】 (1)系统是怎样创建进程的? (2)可执行文件加载时进行了哪些处理? (3)当首次调用新创建进程时,其入口在哪里?【实验指导】1 进程的创建任务编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。程序#includemain()int p1=0,p2=0;if(p1 =fork() /*子进程创建成功*/ putchar(b);else if(p2=fork() /*子进程创建成功*/ p

11、utchar(c); else putchar(a); /*父进程执行*/bca(有时会出现bac)分析:从进程执行并发来看,输出bac,acb等情况都有可能。原因:fork()创建进程所需的时间多于输出一个字符的时间,因此在主进程创建进程2的同时,进程1就输出了“b”,而进程2和主程序的输出次序是有随机性的,所以会出现上述结果。2 进程的控制 修改已编写好的程序,将每个程序的输出由单个字符改为一句话,再观察程序执行时屏幕上出现的现象,并分析其原因。如果在程序中使用系统调用lockf()来给每个程序加锁,可以实现进程之间的互斥,观察并分析出现的现象。程序#includemain()int p1

12、,p2,i;if(p1=fork() for(i=0;i500;i+) printf(child %dn,i);else if(p2=fork() for(i=0;i500;i+) printf(son %dn,i); else for(i=0;i500;i+) printf(daughter %dn,i);运行结果child.sondaughterdaughter或childsonchildsondaughter分析:由于函数printf()输出的字符串之间不会被中断,因此,字符串内部的字符顺序输出时不变。但是 , 由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先

13、后随着执行的不同而发生变化。这与打印单字符的结果相同。实验四:银行家算法的模拟实现【实验目的】(1)进一步理解利用银行家算法避免死锁的问题;(2)在了解和掌握银行家算法的基础上,编制银行家算法通用程序,将调试结果显示在计算机屏幕上,再检测和笔算的一致性。(3)理解和掌握安全序列、安全性算法。【实验内容】(1) 正确设置相应的数据结构;(2) 清晰画出算法流程图;(3) 准确实现教材第97-98页例题。【实验原理】一、安全状态指系统能按照某种顺序如(称为序列为安全序列),为每个进程分配所需的资源,直至最大需求,使得每个进程都能顺利完成。 二、银行家算法假设在进程并发执行时进程i提出请求j类资源k

14、个后,表示为Requestij=k。系统按下述步骤进行安全检查:(1)如果RequestiNeedi则继续以下检查,否则显示需求申请超出最大需求值的错误。(2)如果RequestiAvailable则继续以下检查,否则显示系统无足够资源,Pi阻塞等待。(3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值: Availablej=Availablej-Requestij; Allocationi,j=Allocationi,j+Requestij; Needi,j=Needi,j-Requestij;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将

15、资源分配给进程Pi,以完成本次分配;否则, 将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。三、安全性算法(1)设置两个向量: 工作向量Work: 它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work=Available; Finish: 它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finishi=false; 当有足够资源分配给进程时, 再令Finishi=true。(2)从进程集合中找到一个能满足下述条件的进程: Finishi=false; Needi,jWorkj; 若找到, 执行步骤(3), 否则,执行步骤(

16、4)。(3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: Workj=Worki+Allocationi,j; Finishi=true; go to step 2; (4)如果所有进程的Finishi=true都满足, 则表示系统处于安全状态;否则,系统处于不安全状态。【实验指导】参考实验步骤如下:(1)参考图1-1所示流程图编写安全性算法。Y所有finish都为true?输出安全序列NYN存在Finishi =false&Needij Needij出错返回:return(error)Requestij Availablej出错返回:(进程阻塞)return

17、(error)Availablej = Availablej RequestijAllocationij= Allocationij + RequestijNeedij = Needij Requestij假定分配:输入初始参数(资源分配及请求情况)开始 假定分配之后,系统安全吗?申请成功。输出各种数据的变化图1-2银行家算法流程图实验五:Linux 内存管理【实验目的】理解需要动态存储分配的原因;掌握如何进行动态分配。【准备知识】分配内存空间所使用的函数调用如下#includevoid *malloc(size_t size);函数用于分配动态内存空间,size表示申请分配的内存空间的大小,

18、以字节记。释放原先配置的函数#includevoid free(void *ptr);参数ptr为指向先前由malloc()函数所返回的内存指针。调用free后ptr所指的内存空间会被收回。假如参数ptr所指的内存空间已被收回获是未知的内存地址,则调用free可能有无法预料的情况发生。若参数ptr为NULL则free()不会有作用。Read()函数:#includeSsize_t read(int fd,void *buf,size_t count);Read()会把参数fd所指的文件传送count个字节到buf指针所指的内存中。若参数count 为0,则read()不会有作用并返回0。返回值

19、为实际读到的字节数,如果返回0,表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动。 fstat()函数: #include #includeint fstat(int filedes,struct stat *buf);函数用来将参数filedes所指的文件状态,复制到参数buf所指的结构中(struct stat)。执行成功则返回0,失败返回-1。 【实验内容】(1) 编写程序完成以下功能:a.申请一块内存空间b.复制字符串”hello”到分配的内存c.打印出该字符串及内存地址d.释放申请的内存空间(2) 编写程序完成以下功能:在打开文件后,通过fstat()获得文件

20、长度,然后通过malloc()系统调用申请响应大小的内存空间,通过read()将文件内容完全读入该内存空间,并显示出来。【实验指导】用malloc申请空间:#include #include #include #include int main(void) char *str; if (str = malloc(10) = NULL) printf(Not enough memory to allocate buffern); exit(1); /* terminate program if out of memory */ /* copy Hello into string */ strcp

21、y(str, Hello); /* display string */ printf(String is %sn, str); /* free memory */ free(str); return 0; 显示/etc/passwd文件大小读指定长度空间:#include#include#includemain() struct stat buf;char *str;int fd,fsize;fd=open(“/etc/passwd”,O_RDONLY)fsize=fstat(fd,&buf);printf(“/etc/passwd file size =%dn”,buf.st_size);

22、if (str = malloc(fsize) = NULL) printf(Not enough memory to allocate buffern); exit(1); /* terminate program if out of memory */ if (bytes = read(fd, str, fsize) = -1) printf(Read Failed.n); exit(1); else printf(Read: %d bytes read.n, bytes); return 0; 实验六:页面置换算法的模拟实现(存储管理)【实验目的】存储管理的主要功能之一是合理地分配空间。

23、请求页式管理是一种常用的虚拟存储管理技术。本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的技术特点,掌握请求页式存储管理的页面置换算法。【实验内容】(1)通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成: 50%的指令是顺序执行的; 50%的指令是均匀分布在前地址部分; 50%的指令是均匀分布在后地址部分。 具体的实施方法是: 在 0,319 的指令之间随即选取一起点m; 顺序执行一条指令,即执行地址为m+1的指令; 在前地址0,m+1中随机选取一条指令并执行,该指令的地址为m; 顺序执行一条指令,其地址为 m+ 1; 在后地址m+ 2,319中

24、随机选取一条指令并执行; 重复上述步骤-,直到执行320次指令。 (2)将指令序列变换为页地址流 设:页面大小为1k; 用户内存容量为4页到32页; 用户虚存容量为32k。 在用户虚存中,按每k存放10条指令排在虚存地址,即320条指令在虚存中的存放方式为: 第0条-第9条指令为第0页(对应虚存地址为0,9); 第10条-第19条指令为第一页(对应虚存地址为10,19); 第310条第319条指令为第31页(对应虚地址为310,319)。 按以上方式,用户指令可组成32页。 (3)计算并输出下述各种算法在不同内存容量下的命中率。 先进先出的算法(FIFO); 最近最少使用算法(LRR); 最佳

25、淘汰算法(OPT)先淘汰最不常用的页地址; 最少访问页面算法(LFR); 最近最不经常使用算法(NUR)。 其中和为选择内容。命中率=1-页面失效次数/页地址流长度 在本实验中,页地址流长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。3、随机数产生办法,Linux或UNIX系统提供函数strand()和rand(),分别进行初始化和产生随机数。例如: strand (); 语句可初始化一个随机数; a0=10*rand()/65535*319+1; a1=10*rand()/65535*a0;语句可用来产生a0与a1中的随机数。【实验指导】设计一个虚拟存储区和内

26、存工作区,并使用下列算法计算访问命中率.(1) 进先出的算法(FIFO)(2) 最近最少使用的算法(LRU)(3) 最佳淘汰算法(OPT)(4) 最少访问页面算法(LFU)(5) 最近最不经常使用算法(NUR)命中率=(1-页面失效次数)/页地址流长度程序设计本实验的程序设计基本上按照实验内容进行。即首先用srand()和rand()函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。相关定义如下:1 数据结构(1)页面类型 typedef struct int pn,pfn,counter,time; pl-type;其中pn 为页号,pfn为面号

27、, counter为一个周期内访问该页面的次数, time为访问时间.(2) 页面控制结构pfc-struct int pn,pfn; struct pfc_struct *next; typedef struct pfc_struct pfc_type;pfc_type pfc_structtotal_vp,*freepf_head,*busypf_head;pfc_type *busypf_tail; 其中pfctotal_vp定义用户进程虚页控制结构,*freepf_head为空页面头的指针,*busypf_head为忙页面头的指针,*busypf_tail为忙页面尾的指针.2函数定义(

28、1)Void initialize( ):初始化函数,给每个相关的页面赋值.(2)Void FIFO( ):计算使用FIFO算法时的命中率.(3)Void LRU( ):计算使用LRU算法时的命中率.(4)Void OPT( ):计算使用OPT算法时的命中率.(5)Void LFU( ):计算使用LFU算法时的命中率.(6)Void NUR( ):计算使用NUR算法时的命中率.3.变量定义(1)int atotal_instruction: 指令流数据组.(2)int pagetotal_instruction: 每条指令所属的页号.(3)int offsettotal_instruction

29、: 每页装入10条指令后取模运算页号偏移值.(4)int total_pf: 用户进程的内存页面数.(5)int disaffect: 页面失效次数.4.程序参考源码及结果#include #include #include #define TRUE 1#define FALSE 0#define INVALID -1#define NUL 0#define total_instruction 320 /*指令流长*/#define total_vp 32 /*虚页长*/#define clear_period 50 /*清零周期*/typedef struct /*页面结构*/int pn,

30、pfn,counter,time;pl_type;pl_type pltotal_vp; /*页面结构数组*/struct pfc_struct /*页面控制结构*/ int pn,pfn; struct pfc_struct *next;typedef struct pfc_struct pfc_type;pfc_type pfctotal_vp,*freepf_head,*busypf_head,*busypf_tail;int diseffect,atotal_instruction;int pagetotal_instruction, offsettotal_instruction;v

31、oid initialize();void FIFO();void LRU();void OPT();void LFU();void NUR();int main()int S,i;srand(int)getpid(); S=(int)rand()%390; for(i=0;itotal_instruction;i+=1) /*产生指令队列*/ai=S; /*任选一指令访问点*/ai+1=ai+1; /*顺序执行一条指令*/ai+2=(int)rand()%390; /*执行前地址指令m*/ai+3=ai+2+1; /*执行后地址指令*/S=(int)rand()%390;for(i=0;it

32、otal_instruction;i+) /*将指令序列变换成页地址流*/ pagei=ai/10;offseti=ai%10;for(i=4;i=32;i+) /*用户内存工作区从4个页面到32个页面*/printf(%2d page frames,i);FIFO(i);LRU(i);OPT(i);LFU(i);NUR(i);printf(n);return 0;void FIFO(total_pf) /*FIFO(First in First out)ALGORITHM*/int total_pf; /*用户进程的内存页面数*/int i;pfc_type *p, *t;initializ

33、e(total_pf); /*初始化相关页面控制用数据结构*/busypf_head=busypf_tail=NUL; /*忙页面队列头,对列尾链接*/for(i=0;inext;plbusypf_head-pn.pfn=INVALID; /*释放忙页面队列中的第一个页面*/freepf_head=busypf_head;freepf_head-next=NUL;busypf_head=p;p=freepf_head-next; /*按方式调新页面入内存页面*/freepf_head-next=NUL;freepf_head-pn=pagei;plpagei.pfn=freepf_head-p

34、fn;if(busypf_tail=NUL)busypf_head=busypf_tail=freepf_head;elsebusypf_tail-next=freepf_head;busypf_tail=freepf_head;freepf_head=p;printf(FIFO:%6.4F,1-(float)diseffect/320);void LRU(total_pf)int total_pf;int min,minj,i,j,present_time;initialize(total_pf);present_time=0;for(i=0;itotal_instruction;i+) i

35、f(plpagei.pfn=INVALID) /*页面失效*/ diseffect+;if(freepf_head=NUL) /*无空闲页面*/min=32767;for(j=0;jplj.time&plj.pfn!=INVALID)min=plj.time;minj=j;freepf_head=&pfcplminj.pfn;plminj.pfn=INVALID;plminj.time=-1;freepf_head-next=NUL;plpagei.pfn=freepf_head-pfn;plpagei.time=present_time;freepf_head=freepf_head-nex

36、t;elseplpagei.time=present_time;present_time+;printf(LRU:%6.4f,1-(float)diseffect/320);void NUR(total_pf)int total_pf;int i,j,dp,cont_flag,old_dp;pfc_type *t;initialize(total_pf);dp=0;for(i=0;itotal_instruction;i+)if(plpagei.pfn=INVALID) /*页面失效*/diseffect+;if(freepf_head=NUL) /*无空闲页面*/cont_flag=TRUE;old_dp=dp;while(cont_flag)if(pldp.counter=0&pldp.pfn!=INVALID)cont_flag=FALSE;elsedp+;if(dp=total_vp)dp=0;if(dp=old_dp)for(j=0;jnext=NUL;plpagei.pfn=freepf_head-pfn;freepf_head=freepf_head-next;else

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号