操作系统处理机调度实验C语言版(按优先权排序)

  • 格式:doc
  • 大小:188.00 KB
  • 文档页数:12

中南大学 实验名称:处理机调度 课程名称:计算机操作系统

学生姓名 盛 希 玲 学 号 0903060215 学 院 信息科学与工程学院 专业班级 电子信息工程0602 完成时间 2008年10月12日 1

目 录 一 实验内容 ...................................................................................... 2 二 实验目的 ...................................................................................... 2 三 实验题目 ...................................................................................... 2 四 基本思想 ...................................................................................... 2 五 算法分析 ...................................................................................... 2 六 流程图 .......................................................................................... 3 七 算法描述 ...................................................................................... 4 八 运行输出结果 .............................................................................. 9 2

一 实验内容 选择一个调度算法,实现处理机调度。 二 实验目的

多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。本实验模拟实现处理机调度,以加深了解处理机调度的工作。

三 实验题目

设计一个按优先权调度和时间片轮转算法实现处理机调度的程序。 四 基本思想

先选择时间片的个数和每个时间片需要的时间,正在运行的进程每运行一秒其优先权数目加一,即其优先权减小。每个时间片运行结束后,选择进入时间片进程优先权数目最小的进程,开始下一个时间片的运行。如果有进程运行结束,则离开,再在就绪队列中选择优先权数目最小的进程进入。在运行期间,如果有新的进程来到,按优先权大小放入就绪队列中。

五 算法分析

定义一个结构体,此包含了PCB的信息: struct PCB { char PID[5]; /*进程名*/ int needtime; /*要求运行的时间*/ int cputime; /*已运行时间*/ int priority; /*优先权(越小越高)*/ int starttime; /*进入就绪队列的时间*/ int overtime; /*运行完成的时间*/ int state; /*状态:1就绪2运行3完成*/ struct PCB *next; }; 子函数struct PCB *create(int num,int n)用来建立一个按优先级大小排列的就绪进程链表和一个按时间先后循序排列的将进入就绪进程的链表。 3

main()函数中用一while循环输出进入时间片的进程状态。 六 流程图

开始 调用creat()函数,初始化进程PCB,各进程按优先级排序

按优先级选择绪队列中进程放入时间片运转 是否开始运行

运行,每运行一秒优先权和已运行时间加一 时间片结束,是否就绪进程队列不为零

将进入就绪队列的进程

就绪队列

是否有新进程进入

是否所有进程运行结束

结束 4

七 算法描述 #define NULL 0 #define LEN sizeof(struct PCB) #include"stdio.h" #include"stdlib.h" struct PCB { char PID[5]; /*进程名*/ int needtime; /*要求运行的时间*/ int cputime; /*已运行时间*/ int priority; /*优先权(越小越高)*/ int starttime; /*进入就绪队列的时间*/ int overtime; /*运行完成的时间*/ int state; /*状态:1就绪2运行3完成*/ struct PCB *next; }; struct PCB *create(int num,int n) /*创建进程,并将进程按优先级顺序插入队列中*/ { struct PCB *head,*p,*p1,*p2; int i; head=NULL; /*头指针指零*/ for(i=1;i<=num;i++) /*循环建立所有进程*/ { printf("请输入第%d个进程的信息\n",i); p=(struct PCB *)malloc(LEN); /*开辟一个空间*/ printf("进程名:"); /*输入进程名*/ scanf("%s",p->PID); printf("要求运行的时间:"); /*输入要运行的时间*/ scanf("%d",&p->needtime); p->cputime=0; /*占用处理机的时间赋为零*/ printf("优先权:"); /*输入优先权*/ scanf("%d",&p->priority); if(n==1) p->starttime=0; /*进入就绪队列的时间赋为零*/ else { printf("进入就绪队列时间:"); /*输入进入就绪队列的时间*/ scanf("%d",&p->starttime); } p->overtime=-1; /*运行没有结束所以运行完成的时间赋为-1*/ 5

p->state=1; /*状态赋为就绪状态*/ p1=head; /*p1指针指向头指针*/ if(head==NULL) /*如果头指针为零将头指针指向新建立的进程*/ {head=p;head->next=NULL;} else /*头指针不为零的情况*/ { if(n==1) while(p1!=NULL&&p->priority>p1->priority) /*查找插入点*/ {p2=p1; p1=p1->next; } else while(p1!=NULL&&p->starttime>p1->starttime) /*查找插入点*/ {p2=p1; p1=p1->next; } if(head==p1) /*优先权的值最小作为表头*/ {p->next=head;p2=head=p;} else /*否则的话插入*/ {p2->next=p;p->next=p1;} } } return(head); } void main() { char now[5]; int cho,num,num1,timepiece,time,i,j,k,flag,choo,clock=0; struct PCB *head,*head1,*over,*later,*l,*l1,*l2,*p,*p0,*p1,*p2,*q,*q1,*q2,*q3; over=NULL; printf("初始化进程...\n"); printf("输入总的就绪进程数:"); scanf("%d",&num); head=create(num,1); /*建立就绪进程的链表*/ printf("输入将会就绪的进程数:"); scanf("%d",&num1); /*建立将会进入就绪进程的链表*/ later=create(num1,2); printf("cpu是否开始运行:1是 2不是--"); scanf("%d",&cho); if(cho==1) /*处理机开始进行调度*/ { printf("现在的时间是:"); scanf("%s",now); 6

printf("显示所有就绪的进程:\n"); p2=head; printf("进程名\t要求运行时间\t已运行时间\t优先权\t状态(1就绪2运行3结束)\n"); while(p2!=NULL) { printf("%s\t%d\t\t%d\t\t%d\t%d\n",p2->PID,p2->needtime,p2->cputime,p2->priority,p2->state); p2=p2->next; } printf("请输入时间片总数:"); scanf("%d",&timepiece); printf("请输入时间片的时间:"); scanf("%d",&time); printf("运行正式开始!\n"); head1=head; printf("\t\t进程名\t要求运行时间\t已运行时间\t优先权\t状态\n"); for(i=1;i<=timepiece;i++) /*将进入时间片运行的进程用头指针head1指示,并改变就绪进程头指针head的指向*/ { if(head!=NULL) { p=head; head=head->next; } else break; } p->next=NULL; while(head1!=NULL) /*就绪进程头指针不为零就循环*/ { head1->state=2; /*状态:1就绪2运行3完成*/ for(j=1;j<=time;j++) /*每个时间片所需时间的循环*/ { clock++; /*定时器每秒加1*/ if(later!=NULL&&clock==later->starttime) /*如果将进入就绪队列的进程时间到达加入就绪队列*/ {l=later; l1=head; later=later->next; if(head==NULL) {head=l;head->next=NULL;} else { while(l1!=NULL&&l1->priority<=l->priority)