一、课设目的
通过对操作系统课程的学习,熟悉进程的概念、进程的管理与存储、进程的调度,通
过实践深入理解进程的调度算法。
二、课设任务
要求编写一个程序,可以创建若干个虚拟进程,并对若干个虚拟进程进行调度,调度
策略为时间片轮转法,主要任务包括:
进程的个数,进程的内容(即进程的功能序列)来源于一个进程序列描述文件,另
外调度运行结果输出到一个运行日志文件;
设计 PCB 适用于时间片轮转法;
建立进程队列;
实现时间片轮转调度算法,尽量可视化的展示调度的动态过程。
○5 总结程序设计的开发过程:需求分析、系统设计、系统实现及文档的收集和整理。
三、实验方法与设计分析
每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、
优先数、到达时间、需要运行时间、已用 CPU 时间、进程状态等等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到
达时间为输入进程的时间。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪 W(Wait)、运行 R(Run)、或完成 F(Finish)三种状态
之一。
就绪进程获得 CPU 后都只能运行一个时间片。用已占用 CPU 时间加 1 来表示。
如果运行一个时间片后,进程的已占用 CPU 时间已达到所需要的运行时间,则撤消该进程,
如果运行一个时间片后进程的已占用 CPU 时间还未达所需要的运行时间,也就是进程还需
要继续运行,此时应将进程的优先数减 1(即降低一级),然后把它插入就绪队列等待 CPU。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检
查。
重复以上过程,直到所要进程都完成为止
四、程序流程图
开始
设置时间片
增加进程
选择
是
继续增加
PCB 顺序
结束进程
调度进程
PCB 顺序
打印进程
结束
循环
五、程序源代码
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
using namespace std;
ofstream myfile("bb.txt",ios::app||ios::trunc);
typedef struct node
{
char name[10];/*进程名*/
int round;
/*进程分配的时间片*/
int cputime;
/*进程消耗的CUP时间*/
int needtime; /*进程需要的CUP时间*/
int count;
/*进程运行时间*/
char state;
/*进程的状态:'R':运行,'W':等待,'F':结束*/
struct node *next;/*指向下一个进程的指针*/
}PCB;
PCB *finish,*ready,*tail,*run;/*指向三个队列的队首的指针,tail为就绪队列的队尾指针*/
int N;/*定义进程的数目*/
void firstin(void)
{
if(ready!=NULL)
{
run=ready;
ready=ready->next;
run->state='R';
run->next=NULL;
}
else
run=NULL;
{
}
}
void prt1(char a)
cout<<"name" <<"
cputime" <<"
needtime"<<"
count "<<"
round"<<"
state"<
name<<"
"<cputime<<"
"<needtime<<"
"<count<<"
"<round<<"
"<state<name<<"
";myfile<cputime<<"
";myfile<needtime<<"
";
myfile<count<<"
";myfile<round<<"
";
myfile<state<}
p=ready;
while(p!=NULL)
{
}
prt2(algo,p);
p=p->next;
p=finish;
while(p!=NULL)
{
prt2(algo,p);
p=p->next;
}
getchar();
}
void insert(PCB *q)
{
}
tail->next=q;
tail=q;
q->next=NULL;
void rcreate_task(char algo)
{
PCB *p;
int n,time;
char na[10];
ready=NULL;
finish=NULL;
run=NULL;
cout<<"请输入进程数目N:";
cin>>N;
for(n=0;n>na;
cout<<"Enter the time of process:"<>time;
strcpy(p->name,na);
p->cputime=0;
p->needtime=time;
p->count=0;
p->state='W';
p->round=2;
if(ready!=NULL)
{
insert(p);
}
else
{
p->next=ready;
ready=p;
tail=p;
}
}
run=ready;
ready=ready->next;
run->state='R';
cout<<"创建成功。"<count==run->round)
{
run->count=0;
if(ready!=NULL)
{
run->state='W';
insert(run);
firstin();
}
}
prt(algo);
void roundrun(char algo)
{
while(run!=NULL)
{
run->cputime=run->cputime+1;
run->needtime=run->needtime-1;
run->count=run->count+1;
if(run->needtime==0)
{
run->next=finish;
finish=run;
run->state='F';
run=NULL;
if(ready!=NULL)
firstin();
{
}
}
else
{
if(run->count==run->round)
{
run->count=0;
if(ready!=NULL)
run->state='W';
insert(run);
firstin();
{
}
}
}
prt(algo);
}
}
void caidan()
{
}
cout<<"**************************主页************************"<>algo;
if(algo=='i'||algo=='I')
rcreate_task(algo);
{
}
else if(algo=='c'||algo=='C')
{
}
chakan(algo);
else if(algo=='o'||algo=='O')
{
}
roundrun(algo);
else if(algo=='h'||algo=='H')
{
}
goto loop2;
goto loop1;
myfile.close();
return 0;
loop2:
}
六、运行结果