时间片轮转调度算法实验报告

更新时间:2023-05-15 09:56:16 阅读: 评论:0

实验概述:
【实验目的及要求】
用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 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图