《2022年操作系统实验程序》由会员分享,可在线阅读,更多相关《2022年操作系统实验程序(29页珍藏版)》请在金锄头文库上搜索。
1、操作系统实验实验一进程调度一、实验目的多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那个进程优先占有处理机。因而引起进程调度。本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。二、实验要求1设计进程调度算法,进程数不定2包含几种调度算法,并加以实现3输出进程的调度过程进程的状态、链表等。三、参考例1题目优先权法、轮转法简化假设1)进程为计算型的(无I/O)2)进程状态: ready、 running、finish 3)进程需要的CPU 时间以时间片为单位确定2算法描述1)优先权法动态优先权当前运行进程用完时间片后,其优先权减去一个常数。2)轮转法四、实
2、验流程图开始键盘输入进程数n,和调度方法的选择优先权法?轮转法产生 n 个进程,对每个进程产生一个PCB,并用随机数产生进程的优先权及进程所需的CPU 时间按优先权大小,把n个进程拉成一个就绪队列初始化其他数据结构区链首进程投入运行时间片到,进程所需的CPU 时间减 1, 优先权减3,输出个进程的运行情况所需的 CPU 时间 =0?撤销进程就绪队列为空?结束将进程插入就绪队列N Y N Y Y B N 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 29 页 - - -
3、- - - - - - 注意:1产生的各种随机数的取值范围加以限制,如所需的CPU 时间限制在120 之间。2进程数 n 不要太大通常取48 个3使用动态数据结构4独立编程5至少三种调度算法6若有可能请在图形方式下,将PCB 的调度用图形成动画显示。五实验过程:(1)输入:进程流文件(1.txt) ,其中存储的是一系列要执行的进程,每个作业包括四个数据项:进程名进程状态 (1 就绪 2 等待 3 运行 ) 所需时间优先数 (0 级最高 ) 进程 0 1 50 2 进程 1 2 10 4 进程 2 1 15 0 进程 3 3 28 5 进程 4 2 19 1 进程 5 3 8 7 输出 : 进程
4、执行流等待时间,平均等待时间本程序包括 :FIFO 算法,优先数调度算法,时间片轮转调度算法产生 n 个进程,对每个进程用随机数产生进程的轮转时间片数及进程所需的时间片数,已占用CPU 的时间片数置为0 按进程产生的先后次序拉成就绪队列链链首进程投入运行时间片到,进程所需时间片数减1,已占用 CPU 时间片数加1 输出各进程的运行情况进程所需时间片数=0?撤销该进程就绪队列为空吗?占用 CPU 的时间片数 =轮转时间片数?占用 CPU 的时间片数置为0 把该进程插入就绪队列尾B N Y N Y Y 结束N 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -
5、 - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 29 页 - - - - - - - - - (2)程序代码#include #include #include const int block_time=10; / 定义时间片的长度为10 秒const int MAXPCB=100; /定义最大进程数/定义进程结构体typedef struct node char name20; int status; int time; int privilege; int finished; int wait_time; pcb; pcb pcbsMAXPCB; int
6、 quantity; /初始化函数void initial() int i; for(i=0;iMAXPCB;i+) strcpy(pcbsi.name,); pcbsi.status=0; pcbsi.time=0; pcbsi.privilege=0; pcbsi.finished=0; pcbsi.wait_time=0; quantity=0; /读数据函数int readData() FILE *fp; char fname20; int i; coutfname; if(fp=fopen(fname,r)=NULL) 名师资料总结 - - -精品资料欢迎下载 - - - - - -
7、 - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 29 页 - - - - - - - - - cout 错误,文件打不开 ,请检查文件名 endl; else while(!feof(fp) fscanf(fp,%s %d %d %d,pcbsquantity.name,&pcbsquantity.status, &pcbsquantity.time,&pcbsquantity.privilege); quantity+; / 输出所读入的数据cout 输出所读入的数据endl; cout 进程名进程状态所需时间优先数 endl; f
8、or(i=0;iquantity;i+) cout pcbsi.name pcbsi.status pcbsi.time pcbsi.privilegeendl; return(1); return(0); /重置数据 ,以供另一个算法使用void init() int i; for(i=0;iMAXPCB;i+) pcbsi.finished=0; pcbsi.wait_time=0; /先进先出算法void FIFO() int i,j; int total; /输出 FIFO 算法执行流coutendl*endl; coutFIFO 算法执行流 :endl; cout 进程名等待时间 e
9、ndl; for(i=0;iquantity;i+) cout pcbsi.name pcbsi.wait_timeendl; for(j=i+1;jquantity;j+) pcbsj.wait_time+=pcbsi.time; total=0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 29 页 - - - - - - - - - for(i=0;iquantity;i+) total+=pcbsi.wait_time; cout 总等待时间 :total 平
10、均等待时间 :total/quantityendl; /优先数调度算法void privilege() int i,j,p; int passed_time=0; int total; int queueMAXPCB; int current_privilege=1000; for(i=0;iquantity;i+) current_privilege=1000; for(j=0;jquantity;j+) if(pcbsj.finished=0)&(pcbsj.privilegecurrent_privilege) p=j; current_privilege=pcbsj.privilege
11、; queuei=p; pcbsp.finished=1; pcbsp.wait_time+=passed_time; passed_time+=pcbsp.time; /输出优先数调度执行流coutendl*endl; cout 优先数调度执行流:endl; cout 进程名等待时间 endl; for(i=0;iquantity;i+) cout pcbsqueuei.name pcbsqueuei.wait_timeendl; total=0; for(i=0;iquantity;i+) total+=pcbsi.wait_time; cout 总等待时间 :total 平均等待时间 :
12、total/quantityendl; /时间片轮转调度算法void timer() int i,j,number,flag=1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 29 页 - - - - - - - - - int passed_time=0; int max_time=0; int round=0; int queue1000; int total=0; while(flag=1) flag=0; number=0; for(i=0;i1) for(i
13、=0;iquantity;i+) if(pcbsi.finished=0) flag=1; queuetotal=i; total+; if(pcbsi.time=block_time*(round+1) pcbsi.finished=1; round+; if(queuetotal-1=queuetotal-2) total-; coutendl*endl; cout 时间片轮转调度执行流:endl; for(i=0;itotal;i+) coutpcbsqueuei.name ; coutendl; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -
14、- - - - - - 名师精心整理 - - - - - - - 第 6 页,共 29 页 - - - - - - - - - /显示void version() cout /* 进程调度*/; coutendlendl; /主函数void main() int flag; version(); initial(); flag=readData(); if(flag=1) FIFO(); init(); privilege(); init(); timer(); (3)运行结果:输入进程流文件名1.txt 即可得出以下输出结果:名师资料总结 - - -精品资料欢迎下载 - - - - - -
15、- - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 29 页 - - - - - - - - - 实验二银行家算法一、实验目的死锁会引起计算机工作僵死,因此操作系统中必须防止。本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。二、实验要求设计有 n 个进程共享m 个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。系统能显示各个进程申请和释放资源,以及系统动态分配资源的过程,便于用
16、户观察和分析;三、数据结构1可利用资源向量Available ,它是一个含有m 个元素的数组, 其中的每一个元素代表一类可利用的资源的数目,其初始值是系统中所配置的该类全部可用资源数目。其数值随该类资源的分配和回收而动态地改变。如果Available (j) =k,标是系统中现有Rj 类资源 k 个。2最大需求矩阵Max,这是一个nm 的矩阵,它定义了系统中n 个进程中的每一个进程对m 类资源的最大需求。如果Max(i,j)=k,表示进程i 需要 Rj 类资源的最大数目为k。3分配矩阵Allocation ,这是一个nm 的矩阵,它定义了系统中的每类资源当前一分配到每一个进程的资源数。如果Al
17、location (i,j)=k,表示进程 i 当前已经分到Rj 类资源的数目为k。Allocation i表示进程 i 的分配向量,有矩阵Allocation 的第 i 行构成。4需求矩阵Need,这是一个nm 的矩阵,用以表示每个进程还需要的各类资源的数目。如果Need(i,j)=k,表示进程 i 还需要 Rj 类资源 k 个,才能完成其任务。 Need i表示进程 i 的需求向量, 由矩阵 Need的第 i 行构成。上述三个矩阵间存在关系:Need(i,j)=Max (i,j)-Allocation (i,j) ;四、银行家算法Request i是进程 Pi 的请求向量。 Request
18、i(j)=k 表示进程 Pi 请求分配 Rj 类资源 k 个。当 Pi 发出资源请求后,系统按下述步骤进行检查:1如果 Request iNeed,则转向步骤2;否则,认为出错,因为它所请求的资源数已超过它当前的最大需求量。2如果 Request iAvailable ,则转向步骤3;否则,表示系统中尚无足够的资源满足Pi 的申请, Pi 必须等待。3系统试探性地把资源分配给进程Pi,并修改下面数据结构中的数值:Available = Available - Request i Allocation i= Allocation i+ Request i Need i= Need i - Req
19、uest i4系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。如果安全才正式将资源分配给进程 Pi,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程Pi 等待。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 29 页 - - - - - - - - - 假定系统有5 个进程( p0,p1,p2,p3,p4)和三类资源( A,B,C) ,各种资源的数量分别为10,5,7,在 T0时刻的资源分配情况如下图:Max Allocation Nee
20、d Available A B C A B C A B C A B C P0 7 5 3 0 1 0 7 4 3 3 3 2 ( 2 3 0 ) P1 3 2 2 2 0 0 1 2 2 (3 0 2 ) (0 2 0 ) P2 9 0 2 3 0 2 6 0 0 P3 2 2 2 2 1 1 0 1 1 P4 4 3 3 0 0 2 4 3 1 五、安全性算法1设置两个向量。Work :它表示系统可提供给进程继续运行的各类资源数目,它包含 m 个元素, 开始执行安全性算法时,Work = Available 。Finish:它表示系统是否有足够的资源分配给进程,使之运行完成,开始Finish
21、(I)=false;当有足够资源分配给进程Pi 时,令 Finish(i)=true;2从进程集合中找到一个能满足下述条件的进程。Finish(i)= = false;Need iwork;如找到则执行步骤3;否则,执行步骤4;3当进程 Pi 获得资源后,可顺利执行直到完成,并释放出分配给它的资源,故应执行Work = work + Allocation iFinish(i)=true;转向步骤2;4若所有进程的Finish( i)都为 true,则表示系统处于安全状态;否则,系统处于不安全状态。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - -
22、- - - - 名师精心整理 - - - - - - - 第 9 页,共 29 页 - - - - - - - - - 六、系统流程图开 始输入资源数m, 及各类资源总数, 初始化输入进程数n,输入进程 i 的最大需求向量i n max 资 源提示错误i 加 1 任选一个进程作为输入该进程的资源请求量调用银行家算法, 及安全性算法, 完成分配, 或并该 进 程 的Need向量为 0 该 进 程 已 运 行Need 矩阵为所 有 进 程 运 行结 束N Y Y N N Y 初始化need N Y 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - -
23、 - - - 名师精心整理 - - - - - - - 第 10 页,共 29 页 - - - - - - - - - 七银行家算法程序代码#include #include #include using namespace std; typedef struct Max1 / 资源的最大需求量 int m_a; int m_b; int m_c; Max; typedef struct Allocation1 /已分配的资源数 int a_a; int a_b; int a_c; Allocation; typedef struct Need1 /还需要的资源数 int n_a; int n
24、_b; int n_c; Need; struct Available1 /可利用的资源量 int av_a; int av_b; int av_c; q; struct pr /定义一个结构 char name; Max max; Allocation allocation; Need need; int finishflag; p5; char na5; /* void init() /读入文件 1.txt cout 各进程还需要的资源数NEED :endl; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -
25、 - - - - - - 第 11 页,共 29 页 - - - - - - - - - FILE *fp; fp=fopen(1.txt,r+); / 打开文件 1.txt for(int i=0;i5;i+) fscanf(fp,%c,%d,%d,%d,%d,%d,%dn,&pi.name,&pi.max.m_a,&pi.max.m_b, &pi.max.m_c,&pi.allocation.a_a,&pi.allocation.a_b,&pi.allocation.a_c); pi.need.n_a=pi.max.m_a-pi.allocation.a_a; pi.need.n_b=pi
26、.max.m_b-pi.allocation.a_b; pi.need.n_c=pi.max.m_c-pi.allocation.a_c; coutpi.name: pi.need.n_a pi.need.n_b pi.need.n_cendl; fclose(fp); /关闭文件 /* int fenpei()/ 分配资源 coutAvailable:; coutq.av_a q.av_b q.av_cendl; int finishcnt=0,k=0,count=0; for(int j=0;j5;j+) pj.finishflag=0; while(finishcnt5) for(int
27、 i=0;i=pi.need.n_a&q.av_b=pi.need.n_b&q.av_c=pi.need.n_c) q.av_a+=pi.allocation.a_a; q.av_b+=pi.allocation.a_b; q.av_c+=pi.allocation.a_c; pi.finishflag=1; finishcnt+; nak+=pi.name; break; count+;/ 禁止循环过多if(count5)return 0; return 1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -
28、- - - - - - 第 12 页,共 29 页 - - - - - - - - - /* int shq() /申请资源 int m=0,i=0,j=0,k=0; /m 为进程号 ; i,j,k 为申请的三类资源数cout 请输入进程号和请求资源的数目!endl; cout 如:进程号资源 A B Cendl; cout 0 2 0 2mijk; if(i=pm.need.n_a&j=pm.need.n_b &k=pm.need.n_c) if(i=q.av_a&j=q.av_b&k=q.av_c) pm.allocation.a_a+=i; pm.allocation.a_b+=j; p
29、m.allocation.a_c+=k; pm.need.n_a=pm.max.m_a-pm.allocation.a_a; pm.need.n_b=pm.max.m_b-pm.allocation.a_b; pm.need.n_c=pm.max.m_c-pm.allocation.a_c; cout各进程还需要的资源数NEED:n; for(int w=0;w5;w+) coutpw.name: pw.need.n_a pw.need.n_b pw.need.n_cendl; return 1; else coutAvailable 让进程 m 等待 .endl; else coutNeed
30、, 让进程 m 等待.endl; return 0; /* void main() int flag; char c; cout /* 银行家算法*/ endl; cout 确认已经在 1.txt 文档中正确输入各进程的有关信息后按回车键endl; getch(); init(); q.av_a=10; /各种资源的数量q.av_b=5; q.av_c=7; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 29 页 - - - - - - - - - while(fla
31、g) for(int i=0;i5;i+) q.av_a-= pi.allocation.a_a; q.av_b-= pi.allocation.a_b; q.av_c-= pi.allocation.a_c; if(fenpei() cout这样配置资源是安全的!endl; cout其安全序列是:; for(int k=0;k5;k+) coutnak; coutendl; cout有进程发出Request 请求向量吗 ?(Enter y or Y)endl; coutendl; c=getch(); if(c=y|c=Y) if(shq()continue; else break; els
32、e flag=0; else flag=0; cout 不安全 !endl; 八运行结果名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 29 页 - - - - - - - - - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 29 页 - - - - - - - - - 实验三存储管理一实验目的存储管理的主要功能之一是合理地分配空间。请求页式
33、管理是一种常用的虚拟存储管理技术。本实验的目的是通过请求页式管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。二实验内容(1)通过计算不同算法的命中率比较算法的优劣。同时也考虑了用户内存容量对命中率的影响。页面失效次数为每次访问相应指令时,该指令所对应的页不在内存中的次数。在本实验中,假定页面大小为1k,用户虚存容量为32k,用户内存容量为4 页到 32 页。(2)produce_addstream 通过随机数产生一个指令序列,共320 条指令。A、指令的地址按下述原则生成:1) 50%的指令是顺序执行的2) 25%的指令是均匀分布在前地址部分3) 25%
34、的指令是均匀分布在后地址部分B、 具体的实施方法是:1)在0,319的指令地址之间随机选取一起点m;2)顺序执行一条指令,即执行地址为m+1 的指令;3)在前地址 0,m+1中随机选取一条指令并执行,该指令的地址为m ;4)顺序执行一条指令,地址为m +1 的指令5)在后地址 m +2,319中随机选取一条指令并执行;6)重复上述步骤1)5) ,直到执行320 次指令C、 将指令序列变换称为页地址流在用户虚存中,按每k 存放 10 条指令排列虚存地址,即320 条指令在虚存中的存放方式为:第 0 条第 9 条指令为第0 页(对应虚存地址为0,9) ;第 10 条 第 19 条指令为第1 页(对
35、应虚存地址为10,19) ;。 。 。 。 。 。第 310 条第 319 条指令为第31 页(对应虚存地址为310,319) ;按以上方式,用户指令可组成32 页。(3)计算并输出下属算法在不同内存容量下的命中率。1)先进先出的算法(FIFO) ;2)最近最少使用算法(LRU ) ;3)最佳淘汰算法(OPT) ;4)最少访问页面算法(LFR) ;其中 3)和 4)为选择内容页地址流长度页面失效次数命中率1名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 29 页 - -
36、 - - - - - - - 三系统框图四页面置换算法程序代码:#include #include #include const int MAXSIZE=1000;/定义最大页面数const int MAXQUEUE=3;/定义页框数typedef struct node int loaded; int hit; 开始生成地址流输入算法号S 1S4 形成地址页号用户内存空间msize=2 Msize32 OPT() FIFO() LRU() LFU() Msize 加 1 S=? 是否用其他算法继续结 束N Y 1 2 3 4 Y N 提示出错,重新输入名师资料总结 - - -精品资料欢迎下载
37、 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 29 页 - - - - - - - - - page; page pagesMAXQUEUE; / 定义页框表int queueMAXSIZE; int quantity; /初始化结构函数void initial() int i; for(i=0;iMAXQUEUE;i+) pagesi.loaded=-1; pagesi.hit=0; for(i=0;iMAXSIZE;i+) queuei=-1; quantity=0; /初始化页框函数void init
38、() int i; for(i=0;iMAXQUEUE;i+) pagesi.loaded=-1; pagesi.hit=0; /读入页面流void readData() FILE *fp; char fname20; int i; coutfname; if(fp=fopen(fname,r)=NULL) cout错误 ,文件打不开 ,请检查文件名 ; else while(!feof(fp) fscanf(fp,%d ,&queuequantity); quantity+; cout 读入的页面流 :; for(i=0;iquantity;i+) coutqueuei ; /FIFO 调度
39、算法void FIFO() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 29 页 - - - - - - - - - int i,j,p,flag; int absence=0; p=0; coutendl-endl; cout 先进先出调度算法(FIFO)页面调出流 :; for(i=0;iquantity;i+) flag=0; for(j=0;j=MAXQUEUE) coutpagesp.loaded ; pagesp.loaded=queuei; p=(p+
40、1)%MAXQUEUE; absence+; absence-=MAXQUEUE; coutendl 总缺页数 :absenceendl; /最近最少使用调度算法(LRU )void LRU() int absence=0; int i,j; int flag; for(i=0;iMAXQUEUE;i+) pagesi.loaded=queuei; coutendl-endl; cout 最近最少使用调度算法(LRU) 页面流 :; for(i=MAXQUEUE;iquantity;i+) flag=-1; for(j=0;jMAXQUEUE;j+) if(queuei=pagesj.load
41、ed) flag=j; /CAUTION pages0是队列头if(flag=-1) /缺页处理coutpages0.loaded ; for(j=0;jMAXQUEUE-1;j+) pagesj=pagesj+1; pagesMAXQUEUE-1.loaded=queuei; absence+; else /页面已载入pagesquantity=pagesflag; for(j=flag;jMAXQUEUE-1;j+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共
42、29 页 - - - - - - - - - pagesj=pagesj+1; pagesMAXQUEUE-1=pagesquantity; coutendl 总缺页数 :absenceendl; /显示void version() cout /*虚拟存储管理器的页面调度*/endl; coutendl; void main() version(); initial(); readData(); FIFO(); init(); LRU(); init(); init(); 四运行结果运行程序前先新建一个页面流文件文件(格式为*.txt ) ,在文件中存储的是一系列页面号(页面号用整数表示,用空
43、格作为分隔符),用来模拟待换入的页面。例如:14 5 18 56 20 25 6 3 8 17 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 29 页 - - - - - - - - - 实验四磁盘调度一、实验目的:磁盘是高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求。系统可采用一种策略, 尽可能按最佳次序执行访问磁盘的请求。由于磁盘访问时间主要受寻道时
44、间T 的影响,为此需要采用合适的寻道算法,以降低寻道时间。本实验要求学生模拟设计一个磁盘调度程序,观察调度程序的动态运行过程。通过实验让学生理解和掌握磁盘调度的职能。二、实验题目:模拟电梯调度算法,对磁盘进行移臂操作三、提示及要求:1、 假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。2、 磁盘是可供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。当有进程在访问某个磁盘时,其它想访问该磁盘的进程必须等待,直到磁盘一次工作结束。当有多个进程提出输入输出请求而处于等待状态时,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。为此设置“驱动调度”进程。3、 由于磁盘与处理器
45、是并行工作的,所以当磁盘在为一个进程服务时,占有处理器的其它进程可以提出使用磁盘(这里我们只要求访问磁道),即动态申请访问磁道,为此设置“接受请求”进程。4、 为了模拟以上两个进程的执行,可以考虑使用随机数来确定二者的允许顺序,程序结构图参考附图:5、 “接受请求”进程建立一张“进程请求I/O”表,指出等待访问磁盘的进程要求访问的磁道,表的格式如下:进程名要求访问的磁道号6、“磁盘调度”的功能是查“请求I/O”表,当有等待访问的进程时,按电梯调度算法(SCAN 算法)从中选择一个等待访问的进程,按其指定的要求访问磁道。SCAN算法参考课本第九章。算法模拟框图略。7、 图 1 中的“初始化”工作
46、包括:初始化“请求I/O”表,设置置 当前移臂方向;当前磁道号 。并且假设程序运行前“请求I/O”表中已有若干进程(48 个)申请访问相应磁道。四、实验报告:1、 实验题目。2、 程序中用到的数据结构及其说明。3、 打印源程序并附注释。4、 实验结果内容如下:打印“请求I/O”表,当前磁道号,移臂方向,被选中的进程名和其要求访问的磁道,看是否体现了电梯调度(SCAN )算法。5、 体会与问题。五、附图:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 21 页,共 29 页 - - -
47、 - - - - - - 六磁盘调度的程序代码:#include #include using namespace std; typedef struct node int data; struct node *next; Node; void main() void fcfs(Node *,int,int);/声明先来先服务函数FCFS void sstf(Node *,int,int);/声明最短寻道时间优先函数SSTF void scan(Node *,int,int);/ 声明扫描函数SCAN void print(Node *); /输出链表函数Node *head,*p,*q; /
48、建立一个链表int it,c=0,f,s; /c 为链表长度 ,f 是开始的磁道号,s 是选择哪个算法head=(Node *)malloc(sizeof(Node); head-next=NULL; q=head; cout /*磁盘调度算法 */endl; coutendl; coutit; while(it!=0) p=(Node *)malloc(sizeof(Node); p-next=NULL; p-data=it; q-next=p; q=p; cinit; c+; coutf; /f 为磁道号print(head); cout 链表长度为 :cendl; cout1 、先来先服
49、务算法FCFSendl; cout2 、最短寻道时间优先算法SSTFendl; cout3 、电梯调度算法(扫描算法 SCAN)endl; cout0 、退出 endl; couts; while(s!=0) switch(s) case 1:cout你选择了 :先来先服务算法FCFSendl; fcfs( head,c,f); break; case 2:cout你选择了 :最短寻道时间优先算法SSTFendl; sstf( head,c,f); break; case 3:cout你选择了 :电梯调度算法 (扫描算法SCAN)endl; scan( head,c,f); break; co
50、uts; /*/ void fcfs(Node *head,int c,int f)/先来先服务算法 void print(Node *); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 23 页,共 29 页 - - - - - - - - - Node *l;/*m,*n; float num=0; /num 为平均寻道长度l=head-next; for(int i=0;idata-f); f=l-data; l=l-next; num=num/c; cout 先来先服务的寻
51、道顺序是:endl; print(head); cout 平均寻道长度 :numnext=NULL; m=l; q=head; p=head-next; s=head; r=head-next; float num=0; for(int i=0;idata); for(int j=0;jnext; q=q-next; if(abs(f-p-data)data); r=p; s=q; num+=abs(f-r-data); f=r-data; s-next=r-next; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整
52、理 - - - - - - - 第 24 页,共 29 页 - - - - - - - - - r-next=NULL; m-next=r; m=r; q=head; p=head-next; s=head; r=head-next; num=num/c; cout 最短寻道时间优先顺序是:endl; print(l); cout 平均寻道长度 :numnext=NULL; s=r; m=(Node *)malloc(sizeof(Node);/存放比开始磁道大的磁道m-next=NULL; n=m; x=(Node *)malloc(sizeof(Node); x-next=NULL; y=
53、x; q=head; p=head-next; while(p-next!=NULL) if(p-data-f0) q-next=p-next; p-next=NULL; n-next=p; n=p; p=q-next; i+; else 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 25 页,共 29 页 - - - - - - - - - q-next=p-next; p-next=NULL; s-next=p; s=p; p=q-next; j+; if(p-data=f)
54、n-next=p; n=p; i+; else s-next=p; s=p; j+; q=r; /对比开始磁道小的磁道排序p=r-next; while(q-next-next!=NULL) q=q-next; p=q-next; max=q-data; while(p-next!=NULL) if(p-datamax) max=p-data; p-data=q-data; q-data=max; max=q-data; p=p-next; if(p-datamax) max=p-data; p-data=q-data; q-data=max; max=q-data; 名师资料总结 - - -
55、精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 26 页,共 29 页 - - - - - - - - - /print(r); q=m; p=m-next; while(q-next-next!=NULL) q=q-next; p=q-next; min=q-data; while(p-next!=NULL) if(p-datadata; p-data=q-data; q-data=min; min=q-data; p=p-next; if(p-datadata; p-data=q-data; q-dat
56、a=min; min=q-data; /print(m); x=m; p-next=r-next; y=x-next; while(y-next!=NULL) num+=abs(f-y-data); f=y-data; y=y-next; num+=abs(f-y-data); num=num/c; cout 扫描算法的顺序是:endl; print(x); cout 平均寻道长度为:numnext; cout 单链表显示 :; if(p=NULL) coutnext=NULL) coutdata; else while(p-next!=NULL) coutdata; p=p-next; coutdataendl; 七运行结果:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 28 页,共 29 页 - - - - - - - - - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 29 页,共 29 页 - - - - - - - - -