刘阳操作系统实验报告.docx

上传人:scccc 文档编号:11228340 上传时间:2021-07-15 格式:DOCX 页数:27 大小:367.24KB
返回 下载 相关 举报
刘阳操作系统实验报告.docx_第1页
第1页 / 共27页
刘阳操作系统实验报告.docx_第2页
第2页 / 共27页
刘阳操作系统实验报告.docx_第3页
第3页 / 共27页
刘阳操作系统实验报告.docx_第4页
第4页 / 共27页
刘阳操作系统实验报告.docx_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《刘阳操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《刘阳操作系统实验报告.docx(27页珍藏版)》请在三一文库上搜索。

1、课程名称: 操作系统B 实验项目: 操作系统实验 实验地点: 逸夫楼402、逸夫楼502教室 专业班级: 软件1412 学生姓名: 刘 阳 学号: 2014005852 指导教师: 张俊花 2016年 12 月 1 日目 录实验一 几种操作系统的界面1一、目的和要求1二、内容1实验二 进程调度程序设计2一、目的和要求2二、示例2实验三 存储管理程序设计9一、目的和要求9二、提示9实验题目一、几种操作系统的界面实验目的和要求本实验的目的是使学生熟悉12种操作系统的界面,在熟练使用机器的基础上,能了解各种操作命令和系统调用在系统中的大致工作过程。也就是通过操作系统的外部特征,逐步深入到操作系统的内

2、部实质内容中去。能熟练的在12种操作系统的环境下工作,学会使用各种命令,熟悉系统提供的各种功能,主动而有效地使用计算机。熟悉系统实用程序的调用方法和各种系统调用模块的功能和作用。实验内容和原理 在某种操作系统的环境下建立、修改、运行、打印源程序和结果,最后撤消一个完整的程序。提示:可按下述步骤进行: 1.编写一个完整的源程序,通过编辑命令送入机器,建立源程序文件; 2.编译该源文件,建立相应的目标文件; 3.编译有错时,再用编辑命令修改源文件,消除全部词法和语法错误; 4.连接目标文件,形成可执行文件; 5.执行该文件,得到结果; 6.打印输出源程序和运行结果; 7.撤消本次实验中形成的所有文

3、件。程序清单 public class test public static void main(String args)int sum=0;int i;for(i=2;i=100;i=i+2)sum=i+sum;System.out.println(+sum);实验结果与分析 讨论、心得通过这次实验,我们练习了在Windows操作系统下,源程序的创建、编译和运行。熟悉了编译的基本步骤和指令以及如何进入文件夹,执行指令,浏览目录等指令。掌握了Windows的终端运行程序时的命令。实验一也是操作系统实验的基础,为后续的实验操作做铺垫。实验题目二、进程调度程序设计实验目的和要求(一) 目的 进程是

4、操作系统最重要的概念之一,进程调度是操作系统的主要内容,本实验要求学生独立地用高级语言编写一个进程调度程序,调度算法可任意选择或自行设计,本实验可使学生加深对进程调度和各种调度算法的理解。 (二) 要求1 设计一个有几个进程并发执行的进程调度程序,每个进程由一个进程控制块(PCB)表示,进程控制块通常应包括下述信息:进程名,进程优先数,进程需要运行的时间,占用CPU的时间以及进程的状态等,且可按照调度算法的不同而增删。2 调度程序应包含23种不同的调度算法,运行时可以任选一种,以利于各种方法的分析和比较。3 系统应能显示或打印各进程状态和参数的变化情况,便于观察。实验内容及原理1 题目 本程序

5、可选用优先数法或简单轮转法对五个进程进行调度。每个进程处于运行R(run)、就绪W(wait)和完成F(finish)三种状态之一,并假定起始状态都是就绪状态W。为了便于处理,程序中进程的运行时间以时间片为单位计算。各进程的优先数或轮转时间片数、以及进程需要运行的时间片数,均由伪随机数发生器产生。 进程控制块结构如表2-1所示: 表2-1PCB进程控制块链结构如图2-1所示:RUN HEAD TAIL图2-1 进程控制块链结构其中:RUN当前运行进程指针;HEAD进程就绪链链首指针; TAIL进程就绪链链尾指针。 2. 算法与框图程序框图如图2-2所示。图2-2 进程调度框图(1) 优先数法。

6、 进程就绪链按优先数大小从大到小排列,链首进程首先投入运行。每过一个时间片,运行进程所需运行的时间片数减1,说明它已运行了一个时间片,优先数也减3。理由是该进程如果在一个时间片中完成不了,优先级应降低一级。接着比较现行进程和就绪链链首进程的优先数,如果仍是现行进程高或者相同,就让现行进程继续运行,否则,调度就绪链链首进程投入运行。原运行进程再按其优先数大小插入就绪链,且改变它们对应的进程状态,直至所有进程都运行完各自的时间片数。(2)简单轮转法。 进程就绪链按各进程进入的先后次序排列,链首进程首先投入运行。进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项(相应于优先

7、数法的优先数记录项位置)。每过一个时间片,运行进程占用处理机的时间片数加1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等,若相等说明已到达轮转时间,应将现运行进程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片。主要仪器设备装有Win7系统的笔记本电脑操作方法与实验步骤#include #include #definefurthest 5structprocess/*PCB STRUCTURE*/ int id; int priority; int cputime; int alltime; char state; int next; v

8、oid init() /*CREATE A WAITING QUEUE*/ int i; head = 0; if (algo = 2) iffor (i = 1; ifurthest + 1; i+) prochaini.id = i;prochaini.priority = (rand() +prochaini.cputime = 0;void insert2() /*PUT A PROCESS ONTO THE prochaintail.next = run; tail = run;prochainrun.next = 0;TAIL OF THE QUEUE*/prochainfurth

9、est - 1; int procnum; int rand(); int algo;int run, head, tail, j; void print(); void insert(int q); void insert2(); void timesch(); void init(); void prisch();int main() /*MAIN PROGRAM*/ agan: printf(type the algorithm is (1:RR,2:PRIO):);scanf(%d, &algo); if (algo = 2) init(); prisch();11) % 41;pro

10、chaini.alltime = (rand() + prochaini.state = W; prochaini.next = 0;1) % 7;(prochaini.priorityprochainhead.priority) & (head != 0) prochaini.next = head; head = prochaini.id; insert(prochaini.id); elseprintf(output of priority.n);else for (j = 1; j = 40; j+) printf(nn);for (j = 1; j = 40; j+) printf(

11、nn);printf(system finishedn); getchar();printf(=); printf(=); if (algo = 1) else printf(try goto agan;printf(output of round init(); timesch();else run = head;prochainrun.state = R; head = prochainhead.next; prochainrun.next = 0; print();for (i = 1; ifurthest + 1; i+) head = 1; tail = furthest;proch

12、ainfurthest.next = 0;prochaini.id = i;prochaini.priority = (rand() + prochaini.cputime = 0; prochaini.alltime = (rand() + prochaini.state = W; prochaini.next = (i + 1) %robin.n);1) % 3 + 1;1) % 7;again,pleasen);(furthest + 1);void prisch() /*THE PROCESS WITH PRIO ALGORITHM*/ while (run != 0) prochai

13、nrun.cputime += 1; prochainrun.priority -= 3; prochainrun.alltime -= 1; if (prochainrun.alltime = 0) prochainrun.state = F; prochainrun.next = 0; if (head != 0) run = head;prochainrun.state = R; head = prochainhead.next;void print() /*PRINT THE RUNNING PROCESS,WAITING );printf(waiting queue.); print

14、f(n %d , p = head; while (p != 0) int k, p;for (k = 1; k = 40; k+)printf(=);QUEUE AND PCB SEQUENCE LIST*/printf(nrunning proc.prochainrun.id);printf(n);for (k = 1; k = 40; k+)printf(=); printf(n);printf( id ); for (k = 1; kfurthest + 1; k+)printf(%5d, prochaink.id); printf(n);printf(priority ); for

15、(k = 1; kfurthest + 1; k+)printf(%5d, printf(%5d, p); p = prochainp.next;prochain0.id = prochainrun.id; run = 0; else print();if (prochainrun.priority prochainrun.state = W; insert(run); run = head;prochainrun.state = R; head = prochainhead.next; prochainhead.priority) & (head != 0)prochaink.priorit

16、y);printf(n);printf(cputime ); for (k = 1; kfurthest + 1; k+)printf(%5d,prochaink.cputime);printf(n);printf(alltime ); for (k = 1; kfurthest + 1; k+)printf(%5d,void timesch() /*THE PROCESS WITH RR ALRORITHM*/ while (run != 0) prochainrun.alltime -= 1; prochainrun.cputime += 1; if (prochainrun.alltim

17、e = 0) prochainrun.state = F; prochainrun.next = 0; if (head != 0) else prochain0.id = run = 0; run = head;prochainrun.state = R; head = prochainhead.next;prochaink.alltime);printf(n);printf(state ); for (k = 1; kfurthest + 1; k+)printf(%5c,prochaink.state);printf(n);printf(next ); for (k = 1; kfurt

18、hest + 1; k+)printf(n);printf(%5d, prochaink.next);void insert(intq) /*INSERT A PROCESS*/ int p, s; p = head;s = prochainhead.next; whileprochainrun.id;(prochainq.priorityprochains.priority) & (s != 0) else print();if (prochainrun.cputime = prochainrun.state = W; prochainrun.cputime = 0; insert2();

19、run = head;prochainrun.state = R; head = prochainhead.next; priority) & (head != 0) p = s; s = prochains.next; prochainp.next = q; prochainq.next = s;prochainrun.实验结果与分析 实验心得 以实验一的操作和指令为基础,本次试验的目的在于加深对进程调度和各种调度算法的理解,故通过对优先数法和简单轮转法编辑程序实际运行来加深对这两种方法的理解。 对于简单轮转法,既将全部的进程按照进入的先后顺序排成一个就绪队列,设置每隔一段时间后将CPU分配

20、给队列中新的队首进程,这样就可以保证就绪队列中的所有进程在确定的时间段内都能获得一个时间片的处理机时间。 简单轮转法有效的保证了队列中的所有进程都能分配到处理机,而优先数法则可防止一个长作业长期的垄断处理机。 而对于优先数法,本次试验中使用了动态优先数对进程进行排序,即就绪队列按优先数从大到小进行排列,而各进程的优先数随着进程的推进而改变,以达到获取更好的调度性能的目的。 实验题目三、存储管理程序设计实验目的和要求(一) 目的存储管理的主要功能之一是合理地分配主存空间。请求页式管理是一种常用的虚拟存储管理技术。本实验的目的是通过请求页式存储管理中页面置换算法的模拟设计,来了解虚拟存储技术的特点

21、,掌握请求页式存储管理的页面置换算法。(二) 要求模拟页式虚拟存储管理中硬件的地址转换和缺页中断的处理过程,并用先进先出调度算法(FIFO)处理缺页中断。实验内容及原理(1) 为了装入一个页面而必须调出一页时,如果被选中调出的页面在执行中没有修改过,则不必把该页重新写到磁盘上(因磁盘上已有副本)。因此,在页表中可以增加是否修改过的标志,当执行“存”指令、“写”指令时把对应页的修改标志置成“1”,表示该页修改过,否则为“0”,表示该页未修改过。页表格式如表3-1所示。表3-1 页表格式 页 号 标 志 主存块号 修改标志 磁盘上的位置(2) 设计一个地址转换程序来模拟硬件的地址转换和缺页中断处理

22、过程。当访问的页在主存时则形成绝对地址,但不去模拟指令的执行,可用输出转换后的绝对地址来表示一条指令已完成。当访问的页不在主存时则输出“*该页页号”来表示硬件产生了一次缺页中断。模拟地址转换的程序流程如图3-1所示。(3) 编制一个FIFO页面调度程序。FIFO页面调度算法总是先调出作业中最先进入主存的那一页,因此,可以用一个数组来构成页号队列。数组中每个元素是该作业已在主存的页面号,假定分配给作业的主存块数为m,且该作业开始的m页已装入主存,则数组可由m个元素组成:P0,P1,Pm-1它们的初值为P0=0,P1=1,Pm-1= m-1用一指针k指示当要装入新页时应调出的页在数组的位置,k的初

23、值为“0”。 图3-1 地址转换和FIFO页面调度流程当产生缺页中断后,操作系统总是选择Pk所指出的页面调出,然后执行Pk=要装入的新页页号k=(k+1)mod m在实验中不必实际地启动磁盘执行调出一页和装入一页的工作,而用输出“OUT调出的页号”和“IN要装入的新页页号”来模拟一次调出和装入的过程。模拟程序的流程见图3-1。(4) 假定主存的每块长度为1024个字节,现有一个共7页的作业,其副本已在磁盘上。系统为该作业分配了4块主存块,且该作业的第0页至第3页已经装入主存,其余3页尚未装入主存,该作业的页表见表3-2所示。表3-2 作业的页表 页号 标志 主存块号 修改标志 在磁盘上的位置

24、0 1 5 0 011 1 1 8 0 012 2 1 9 0 013 3 1 1 0 021 4 0 0 022 5 0 0 023 6 0 0 121如果该作业依次执行的指令序列如表3-3所示。表3-3 作业依次执行的指令序列 操作 页号 页内地址 操作 页号 页内地址 + 0 070 移位 4 053 + 1 050 + 5 023 2 015 存 1 037 存 3 021 取 2 078 取 0 056 + 4 001 - 6 040 存 6 084依次执行上述的指令序列来调试你所设计的程序(仅模拟指令的执行,不必考虑指令序列中具体操作的执行)(5) 为了检查程序的正确性,可自行确定

25、若干组指令序列,运行设计的程序,核对执行结果。主要仪器设备笔记本电脑,VC+6.0操作方法与实验步骤源代码:#include #include #define number 12#define length 7struct pagelistint bnum;int id;int changeid;int location;pagelistlength;/页表struct actionchar name;int object;int add;actionnumber;/对页面的操作struct pagechainint page;int block;int next;pagechainlengt

26、h;/存放在块中的页int head;/pagechain的头指针int replace(int pnu);void caculate(int pnu,int leave)/计算物理地址传入页号和页内偏移int wadd;int i;int b;/*for(i=head;pagechaini.page=pnu;i=pagechaini.next)b=pagechaini.block;break;*/if(pagelistpnu.id=1)b=pagechainpnu.block;elseb=replace(pnu);/*if(b=0)b=replace(pnu);*/wadd=b*1024+l

27、eave;printf(n页号为%d的分页的物理地址:%dtt,pnu,wadd);int replace(int pnu)/页面置换int b,p;b=pagechainhead.block;p=pagechainhead.page;pagechainhead.page=pnu;pagelistpnu.bnum=b;pagelistpnu.id=1;pagelistp.id=0;pagelistp.bnum=0;head=pagechainhead.next; printf(n%d与%d互换tt,pnu,p);printf(%d进去,%d出来,pnu,p);return b;void ini

28、tPagelist()/初始化页表int k,b,l;for(k=0;klength;k+)if(k4)printf(n请输入第%d个页面所在的块的块号:,k);setbuf(stdin, NULL);scanf(%d,&b);pagelistk.bnum=b;pagelistk.id=1;elsepagelistk.bnum=0;pagelistk.id=0;pagelistk.changeid=0;printf(n请输入第%d个页面所在的磁盘位置:,k);setbuf(stdin, NULL);scanf(%d,&l);pagelistk.location=l;void initActio

29、n()/初始化操作表int i,b,c;char a;for(i=0;inumber;i+)printf(n请输入相应的操作页面及页内偏移(m:移位,d:取,g:存):);setbuf(stdin, NULL);scanf(%c,%d,%d,&a,&b,&c);actioni.name=a;actioni.object=b;actioni.add=c;void initPagechain()/初始化页的队列链int j;for(j=0;j4;j+)pagechainj.page=j;pagechainj.block=pagelistj.bnum;if(j=3)pagechainj.next=0

30、;elsepagechainj.next=j+1;void main()int k=0;int pag,address;char na;head=0;initPagelist();initAction();initPagechain();for(k=0;knumber;k+)na=actionk.name;pag=actionk.object;address=actionk.add;caculate(pag,address);if(na=g)pagelistpag.changeid=1;/caculate(pag,address);实验结果实验分析实验三难度略高于实验二。在进行实验的过程中应该注意:FIFO算法总是淘汰最先进入内存的页面,即选择在内存中驻留最久的页面予以淘汰,把一个进程已调入内存的页面按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面,但该算法与进程实际运行的规律不相适应,因为在进程中,有些页面经常被访问,比如含有全局变量,常用函数,例程等页面,FIFO算法并不能保证这些页面不被淘汰。

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1