进程调度的方式有哪两种试列举至少4种进程调度算法。

进程调度的方式有哪两种试列举至少4种进程调度算法。,第1张

进程调度的方式有非剥夺方式和剥夺方式。

非剥夺方式:

分派程序一旦把处理机分配给某进程后便让它一直运行下去,直到进程完成或发生某事件而阻塞时,才把处理机分配给另一个进程。

剥夺方式:

当一个进程正在运行时,系统可以基于某种原则,剥夺已分配给它的处理机,将之分配给其它进程。剥夺原则有:优先权原则、短进程优先原则、时间片原则。

进程调度算法

1、先进先出算法(FIFO):

算法总是把处理机分配给最先进入就绪队列的进程,一个进程一旦分得处理机,便一直执行下去,直到该进程完成或阻塞时,才释放处理机。

举例:有三个进程P1、P2和P3先后进入就绪队列,它们的执行期分别是21、6和3个单位时间,对于P1、P2、P3的周转时间为21、27、30,平均周转时间为26。可见,FIFO算法服务质量不佳,容易引起作业用户不满,常作为一种辅助调度算法。

2、最短CPU运行期优先调度算法(SCBF--Shortest CPU Burst First):

该算法从就绪队列中选出下一个“CPU执行期最短”的进程,为之分配处理机。

举例:在就绪队列中有四个进程P1、P2、P3和P4,它们的下一个执行进程调度期分别是16、12、4和3个单位时间,P1、P2、P3和P4的周转时间分别为35、19、7、3,平均周转时间为16。该算法虽可获得较好的调度性能,但难以准确地知道下一个CPU执行期,而只能根据每一个进程的执行历史来预测。

3、时间片轮转法:

前几种算法主要用于批处理系统中,不能作为分时系统中的主调度算法,在分时系统中,都采用时间片轮转法。简单轮转法:系统将所有就绪进程按FIFO规则排队,按一定的时间间隔把处理机分配给队列中的进程。这样,就绪队列中所有进程均可获得一个时间片的处理机而运行。

4、多级反馈队列:

多级队列方法:将系统中所有进程分成若干类,每类为一级。 多级反馈队列方式是在系统中设置多个就绪队列,并赋予各队列以不同的优先权。

#include<stdioh>

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=0;i<n;i++)

{

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=0;j<n;j++)

if(a[j]time)

{

flag=1;

break;

}

else

flag=0;

i=(++i)%n;

}

}

调试通过

/(一)进程调度

进程调度算法有FIFO,优先数调度算法,时间片轮转调度算法,分级调度算法,

输入:进程流文件,其中存储的是一系列要执行的进程,

每个作业包括三个数据项:

进程名 所需时间 优先数(0级最高)

输出:

进程执行流 等待时间 平均等待时间

本程序包括:FIFO,优先数调度算法,时间片轮转调度算法

进程流文件process_streamtxt

测试数据:

p0 16 2

p1 5 1

p2 4 3

p3 8 0

p4 9 4

p5 7 6

VC++调试通过

/

#include <stdioh>

#include <stringh>

#include <iostreamh>

#include <stdlibh>

const int Quatum=2;//定义时间片的长度为2秒

const int MAXPCB=100;//定义最大进程数

//定义进程结构体

typedef struct node

{

char name[20];//进程名

int time; //进程运行时间

int privilege;//进程优先级(静态)

int finished;//进程完成标志,0-未完成,1-已完成

int wait_time;//进程等待时间

}pcb;

pcb pcbs[MAXPCB];

int quantiry;//进程流文件中的进程总数

void initial()

{

int i;

for (i=0;i<MAXPCB;i++)

{

strcpy(pcbs[i]name,"");

pcbs[i]time=0;

pcbs[i]privilege=0;

pcbs[i]finished=0;

pcbs[i]wait_time=0;

}

quantiry=0;

}

int readData()

{

FILE fp;

char fname[20];

int i;

cout<<"请输入进程流文件名:"<<endl;

cin>>fname;

if ((fp=fopen(fname,"r"))==NULL)

{

cout<<"错误,文件打不开,请检查文件名"<<endl;

}

else

{

while (!feof(fp))

{

fscanf(fp,"%s %d %d %d",pcbs[quantiry]name,

&pcbs[quantiry]time,&pcbs[quantiry]privilege);

quantiry++;

}

//输出所读入得数据

cout<<"输出所读入的数据"<<endl;

cout<<"进程流文件中的进程总数="<<quantiry<<endl;

cout<<"进程名 所需时间 优先数"<<endl;

for (i=0;i<quantiry;i++)

{

cout<<" "<<pcbs[i]name<<" "<<pcbs[i]time<<" "<<pcbs[i]privilege<<endl;

}

return 1;

}

return 0;

}

//重置数据,以供另一个算法使用

void init()

{

int i;

for (i=0;i<MAXPCB;i++)

{

pcbs[i]finished=0;

pcbs[i]wait_time=0;

}

}

void FIFO()

{

int i,j;

int total;

//输出FIFO算法执行流

cout<<endl<<"---------------------------------------------------------------"<<endl;

cout<<"FIFO算法执行流:"<<endl;

cout<<"进程名 等待时间"<<endl;

for (i=0;i<quantiry;i++)

{

cout<<" "<<pcbs[i]name<<" "<<pcbs[i]wait_time<<endl;

for (j=i+1;j<quantiry;j++)

{

pcbs[j]wait_time+=pcbs[i]time;

}

}

total=0;

for (i=0;i<quantiry;i++)

{

total+=pcbs[i]wait_time;

}

cout<<"总等待时间:"<<total<<" "<<"平均等待时间:"<<total/quantiry<<endl;

}

//优先度调度算法

void privilege()

{

int i,j,p;

int passed_time=0;

int total;

int queue[MAXPCB];

int current_privielege=1000;

for (i=0;i<quantiry;i++)

{

current_privielege=1000;

for (j=0;j<quantiry;j++)

{

if ((pcbs[j]finished==0)&&(pcbs[j]privilege<current_privielege))

{

p=j;

current_privielege=pcbs[j]privilege;

}

}

queue[i]=p;

pcbs[p]finished=1;

pcbs[p]wait_time+=passed_time;

passed_time+=pcbs[p]time;

}

//输出优先数调度执行流

cout<<endl<<"-----------------------------------------"<<endl;

cout<<"优先数调度执行流:"<<endl;

cout<<"进程名 等待时间"<<endl;

for (i=0;i<quantiry;i++)

{

cout<<" "<<pcbs[queue[i]]name<<" "<<pcbs[queue[i]]wait_time<<"--"<<queue[i]<<endl;

}

total=0;

for (i=0;i<quantiry;i++)

{

total+=pcbs[i]wait_time;

}

cout<<"总等待时间:"<<total<<" 平均等待时间:"<<total/quantiry<<endl;

}

//时间片轮转调度算法

void timer()

{

int i,j,sum,flag=1;

int passed_time=0;

int max_time=0;

int round=0;

int queue[1000];

int total=0;

while(flag==1)

{

flag=0;

for (i=0;i<quantiry;i++)

{

if (pcbs[i]finished==0)

{

flag=1;

queue[total]=i;

total++;

if (pcbs[i]time<=Quatum(round+1))

pcbs[i]finished=1;

}

}

round++;

}

cout<<endl<<"---------------------------------------------------------------"<<endl;

cout<<"时间片轮转调度执行流:";

for(i=0;i<total;i++)

{

cout<<pcbs[queue[i]]name<<" ";

}

cout<<endl;

cout<<"进程名 结束时间 运行时间 等待时间"<<endl;

sum=0;

for (i=0;i<quantiry;i++)

{

for(j=total-1;j>=0;j--)//从轮转调度执行流序列由后往前比较,找到同名进程即可计算其完成时间

{

if (strcmp(pcbs[queue[j]]name,pcbs[i]name)==0)

{

cout<<" "<<pcbs[i]name<<" "<<(j+1)Quatum<<" ";

cout<<pcbs[i]time<<" "<<(j+1)Quatum-pcbs[i]time<<endl;

sum+=(j+1)Quatum-pcbs[i]time;

break;

}

}

}

cout<<"总等待时间:"<<sum<<" "<<"平均等待时间:"<<sum/quantiry<<endl;

}

//显示版权信息函数

void version()

{

cout<<endl<<endl;

cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;

cout<<" ┃ 进程调度模拟系统 ┃"<<endl;

cout<<" ┠───────────────────────┨"<<endl;

cout<<" ┃ version 2011 ┃"<<endl;

cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;

cout<<endl<<endl;

}

//主函数

int main()

{

int flag;

version();

initial();

flag=readData();

if(flag==1){

FIFO();

init();

privilege();

init();

timer();

}

cout<<endl;

system("pause");

return 0;

}

1、时间片轮转调度 算法 (RR):给每个进程固定的执行时间,根据进程到达的先后顺序让进程在单位时间片内执行,执行完成后便调度下一个进程执行,时间片轮转调度不考虑进程等待时间和执行时间,属于抢占式调度。优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。适用于分时系统。

2、先来先服务调度算法(FCFS):根据进程到达的先后顺序执行进程,不考虑等待时间和执行时间,会产生饥饿现象。属于非抢占式调度,优点是公平,实现简单;缺点是不利于短作业。

3、优先级调度算法(HPF):在进程等待队列中选择优先级最高的来执行。

4、多级反馈队列调度算法:将时间片轮转与优先级调度相结合,把进程按优先级分成不同的队列,先按优先级调度,优先级相同的,按时间片轮转。优点是兼顾长短作业,有较好的响应时间,可行性强,适用于各种作业环境。

5、高响应比优先调度算法:根据“响应比=(进程执行时间+进程等待时间)/ 进程执行时间”这个公式得到的响应比来进行调度。高响应比优先算法在等待时间相同的情况下,作业执行的时间越短,响应比越高,满足段任务优先,同时响应比会随着等待时间增加而变大,优先级会提高,能够避免饥饿现象。优点是兼顾长短作业,缺点是计算响应比开销大,适用于批处理系统。

这是数学建模的题目,太难了。

只能给点提示,希望有用。一,用到随机函数。二,调度算法为FIFO和电梯调度。参考 *** 作系统。三,文件io用到#include

<fstream>头文件

#include <iostream>

#include <stdioh>

#include <string>

//#include <windowsh>

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(pfirst==NULL)

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

this->first = NULL;

this->last = NULL;

}

else

{

Current = pfirst;

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->link;trailCurrent!=NULL;trailCurrent=trailCurrent->link)//控制条件有问题

{

for(Current=trailCurrent->link;Current!=NULL;Current=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(nacompare("end"))//如果相等则会返回0

{

p0insertNode(na,at,st);

cin>>na>>at>>st;

}

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

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

p0print();

break;

case 1://先到先服务

p1=p0;//拷贝一份

if(p1isEmpty())

{

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

break;

}

else

{

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

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

p1FCFS();

break;

}

case 2://短作业优先

p2=p0;//拷贝一份

//p2sort();

//p2print();

if(p2isEmpty())

{

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

break;

}

else

{

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

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

p2SJF();

break;

}

case 3://时间片轮转

p3=p0;//拷贝一份

int q;

if(p3isEmpty())

{

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

break;

}

else

{

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

cin>>q;

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

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

p3RR(q);

break;

}

case 4://优先权

p4=p0;//拷贝一份

if(p4isEmpty())

{

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

break;

}

else

{

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

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

p4priority();

break;

}

default:

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

break;

}

}

return;

}

以上就是关于进程调度的方式有哪两种试列举至少4种进程调度算法。全部的内容,包括:进程调度的方式有哪两种试列举至少4种进程调度算法。、程序调度(时间片轮转算法)用C语言程序怎么写啊谢谢、求进程调度先来先服务算法,短进程优先算法完整c语言代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/10167605.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存