2022年操作系统驱动调度 .pdf
实验三驱动调度一、实验内容模拟电梯调度算法,实现对磁盘的驱动调度。二、实验目的磁盘是一种高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,担负着繁重的输入输出任务、在多道程序设计系统中,往往同时会有若干个要求访问磁盘的输入输出请求等待处理。系统可采用一种策略,尽可能按最佳次序执行要求访问磁盘的诸输入输出请求。这就叫驱动调度,使用的算法称为驱动调度算法。驱动调度能降低为若干个输入输出请求服务所需的总时间,从而提高系统效率。本实验要求学生模拟设计一个驱动调度程序,观察驱动调度程序的动态运行过程。通过实验使学生理解和掌握驱动调度的职能。三、数据结构#define M 20 typedef struct PCB char procM;/进程名int cylinder_num;/柱面号int track_num;/磁道号int phy_num;/物理记录号struct PCB *next; PCB; 四、实验题目模拟电梯调度算法,对磁盘进行移臂和旋转调度。(1)磁盘是可供多个进程共享的存储设备,但一个磁盘每时刻只能为一个进程服务。当有进程在访问某个磁盘时,其他想访问该磁盘的进程必须等待,直到磁盘一次工作结束。当有多个进程提出输入输出要求而处于等待状态时,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。选择访问者的工作由 “驱动调度”进程来完成。由于磁盘与处理器是可以并行工作的、所以当磁盘在作为一个进程服务时,占有处理器的另一进程可以提出使用磁盘的要求,也就是说,系统能动态地接收新的名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 15 页 - - - - - - - - - 输入输出请求。为了模拟这种情况,在本实验中设置了一个“接收请求”进程。“驱动调度”进程和“接收请求”进程能否占有处理器运行,取决于磁盘的结束中断信号和处理器调度策略。在实验中可用随机数来模拟确定这两个进程的运行顺序,以代替中断处理和处理器调度选择的过程。因而,程序的结构可参考图31 (2)“接收请求”进程建立一张“请求I/O”表,指出访问磁盘的进程要求访问的物理地址,表的格式为:进程名柱面号磁道号物理记录号图 31 程序结构初始化输入在 0,1区间内的一个随机数随机数 1/2 开始驱动调度接受请求继续?结束是是否否名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 15 页 - - - - - - - - - 假定某个磁盘组共有200个柱面,由外向里顺序编号(0199) ,每个柱面上有 20个磁道,编号为 019,每个磁道分成 8 个物理记录,编号 07。进程访问磁盘的物理地址可以用键盘输入的方法模拟得到。图32 是“接收请求”进程的模拟算法。在实际的系统中必须把等待访问磁盘的进程排入等待列队,由于本实验模拟驱动调度,为简单起见,在实验中可免去队列管理部分,故设计程序时可不考虑“进程排入等待队列”的工作。(3) “驱动调度”进程的功能是查“请求I/O”表,当有等待访问磁盘的进程时,按电梯调度算法从中选择一个等待访问者,按该进程指定的磁盘物理地址启动磁盘为其服务。对移动臂磁盘来说, 驱动调度分移臂调度和旋转调度。电梯调度算法的调度策略是与移动臂的移动方向和移动臂的当前位子有关的,所以每次启动磁盘时都应登记移动臂方向和当前位子。电梯调度算法是一种简单而实用的驱动调度方法,这种调度策略总是优先选择与当前柱面号相同的访问请求,从这些请求中再选择一个能使旋转距离最短的等待访问者。如果没有与当前柱面号相同的访问请求,则根据移臂方向来选择,每次总是沿臂移动方向选择一个与当前柱面号最近的访问请求,若沿这个方向没有访问请求时,就改变臂的移动方向。这种调度策略能使移动臂的移动频率极小,从而提高系统效率。用电梯调度算法实现驱动调度的模拟算法如图33。图 32 “接收请求”模拟算法(4)图 31 中的初始化工作包括,初始化“请求I/O ”表,置当前移臂方向为里移;置当前位置为0 号柱面, 0 号物理记录。程序运行前可假定“请求I/O ”表中已经有如干个进程等待访问磁盘。在模拟实验中,当选中一个进程可以访问磁盘时,并不实际地启动磁盘,而用开始有请求?输入:进程名物理地址进程排入等待队列登记“请求I/O 表返回是否名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 15 页 - - - - - - - - - 是是是是是否否否否显示: “请求 I/O ”表;当前移臂方向;当前柱面号,物理记录号来代替图33 中的“启动磁盘”这项工作开始查” 请求 I/O 表”有等待访问者 ? 有与当前柱面号相同的访问者 ? 当前移臂方向是向里移 ? 有比当前柱面号小的访问请求 ? 有比当前柱面号大的访问请求 ? 置当前移臂方向为向外移置当前移臂方向为向里移从大于当前柱面号的访问请求中选择一个最小者从大于当前柱面号的访问请求中选择一个最小者选择能使旋转距离最短的访问者添加当前位置:柱面号;物理记录号启动磁盘,被选中者退出“请求I/O 表”返回返回图 3-3 电梯调度模拟算法名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 15 页 - - - - - - - - - 五、源程序#includestdio.h #includestdlib.h #includeconio.h #includestring.h #define M 20 typedef struct PCB char procM;/进程名int cylinder_num;/柱面号int track_num;/磁道号int phy_num;/物理记录号struct PCB *next; PCB; PCB *head=NULL; int direction ;/定义方向, 1为up,-1为down PCB *h=NULL; / 存放当前运行中的进程的信息名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 15 页 - - - - - - - - - void init () /初始化当前进程 h=(PCB *)malloc(sizeof(PCB); direction=1; strcpy(h-proc,p); h-cylinder_num = 0; h-track_num= 0; h-phy_num= 0; /模拟记录当前运行进程void current_process(PCB *Q) strcpy(h-proc,Q-proc); h-cylinder_num = Q-cylinder_num; h-track_num=Q-track_num; h-phy_num=Q-phy_num; /插入函数void insert(PCB *p) PCB *q; q=head; if(head=NULL) head=p; else for(q=head;q-next!=NULL;q=q-next); p-next=q-next; q-next=p; void out_info() / 输出进程的信息printf( n); printf( 进程名柱面号磁道号 物理记录号 方向 n); printf( n); printf( %s t%d t%d t%d,h-proc,h-cylinder_num,h-track_num,h-phy_num); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 15 页 - - - - - - - - - void output() PCB *p; p=head; printf( 进程名柱面号磁道号 物理记录号 n); if(p=NULL) printf(-* 进程表为空 ,接收请求或按 n退出*-n); else while(p!=NULL) printf(%s t%d t%d t%dn,p-proc,p-cylinder_num,p-track_num,p-phy_num); p=p-next; /初始化 I/O请求表void create_PCB() PCB *p,*q; q=head; int i,n; printf(n); printf( 请输入 I/O进程表中进程等待的个数:n); printf(n); scanf(%d,&n); printf( 请依次输入进程的相关信息: (用空格分隔) n); printf( n); printf( 进程名,柱面号,磁道号,物理记录号n); for(i=1;iproc); scanf(%d,&p-cylinder_num); scanf(%d,&p-track_num); scanf(%d,&p-phy_num); p-next=NULL; insert(p); printf( n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 15 页 - - - - - - - - - /接受请求模块void Receive_requests() PCB *p; int i,n,m; printf( 请输入一个值 : n); printf(1. n); printf(0. n); scanf(%d,&i); if(i=1) printf( 正在运行的进程为: n); printf(n); /*if(direction=1) / 启动磁盘out_info(); printf( upn); printf(n); if(direction=-1) out_info(); printf( downn); printf(n); */ printf(n); printf( 接受请求前的等待进程表为n); output(); printf( 请输入接受等待进程数量 n); scanf(%d,&n); printf( 请依次输入进程的信息 n); printf( 进程名,柱面号,磁道号,物理记录号n); for(m=1;mproc); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 15 页 - - - - - - - - - scanf(%d,&p-cylinder_num); scanf(%d,&p-track_num); scanf(%d,&p-phy_num); p-next=NULL; insert(p); printf( 接受请求后的等待进程表为: n); printf(n); output(); else printf( 没有接受进程,继续往下运行程序n); /电梯调度算法void lift() int min,cha,max; PCB *p,*q,*B;/p 为指要删除的节点, q为查找的节点, B指向要删除节点的前一个节点q=head; if(q!=NULL) while(q!=NULL)&(q-cylinder_num!=h-cylinder_num)/找 到第一个相同的柱面号 q=q-next; if(q=NULL)/ 没有柱面号相同的等待进程 q=head; if(direction=1)/ 当前移臂方向 up while(q!=NULL)&(q-cylinder_num cylinder_num) q=q-next; if(q=NULL)/ 没有比当前柱面号大的等待进程 direction=-1;/置当前移臂方向为外移q=head;/从小于当前柱面号的访问中选择一个最大的,p指向名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 15 页 - - - - - - - - - p=q; max=q-cylinder_num; q=q-next; while(q!=NULL) if(maxcylinder_num) max=q-cylinder_num; p=q;/p 指向最大的节点 q=q-next; else/有大于当前柱面号的等待进程 min=q-cylinder_num; p=q; q=q-next; while(q!=NULL)/ 大于当前柱面号并且小于指定最小的节点时 if(h-cylinder_numcylinder_num)&(q-cylinder_numcylinder_num) min=q-cylinder_num; p=q;/p指向最小的节点 q=q-next; else/当前移臂方向向外 while(q!=NULL)&(q-cylinder_num h-cylinder_num) q=q-next; if(q=NULL)/ 没有比当前柱面号小的请求 direction=1; q=head;/从大于当前柱面号的访问中选择一个最小的,p指向p=q; min=q-cylinder_num; q=q-next; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 15 页 - - - - - - - - - while(q!=NULL) if(minq-cylinder_num) min=q-cylinder_num; p=q;/p指向最小的节点 q=q-next; else/有比当前柱面号小的请求进程 max=q-cylinder_num; p=q; q=q-next; while(q!=NULL)/ 从小当前柱面号访问进程中选择一个最大的,用p指向 if(p-cylinder_numcylinder_num&q-cylinder_numcylinder_num) max=q-cylinder_num; p=q;/p指向最大的节点 q=q-next; /else/有比当前柱面号小的请求进程/else/当前移臂方向向外/if(q=NULL)/ 没有柱面号相同else/有柱面号相同的等待进程 min=q-phy_num-h-phy_num;/第一个相同柱面号设为最小值p=q;/指向最小的节点,旋转距离最短的访问者if(minnext; while(q!=NULL) if(q-cylinder_num=h-cylinder_num)/ 有柱面号相同 cha=q-phy_num-h-phy_num; if(chacha)/有更小的节点,旋转距离最短的访问者 min=cha; p=q;/指向最小的节点 q=q-next; /while 查找/else current_process(p);/ 保留选中的进程if(direction=1) / 启动磁盘printf( 被选中的等待进程为: n); printf(n); out_info(); printf( upn); printf(n); if(direction=-1) printf( 被选中的等待进程为: n); printf(n); out_info(); printf( downn); printf(n); if(p=head) head=p-next; else B=head; while(B-next!=p)/ 找到要删除进程的前一个节点B=B-next; B-next=p-next;/被选中者退出 I/O请求表 /if(q!=NULL) 结束else printf( 请求进程表为空 ,接收请求或退出 n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 15 页 - - - - - - - - - / 电梯调度算法结束void main()/主函数 system(cls); char go=y; float number; init(); printf( -* 执行驱动调度 *-n); printf( -* 当前运行进程为 *-n); out_info(); printf( upn); printf( -* 创建 I/O请求进程等待表 *-n); create_PCB(); /创建进程链表printf(n); printf(I/O 请求进程等待表为: n); printf(n); output(); while(go=y|go!=n) printf(n); printf( 输入01之间的数: n); printf( 大于0.5 n); printf( 小于0.5 n); scanf(%f,&number); while(number0.5) lift(); printf( 调用电梯驱动调度算法后的I/O请求表为: n); printf(n); output(); break; if(number=0.5) Receive_requests();/ 调用接受请求模块printf( 是否继续?n); printf(n); printf(n); scanf(%s,&go); main(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 15 页 - - - - - - - - - 七、心得体会模拟电梯调度算法,实现对磁盘的驱动调度磁盘是一种高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器, 担负着繁重的输入输出任务、在多道程序设计系统中, 往往同时会有若干个要求访问磁盘的输入输出请求等待处理。系统可采用一种策略, 尽可能按最佳次序执行要求访问磁盘的诸输入输出请求。这就叫驱动调度, 使用的算法称为驱动调度算法。驱动调度能降低为若干个输入输出请求服务所需的总时间,从而提高系统效率。 本实验要求学生模拟设计一个驱动调度程序,观察驱动调度程序的动态运行过程。 通过实验使我理解并且掌握了驱动调度的职能。学到了书上学不到的东西,丰富了知识面收益匪浅,感谢老师的指导名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 15 页 - - - - - - - - - 操作系统实验报告学号:0913063021 姓名:张广辉班级:软件工程 091 指导老师:丁 红南通大学杏林学院2011年 12 月名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 15 页 - - - - - - - - -