编写代码实现作业的三种调度算法

编写代码实现作业的三种调度算法,第1张

#include<windows.h>

#include<iostream>

#include<stdio.h>

#include<string>

using namespace std

const int maxnum=100

int N /*进程数*/

double start[maxnum],endtime[maxnum],arrive[maxnum],runtime[maxnum],zhou[maxnum]

double averagezhou // 平均周转时间

double average_zhou //平均带权周转时间

char name//进程名

double dqzhou[maxnum] //带权周转时间

typedef struct node

{

char name[10] //进程名

int round //进程时间轮转时间片

int cputime//进程占用CPU时间

int needtime //进程到完成还要的时间

char state //进程的状态

struct node *next//链指针

}PCB

PCB *finish,*ready,*tail,*run/*队列指针*/

void firstin() /*将就绪队列中的第一个进程投入运行*/

{

run=ready /*就绪队列头指针赋值给运行头指针*/

run->state='R' /*进程状态变为运行态*/

ready=ready->next /*就绪对列头指针后移到下一进程*/

}

void print1(PCB *q) /*进程PCB输出*/

{

printf("进程名 已运行时间 还需要时间时间片状态\n")

printf(" %-10s%-15d%-10d%-10d %-c\n",q->name,q->cputime,q->needtime,q->round,q->state)

}

void print() /*输出函数*/

{

PCB *p

if(run!=NULL)/*如果运行指针不空*/

print1(run) /*输出当前正在运行的PCB*/

p=ready /*输出就绪队列PCB*/

while(p!=NULL)

{

print1(p)

p=p->next

}

p=finish /*输出完成队列的PCB*/

while(p!=NULL)

{

print1(p)

p=p->next

}

}

void insert(PCB *p2) //轮转法插入函数

{

tail->next=p2 //将新的PCB插入在当前就绪队列的尾

tail=p2

p2->next=NULL

}

void create() /*创建进程PCB*/

{

PCB *p

int i,time

char na[10]

ready=NULL

finish=NULL

run=NULL

printf("请输入进程名称和所需要CPU的时间:\n")

for(i=1i<=Ni++)

{

p=(PCB *)malloc(sizeof(PCB))

scanf("%s",na)

scanf("%d",&time)

strcpy(p->name,na)

p->cputime=0

p->needtime=time

if(i==1)

p->state='R'

else

p->state='W'

p->round=1 /*时间片*/

if(ready!=NULL)

insert(p)

else

{

p->next=ready

ready=p

tail=p

}

}

printf("------------------------------------------------------------------\n")

print() /*输出进程PCB信息*/

run=ready /*将就绪队列的第一个进程投入运行*/

ready=ready->next

run->state='R'

}

void RR()//时间片轮转调度

{

while(run!=NULL)

{

run->cputime=run->cputime+1

run->needtime=run->needtime-1

if(run->needtime==0) /*运行完将其变为完成态,插入完成队列*/

{

run->next=finish

finish=run

run->state='F'

run=NULL

if(ready!=NULL)

firstin()/*就绪对列不空,将第一个进程投入运行*/

}

else

if(ready!=NULL) /*如就绪队列不空*/

{

run->state='W'/*将进程插入到就绪队列中等待轮转*/

insert(run)

firstin()/*将就绪对列的第一个进程投入运行*/

}

printf("------------------------------------------------------------------\n")

print()/*输出进程信息*/

}

}

void FCFS(double *arrive,double *runtime,double n) //先来先服务调度算法

{

start[0]=arrive[0] //开始执行时间=到达时间

endtime[0]=start[0]+runtime[0] //完成时间=开始时间+服务时间

zhou[0]=endtime[0]-arrive[0] //周转时间=完成时间-到达时间

dqzhou[0]=zhou[0]/runtime[0]

for(int i=0i<ni++)

{

if(endtime[i-1]>arrive[i]||endtime[i-1]==arrive[i])

endtime[i]=endtime[i-1]+runtime[i]

else

endtime[i]=arrive[i]+runtime[i]

zhou[i]=endtime[i]-arrive[i]

dqzhou[i]=zhou[i]/runtime[i]

averagezhou+=zhou[i]

average_zhou+=dqzhou[i]

}

averagezhou=averagezhou/n

average_zhou=average_zhou/n

cout<<"完成时间为:"<<endl

for(int j=0j<nj++)

cout<<endtime[j]<<" "<<endl

cout<<"周转时间为:"<<endl

for(int k=0k<nk++)

cout<<zhou[k]<<" "<<endl

cout<<"带权周转时间为:"<<endl

for(int m=0m<nm++)

cout<<dqzhou[m]<<" "<<endl

cout<<"平均周转时间为:"<<endl

cout<<averagezhou<<" "<<endl

cout<<"平均带权周转时间为:"<<endl

cout<<average_zhou<<" "<<endl

}

void SJF(double *arrive,double *runtime,double n) //短作业优先调度算法

{

int end[maxnum] //用于标记进程是否已经执行,应经执行end[i]=1,否则为0

for(int k=0k<nk++)

end[k]=0

int temp,now=0,next=1,p=1 //now表示刚执行完的进程号,next表示下一个要执行的进程号

start[0]=arrive[0] //开始执行时间=到达时间

endtime[0]=start[0]+runtime[0] //完成时间=开始时间+服务时间

zhou[0]=endtime[0]-arrive[0] //周转时间=完成时间-到达时间

dqzhou[0]=zhou[0]/runtime[0]//带权周转时间=周转时间/服务时间

averagezhou=zhou[0]

average_zhou=dqzhou[0]

end[now]=1 //执行完的进程设置为1;

for(int i=1i<ni++)

{

int j

for(j=1j<n)

{

if(arrive[j]<endtime[now]||arrive[j]==endtime[now])

j++

else

break

}

temp=j

int min=p

for(j=1j<=tempj++)

{

if(runtime[min]>runtime[j] &&end[j]==0)

min=j

}

next=min

endtime[next]=endtime[now]+runtime[next]

zhou[next]=endtime[next]-arrive[next]

dqzhou[next]=zhou[next]/runtime[next]

averagezhou+=zhou[next]

average_zhou+=dqzhou[next]

end[next]=1

now=next

next=p

while(end[p]!=0)

p++

}

averagezhou=averagezhou/n

average_zhou=average_zhou/n

cout<<"完成时间为:"<<endl

for(int j=0j<nj++)

cout<<endtime[j]<<" "<<endl

cout<<"周转时间为:"<<endl

for(k=0k<nk++)

cout<<zhou[k]<<" "<<endl

cout<<"带权周转时间为:"<<endl

for(int m=0m<nm++)

cout<<dqzhou[m]<<" "<<endl

cout<<"平均周转时间为:"<<endl

cout<<averagezhou<<" "<<endl

cout<<"平均带权周转时间为:"<<endl

cout<<average_zhou<<" "<<endl

}

int EDF()//最早截止时间的调度算法

{

int arrive_A,arrive_B //标记进程A,进程B的到达时间

int zhouqi_A,zhouqi_B,serve_A,serve_B //进程的周期时间和服务时间

int i,j,a=0,b=0,ka=0,kb=0//ka,kb为开关,i,j,a,b为进程下标

int num_a=0,num_b=0//服务累计时间

printf("输入进程A的周期时间,服务时间: ")

scanf("%d%d",&zhouqi_A,&serve_A)

printf("输入进程B的周期时间,服务时间: ")

scanf("%d%d",&zhouqi_B,&serve_B)

for(int T=0T<=100T++)

{

if(num_a==serve_A)//进程A完成

{

num_a=serve_A+1

printf("当T=%d时",T)

printf("进程A%d结束\n",a)

if(num_b<serve_B)

{

printf(" 调用进程B%d\n",b)

kb=1

}

ka=0

}

if(num_b==serve_B)

{

num_b=serve_B+1

printf("当T=%d时",T)

printf("进程B%d结束\n",b)

if(num_a<serve_A)

{

printf(" 调用进程A%d\n",a)

ka=1

}

kb=0

}

if(T%zhouqi_A==0 &&T%zhouqi_B==0)

{

arrive_A=arrive_B=T

j=++a

i=++b

printf("当T=%d时,进程A%d和进程B%d同时产生,此时,",T,j,i)

if(zhouqi_A<=zhouqi_B)

{

printf("调用进程A%d,阻塞进程B%d\n",j,i)

ka=1

kb=0

}

else

{

printf("调用进程B%d,阻塞进程A%d\n",i,j)

ka=0

kb=1

}

num_a=num_b=0

}

if(T%zhouqi_A==0&&T%zhouqi_B!=0)

{

arrive_A=T

printf("当T=%d时",T)

printf("进程A%d产生 ",++a) //不可能与进程A竞争处理器

num_a=0

if(num_b<serve_B) //进程B没有完成

if(arrive_B+zhouqi_B>arrive_A+zhouqi_A) //若进程B最早截止时间大于进程A的,则执行进程A

{

printf("进程A%d执行。\n",a)

ka=1

kb=0

}

else //若进程B最早截止时间小于等于进程A的

printf("进程B%d继续执行。\n",b)

else//进程B完成

{

printf("进程A%d执行。\n",a)

ka=1

}

}

if(T%zhouqi_A!=0 &&T%zhouqi_B==0)

{

arrive_B=T

printf("当T=%d时",T)

printf("进程B%d产生,",++b) //不可能与进程B竞争处理器

num_b=0

if(num_a<serve_A) //进程A没有完成

if(arrive_B+zhouqi_B>=arrive_A+zhouqi_A) //进程A的最早截止时间不小于B

printf("进程A%d继续执行。\n",a)

else

{

printf("进程B%d执行。\n",b)

kb=1

ka=0

}

else //进程A完成

{

printf("进程B%d执行。\n",b)

kb=1

}

}

if(ka)

num_a++

if(kb)

num_b++

}

return 1

}

int main()

{

system("color 0b") //设置颜色

cout<<"最早截止时间的调度算法如下: "<<endl<<endl

EDF()

int n

cout<<endl

cout<<"请输入进程的数目: "

cin>>n

cout<<"请按进程到达时间从小到大依次输入n个进程的到达时间: "<<endl

for(int i=0i<ni++)

cin>>arrive[i]

cout<<"请按上面进程的顺序依次输入n个进程的服务时间: "<<endl

for(int j=0j<nj++)

cin>>runtime[j]

cout<<"先来先服务调度算法如下: "<<endl

FCFS(arrive,runtime,n)

cout<<endl<<endl

cout<<"短作业优先调度算法如下: "<<endl

SJF(arrive,runtime,n)

cout<<endl<<endl

printf("轮转调度算法如下:\n\n")

printf("输入创建进程的数目:\n")

scanf("%d",&N)

create()

RR()

return 0;

}

#include<stdio.h>

struct pcb

{

char name

int time

}

void main()

{

int n,i,j,flag=1

struct pcb a[100]

printf("输入程序个数:")

scanf("%d",&n)

getchar()/*接收回车*/

for(i=0i<ni++)

{

printf("输入程序的名字:如A B C...\n")

scanf("%c",&a[i].name)

getchar()/*接收回车*/

printf("输入占用的时间片:")

scanf("%d",&a[i].time)

getchar()/*接收回车*/

}

i=0

while(flag &&n>0)

{

if(a[i].time!=0)

{

printf("%c",a[i].name)

a[i].time--

}

for(j=0j<nj++)

if(a[j].time)

{

flag=1

break

}

else

flag=0

i=(++i)%n

}

}

调试通过...

#include <iostream>

#include <stdio.h>

#include <string>

//#include <windows.h>

using namespace std

//hyugtyftydrtdtrdrrtrdrt

struct Node

{

string name//进程(作业)名称

int arriveTime//到达时间

int ServerTime//服务时间

int leftTime//the left time

Node *link//指向下一个节点的指针

}

class CProcess

{

public:

CProcess()//构造函数

~CProcess()//析构函数

const CProcess &operator =(const CProcess&p)//重载赋值 *** 作符

void insertNode(string &na,int&at,int&st)//插入新元素(at由小到大)到链表合适的位置

void sort()//按照服务时间由大到小排序

bool isEmpty()//判断是否为空

void destroy()//销毁

int length()//求出链表长度

void print()//打印出元素

void FCFS()//先到先服务

void SJF()//短进程(作业)优先

void RR(int&q)//时间片轮转

void priority()//优先权调度

protected:

Node *first

Node *last

}

const CProcess&CProcess::operator=(const CProcess&p)

{

Node *newNode

Node *Current

if(this!=&p)//避免自己给自己赋值

{

if(first!=NULL)//如果链表不为空

destroy()

if(p.first==NULL)

{//如果要拷贝的对象为空

this->first = NULL

this->last = NULL

}

else

{

Current = p.first

first= new Node

first->name=Current->name//

first->arriveTime=Current->arriveTime

first->ServerTime=Current->ServerTime

first->link =NULL

last =first

Current = Current->link

while(Current!=NULL)

{

newNode = new Node

newNode->name=Current->name

newNode->arriveTime=Current->arriveTime

newNode->ServerTime=Current->ServerTime

newNode->link=NULL

last->link=newNode

last=newNode

Current = Current->link

}

}

}

return *this

}

CProcess::CProcess()

{//构造函数

first=NULL

last=NULL

}

CProcess::~CProcess()

{

Node *temp

while(first!=NULL)

{

temp=first

first=first->link

delete temp

}

last=NULL

}

void CProcess::insertNode(string &na,int&at,int&st)

{//按照到达时间升序排序

Node *Current

Node *trailCurrent//指向Current的前一个节点

Node *newNode

bool found

newNode = new Node//建立一个新节点

newNode->name=na

newNode->arriveTime=at

newNode->ServerTime=st

newNode->link=NULL//

if(first==NULL)//如果第一个节点为空(如果是第一次插入元素)

first=newNode//将新节点赋给第一个节点

else

{//如果不是第一次

Current =first

found = false

while(Current!=NULL &&!found)

{

if(Current->arriveTime >= at)

found = true

else

{

trailCurrent = Current

Current = Current->link

}

}

if(Current==first)

{

newNode->link = first

first = newNode

}

else

{

trailCurrent->link = newNode

newNode->link = Current

}

}

}

int CProcess::length()

{

int count =0//声明变量,并初始化为0(用来记录长度)

Node *Current

Current = first

while(Current!=NULL)//当前节点不为空,记录值自加,一直向后遍历,

{

count++

Current = Current->link

}

return count//返回长度

}

void CProcess::sort()//按照服务时间,升序排列

{//冒泡排序

string sname

int at

int st

Node *Current//指向当前节点

Node *trailCurrent//指向当前节点的前一个节点

for(trailCurrent=first->linktrailCurrent!=NULLtrailCurrent=trailCurrent->link)//控制条件有问题

{

for(Current=trailCurrent->linkCurrent!=NULLCurrent=Current->link)//控制条件有问题

{

if(trailCurrent->ServerTime >Current->ServerTime)

{

sname=trailCurrent->name

at=trailCurrent->arriveTime

st=trailCurrent->ServerTime

trailCurrent->name=Current->name

trailCurrent->arriveTime=Current->arriveTime

trailCurrent->ServerTime=Current->ServerTime

Current->name=sname

Current->arriveTime=at

Current->ServerTime=st

}

}

}

}

bool CProcess::isEmpty()//判断是否为空

{

return (first==NULL)//如果第一个节点为空,返回值

}

void CProcess::print()

{

Node *Current

Current = first->link//头节点赋给当前节点

while(Current!=NULL)//当前节点不为空,一直向后遍历打印

{

cout<<Current->name<<" "

cout<<Current->arriveTime<<" "

cout<<Current->ServerTime<<"\n"

Current = Current->link

}

}

void CProcess::destroy()

{

Node *temp//定义一个临时指针变量

while(first!=NULL)

{

temp=first

first=first->link

delete temp

}

last=NULL

}

void CProcess::FCFS()//先到先服务

{

Node *Current

int T0=0//完成时间

int T1=0//周转时间

Current = first->link//头节点赋给当前节点

while(Current!=NULL)

{

if(T0 <Current->arriveTime)

{

T0=Current->arriveTime+Current->ServerTime

T1=T0-Current->arriveTime

cout<<Current->name<<"\t"//打印出进程名

cout<<T0<<"\t"//打印出完成时间

cout<<T1<<"\n"//打印出周转时间

Current = Current->link

}

else

{

T0=Current->ServerTime+T0

T1=T0-Current->arriveTime//周转时间等于,完成时间 - 到达时间

cout<<Current->name<<"\t"//打印出进程名

cout<<T0<<"\t"//打印出完成时间

cout<<T1<<"\n"//打印出周转时间

Current = Current->link

}

}

}

void CProcess::SJF()//短进程(作业)优先

{

//首先执行第一个到达的作业

Node *Current

int T0=0//完成时间

int T1=0//周转时间

T0=first->link->ServerTime+T0

T1=T0-first->link->arriveTime

cout<<first->link->name<<"\t"

cout<<T0<<"\t"//打印出完成时间

cout<<T1<<"\n"//打印出周转时间

first->link=first->link->link//删除

//执行剩下的

sort()//对剩下的排序

Current = first->link//头节点赋给当前节点

while(Current!=NULL)

{

if(T0 <Current->arriveTime)

{

T0=Current->arriveTime+Current->ServerTime

T1=T0-Current->arriveTime

cout<<Current->name<<"\t"//打印出进程名

cout<<T0<<"\t"//打印出完成时间

cout<<T1<<"\n"//打印出周转时间

Current = Current->link

}

else

{

T0=Current->ServerTime+T0

T1=T0-Current->arriveTime//周转时间等于,完成时间 - 到达时间

cout<<Current->name<<"\t"//打印出进程名

cout<<T0<<"\t"//打印出完成时间

cout<<T1<<"\n"//打印出周转时间

Current = Current->link

}

}

}

void CProcess::RR(int&q)//时间片轮转

{

cout<<"时间片轮转 *** 作完成!\n"

}

void CProcess::priority()//优先权调度

{

cout<<"优先权 *** 作完成!\n"

}

void main()

{

CProcess p0,p1,p2,p3,p4

int at,st

string na

int judge=1//控制退出程序

int choice//控制选择 *** 作

while(judge)

{

cout<<"********************************************************\n"

cout<<"****** 说明:本程序适用于单道进程(作业) ******\n"

cout<<"******** 请选择您的 *** 作 ***************\n"

cout<<"*********输入相应的数字,按下(Enter)键!**************\n"

cout<<"************* 5.录入信息************\n"

cout<<"************* 1.先到先服务 ************\n"

cout<<"************* 2.短进程(作业)优先 ************\n"

cout<<"************* 3.时间片轮转 ************\n"

cout<<"************* 4.优先权(静态)调度************\n"

cout<<"************* 0.退出程序************\n"

cout<<"********************************************************\n"

cin>>choice

switch(choice)

{

case 0:

judge=0

break

case 5:

cout<<"请输入信息以“end”结束输入!\n"

cout<<"进程名 到达时间 服务时间"<<endl

while(na.compare("end"))//如果相等则会返回0

{

p0.insertNode(na,at,st)

cin>>na>>at>>st

}

cout<<"录入成功,目前的信息为:\n"

cout<<"进程名 到达时间 服务时间"<<endl

p0.print()

break

case 1://先到先服务

p1=p0//拷贝一份

if(p1.isEmpty())

{

cout<<"请先录入信息\n"

break

}

else

{

cout<<"先到先服务\n"

cout<<"进程名 完成时间 周转时间\n"

p1.FCFS()

break

}

case 2://短作业优先

p2=p0//拷贝一份

//p2.sort()

//p2.print()

if(p2.isEmpty())

{

cout<<"请先录入信息\n"

break

}

else

{

cout<<"短作业优先\n"

cout<<"进程名 完成时间 周转时间\n"

p2.SJF()

break

}

case 3://时间片轮转

p3=p0//拷贝一份

int q

if(p3.isEmpty())

{

cout<<"请先录入信息\n"

break

}

else

{

cout<<"请输入时间片大小"

cin>>q

cout<<"时间片轮转\n"

cout<<"进程名 完成时间 周转时间\n"

p3.RR(q)

break

}

case 4://优先权

p4=p0//拷贝一份

if(p4.isEmpty())

{

cout<<"请先录入信息\n"

break

}

else

{

cout<<"时间片轮转\n"

cout<<"进程名 完成时间 周转时间\n"

p4.priority()

break

}

default:

cout<<"请选择目录中的选项!\n"

break

}

}

return

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12162581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存