一、实验题目: 模拟进程调度功能
二、实验目的: 通过本实验,进一步掌握进程调度的功能和实现原理。
三、实验环境:
1、硬件:PC机及其兼容机。
2、软件:Windows OS,MS—DOS OS,Turbo C 或 C++、VC++等。
四、实验内容:
1、 设计进程调度功能,至少模拟两种以上调度算法。如:优先级调度算法、时间片调度算法等。
2、 进程调度功能作为一个函数 scheduler,加入到实验题目一中。
3、 进程调度程序从就绪队列中挑选进程,若队列为空,应显示“无就绪进程无法调度”的提示信息。
4、 若选上一个进程,以显示:进程名、状态、时间片、优先级等信息表示一个进程被执行。若运行完,应删除相应 PCB。
五、运行示例:

六、算法流程图:

七、程序清单:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<windows.h>
int count=0;
typedef struct PCB{
char pname[10];
int ppri;
int pruntime;
int pstatus;
struct PCB *next;
}PCB;
void menu(){
printf("---------OS实验一:模拟进程创建、阻塞、唤醒、终止原语---------\n");
printf("----------------------------1.创建----------------------------\n");
printf("----------------------------2.调度----------------------------\n");
printf("----------------------------3.阻塞----------------------------\n");
printf("----------------------------4.唤醒----------------------------\n");
printf("----------------------------5.删除----------------------------\n");
printf("----------------------------6.显示----------------------------\n");
printf("----------------------------0.返回上一层----------------------\n");
printf("---------------------请输入您需要的功能(0-6)------------------\n");
printf("--------------------------------------------------------------\n");
printf("各功能简要说明:\n");
printf("创建:在本实验中,该功能仅实现建立 PCB,初始化 PCB,并将该 PCB放入就绪队列中。\n");
printf("优先级调度:选择该功能选项时,系统将从就绪队列中选择优先级最高的进程,使该进程处于执行状态(将进程 PCB 的内容显示在屏幕上,显示完成后,该进程结束,即撤销该进程的 PCB)。\n");
printf("时间片调度:每选择一次该功能,将就绪队列中所有进程的内容显示在屏幕上,并将每个执行进程的执行时间减去一个时间片,若某进程的剩余时间小于等于0,则表明该进程运行结束,撤销该进程的PCB。\n");
printf("阻塞:在本实验中,实现的功能为,根据用户输入的进程名称查看该进程是否处在运行状态,若处在运行状态,修改该进程PCB的状态,并将该进程转入阻塞队列;若该进程处在其它状态,则给出相应的提示信息;若该进程不存在,也需要给出相应的提示信息。\n");
printf("唤醒:功能类似阻塞功能,注意:若阻塞队列为空,则不能执行唤醒功能。\n");
printf("终止:根据用户输入要结束的进程名称,从就绪队列、阻塞队列和正在运行的进程中找到相应的进程 PCB,并将该 PCB 从相应队列中删除。若该进程不存在,需要给出提示。\n");
printf("显示:将就绪队列、阻塞队列中的进程列表和正在运行的进程显示出来。\n");
}
void fprior(PCB *ready,PCB *run){
PCB *p,*q;
int maxpri=INT_MAX;
p=ready;
while(p->next){
if(p->next->ppri<maxpri)
q=p;
p=p->next;
}
p->next=run->next;
run->next=NULL;
p=q->next;
q->next=p->next;
run->next=p;
}
void ftimeschedule(PCB *ready,PCB *run){
PCB *p,*q;
int time;
int flag=1;
p=ready;
while(p->next)
p=p->next;
p->next=run->next;
run->next=NULL;
printf("请输入时间片大小:");
scanf("%d",&time);
p=ready->next;
while(p && flag){
p->pstatus=1;
ready->next=p->next;
run->next=p;
p->next=NULL;
p->pruntime-=time;
printf("进程名 剩余时间\n");
printf("%s\t\t",p->pname);
printf("%d\n",p->pruntime);
if(p->pruntime>0){
q=ready;
while(q->next)
q=q->next;
q->next=run->next;
run->next=NULL;
}
else{
free(p);
run->next=NULL;
printf("运行结束,%s进程退出内存!\n",p->pname);
}
printf("继续运行一个时间片?1-继续 0-退出\n");
scanf("%d",&flag);