实验概述: |
【实验目的及要求】 用C语言编程实现时间片轮转调度算法 【实验原理】 基于时间片轮转调度算法思想用C语言编程实现 【实验环境】(使用的软件) Visual C++6.0 |
实验内容: 本实验模拟在单处理机情况下处理机调度,用C语言编程实现先来先服务和最短作业优先调度算法。 |
【实验方案设计】 时间片大小固定,由用户输入。进程个数由用户输入。 a.每个进程用一个PCB表示。PCB包括进程名,到达时间,运行时间,剩余时间,进程状态,链接指针。其中,进程名,到达时间和运行时间由用户输入,剩余时间的初值等于运行时间。为简单起见,进程状态设为三种:就绪,运行和完成。链接指针指向下一个进程的PCB; b.按照进程到达的先后顺序排成一个队列。设置一个队头指针指向队列中第一个进程,并设置一个队尾指针指向队列中的最后一个进程; c. 执行调度时,先选择队首的第一个进程运行。另外设置一个指向当前运行进程的指针; d.由于本实验是模拟实验,所以对选中进程并不实际启动运行,而只是执行: ●被选中进程的状态置为运行态; ●被选中进程的剩余时间减去时间片大小; ●按照队列的顺序依次输出每个进程的进程名,到达时间,运行时间,剩余时间,进程状态。 用这三个操作来模拟进程的一次运行; e.进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针,以指示应运行进程。同时还应判断该进程的剩余时间是否为0。如果不为0,则等待下一轮的运行;如果该进程的剩余时间为0,则将该进程的状态置为完成态,并退出队列; f. 若处于就绪态的进程不为空,则重复第d步和第e步直到所有进程都运行完为止。 【实验过程】(实验步骤、记录、数据、分析) 测试用例1: 屏幕显示:Plea input the process name, arrive time and run time 输入: 1 2 1<enter> 2 3 2<enter> 3 4 3<enter> 屏幕显示:Plea input the slice 1<enter> 屏幕输出结果: ******************************************** name arrive run rest state 1 2 1 0 running 2 3 2 2 ready 3 4 3 3 ready ******************************************** name arrive run rest state 2 3 2 1 running 3 4 3 3 ready ******************************************** name arrive run rest state 2 3 2 1 ready 3 4 3 2 running ******************************************** name arrive run rest state 2 3 2 0 running 3 4 3 2 ready ******************************************** name arrive run rest state 3 4 3 1 running ******************************************** name arrive run rest state 3 4 3 0 running ******************************************** 测试数据2: 2 3 1 1 2 3 5 4 2 测试数据3: 【结论】(结果) 测试数据1的运行结果(截图): 测试数据2的运行结果: 测试数据3的运行结果: 源程序代码: #include "stdio.h" #include "stdlib.h" struct stud { int name; int arrive; int run; int rest; char *state; struct stud *next; }; struct stud *create() { int a,i; struct stud *head, *rear,*p,*q,*t; head=rear=NULL;四级题 printf("Plea input the process number:"); scanf("%d",&a); printf("\nPlea input the process name,arrive time and run time:\nFor example: 1 2 1\n"); for(i=0;i<a;i++) { p=(struct stud*)malloc(sizeof(struct stud)); scanf("%d%d%d",&p->name,&p->arrive,&p->run); p->rest=p->run; p->state="ready"; if(rear==NULL) { head=p; p->next=NULL; rear=p; } 实词有哪些 el { t=NULL; q=head; while(q&&q->arrive<p->arrive) 定位烫 {t=q; q=q->next;} if(q五年级口算题==head) {p->next=head; head=p;} el if(t==rear) {rear->next=p; p->next=NULL; rear=p;} el {t->next=p; p->next=q;} } } return head; } void output(struct stud 艾雅法拉火山*head) { struct stud *p,*t,*r; int slice; printf("Plea input the slice:"); scanf("%d",&slice); while(head!=NULL) { r=p=head; while(p!=NULL) {t=head; p->rest=p->rest-slice; p->state="running"; if(p->rest<0) p->rest=0; printf("\n**************************************\n"); printf("name\tarrive\trun\trest\tstate\n"); while(t!=NULL) { printf("%d\t%d\t%d\t%d\t%s\n",t->name,t->arrive,t->run,t->rest,t->state); t=t->next; } if(p->rest==0)/*判断是否删除结点*/ { if(p==head) {head=p->next; free(p); p=head;}/*删除头结点*/ el {r->next=p->next; p=r->next; r=p;} } el {r=p; p蔬菜大全名字->state="ready"; p=p->next; } } } } void main() { struct stud *head; head=create(); output(head) ; } |
【小结】 实验中产生的错误及原因分析: 1、程序运行不下去: 错误分析:链表初始化排序过程中:指针p=Null时,不能执行q->arrive等命令; 错误解决方法: 将while(q->arrive<p->arrive &&q) {t=q; q=q->next;} 改为:while(q&&q->arrive<p->arrive) {t=q; q=q->next;} 2、进程运行时间大于时间片时,程序进入死循环: 当进程所需时间等于时间片时,运行结果正确: 进程运行时间大于时间片时,程序进入死循环: 错误分析: 进程所需剩余时间计算错误; 错误修改: 将while(p!=NULL) {t=head; p->rest=p个人车辆转让协议->前店后院run-slice; p->state="running"; 修改为:while(p!=NULL) {t=head; p->rest=p->rest-slice; p->state="running"; 错误3: 测试数据: 1 2 1 3 1 3 Slice=2 结果为: 即进入死循环。 当进程所需时间小于时间片时,应立即跳出进程就绪对列。 错误修改: 在output()子函数中p->rest=p->rest-slice; 后面加上一个语句: if(p->rest<0) p->rest=0; 实验运行结果为: 实验的体会及收获: 通过这次试验,我对处理机的调度算法---基于时间片轮转调度算法思想有了更深的理解;另外使我对链表的知识有了更深的理解,而且锻炼了我的思维能力,使我能更全面地思考问题,以后还需要多做些这方面的练习。 实验还需改进之处: 为考虑进程所需时间小于时间片大小的情况,如:进程运行完一次时间片时间中断后,但下一个进程的提交时间要迟很多,这时候就会浪费很多时间等待,这是该程序还需改进的地方。 另外,本实验中的RR算法的时间片大小固定,所以实际是属于基本轮转法,还有种是时间片长短是变化的,即改进轮转法。在基本轮转法中,时间片大小的设置是关键。时间片设得太短会导致过多的进程切换,降低了CPU效率;而设得太长又可能引起对短的交互请求的响应变差。据悉,通常,时间片的长度为几十毫秒到几百毫秒,而将时间片设为100毫秒通常是一个比较合理的折衷。 |
指导教师评语及成绩: |
评语: 成绩: 指导教师签名: 批阅日期: |
本文发布于:2023-05-15 09:56:16,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/82/639302.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |