《上海大学操作系统(二)实验报告(全).doc》由会员分享,可在线阅读,更多相关《上海大学操作系统(二)实验报告(全).doc(39页珍藏版)》请在三一办公上搜索。
1、精选优质文档-倾情为你奉上评分: SHANGHAI UNIVERSITY操作系统实验报告学 院 计算机工程与科学专 业 计算机科学与技术学 号 学生 计算机操作系统实验一报告实验一 题目 : 操作系统的进程调度 : 佳慧 学号 : 实验日期 : 2015.1实验环境 : Microsoft Visual Studio实验目的 :进程是操作系统最重要的概念之一, 进程调度又是操作系统核心的主要容。 本实习要求学生独立地用高级语言编写和调试一个简单的进程调度程序。调度算法可任意选择或自行设计。例如,简单轮转法和优先数法等。本实习可加深对于进程调度和各种调度算法的理解。实验容:1、设计一个有n个进程
2、工行的进程调度程序。每个进程由一个进程控制块(PCB)表示。进程控制块通常应包含下述信息:进程名、进程优先数、进程需要运行的时间、占用CPU的时间以及进程的状态等,且可按调度算法的不同而增删。2、调度程序应包含23种不同的调度算法,运行时可任意选一种,以利于各种算法的分析比较。3、系统应能显示或打印各进程状态和参数的变化情况,便于观察诸进程的调度过程。操作过程:1、本程序可选用优先数法或简单轮转法对五个进程进行调度。每个进程处于运行R(run)、就绪W(wait)和完成F(finish)三种状态之一,并假设起始状态都是就绪状态W。为了便于处理,程序进程的运行时间以时间片为单位计算。进程控制块结
3、构如下:进程控制块结构如下: PCB进程标识数链指针优先数/轮转时间片数占用 CPU 时间片数进程所需时间片数进程状态进程控制块链结构如下:其中:RUN当前运行进程指针;HEAD进程就绪链链首指针;TAID进程就绪链链尾指针。2、 算法与框图(1) 优先数法。进程就绪链按优先数大小从高到低排列,链首进程首先投入运行。每过一个时间片,运行进程所需运行的时间片数减 1,说明它已运行了一个时间片,优先数也减 3,理由是该进程如果在一个时间片中完成不了, 优先级应该降低一级。 接着比较现行进程和就绪链链首进程的优先数,如果仍是现行进程高或者相同,就让现行进程继续进行,否则,调度就绪链链首进程投入运行。
4、 原运行进程再按其优先数大小插入就绪链, 且改变它们对应的进程状态,直至所有进程都运行完各自的时间片数。(2) 简单轮转法。进程就绪链按各进程进入的先后次序排列,进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项 (相当于优先数法的优先数记录项位置) 。每过一个时间片,运行进程占用处理机的时间片数加 1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等, 若相等说明已到达轮转时间, 应将现运行进程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片。(3) 程序框图运行结果:Priority算法:Round Robin算
5、法:实验代码:/操作系统实验-进程调度#include #include #include #include const long n=5;struct pcbtype/进程控制块结构long id, priority, runtime, totaltime;char status;/R, W, F - 运行,就绪,完成PCBn+1;long linkn+1;/链表结构long RUN, HEAD, TAIL;/选择算法long ChooseAlgo()char s128;printf(Please type the Algorithm(PriorityRound Robin):);gets(
6、s);if (s0=P | s0=p)return 1;return 0;/初始化void init()long i;for (i=1; i=n; i+)PCBi.id = i;PCBi.priority = rand()%4+1;PCBi.runtime = 0;PCBi.totaltime = rand()%8+1;PCBi.status = W;/显示进程调度状况void showit()long i;printf(=n);printf(%-25s,ID);for (i=1; i=n; i+) printf(%4ld, PCBi.id);printf(n%-25s,PRIORITY/TU
7、RNTIME);for (i=1; i=n; i+) printf(%4ld, PCBi.priority);printf(n%-25s, CPUTIME);for (i=1; i=n; i+) printf(%4ld, PCBi.runtime);printf(n%-25s, ALLTIME);for (i=1; i=n; i+) printf(%4ld, PCBi.totaltime);printf(n%-25s,STATUS);for (i=1; i=n; i+) printf(%4c, PCBi.status);printf(n=n);if (RUN != -1) printf(RUN
8、NING PROCESS: %ldn, RUN);else printf(RUNNING PROCESS: NULLn);printf(WAITING QUEUE: );for (i=HEAD; i!=-1; i=linki) printf(%ld , i);printf(nn);/优先数调度算法void main_priority()long i, j, k; long sortn+1;init();/设置就绪链for (i=1; i=n; i+)sorti = i;for (i=1; ii; j-)if (PCBsortj.priority PCBsortj-1.priority)k=so
9、rtj; sortj=sortj-1; sortj-1=k;HEAD=sort1;for (i=1; in; i+)linksorti = sorti+1;TAIL = sortn;linkTAIL = -1;RUN = -1;/就绪链设置完毕RUN = HEAD;PCBRUN.status = R;HEAD = linkHEAD;/运行链首进程while (RUN != -1)showit();PCBRUN.totaltime-;PCBRUN.priority -= 3; /优先级减3PCBRUN.runtime+;if (PCBRUN.totaltime = 0)/进程运行完成PCBRUN
10、.status=F;RUN = HEAD;if (HEAD != -1)HEAD = linkHEAD;PCBRUN.status=R;elseif (HEAD != -1 & PCBRUN.priority PCBRUN.priority)k=linkk;if (k = TAIL)linkk = RUN;/插入链尾之后TAIL = RUN;linkRUN = -1;RUN = HEAD;HEAD = linkHEAD;PCBRUN.status = R;elselinkRUN = linkk;/插入链中linkk = RUN;RUN = HEAD;/链首进程开始运行HEAD = linkHE
11、AD;PCBRUN.status = R;showit();/轮转调度算法void main_round_robin()long i;init();/设置就绪链HEAD = 1;for (i=1; in; i+)linki = i+1;TAIL = n; linkTAIL = -1;RUN = -1;/就绪链设置完毕RUN = HEAD;PCBRUN.status = R;HEAD = linkHEAD;/运行首进程while (RUN != -1)showit();PCBRUN.totaltime-;PCBRUN.runtime+;if (PCBRUN.totaltime = 0)/进程运行
12、完成PCBRUN.status = F;RUN = HEAD;if (HEAD != -1)HEAD = linkHEAD;PCBRUN.status = R;elseif (HEAD != -1 & PCBRUN.runtime % PCBRUN.priority=0)/轮转时间到 PCBRUN.status=W;/插入链尾linkTAIL=RUN;linkRUN=-1;TAIL=RUN;RUN=HEAD;/链首进程开始运行HEAD=linkHEAD;PCBRUN.status=R;showit();/主函数int main()long algo;srand(time(NULL);algo
13、= ChooseAlgo();if (algo = 1)main_priority();/优先数法elsemain_round_robin();/简单轮转法printf(SYSTEM FINISHEDn);return 0;实验体会: 通过写代码的过程更加清晰地了解了两种算法的思想和用处,对算法的了解加深的同事也锻炼了写代码的能力。计算机操作系统实验三报告实验三 题目 : 请求页式存储管理 : 佳慧 学号 : 实验日期 : 2015.1实验环境 : Microsoft Visual Studio实验目的 :近年来,由于大规模集成电路(LSI)和超大规模集成电路(VLSI)技术的发展,使存储器的
14、容量不断扩大,价格大幅度下降。但从使用角度看,存储器的容量和成本总受到一定的限制。所以,提高存储器的效率始终是操作系统研究的重要课题之一。虚拟存储技术是用来扩大存容量的一种重要方法。学生应独立地用高级语言编写几个常用的存储分配算法,并设计一个存储管理的模拟程序,对各种算法进行分析比较,评测其性能优劣,从而加深对这些算法的了解。实验容 :为了比较真实地模拟存储管理,可预先生成一个大致符合实际情况的指令地址流。然后模拟这样一种指令序列的执行来计算和分析各种算法的访问命中率。 本实验采用页式分配存储管理方案, 并通过分析计算不同页面淘汰算法情况下的访问命中率来比较各种算法的优劣。 另外也考虑到改变页
15、面大小和实际存储器容量对计算结果的影响, 从而可为算则好的算法、合适的页面尺寸和实存容量提供依据。 实验是按下述原则生成指令序列的:(1) 50%的指令是顺序执行的。(2) 25%的指令均匀散布在前地址部分。(3) 25%的指令均匀散布在后地址部分。示例中选用最佳淘汰算法(OPT)和最近最少使用页面淘汰算法(LRU)计算页面命中率。公式为假定虚存容量为 32K,页面尺寸从 1K 至 8K,实存容量从 4 页至 32 页。(1)最佳淘汰算法(OPT)这是一种理想的算法,可用来作为衡量其他算法优劣的根据,在实际系统中是难以实现的,因为它必须先知道指令的全部地址流。 由于本示例中已预生成了全部的指令
16、地址流, 故可计算出最佳命中率。该算法的准则是淘汰已满页表中不再访问或是最迟访问的的页。 这就要求将页表中的页逐个与后继指令访问的所有页比较,如后继指令不在访问该页,则把此页淘汰,不然得找出后继指令中最迟访问的页面淘汰。可见最佳淘汰算法要花费比较长的运算时间。(2)最近最少使用页淘汰算法(LRU)这是一种经常使用的方法,有各种不同的实施方案,这里采用的是不断调整页表链的方法,即总是淘汰页表链链首的页,而把新访问的页插入链尾。如果当前调用页已在页表,则把它再次调整到链尾。这样就能保证最近使用的页,总是处于靠近链尾部分,而不常使用的页就移到链首,逐个被淘汰,在页表较大时,调整页表链的代价也是不小的
17、。操作过程 :编写程序:#include #include #include #include #include #include #include #include #include using namespace std;int adress32;/全局变量数组,地址流int p;/全局变量p是一共有多少地址流void init()/初始化函数, int t;srand(time(0);/随机产生指令序列 p=12+rand()%32; cout地址流个数 P=pendl;cout随机产生的地址流序列n;for(int i=0,j=0;ip;i+,j+)t=1+rand()%9;adres
18、si=t;/将随机产生的指令数存入页面流 printf(a%d=%d ,i,t); j=j%5; if(i10) printf( ); if(j=4) printf(n);coutendl;void OPT(int n) /FIFO算法,n是M的值int e,q=p,m=n-1;int flag;int flag1;int queye=0;int leaflink32; memset(leaflink,0,sizeof(leaflink);for(int x=0;xq;x+)e=x;flag=0;for(int i=0;in;i+)if(leaflinki=adressx)flag=1;fla
19、g1=i;printf(有相同n);break;if(flag=0) int k=0; for(int j=0;j=m) queye+; if(flag=1) int temp10=0; for(int i=0;i=m;i+) for(int a=e+1;aq;a+) if(leaflinki=adressa) tempi+; int index=0; for(int i=0;itempi) min=tempi; index=i; int l=leaflinkindex; leaflinkindex=leaflink0; leaflink0=l; for(int j=0;jn;j+) prin
20、tf(leaflink%d=%d ,j,leaflinkj); coutendl; coutM=n时FIFO的命中率为:(1-(double)queye/p)*100% endl;void LRU(int n)/LRU算法int i;int m=n-1;int q=p;int e;int queye=0;int flag;int flag1;int y;int leaflink32;memset(leaflink,0,sizeof(leaflink);for(int x=0;xq;x+)flag=0;e=x;for(i=0;in;i+)if(leaflinki=adressx)flag=1;f
21、lag1=i;printf(X=%d,lru%d = adress%d=%d ,flag= 1n,x,i,x,adressx);break;if(flag=0) int k=0;for(int j=0;jm;j+)/0 1 2leaflinkk=leaflinkk+1; k+;leaflinkm=adresse;queye+;else if(flag=1) y=flag1;for(int j=0;jm;j+)leaflinkflag1=leaflinkflag1+1;flag1+; leaflink3=adresse;printf(发现相同后,改变leaflink%d=%dn,m,leafli
22、nk3); for(int j=0;jn;j+) printf(leaflink%d=%d ,j,leaflinkj); coutendl;cout发生替换次数:queyeendl;coutM=n时LRU的命中率为:(1-(double)queye/p)*100%c;if(c=O)for(int i=3;i4;i+)OPT(i);else if(c=L) for(int i=4;i5;i+) LRU(i); coutendl; return 0;运行结果:最近最少使用:最佳淘汰:实验体会 : 通过这次实验,我了解了采用页式分配存储管理方案,并对页式分配存储管理的两个算法最佳淘汰算法和最近最少使
23、用页淘汰算法有了更深入的了解,为之后的学习奠定了基础。计算机操作系统实验四报告实验四 题目 : 文件操作与管理 : 佳慧 学号 : 实验日期 : 2015.1实验环境 : Microsoft Visual Studio实验目的 :随着社会信息量的极大增长, 要求计算机处理的信息与日俱增, 涉及到社会生活的各个方面。因此,文件管理是操作系统的一个极为重要的组成部分。学生应独立地用高级语言编写和调试一个简单的文件系统, 模拟文件管理的工作过程。 从而对各种文件操作命令的实质容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。实验容:1.要求:(1)实际一个 n 个用户的文
24、件系统,每个用户最多可保存 m 个文件。(2)限制用户在一次运行中只能打开 l 个文件。(3)系统应能检查打入命令的正确性,出错要能显示出错原因。(4)对文件必须设置保护措施,如只能执行,允许读、允许写等。在每次打开文件时根据本次打开的要求,再次设置保护级别,即可有二级保护。(5)对文件的操作至少应有下述几条命令:creat 建立文件。delete 删除文件。open 打开文件。close 关闭文件。read 读文件。write 写文件。2.示例:(1)程序采用二级文件目录,即设置了主文件目录(MFD)和用户文件目录(UFD) 。前者应包含文件主(即用户)及他们的目录区指针;后者应给出每个文件
25、主占有的文件目录,即文件名,保护码,文件长度以及他们存放的位置等。另外为打开文件设置了运行文件目录(AFD) ,在文件打开时应填入打开文件号,本次打开保护码和读写指针等。3.算法与框图(1)因系统小,文件目录的检索使用了简单的线性搜索,而没有采用 Hash 等有效算法。(2)文件保护简单实用了三位保护码,对应于允许读、允许写和运行执行,如下所示: 1 1 1允许写 允许读 允许执行如对应位为 0,则不允许。实验源码:#include #include #include #include #include #include #include using namespace std;struct
26、UFD int fname; int len; int procode3;ufd10;struct MFD int user; UFD p5;mfd10;int main() int x,n=10,flag1=1,flag2=1,flag3=1; if(flag1) for(int i=0;i10;i+) ufdi.fname=i; int t=100+rand()%900; ufdi.len=t; for(int j=0;j3;j+) ufdi.procodej=rand()%2; srand(unsigned)time(NULL); bool f10; for(int i=0;i10;i+
27、) mfdi.user=i; memset(f,0,sizeof f); for(int j=0;j5;j+) int t; do t=rand()%10; while(ft); ft=1; mfdi.pj=ufdt; while(n-&flag2) coutinput user:x; if(x=10) couttry againendl; break; for(int j=0;j5;j+) coutmfdx.pj.fname mfdx.pj.len mfdx.pj.procode0mfdx.pj.procode1mfdx.pj.procode2endl; coutinput the comm
28、and:endl; coutcreat 1; delete 2; open 3; bye 4; close 5; read 6; write 7s; switch(s) case 1: if(flag3) cout输入你要创建的文件的名字:mfdx.p0.fname; cout输入你要创建的文件的长度:mfdx.p0.len; cout输入你要创建的文件的权限:endl; for(int i=0;imfdx.p0.procodei; for(int j=0;j5;j+) coutmfdx.pj.fname mfdx.pj.len mfdx.pj.procode0mfdx.pj.procode1
29、mfdx.pj.procode2endl; coutinput the command:endl; else cout输入你要创建的文件的名字:mfdx.pindex.fname; cout输入你要创建的文件的长度:mfdx.pindex.len; cout输入你要创建的文件的权限:endl; for(int i=0;imfdx.pindex.procodei; for(int j=0;j5;j+) coutmfdx.pj.fname mfdx.pj.len mfdx.pj.procode0mfdx.pj.procode1mfdx.pj.procode2endl; coutinput the
30、command:endl; break; case 2: flag3=0; cout输入要删除的文件:t; for(int i=0;i5;i+) if(mfdx.pi.fname=t) index=i; mfdx.pi.fname=0; mfdx.pi.len=000; memset(mfdx.pi.procode,0,sizeof(mfdx.pi.procode); for(int j=0;j5;j+) coutmfdx.pj.fnamemfdx.pj.len mfdx.pj.procode0mfdx.pj.procode1mfdx.pj.procode2endl; coutinput th
31、e command:endl; break; case 3: cout输入要打开的文件:file; for(int i=0;i5;i+) if(mfdx.pi.fname=file) if(mfdx.pi.procode2=0) cout你没有权限endl; else cout可以打开endl; coutinput the command:endl; break; case 4: for(int j=0;j5;j+) coutmfdx.pj.fnamemfdx.pj.len mfdx.pj.procode0mfdx.pj.procode1mfdx.pj.procode2endl; coutgo
32、odbyeendl; flag=0; flag2=0; flag1=0; break; case 5: flag=0; flag1=0; break; case 6: cout输入要读的文件:file1; for(int i=0;i5;i+) if(mfdx.pi.fname=file1) if(mfdx.pi.procode1=0) cout你没有权限endl; else cout可以读endl; coutinput the command:endl; break; case 7: cout输入要写的文件:file2; for(int i=0;i5;i+) if(mfdx.pi.fname=file2) if(mfdx.pi.procode0=0) cout你没有权限endl; else cout可以写endl;