收藏 分享(赏)

《计算机操作系统》实验指导书.doc

上传人:dzzj200808 文档编号:2310383 上传时间:2018-09-10 格式:DOC 页数:28 大小:215.50KB
下载 相关 举报
《计算机操作系统》实验指导书.doc_第1页
第1页 / 共28页
《计算机操作系统》实验指导书.doc_第2页
第2页 / 共28页
《计算机操作系统》实验指导书.doc_第3页
第3页 / 共28页
《计算机操作系统》实验指导书.doc_第4页
第4页 / 共28页
《计算机操作系统》实验指导书.doc_第5页
第5页 / 共28页
点击查看更多>>
资源描述

1、计算机操作系统实验指导书(适合于计算机科学与技术专业)湖南工业大学计算机与通信学院二 O 一三 年 十月i前言计算机操作系统是计算机科学与技术专业的主要专业基础课程,其实践性、应用性很强。实践教学环节是必不可少的一个重要环节。计算机操作系统的实验目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握操作系统的基本原理,加深对操作系统基本方法的理解,加深对课堂知识的理解,为学生综合运用所学知识,在 Linux 环境下调用一些常用的函数编写功能较简单的程序来实现操作系统的基本方法、并在实践应用方面打下一定基础。要求学生在实验指导教师的帮助下自行完成各个操作环节,并能实现且达到举一反三的目的,完成

2、一个实验解决一类问题。要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,并且能够进行简单分析和判断;能够熟练使用 Linux 用户界面;掌握操作系统中进程的概念和控制方法;了解进程的并发,进程之间的通信方式,了解虚拟存储管理的基本思想。同时培养学生进行分析问题、解决问题的能力;培养学生完成实验分析、实验方法、实验操作与测试、实验过程的观察、理解和归纳能力。为了收到良好的实验效果,编写了这本实验指导书。在指导书中,每一个实验均按照该课程实验大纲的要求编写,力求紧扣理论知识点、突出设计方法、明确设计思路,通过多种形式完成实验任务,最终引导学

3、生有目的、有方向地完成实验任务,得出实验结果。任课教师在实验前对实验任务进行一定的分析和讲解,要求学生按照每一个实验的具体要求提前完成准备工作,如:查找资料、设计程序、完成程序、写出预习报告等,做到有准备地上机。进行实验时,指导教师应检查学生的预习情况,并对调试过程给予积极指导。实验完毕后,学生应根据实验数据及结果,完成实验报告,由学习委员统一收齐后交指导教师审阅评定。实验成绩考核:实验成绩占计算机操作系统课程总评成绩的 20%。指导教师每次实验对学生进行出勤考核,对实验效果作记录,并及时批改实验报告,综合评定每一次的实验成绩,在学期终了以平均成绩作为该生的实验成绩。有以下情形之一者,实验成绩

4、为不及格:1. 迟到、早退、无故缺勤总共 3 次及以上者;2. 未按时完成实验达 3 次及以上者;3. 缺交实验报告 2 次及以上者。ii目 录第一部分 实验环境及所用系统函数介绍 11.1 Linux 操作系统简介 .11.2 Linux 的使用 .11.2.1 vi 的使用 .11.2.2 gcc 的使用 21.2.3 主要系统调用函数 2第二部分 实验内容 5实验一 熟悉 LINUX 基本命令及编程环境 5实验二 进程管理 8实验三 进程调度 .12实验四 进程间通信 .17实验五 存储管理实验 .20.1.第一部分 实验环境及所用系统函数介绍DOS 操作系统是单道操作系统,无法进行多道

5、程序设计,Windows 环境下的Visual C+虽然也可用于多道程序设计,但是并不是完全的多道,因为它也可用于DOS 编程。所以我们的实验选用 Linux 操作系统。 Linux 操作系统是一个类 UINX 操作系统,是一个纯多道并发的网络操作系统。1.1 Linux 操作系统简介Linux 是一个多用户操作系统,是 UNIX 的一个克隆版本 (界面相同但内部实现不同),同时它是一个自由软件,是免费的、源代码开放的,这是它与 UNIX 的不同之处。现在,Linux 凭借优秀的设计,不凡的性能,加上 IBM、Intel、CA 、CORE、Oracle等国际知名企业的大力支持,市场份额逐步扩大

6、,已成为与 Windows 和 UNIX 并存的三大主流操作系统之一。1.2 Linux 的使用1.2.1 vi 的使用1) vi 的简单应用vi 是 linux 环境下赫赫有名的文本编辑工具之一。进入 vi 编辑器的方法: vi filename.c 注:文件名必须带有扩展名.c,如 filename.c 否则无法通过编译;进入 vi 后要按:按“i”键从命令方式切换到输入方式;从输入方式切换到命令方式的方法:按“Esc”键保存文件 :w保存文件并退出 :wq不保存文件退出 :q!注:以上操作必须在命令方式下进行。2) 其他常用 vi 操作命令j,k,h,l:上下左右0: 行首 $: 行尾

7、ctrl+f :后翻页 ctrl+b:前翻页 G : 文件尾 数字 G: 数字所指定行 i,I : 插入命令,i 在当前光标处插入, I 行首插入 .2.a,A: 追加命令,a 在当前光标后追加, A 在行末追加 o,O: 打开命令,o 在当前行下打开一行,O 在当前行上插入一行 x: 删除光标处字符 dd: 删除当前行 d0: 删除光标前半行 d$: 删除光标后半行 r,R : 替换命令, r 替换当前光标处字符, R 从光标处开始替换/string: 查找字符串 n : 继续查找 N : 反向继续查找 % :查找对应括号 u :取消上次操作 注:以上操作必须在命令方式下进行。1.2.2 g

8、cc 的使用gcc 是 linux 下的一种 c 程序编译工具,使用方法如下(有提示符#的情况):编译: gcc o filename1 filename.c其中: filename.c 是源文件名,filename1 是目标文件名,o 代表 object执行:./filenamel示例:键入一简单的程序:vi ab.c 按回车键输入以下代码段,#include#includemain()printf(“aaaa”);按 ESC 键,再按 “:WQ”(W 是保存,Q 是退出)出现提示符:root GGG-LINUX root#键入:gcc o ab ab.c 进行编译。执行:./ab1.2.3

9、 主要系统调用函数1.2.1 系统调用 fork()功能:创建一个新的进程. 头文件:#include 说明:本系统调用产生一个新的进程, 叫子进程, 是调用进程的一个复制品. 调用进程.3.叫父进程, 子进程继承了父进程的几乎所有的属性。 (1) 该子进程继承了父进程的程序空间,复制了父进程的数据段和栈段。也就是说不管是父进程还是子进程,在占有处理机后,都从 fork()调用的返回点开始运行;(2) 调用成功则对父进程返回子进程标识号 pid;(3) 调用成功对子进程返回 0, 这也是最方便的区分父子进程的方法。(4) 若调用失败则返回-1 给父进程, 子进程不生成。 注意:如果 fork(

10、)值0,0 的数即是子进程号。但这时是父进程占有处理机。1.2.2 系统调用 wait(pid_t pid; int sig;说明:向一个或一组进程发送一个信号,该信号由参数 sig 指定,为系统给出的信号表中的一个。Sig 是 signal 的缩写。.4.返回值: 调用成功则返回 0,否则返回-1. kill -STOP pid: 发送 SIGSTOP (17,19,23)停止一个进程,而并不消灭这个进程。kill -CONT pid: 发送 SIGCONT (19,18,25)重新开始一个停止的进程。kill -KILL pid: 发送 SIGKILL (9)强迫进程立即停止,并且不实施清

11、理操作。kill -9 -1: 终止拥有的全部进程。SIGKILL 和 SIGSTOP 信号不能被捕捉、封锁或者忽略。1.2.5 系统调用 lockf()功能:应用、检测或删除打开文件的一个 POSIX 锁语法:#include int lockf(int fd, int cmd, off_t len);说明:应用、检测或删除打开文件某部分的一个 POSIX 锁,文件通过 fd 指明,文件的描述符的请求操作通过 cmd 指明。#define F_ULOCK 0 解锁一个区域#define F_LOCK 1 上锁一个区域#define F_TLOCK 2 检测并上锁一个区域#define F_T

12、EST 3 检测一个区域是否上锁文件上锁区域的请求起始于隐含的偏移并包好 len 字节,假如 len 为负,从pospos+len-1,这里 pos 为当前文件位置,假如 len 为零,则位置从当前文件位置延伸延伸到无限长,包括当前和以后的文件最后的位置。在所有情况下,位置可延伸到以前当前的文件的最后位置。在 Linux 中,这称为 fcntl(2)的接口(一般会指明 lockf 和 fcntl 的关系) 。1.2.6 系统调用 pipe()是用来建立管道的。语法: #include int pipe(int fd2); 这里 fd1为写入端,fd0为读出端。功能:从管道里写或从管道里读。计算

13、机操作系统实验指导书.5.第二部分 实验内容实验一 熟悉 LINUX 基本命令及编程环境一、 实验类型本实验为验证性实验。二、 实验目的与任务1)熟悉使用 Linux 字符界面,窗口系统的常用命令;2)熟悉运用 Linux 常用的编程工具;3)熟悉运用 Linux 的在线求助系统。三、 预习要求1)熟悉一种操作系统的使用和安装,如 windows 操作系统的安装,DOS 系统的使用2)了解进程的概念及进程的状态3)熟悉 c 语言程序设计4)熟悉 c 语言程序编译过程四、 实验基本原理进入 Linux 操作系统后,控制终端的命令行输入方式下输入各种命令,并显示各种命令操作后的输出结果,操作包括文

14、件操作命令的使用,vi 命令的使用以及 gcc 编译器的使用,详细的各种命令及使用方式见第一部分的介绍。五、 实验仪器与设备(或工具软件)实验设备:计算机一台,软件环境要求:安装 Red Hat Linux 操作系统和 gcc编译器。六、 实验内容1)使用常用的操作命令 ls, cp, rm, mkdir, man, vi 等。2)熟悉怎么编辑一个程序(编辑,调试,运行见) ,输入一个简单的 C 程序进行练习,参考练习程序如下:程序 1#include计算机操作系统实验指导书.6.main()int p1;while(p1=fork()=-1);if(p1=0)putchar(B);else

15、putchar(A);程序 2#include#include “stdafx.h“main()int row,column,num,n=6;for(row=1;row=1;num-)printf(“%d“,num);for(num=2;nummain()int p1,p2;while(p1=fork()=-1);if(p1!=0) while(p2=fork()=-1);if(p2=0) putchar(b);else putchar(c);else putchar(a);运行结果:bca(或 bac)分析:从进程并发执行来看,输出 bac,acb 等情况都有可能。原因:fork()创建进程

16、所需的时间要多于输出一个字符的时间,因此在主程序创建进程的同时,进程 2 就输出了”b” ,而进程 2 和主程序的输出次序是随机的,所以出现上述结果。(2)进程的控制参考程序如下#includemain()int p1,p2,i;while (p1=fork()=-1);if(p1=0)for(i=0;imain()int p1,p2,i;while (p1=fork()=-1);if(p1=0)lock(1,1,0);for(i=0;iname=i;temp-runtime=rand()%20;temp-runedtime=0;temp-next=NULL;temp-killtime=0;i

17、f(i=0) top=temp; tail=temp; elsetail-next=temp;tail=temp;printf(“process name %d, runtime=%d, runedtime=%d,killtime=%dn“,tail-name,tail-runtime,tail-runedtime,tail-killtime); while(top!=NULL)runqueue=top;top=top-next;runqueue-next=NULL;runqueue-runtime= runqueue-runtime-timeslice;if(runqueue-runtime

18、killtime=runqueue-runtime+timeslice;runqueue-runedtime=runqueue-runedtime+runqueue-killtime;runqueue-runtime=0;printf(“process name %d, runtime=%d, runedtime=%d,killtime=%dn“,runqueue-name,runqueue-runtime,runqueue-runedtime,runqueue-killtime);elserunqueue-killtime=timeslice;runqueue-runedtime=runqu

19、eue-runedtime+runqueue-killtime;printf(“process name %d, runtime=%d, runedtime=%d,killtime=%dn“,runqueue-name,runqueue-runtime,runqueue-runedtime,runqueue-killtime);tail-next=runqueue;tail=tail-next;6)运行结果,包括各个进程的运行顺序,每次占用处理机的运行时间,可以参考下列输出如图 4.3。图 4.3 输出结果示意图七、 实验步骤1)进入 vi 编辑器2)在编译器中输入所要运行的程序代码3)退出编

20、辑器,返回命令行输入方式,使用 gcc 编译器编译程序,获得能运行的目标程序。4)运行目标程序,查看运行结果。计算机操作系统实验指导书.16.八、 注意事项1)修改时间片大小,查看对实验结果的影响。2)随机数的产生由 rand()函数实现,rand() 的输出随机数范围在 0215 之间,需要转换到 020 范围。3)注意链表节点的插入,删除方法。九、 实验报告要求需要列出运行了的程序清单及相应结果,并对结果进行分析和讨论。对结果的分析主要讨论时间片大小对程序执行的影响?计算机操作系统实验指导书.17.实验四 进程间通信 一、 实验类型本实验为设计性实验二、 实验目的与任务了解 Linux 系

21、统中的进程管道通信的基本原理,并能编写简单的管道通信的程序。三、 预习要求1)熟悉进程通信的概念2)熟悉管道通信的基本原理3)用到的系统调用有 pipe()四、 实验基本原理实验利用 Linux 操作系统提供的系统调用 pipe()来实现两个进程之间的通信。输入进程从管道的一端输入数据,另一个进程从管道的另一端读数据,通过这种方式来实现进程间的通信。五、 实验仪器与设备(或工具软件)实验设备:计算机一台,软件环境要求:安装 Red Hat Linux 操作系统和 gcc 编译器。六、 实验内容编制一段程序,实现进程管道通信。使用系统调用 pipe()建立一条管道。两个子进程 P1 和 P2 分

22、别向管道各写一句话:Child process 1 is sending message!Child process 2 is sending message!而父进程则从管道中读出来自两个子进程的信息,显示在屏幕上。参考程序程序如下#include#include#includeint pid1,pid2;main()计算机操作系统实验指导书.18.int fd2;char OutPipe100,InPipe100;pipe(fd);while(pid1=fork()=-1);if(pid1=0)lockf(fd1,1,0);sprintf(OutPipe,“n Child process

23、1 is sending message!n“);write(fd1,OutPipe,50);sleep(5);lockf(fd1,0,0);exit(0);elsewhile(pid2=fork()=-1);if(pid2=0)lockf(fd1,1,0);sprintf(OutPipe,“n Child process 2 is sending message!n“);write(fd1,OutPipe,50);sleep(5);lockf(fd1,0,0);exit(0);elsewait(0);read(fd0,InPipe,50);printf(“%sn“,InPipe);wait(

24、0);read(fd0,InPipe,50);printf(“%sn“,InPipe);exit(0);七、 实验步骤1)进入 vi 编辑器计算机操作系统实验指导书.19.2)在编译器中输入所要运行的程序代码3)退出编辑器,返回命令行输入方式,使用 gcc 编译器编译程序,获得能运行的目标程序。4)运行目标程序,查看运行结果。八、 注意事项1)管道按怎样的方式传送消息?是否能够双向传送消息?2)在管道通信方式中,如何来实现进程同步与互斥的?3)pipe()函数的使用可参看第一部分的介绍。九、 实验报告要求需要列出运行了的程序清单及相应结果,并对结果进行分析和讨论。对结果的分析主要讨论管道通信方

25、式的特点,实验结果是否体现该特点。计算机操作系统实验指导书.20.实验五 存储管理实验一、 实验类型本实验为综合性实验。二、 实验目的与任务1)理解动态异长存储分区资源管理2)掌握所需数据结构和管理程序3)了解各种存储分配算法的优点和缺点。4)编程实现动态不等长存储管理的模拟程序。三、 预习要求1)进程控制的概念及内容2)熟悉存储管理的概念3)了解动态分区管理的思想,熟悉分配算法和回收算法4)熟悉 c 语言编程,指针及结构体等知识5)数据结构中的链表的建立及基本操作四、 实验基本原理使用一个一维数组来模拟内存储空间,建立内存块来记录内存分配使用情况,通过随机产生进程及其所需要的内存来模拟真实的

26、进程。通过给进程分配内存及回收来实现对动态不等长存储管理方法。五、 实验仪器与设备(或工具软件)实验设备:计算机一台,软件环境要求:安装 Red Hat Linux 操作系统和 gcc 编译器。六、 实验内容1)实验中使用的数据结构(1) 内存块表,包括参数进程名 name;起始地址 address;长度 length;标志 flag,表示该块是否被分配。(2) 为简单起见,只设内存分配记录链表数据结构,用来记录内存分配与空闲情况。2)实验中假设有若干个进程,如 5 个,每个需要空间随机产生,为 020 之间的计算机操作系统实验指导书.21.整数,进程名字实验者自己定义,可以是一个整数。3)其

27、他一些参数,如内存空间的大小实验者自己定义,建议为 100;4)为了得到清晰的实验结果,建议先给每个进程分配存储空间,后进行回收。5)程序的流程图如图 5.1, 图 5.2, 图 5.3图 5.3 回收流程图6)参考程序#include “math.h“#include “stdafx.h“#include “stdio.h“仅右都为空闲节点仅左都为空闲节点查找链表,找到相应记录进程使用内存的节点分四种情况回收空间与合并左右节点,即修改相应参数,删除多余节点与左节点合并,即修改相应参数,删除多余节点与右节点合并,即修改相应参数,删除多余节点回收该节点,即修改有关参数回收结束左右都为空闲节点直接

28、修改该节点的参数左右都不为空闲节点建立链表初始化链表,表示整个存储空间对 5 个进程分别分配空间回收 1 个进程结束程序图 5.1 总的流程图否是查找链表,找到一个大于或等于进程所需空间的空闲节点|节点空间 -进程空间|name=-1;Header-address=0;Header-length=100;Header-flag=0;Header-next=NULL;srand(100);for(i=0;iname,t-address,t-length,t-flag);t=t-next;int processname=3;/回收printf(“回收 process name %dn“,proce

29、ssname);reclaim(processname,Header);t=Header;while(t!=0)printf(“process name %d, address=%d, length=%d,flag=%dn“,t-name,t-address,t-length,t-flag);t=t-next;processname=4;计算机操作系统实验指导书.23.printf(“回收 process name %dn“,processname);reclaim(processname,Header);t=Header;while(t!=0)printf(“process name %d,

30、 address=%d, length=%d,flag=%dn“,t-name,t-address,t-length,t-flag);t=t-next;return 1;int reclaim(int processname, MEMORY_BLOCK *Header)MEMORY_BLOCK *temp,*t,*tt;t=Header;temp=t;while(t-name!=processname)temp=t;t=t-next; if(t=0) printf(“no process“);return 0;else if(t-next!=NULL)if(temp-flag=0temp-le

31、ngth=temp-length+t-length+t-next-length;tt=t-next;temp-next=tt-next;delete tt;delete t;else if(temp-flag=0) /左为空temp-name=-1;temp-length=temp-length+t-length;temp-next=t-next;delete t;else if(t-next-flag=0) /右为空t-name=-1;t-length=t-length+t-next-length;t-flag=0;tt=t-next;t-next=tt-next;计算机操作系统实验指导书.

32、24.delete tt;else t-name=-1;t-flag=0;elseif(temp-flag=0) /左为空temp-name=-1;temp-length=temp-length+t-length;temp=t-next;delete t;else t-name=-1;t-flag=0;return 1;int allocation(MEMORY_BLOCK *Header,int name,int time)MEMORY_BLOCK *temp,*t,*tt;int thresh=2;t=Header;while(t!=0)if(t-lengthtimet=t-next;if

33、(t=0) printf(“no memory :%dn“,name); return 0;elseif(t-length-timethresh) /分割temp=new MEMORY_BLOCK;temp-name=-1;temp-flag=0;temp-length=t-length-time;temp-address=t-address+time;t-name=name;t-flag=1;计算机操作系统实验指导书.25.t-length=time;temp-next=t-next;t-next=temp;else /直接分配t-name=name;t-flag=1; return 1;7

34、)编写测试程序,对存储分配表进行初始化,存储分配情况和回收一个进程的存储空间后的结果在屏幕上显示出来,显示的结果如图 5.4 所示。图 5.4 模拟输出的示意图七、 实验步骤1)进入 vi 编辑器2)在编译器中输入所要运行的程序代码3)退出编辑器,返回命令行输入方式,使用 gcc 编译器编译程序,获得能运行的目标程序。4)运行目标程序,查看运行结果。八、 注意事项1)随机数的产生由 rand()函数实现,rand() 的输出随机数范围在 0215 之间,需要转换到 020 范围。2)节点的删除和插入方式。3)回收内存空间时,分四种情况讨论是否需要合并。九、 实验报告要求需要列出运行了的程序清单及相应结果,并对结果进行分析和讨论。对结果的分析主要讨论首次适应存储分配算法的优缺点,实验结果是如何体现的?

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

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报