/*
本程序未经302全体成员认可禁止非法COPY, CopyRight to 302 Dormitory 16 .
进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。
每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
*/
//运行所需要的头文件
#include "stdafx.h"
#include "stdlib.h"
#include "iostream.h"
#include "string.h"
#include "time.h"
#include "conio.h"
#include "math.h"
#define pgrade 10;
#define ptime 50;
#define ptime1 5;
//进程的结构体类型.
typedef struct process
{
char pname[20]; //进程名
long pid; //进程ID
long privalige; //进程权值
long startime; //开始进程时间
long usedtime; //进程已经使用时间
long needtime; //进程还需要时间
int psort ; //进程完成次序
struct process *next; //指向下一进程的指针
}PROC;
class operating
{
private:
int procount; //进程数量
PROC sysprc; //指向所有进程的头节点
long times,psort,maxtime; //当前CPU调度的次数,完成的名次.
public :
int insertprocess(PROC ); //安到来的进程时间升序插入进程.
void createprocess(void); //建立进程
void disprocess(void); //显示所有进程
void disaproc(PROC&,int); //单记录显示进程并进行相应的处理工作.
void runprocess(void); //开始进行进程调度
//构造函数进程一些必要参数初始化:
operating()
{
strcpy(sysprc.pname,"最高优先数算法:");
sysprc.next=NULL;
psort=times=1;
maxtime=0;
};
};
//创建有序进程链表(按到达时间升序排序).
int operating::insertprocess(PROC pp)
{
PROC *temproc=&sysprc,*temproc1;
if(!temproc) return false;
else
{
//创建一个进程并进行相关赋值.
temproc1=new PROC;
strcpy(temproc1->pname,pp.pname);
temproc1->pid=pp.pid;
temproc1->privalige=pp.privalige ;
temproc1->startime=pp.startime;
temproc1->usedtime=pp.usedtime ;
temproc1->needtime=pp.needtime ;
temproc1->psort=pp.psort;
temproc1->next=NULL;
while(temproc->next)
{
if(temproc1->startime < temproc->next->startime)
{
temproc1->next=temproc->next->next;
temproc->next=temproc1;
}
temproc=temproc->next;
}
if(!temproc->next)
{temproc->next=temproc1;temproc1->next=NULL;}
}
return true ;
}
//创建一个进程操作.
void operating::createprocess(void)
{
char name[20];
PROC *temproc1,temp;
//输入进程的个数:
cout <<"Please input the process count :";
cin >>procount;
for(int i=1;i<=procount;i++)
{
cout <<"Please input the process name :";//输入进程名字.
cin >>name;
temproc1=new PROC;
strcpy(temproc1->pname,name);
temproc1->pid=i;
srand((unsigned)time( NULL));
temproc1->privalige=rand()% pgrade;
srand((unsigned)time( NULL));
temproc1->startime=rand() % ptime;
if (maxtime<temproc1->startime) maxtime=temproc1->startime;
temproc1->usedtime=0;
srand((unsigned)time( NULL));
temproc1->needtime= rand() % ptime1 ;
temproc1->psort=0;
if(!temproc1->needtime) temproc1->needtime++;
temproc1->next=NULL;
temp=*temproc1;
insertprocess( temp ); //调用insertprocess创建进程.
}
}
//输入所有的进程信息.
void operating::disprocess(void)
{
PROC *temproc=sysprc.next;
while(temproc)
{
cout << "\nProcess Name :" << temproc->pname;
cout << "\nProcess PID :" << temproc->pid;
cout << "\nProcess privalige:" << temproc->privalige;
cout << "\nProcess Startime :" << temproc->startime;
cout << "\nProcess Usedtime :" << temproc->usedtime;
cout << "\nProcess Needtime :" << temproc->needtime;
cout << "\nProcess Finishtime :" << temproc->usedtime;
cout <<"\n\n\n";
temproc=temproc->next;
}
}
//单进程信息显示并进行 (进程权限--) (使用时间++) (需要时间--)
void operating::disaproc( PROC & pp,int bj)
{
PROC *temproc=&pp;
//进程权限-- 用时++ 需要时间--
if(bj && pp.needtime)
{
pp.privalige--;
pp.usedtime++;
pp.needtime--;
if(!pp.needtime)
{
--procount;
pp.psort=psort++;//当需要时间为0时则名次保存.
}
}
//如果需要时间量=0则还需要运行的进行数--.
cout <<" \n RUN times:" << times++;
cout <<" \n [Process Run :]"<<temproc->pname;
cout << "\nProcess PID :" << temproc->pid;
cout << "\nProcess Privalige:" << temproc->privalige;
cout << "\nProcess Startime :" << temproc->startime;
cout << "\nProcess Usedtime :" << temproc->usedtime;
cout << "\nProcess Needtime :" << temproc->needtime;
cout << "\nProcess Finishtime :" << temproc->psort;
cout <<"\n\n\n";
}
//开始进程调度.
void operating::runprocess(void)
{
PROC *temproc=&sysprc,*temproc1;
long shortruntime,maxtime1;
if(temproc->next)
{
temproc1=temproc=temproc->next;
shortruntime=temproc->startime;
// 第一次运行依据时间判断.
while(temproc)
{
if(shortruntime>temproc->startime){temproc1=temproc;}
temproc=temproc->next;
}
disaproc(*temproc1,1);
temproc=&sysprc;
temproc1=temproc=temproc->next;
long highpri;
maxtime1=1;
//每运行完成个进程,就进程个数(procount--)--.
while(procount)
{
temproc=&sysprc;
temproc1=temproc=temproc->next;
highpri=0;
maxtime1=maxtime1+1;
if(maxtime1 >= maxtime) maxtime1=maxtime;
//依进程的权限运行进程.
while(temproc)
{
if(highpri<temproc->privalige && (temproc->needtime!=0))
{
temproc1=temproc; highpri=temproc->privalige;}
temproc=temproc->next;
}
if( highpri) disaproc(*temproc1,1);
}
}
else
return;
}
void main()
{
operating sysproc;
//创建进程.
sysproc.createprocess();
//显示所有进程信息.
sysproc.disprocess();
cout<<"\n显示进程的完成结果 :";
sysproc.runprocess();
}