1、进程调度算法模拟 实验报告 实 验 报 告 课程名称 计算机操作系统 实验名称 进程调度算法模拟 专业班级 学生姓名 指导教师 实验一 进程调度算法模拟, 1内容:设计一个简单的进程调度算法,模拟OS中的进程调度过程;2要求: 进程数不少于5个; 进程调度算法任选; 可以用动态优先数加时间片轮转法实现进程调度,每运行一个时间片优先数减3; 用C语言编程; 程序运行时显示进程调度过程。3步骤: 设计PCB及其数据结构: 进程标识数:ID 进程优先数:PRIORITY(优先数越大,优先级越高) 进程已占用时间片:CPUTIME,每得到一次调度,值加1; 进程还需占用时间片:ALLTIME,每得到一
2、次调度,该值减1,一旦运行完毕,ALLTIME为0) 进程队列指针:NEXT,用来将PCB排成队列 进程状态:STATE(一般为就绪,可以不用) 设计进程就绪队列及数据结构; 设计进程调度算法,并画出程序流程图; 设计输入数据和输出格式; 结构格式:当前正运行的进程:0 当前就绪队列:2,1,3,4 编程上机,验证结果。4提示:假设调度前,系统中有5个进程,其初始状态如下:ID01234PRIORITY93830290可否考虑用数组或链表去实现CPUTIME00000ALLTIME32634STATEreadyreadyreadyreadyready 以时间片为单位调度运行; 每次调度ALLT
3、IME不为0,且PRIORITY最大的进程运行一个时间片; 上述进程运行后其优先数减3,再修改其CPUTIME和ALLTIME,重复, 直到所有进程的ALLTIME均变为0。5书写实验报告 实验题目; 程序中所用数据结构及说明; 清单程序及描述; 执行结果。 实验源代码:#include#includetypedef int Status;#define ERROR 0#define OK 1typedef struct PCB char NAME10; /进程名字 int PRIO; /进程优先数 int ROUNT; /轮转时间片 int COUNT; /计数器 int NEEDTIME;
4、 /需要的CPU时间 int CPUTIME; /占用cpu时间 char *STATE; /进程状态ElemPCB;typedef struct QNode ElemPCB pcb; struct QNode *next;QNode, *QueuePtr;typedef struct /就绪队列 QueuePtr RUN; /当前运行进程指针 QueuePtr READY; /头指针 QueuePtr TAIL; /尾指针READYQueue;typedef struct /完成队列 QueuePtr FINISH; /头指针 QueuePtr TAIL; /尾指针FINISHQueue;S
5、tatus Create(READYQueue &ready); Status Print(READYQueue ready,FINISHQueue finish);Status Printr(READYQueue ready,FINISHQueue finish);Status Fisrt(READYQueue &ready); Status Insert1(READYQueue &ready);Status Insert2(READYQueue &ready);Status Prisch(READYQueue &ready,FINISHQueue &finish);Status Round
6、sch(READYQueue &ready,FINISHQueue &finish);void main() char ch; READYQueue ready; FINISHQueue finish; ready.READY=ready.TAIL=(QueuePtr)malloc(sizeof(QNode); /存储分配 ready.RUN=(QueuePtr)malloc(sizeof(QNode); ready.RUN-next=NULL; finish.FINISH=finish.TAIL=(QueuePtr)malloc(sizeof(QNode); Create(ready); /
7、创建后就绪对列中 printf(n就绪对列中初始值:n); Print(ready,finish); Fisrt(ready); printf(请输入要选择调度的算法(p-优先数调度,r-时间片轮转法):n); while(1) do ch=getchar(); scanf(%c,&ch); while(ch!=p & ch!=r); switch(ch) case p: /优先数调度 Prisch(ready,finish); break; case r: /时间片轮转法 Roundsch(ready,finish); break; Status Print(READYQueue ready
8、,FINISHQueue finish) /打印就绪队列中的进程状态 QueuePtr p,q; p=ready.READY; q=finish.FINISH; /运行中的进程 if(ready.RUN-next!=NULL) printf(%s,ready.RUN-next-pcb.NAME); printf(:%st,ready.RUN-next-pcb.STATE); printf(优先数:%dn,ready.RUN-next-pcb.PRIO); /就绪队列的进程 while(p!=ready.TAIL) printf(%s,p-next-pcb.NAME); printf(:%st,
9、p-next-pcb.STATE); printf(优先数:%dn,p-next-pcb.PRIO); p=p-next; /完成队列的进程 while(q!=finish.TAIL) printf(%s,q-next-pcb.NAME); printf(:%st,q-next-pcb.STATE); printf(优先数:%dn,q-next-pcb.PRIO); q=q-next; return OK;Status Printr(READYQueue ready,FINISHQueue finish) /打印就绪队列中的进程状态 QueuePtr p,q; p=ready.READY; q
10、=finish.FINISH; /运行中的进程 if(ready.RUN-next!=NULL) printf(%s,ready.RUN-next-pcb.NAME); printf(:%st,ready.RUN-next-pcb.STATE); printf(剩余时间:%dn,ready.RUN-next-pcb.NEEDTIME); /就绪队列的进程 while(p!=ready.TAIL) printf(%s,p-next-pcb.NAME); printf(:%st,p-next-pcb.STATE); printf(剩余时间:%dn,p-next-pcb.NEEDTIME); p=p
11、-next; /完成队列的进程 while(q!=finish.TAIL) printf(%s,q-next-pcb.NAME); printf(:%st,q-next-pcb.STATE); printf(剩余时间:%dn,q-next-pcb.NEEDTIME); q=q-next; return OK;Status Create(READYQueue &ready) QueuePtr p; int i=0 ; int n; printf(请输入进程个数:); scanf(%d,&n); while(ipcb.NAME); printf(输入进程需要的时间:); scanf(%d,&p-p
12、cb.NEEDTIME); printf(输入进程的进程优先数:); scanf(%d,&p-pcb.PRIO); p-pcb.STATE=W; p-pcb.ROUNT=2; p-pcb.COUNT=0; i+; p-next=NULL; ready.TAIL-next=p; ready.TAIL=p; return OK;Status Fisrt(READYQueue &ready) if(ready.READY=ready.TAIL) return ERROR; ready.RUN-next=ready.READY-next; ready.RUN-next-pcb.STATE=RUN; /
13、修改进程状态 if(ready.TAIL=ready.READY-next) ready.READY=ready.TAIL; else ready.READY-next=ready.READY-next-next; /头指针后移 printf(n%s被从就绪队列调度运行n,ready.RUN-next-pcb.NAME); return OK;Status Insert1(READYQueue &ready) int i=0,j=0; QueuePtr p=ready.READY,q; ElemPCB temp; QueuePtr s=(QueuePtr)malloc(sizeof(QNode
14、); s-pcb=ready.RUN-next-pcb; s-next=NULL; /将未完成的进程插入就绪队列 ready.TAIL-next=s; ready.TAIL=s; /按优先数从大到小排序 for(p;p!=ready.TAIL;p=p-next) for(q=p-next;q!=ready.TAIL;q=q-next) if(p-next-pcb.PRIO next-pcb.PRIO) temp=p-next-pcb; p-next-pcb=q-next-pcb; q-next-pcb=temp; return OK; Status Insert2(READYQueue &re
15、ady) QueuePtr p=ready.RUN-next; if(p-pcb.NEEDTIME 0) ready.TAIL-next=p; /插入到就绪队列 ready.TAIL=p; ready.RUN-next=NULL; return OK;Status Prisch(READYQueue &ready,FINISHQueue &finish) int i=0 ; while(ready.RUN-next!=NULL) ready.RUN-next-pcb.CPUTIME+; ready.RUN-next-pcb.NEEDTIME-; ready.RUN-next-pcb.PRIO-
16、=3; if(ready.RUN-next-pcb.NEEDTIME=0) finish.TAIL-next=ready.RUN-next; /插入到完成队列 finish.TAIL=ready.RUN-next; /尾指针后移 ready.RUN-next-pcb.STATE=FINISH; ready.RUN-next=NULL; if(ready.READY!=ready.TAIL) Fisrt(ready); else if(ready.READY != ready.TAIL & (ready.RUN-next-pcb.PRIO) next-pcb.PRIO) ready.RUN-ne
17、xt-pcb.STATE=W; printf(%s被调到就绪队列里n,ready.RUN-next-pcb.NAME); Insert1(ready); Fisrt(ready); i+; printf(n进程执行第%d个时间片的结果:n,i); Print(ready,finish); return OK;Status Roundsch(READYQueue &ready,FINISHQueue &finish) int i=0; while(ready.RUN-next!=NULL) ready.RUN-next-pcb.CPUTIME+; ready.RUN-next-pcb.NEEDT
18、IME-; ready.RUN-next-pcb.COUNT+; if(ready.RUN-next-pcb.NEEDTIME=0) finish.TAIL-next=ready.RUN-next; /插入到完成队列 finish.TAIL=ready.RUN-next; /尾指针后移 ready.RUN-next-pcb.STATE=FINISH; ready.RUN-next=NULL; if(ready.READY!=ready.TAIL) Fisrt(ready); else if(ready.RUN-next-pcb.COUNT=ready.RUN-next-pcb.ROUNT) ready.RUN-next-pcb.COUNT=0; if(ready.READY != ready.TAIL) ready.RUN-next-pcb.STATE=W; printf(%s被调到就绪队列里n,ready.RUN-next-pcb.NAME); Insert2(ready); Fisrt(ready); i+; printf(n进程执行第%d个时间片的结果:n,i); Printr(ready,finish); return OK;运行结果截图:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1