您的当前位置:首页操作系统进程调度算法模拟

操作系统进程调度算法模拟

2020-03-29 来源:乌哈旅游


实验一 进程调度算法模拟

一 .实验题目:

设计一个简单的进程调度算法,模拟OS中的进程调度过程 二.要求:

① 进程数不少于5个;

② 进程调度算法任选;

可以用动态优先数加时间片轮转法实现进程调度,每运行一个时间片优先数减3; ③ 用C语言编程;

④ 程序运行时显示进程调度过程。

三.程序中所用数据结构及说明:

进程控制块结构体: typedef struct node1 {

int ID;//进程标识数 int PRIORITY;//进程优先数 int CPUTIME;//进程已占用时间片 int ALLTIME;//进程还需占用时间片 }Block,pcb;

就绪进程链表节点: typedef struct node2 { pcb data;

struct node2 *next; }process;

四.清单程序及描述: Procelink.h:

typedef struct node1 {

int ID;//进程标识数 int PRIORITY;//进程优先数 int CPUTIME;//进程已占用时间片 int ALLTIME;//进程还需占用时间片 //char STATE;//进程状态

//struct node *next;//进程队列指针

}Block,pcb;

typedef struct node2 {

pcb data;

struct node2 *next; }process;

void Initlink(process **PQ) { }

int IsEmpty(process *PQ) { }

void EnInitlink(process *PQ,pcb p) {

while(PQ->next!=NULL) PQ=PQ->next;

process *temp=(process *)malloc(sizeof(Block));

temp->data.PRIORITY=p.PRIORITY;

temp->data.ID=p.ID;

temp->data.CPUTIME=p.CPUTIME; temp->data.ALLTIME=p.ALLTIME; temp->next=PQ->next;

PQ->next=temp;

if(PQ->next == NULL)

return 1; else return 0;

/*如果有内存空间,申请头结点空间并使头指针head指向头结点*/ if((*PQ = (process *)malloc(sizeof(process))) == NULL) exit(1); (*PQ)->next = NULL;

/*置链尾标记NULL */

}//插入

pcb DeInitlink(process *PQ) //选择优先数最小的出列 {

if(IsEmpty(PQ)) { }

process *temp=(process *)malloc(sizeof(Block)); temp = PQ->next;

process *te=(process *)malloc(sizeof(Block)); process *t=(process *)malloc(sizeof(Block)); te= PQ->next;//优先数最小的进程 while(temp->next != NULL) {

if(te->data.PRIORITYnext->data.PRIORITY)

printf(\"所有进程已运行完!\\n\");

exit(0);//退出

{

te=temp->next; t=temp->next->next; PQ=temp;

}

temp=temp->next; }

PQ->next=PQ->next->next; pcb pp=te->data; // free(temp); // free(t); //free(te); return pp; }//出队列

void outid(process *PQ)//输出就绪队列函数 { printf(\"当前就绪队列为: \"); while(!IsEmpty(PQ)) { printf(\"%d \ PQ=PQ->next; }

printf(\"\\n\");

}

void dispatch(pcb p,process *PQ)//进程运行函数 { if((p.ALLTIME)!=0) {

p.PRIORITY-=3; p.CPUTIME+=1; p.ALLTIME-=1;

printf(\"进程 %d运行\\n\

//printf(\"进程优先数:%d 进程已占用时间片:片:%d\\n\

outid(PQ);//输出就绪队列 }

if((p.ALLTIME)==0) { printf(\"进程 %d 运行完成!\\n\ return;//完成则不加入链表 }

%d 进程还需占用时间 }

EnInitlink(PQ,p); return;//运行之后再加入链表

os_1.cpp:

#include #include #include\"procelink.h\" void main() {

process * PQ; \\n\"); }

五.执行结果:

for(int i=1;i<=n;i++) { }

while(!IsEmpty(PQ)) {

dispatch(DeInitlink(PQ),PQ);//进程运行函数调用 }

if(IsEmpty(PQ))

printf(\"所有进程已运行完!\\n\"); printf(\"第%d进程: \

scanf(\"%d %d %d %d\,&pro1.CPUTIME,&pro1.ALLTIME);

EnInitlink(PQ,pro1); int n;//n为进程数 pcb pro1; Initlink(& PQ);

printf(\"请输入进程个数: \");

printf(\"请输入各个进程的 进程标识数ID,进程优先数,进程已占用时间片,进程还需占用时间片

scanf(\"%d\

free(PQ);//释放内存空间

六.实验总结:

通过这次操作系统中进程调度算法的模拟,使我对操作系统中的进程调度有了更清晰的认识和了解,程序中也有不足之处,该程序是顺序进链,出链时再选择优先数最大的进程。比如调度某个进程时若该进程大于一个时间片(即调度一次不能结束)则可以直接修改进程信息,而不必使其先出链在进链,增加了时间复杂度。

因篇幅问题不能全部显示,请点此查看更多更全内容