太原XX大学操作系统实验报告课案.doc

上传人:牧羊曲112 文档编号:4990253 上传时间:2023-05-28 格式:DOC 页数:22 大小:368.50KB
返回 下载 相关 举报
太原XX大学操作系统实验报告课案.doc_第1页
第1页 / 共22页
太原XX大学操作系统实验报告课案.doc_第2页
第2页 / 共22页
太原XX大学操作系统实验报告课案.doc_第3页
第3页 / 共22页
太原XX大学操作系统实验报告课案.doc_第4页
第4页 / 共22页
太原XX大学操作系统实验报告课案.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《太原XX大学操作系统实验报告课案.doc》由会员分享,可在线阅读,更多相关《太原XX大学操作系统实验报告课案.doc(22页珍藏版)》请在三一办公上搜索。

1、课程名称: 操作系统B 实验项目: 操作系统实验 实验地点: 逸夫楼 专业班级: 软件14班 学生姓名: 学号: 2014 指导教师: 张辉 2016年 12 月 2 日目录2实验一 几种操作系统的界面3一目的和要求3二内容3三程序代码3四运行结果4实验二 进程调度程序设计5一、目的和要求5二、示例5程序清单7运行结果12实验三 存储管理程序设计13一、目的和要求13二、提示13三流程图14程序代码15运行结果20实验感想21参考资料21实验一 几种操作系统的界面一目的和要求(一) 目的8 在熟练使用机器的基础上,能了解各种操作命令和系统调用在系统中的大致工作过程。也就是通过操作系统的外部特征

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

3、本次实验中形成的所有文件。三程序代码#include stdio.h#includeiostreamusing namespace std;void main()int a;cin a;cout 怎么编写程序: aendl;四运行结果1.2.Dos命令行。1. 按住Windows键+R输入notepad回车调出记事本。2. 编辑一个java程序选择另存为d:。3. 按住Windows键+R输入cmd回车。4. 进入Dos界面键入d:。5. 输入dir查看java文件,使用javac命令进行编辑实验二 进程调度程序设计一、目的和要求(一) 目的进程是操作系统最重要的概念之一,进程调度是操作系统的

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

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

6、序框图如图2-2所示。priority是 输入调度算法alog 开始 alog=priority/round robin?生成并按优先数大小排列进程控制块链进程时间片数为0?从链首取一个进程投入运行生成并按进入次序排列进程控制块链链首进程投入运行时间片到,进程时间片数减1,优先数减3运行进程退出,排到进程链尾部 撤消该进程链首进程投入运行时间片到,进程时间片数减1,占用CPU时间加1优先数大于链首进程?进程时间片数为0? 撤消该进程运行进程退出,按优先数插入进程链从链首取一个进程投入运行 结束 结束 进程队列空?进程队列空?是是是否否否否否是round robin占用处理机时间片到?否是图2-

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

8、中的轮转时间片数记录项(相应于优先数法的优先数记录项位置)。每过一个时间片,运行进程占用处理机的时间片数加1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等,若相等说明已到达轮转时间,应将现运行进程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片。 程序清单#include #include #define furthest 5int algo;struct process /*PCB STRUCTURE*/int id;int priority;int cputime;int alltime;char state;int next;pro

9、chainfurthest - 1;int procnum;int rand();int run, head, tail, j;int main() /*MAIN PROGRAM*/agan: printf(type the algorithm is(1:RR, 2 : PRIO) :);scanf(%d, &algo);if (algo = 2)printf(output of priority.n);void init();void prisch();elseif (algo = 1)printf(output of round robin.n);void init();void time

10、sch();elseprintf(try again, pleasen);goto agan;for (j = 1; j = 40; j+)printf( = );printf(nn);for (j = 1; j = 40; j+)printf( = );printf(nn);printf(system finishedn);void print() /*PRINT THE RUNNING PROCESS,WAITING QUEUE AND PCB SEQUENCE LIST*/int k, p;for (k = 1; k = 40; k+)printf( = );printf(nrunnin

11、g proc.);printf(waiting queue.);printf(n %d , prochainrun.id);p = head;while (p != 0)printf( % 5d, p);p = prochainp.next;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 (k = 1; kfurthest + 1;

12、k+)printf( % 5d, prochaink.priority);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, prochaink.alltime);printf(n);printf(state);for (k = 1; kfurthest + 1; k+)printf( % 5c, prochaink.state);

13、printf(n);printf(next);for (k = 1; kfurthest + 1; k+)printf( % 5d, prochaink.next);printf(n);void insert(int q) /*INSERT A PROCESS*/int p, s;p = head;s = prochainhead.next;while (prochainq.priorityprochains.priority) & (s != 0)p = s;s = prochains.next;prochainp.next = q;prochainq.next = s;void inser

14、t2() /*PUT A PROCESS ONTO THE TAIL OF THE QUEUE*/prochaintail.next = run;tail = run;prochainrun.next = 0;void init() /*CREATE A WAITING QUEUE*/int i;head = 0;if (alog = 2)for (i = 1; ifurthest + 1; i+)prochaini.id = i;prochaini.priority = (rand() + 11) % 41;prochaini.cputime = 0;prochaini.alltime =

15、(rand() + 1) % 7;prochaini.state = W;prochaini.next = 0;if (prochaini.priorityprochainhead.priority) & (head != 0)insert(prochaini.id);elseprochaini.next = head;head = prochaini.id;elsefor (i = 1; ifurthest + 1; i+)prochaini.id = i;prochaini.priority = (rand() + 1) % 3 + 1;prochaini.cputime = 0;proc

16、haini.alltime = (rand() + 1) % 7;prochaini.state = W;prochaini.next = (i + 1) % (furthest + 1);head = 1;tail = furthest;prochainfurthest.next = 0;run = head;prochainrun.state = R;head = prochainhead.next;prochainrun.next = 0;print();void prisch() /*THE PROCESS WITH PRIO ALGORITHM*/while (run != 0)pr

17、ochainrun.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;elseprochain0.id = prochainrun.id;run = 0;elseif (prochainrun.priority prochainhead

18、.priority) & (head != 0)prochainrun.state = W;insert(run);run = head;prochainrun.state = R;head = prochainhead.next;print();void timesch() /*THE PROCESS WITH RR ALRORITHM*/while (run != 0)prochainrun.alltime -= 1;prochainrun.cputime += 1;if (prochainrun.alltime = 0)prochainrun.state = F;prochainrun.

19、next = 0;if (head != 0)run = head;prochainrun.state = R;head = prochainhead.next;elseprochain0.id = prochainrun.id;run = 0;elseif (prochainrun.cputime = prochainrun.priority) & (head != 0)prochainrun.state = W;prochainrun.cputime = 0;insert2();run = head;prochainrun.state = R;head = prochainhead.nex

20、t;print();运行结果 输入1输入2实验三 存储管理程序设计一、目的和要求(一) 目的存储管理的主要功能之一是合理地分配主存空间。请求页式管理是一种常用的虚拟存储管理技术。本实验的目的是通过请求页式存储管理中页面置换算法的模拟设计,来了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。(二) 要求模拟页式虚拟存储管理中硬件的地址转换和缺页中断的处理过程,并用先进先出调度算法(FIFO)处理缺页中断。二、实验内容和原理(1) 为了装入一个页面而必须调出一页时,如果被选中调出的页面在执行中没有修改过,则不必把该页重新写到磁盘上(因磁盘上已有副本)。因此,在页表中可以增加是否修改过的标

21、志,当执行“存”指令、“写”指令时把对应页的修改标志置成“1”,表示该页修改过,否则为“0”,表示该页未修改过。页表格式如表3-1所示。(2)表3-1 页表格式 页 号 标 志 主存块号 修改标志 磁盘上的位置(3) 设计一个地址转换程序来模拟硬件的地址转换和缺页中断处理过程。当访问的页在主存时则形成绝对地址,但不去模拟指令的执行,可用输出转换后的绝对地址来表示一条指令已完成。当访问的页不在主存时则输出“*该页页号”来表示硬件产生了一次缺页中断。模拟地址转换的程序流程如图3-1所示。(4) 编制一个FIFO页面调度程序。FIFO页面调度算法总是先调出作业中最先进入主存的那一页,因此,可以用一个

22、数组来构成页号队列。数组中每个元素是该作业已在主存的页面号,假定分配给作业的主存块数为m,且该作业开始的m页已装入主存,则数组可由m个元素组成:P0,P1,Pm-1它们的初值为P0=0,P1=1,Pm-1= m-1用一指针k指示当要装入新页时应调出的页在数组的位置,k的初值为“0”。 j= Pkj页的修改标志=1? 输出“OUTj” Pk=L k=(k+1) mod m 修改页表 输出“IN L” 取一条指令 开始 页标志=1? 输出绝对地址取一条指令输出“页号” 取指令中访问的页号L 查页表 形成绝对地址 置L页修改标志”1” 结束 是”存”指令?有后继指令?否(产生缺页中断)是否否否是是模

23、拟硬件地址转换模拟FIFO页面调度是 图3-1 地址转换和FIFO页面调度流程当产生缺页中断后,操作系统总是选择Pk所指出的页面调出,然后执行Pk=要装入的新页页号k=(k+1)mod m在实验中不必实际地启动磁盘执行调出一页和装入一页的工作,而用输出“OUT调出的页号”和“IN要装入的新页页号”来模拟一次调出和装入的过程。模拟程序的流程见图3-1。(5) 假定主存的每块长度为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依次执行上述的指令序列来调试你所设计的程序(仅模拟指令的执行,不必考虑指令序列中具体操作的执行)(6) 为了检

25、查程序的正确性,可自行确定若干组指令序列,运行设计的程序,核对执行结果。 三、操作方法与实验步骤程序清单:#definesize1024/定义块的大小,本次模拟设为1024个字节。#includestdio.h#includestring.h#includestructplistintnumber;/页号intflag;/标志,如为1表示该页已调入主存,如为0则还没调入。intblock;/主存块号,表示该页在主存中的位置。intmodify;/修改标志,如在主存中修改过该页的内容则设为1,反之设为0intlocation;/在磁盘上的位置;/模拟之前初始化一个页表。structplistp1

26、7=0,1,5,0,010,1,1,8,0,012,2,1,9,0,013,3,1,1,0,021,4,0,-1,0,022,5,0,-1,0,023,6,0,-1,0,125;/命令结构,包括操作符,页号,页内偏移地址structilistcharoperation10;intpagenumber;intaddress;/在模拟之前初始化一个命令表,通过程序可以让其顺序执行。structilistp212=+,0,72,5+,1,50,*,2,15,save,3,26,load,0,56,-,6,40,+,4,56,-,5,23,save,1,37,+,2,78,-,4,1,save,6,8

27、6;main()printf(模拟页式虚拟存储管理中硬件的地址转换和用先进先出调度算法处理缺页中断n);inti,lpage,pflage,replacedpage,pmodify;intp4=0,1,2,3;intk=0;intm=4;longmemaddress;for(i=0;i12;i+)/作业执行指令序列,12个lpage=p2i.pagenumber;/获取页号pflage=p1lpage.flag;/标志,是否在内存中printf(%s,%d,%d,p2i.operation,p2i.pagenumber,p2i.address);printf(in.%d,lpage);if(p

28、flage=0)/如果页面不在内存中printf(replacepage%d,lpage);/置换replacedpage=pk;pmodify=p1replacedpage.modify;if(pmodify=1)printf(*out.%d,replacedpage);elseprintf(out.%d,replacedpage);pk=lpage;k=(k+1)%m;p1lpage.flag=1;/标志位改为1p1lpage.block=p1replacedpage.block;p1replacedpage.block=-1;p1replacedpage.flag=0;p1replace

29、dpage.modify=0;memaddress=p1lpage.block*size+p2i.address;if(p2i.operation=save)p1lpage.modify=1;printf(nmemaddressis%ldn,memaddress);= #includestdio.h#definesize1024structplistintnumber;intflag;intblock;intmodify;intlocation;structplistp17=0,1,5,0,010,1,1,8,0,012,2,1,9,0,013,3,1,1,0,021,4,0,-1,0,022

30、,5,0,-1,0,023,6,0,-1,0,121;structilistcharoperation10;intpagenumber;intaddress;structilistp212=+,0,70,+,1,50,*,2,15,存,3,21,取,0,56,-,6,40,移位,4,53,+,5,23,存,1,37,取,2,78,+,4,1,存,6,84;main()inti,lpage,pflage,replacedpage,pmodify;intp4=0,1,2,3;intk=0;intm=4;longmemaddress;printf(n操作t页号t页内地址标志绝对地址修改页号页架号绝对地址n);for(i=0;i%dt,p2i.pagenumber,replacedpage);printf(%dt,p1lpage.block);printf(%dt,memaddress);printf(n);四、实验结果与分析22

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号