那个时刻,顺序是:先入队,调整队,队首进程执行。
所以,新程序先入队,调整队把第一个进程放在队尾了,最后执行在队头的进程
所以你说的“第一个进程”(就是没完成的那个)在队尾
想像一下,如果队中只有一个没有完成的进程,结束之后不是放在队尾,这样不是刚进来的进程都要放在它的后面执行吗?这样是不是对刚来的家伙不公平呢?但是实际上不同的进程调度算法实现起来是不一样的,你也可以自己写一个,让新来的给前辈让路。
我参照的是汤小丹的《计算机 *** 作系统》教材的实现方式。
希望能帮到你
试试这个,以前我编的时间片轮转
#include<iostreamh>
typedef struct node
{
char name [10];
struct node next;
int needtime;
int servetime;
char state;
};
void IniPCB(int n,node &head,node &finish)
{
node ready=new struct node;
ready=NULL;
for(int i=0;i<n;i++)
{
node p=new struct node;
cout<<"输入进程名:";
cin>>p->name;
cout<<"输入进程需要运行的时间:";
cin>>p->needtime;
p->servetime=0;
p->state='R';
if(ready==NULL)
{
ready=p;
head=p;
}
else
{
ready->next=p;
ready=p;
}
finish=p;
}
finish->next=head;
}
void DoPCB(int n,node &head,node &finish,node &run)
{
run=head;
bool end=0;
node check=new struct node;
cout<<"执行结果如下:"<<endl;
cout<<"进程名"<<" "<<"运行时间"<<" "<<"需要时间"<<" "<<"状态"<<endl;
for(int j=0;j<n;j++)
{
cout<<" "<<head->name<<" "<<head->servetime<<" "<<head->needtime<<" "<<head->state<<endl;
head=head->next;
}
cout<<endl;
int count=0;
while(end!=1)
{
if(run->state=='R')
{
(run->servetime)++;
if((run->servetime)==(run->needtime))
{
run->state='E';
}
count++;
cout<<"第"<<count<<"个时间片:"<<endl;
head=finish->next;
for(int k=0;k<n;k++)
{
cout<<" "<<head->name<<" "<<head->servetime<<" "<<head->needtime<<" "<<head->state<<endl;
head=head->next;
}
cout<<endl;
}
check=run;
for(int x=0;x<n;x++)
{
if(check->state=='E')
check=check->next;
}
if(check==run&&run->state=='E')
{
end=1;
}
run=run->next;
}
}
void main()
{
cout<<"输入进程个数:";
int n;
cin>>n;
node run=new struct node;
node head=new struct node;
node finish=new struct node;
run=NULL;
head=NULL;
finish=NULL;
IniPCB(n,head,finish);
DoPCB(n,head,finish,run);
}
调度算法说的是现在有若干个进程(每个进程拥有自己的属性),算法根据它们的属性选择哪一个进程去执行。先来先服务:按照进程来的时间早晚属性来判断,先来的先执行最短:按照进程运行需要的时间长短属性来判断,最短的先执行时间片轮转:和进程属性无关,每个进程都分配相同的时间去运行,轮着来优先权设置:根据进程的优先级属性判断谁先执行,优先级是用户可以设定的希望能够帮到你
如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。结束的进程会从运行队列中清除,剩下的时间片随进程结构的清除而清除,并不影响到其他进程的调度。
时间片由 *** 作系统内核的调度程序分配给每个进程。首先,内核会给每个进程分配相等的初始时间片,然后每个进程轮番地执行相应的时间,当所有进程都处于时间片耗尽的状态时,内核会重新为每个进程计算并分配时间片,如此往复。
在每个进程的task_struct结构中有以下四项:policy、priority、counter、rt_priority。这四项是选择进程的依据。其中,policy是进程的调度策略,用来区分实时进程和普通进程,实时进程优先于普通进程运行;priority是进程(包括实时和普通)的静态优先级。
counter是进程剩余的时间片,它的起始值就是priority的值;由于counter在后面计算一个处于可运行状态的进程值得运行的程度goodness时起重要作用,因此,counter也可以看作是进程的动态优先级。rt_priority是实时进程特有的,用于实时进程间的选择。
扩展资料:
时间片长度的影响:
时间片轮转调度中特别需要关注的是时间片的长度。从一个进程切换到另一个进程是需要一定时间的--保存和装入寄存器值及内存映像,更新各种表格和队列等。
假如进程切换(process switch) - 有时称为上下文切换(context switch),需要5毫秒,再假设时间片设为20毫秒,则在做完20毫秒有用的工作之后,CPU将花费5毫秒来进行进程切换。CPU时间的20%被浪费在了管理开销上。
为了提高CPU效率,我们可以将时间片设为500毫秒。假设所有其他进程都用足它们的时间片的话,最后一个不幸的进程不得不等待5秒钟才获得运行机会。多数用户无法忍受一条简短命令要5秒钟才能做出响应。同样的问题在一台支持多道程序的个人计算机上也会发生。
结论可以归结如下:时间片设得太短会导致过多的进程切换,降低了CPU效率;而设得太长又可能引起对短的交互请求的响应变差。
参考资料来源:百度百科-时间片轮转
参考资料来源:百度百科-时间片
参考资料来源:百度百科-进程调度
以上就是关于时间片轮转调度算法中同一时刻时一个进程时间片完,另一个到达,那个会先调用全部的内容,包括:时间片轮转调度算法中同一时刻时一个进程时间片完,另一个到达,那个会先调用、编写程序模拟处理机调度 时间片轮转 动态优先权调度 高响应比优先调度 c++代码、处理器调度程序根据各个应用程序运行所需要的时间多少来确定时间片的长短等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)