一、实验目的
用高级语言编写和调试一个进程调度程序,以加深对进程的概念 及进程调度算法的理解。
二、实验内容
设计一个有 N 个进程共行的进程调度程序。
(1)进程调度算法:采用最高优先数优先的调度算法(即把处 理机分配给优先数最高的进程)和先来先服务算法。
(2)每个进程有一个进程控制块(PCB)表示。进程控制块可 以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用11 CPU 时间、进程状态等。
(3)每个进程的状态可以是就绪 W(Wait)、运行 R(Run)或 完成 F(Finish)三种状态之一。
(4)进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
(5)进程的到达时间为进程的输入的时间。
(6)进程的运行时间以时间片为单位进行计算。
(7)就绪进程获得 CPU 后都只能运行一个时间片。
(8)用已占有 CPU 时间加 1 来表示。
(9)如果运行一个时间片后,进程的已占有 CPU 时间已达到所 需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占 有 CPU 时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减 1(即降低一级),然后把它插入就绪队列 等待 CPU。
三、实验结果
1.实验结果
2.详细代码
#include#define ready 1 #define run 2 #include "malloc.h" struct PCB { char name010[10]; //进程名 int priority010; //进程优先级 int state010; //进程的状态W R F int needtime010; //进程需要的运行时间 int runtime010; //已用时间 struct PCB* next; }; PCB *head; //进程控制块设计 void create() { PCB *p,*q; int n,i; printf("请输入要创建的进程数:"); scanf("%d",&n); head=(PCB*)malloc(sizeof(PCB)); p=head; for(i=1;i<=n;i++) { q=(PCB*)malloc(sizeof(PCB)); p->next=q; p=q; printf("请输入第%d个进程的进程名:",i); scanf("%s",&q->name010); printf("请输入进程的优先级:",i); scanf("%d",&q->priority010); printf("请输入进程所需的运行时间:",i); scanf("%d",&q->needtime010); q->state010=Wait; q->next=NULL; } } void delete_(PCB *head,PCB *p) { PCB *q; q = head; while(q->next != p) q = q->next; q->next = p->next; free(p); } PCB* getminneedtime(PCB* head) { PCB *p,*q; p = head->next; q = p->next; while(q) { if(p->needtime010 > q->needtime010) p = q; q = q->next; } return p; } void SJF() { PCB *p, *q; while(head->next) { p = getminneedtime(head); p->state010 = Run; printf("n****正在运行的进程信息如下所示:n"); printf("进程名:%s ",p->name010); printf("进程状态:Run "); printf("进程所需时间:%d ",p->needtime010); printf("进程的运行时间:%dn",p->runtime010); q=head->next; if(q->next != NULL) { printf("****现在的就绪队列信息如下:*****n"); } else { printf("****现在就绪队列为空!!!*****nn"); } while(q) { if(q!=p) { printf("进程名为:%s ",q->name010); printf("进程状态:Wait "); printf("进程所需时间为:%d ",q->needtime010); printf("进程运行时间为:%dn",q->runtime010); } q=q->next; } delete_(head,p); } } void RR() { PCB *p, *q, *r; int time; printf("请输入时间片的大小:"); scanf("%d",&time); p = head->next; while(p) //找到进程链表最后一个PCB { r = p; p = p->next; } while(head->next) { p = head->next; p->state010 = Run; printf("n****正在运行的进程信息如下:****n"); printf("%s ",p->name010); printf("Run "); printf("需要时间:%d ",p->needtime010); printf("运行时间:%d ",p->runtime010); printf("优先权:%dnn",p->priority010); if((p->needtime010 - p->runtime010 )<= time) { delete_(head,p); } else { p->runtime010 = p->runtime010 + time; head->next = p->next; r->next = p; r = p; r->state010 = Wait; r->next = NULL; } if(head->next == NULL) printf("****现在就绪队列为空!!!*****nn"); else { printf("****现在的就绪队列信息如下:*****n"); q = head->next; while(q) { printf("%s ",q->name010); printf("Wait "); printf("需要时间:%d ",q->needtime010); printf("运行时间:%d",q->runtime010); printf("优先权:%dn",q->priority010); q = q->next; } } } } PCB* getpriority(PCB* head) { PCB *p, *q; p = head->next; q = p->next; while(q) { if(q->priority010 > p->priority010) p = q; q = q->next; } return p; } void HPF() { PCB *p, *q; while(head->next) { p = getpriority(head); p->state010 = Run; (p->runtime010)++; (p->priority010)--; printf("n****正在运行的进程信息如下:****n"); printf("%s ",p->name010); printf("Run "); printf("需要时间:%d ",p->needtime010); printf("运行时间:%d ",p->runtime010); printf("优先权:%dn",p->priority010); if(p->runtime010 == p->needtime010) delete_(head,p); q = head->next; if(q!= NULL) printf("****现在的就绪队列信息如下:*****n"); else printf("****现在就绪队列为空!!!*****nn"); while(q) { printf("%s ",q->name010); printf("Wait "); printf("需要时间:%d ",q->needtime010); printf("运行时间:%d",q->runtime010); printf("优先权:%dn",q->priority010); q = q->next; } } } void printfunc() { printf(" *******************n"); printf(" * 1-创建进程 *n"); printf(" * 2-短作业调度算法 *n"); printf(" * 3-优先权调度算法 *n"); printf(" * 4-时间片轮回算法 *n"); printf(" * 0-退出 *n"); printf(" *******************n"); } int main() { printfunc(); int choice; do { printf("请输入相应的数字:") ; scanf("%d",&choice); switch(choice) { case 1: create(); printfunc(); break; case 2: if(head == NULL || head->next == NULL) printf("****现在就绪队列为空,请先创建进程*****n"); else { SJF(); printfunc(); } break; case 3: if (head == NULL || head->next == NULL) printf("****现在就绪队列为空,请先创建进程*****n"); else { HPF(); printfunc(); } break; case 4: if (head == NULL || head->next == NULL) printf("****现在就绪队列为空,请先创建进程*****n"); else { RR(); printfunc(); } break; case 0: exit(0); } }while(1); }



