RR时间轮转算法
#include
#include
#include
#include
/*杩涚?鎺у埗鍧楁暟鎹 粨鏋?/
typedef struct node
{
char name[10];/*杩涚?鍚?/
int prio; /*杩涚?浼樺厛绾?/
int round; /*寰 幆杞 浆娉曡繘绋嬫瘡娆?疆杞 殑鏃堕棿鐗?/
int cputime; /*杩涚?绱 娑堣?楃殑CUP鏃堕棿*/
int needtime; /*杩涚?鍒板畬鎴愯繕闇?瑕佺殑CUP鏃堕棿*/
int count; /*寰 幆杞 浆娉曚竴涓 椂闂寸墖鍐呰繘绋嬭繍琛屾椂闂?/
char state; /*杩涚?鐨勭姸鎬侊細'R':杩愯 ,'W'锛氱瓑寰?'F'锛氱粨鏉?/ struct node *next;/*鎸囧悜涓嬩竴涓 繘绋嬬殑閾炬寚閽?/
}PCB;
PCB *finish,*ready,*tail,*run; /*鎸囧悜涓変釜闃熷垪鐨勯槦棣栫殑鎸囬拡锛?
finish涓哄畬鎴愰槦鍒楀ご鎸囬拡锛?
ready涓哄氨缁 槦鍒楀ご鎸囬拡锛?
tail涓哄氨缁 槦鍒楃殑闃熷熬鎸囬拡锛?
run涓哄綋鍓嶈繍琛岃繘绋嬪ご鎸囬拡*/ int N; /*瀹氫箟杩涚?鐨勬暟鐩?/
void firstin(void); //璋冨害灏辩华闃熷垪鐨勭 涓?涓 繘绋嬫姇鍏ヨ繍琛岋紱
void print1(char a); //鎵撳嵃琛ㄥご琛屼俊鎭?
void print2(char chose,PCB *p); //鎵撳嵃姣忎竴琛岀殑鐘舵?佷俊鎭? void print(char chose); //鎵撳嵃姣忔墽琛屼竴娆,畻娉曞悗鎵?鏈夌殑杩涚?鐨勭姸鎬佷俊鎭?
void insert_prio(PCB *q); //鍦ㄤ紭鍏堟暟绠楁硶涓?灏嗗皻鏈 畬鎴愮殑PCB鎸変紭鍏堟暟椤哄簭鎻掑叆鍒板氨缁 槦鍒椾腑锛?
void prior_init(char chose); //杩涚?浼樺厛绾ф硶鍒濆 鍖栧皢杩涚?鎸変紭鍏堢骇鎻掑叆鍒板氨缁 槦鍒楅噷 void priority(char chose); //杩涚?浼樺厛绾х畻娉曟?诲嚱鏁?
void insert_rr(PCB *q); //鍦ㄨ疆杞 硶涓 紝灏嗘墽琛屼簡涓?涓
椂闂寸墖鍗曚綅锛堜负2锛夛紝浣嗗皻鏈 畬鎴愮殑杩涚?鐨凱CB锛屾彃鍒板氨缁 槦鍒楃殑闃熷熬锛?
void roundrun_init(char chose);
void roundrun(char chose); //寰 幆杞 浆娉曞垵濮嬪寲灏嗗氨缁
槦鍒椾繚瀛樹负FIFO闃熷垪 void roundrun(char chose); //寰 幆杞 浆娉曟?荤畻娉?
void main() //涓诲嚱鏁?
{
char chose=' ';
while((chose!='e')&&(chose!='E')) {
fflush(stdin);
system("cls");
printf("\tR.寰 幆杞 浆绠楁硶妯?嫙\n\n"); printf("\tE.閫?鍑虹?搴廫n\n"); printf("\t璇疯緭鍏ヤ綘鐨勯?夋嫨锛?); scanf("%c",&chose);
if((chose!='e')&&(chose!='E')) {
system("cls");
if((chose=='r')||(chose=='R')) {
roundrun_init(chose);
roundrun(chose);
system("cls");
}
}
}
printf("\n\t\t璋?阿浣跨敤锛侊紒锛乗n");
}
void firstin(void) {
if(ready!=NULL)
{
run=ready;
ready=ready->next;
run->state='R';
run->next=NULL;
}
else
{
run=NULL;
}
}
void print1(char a)//鎵撳嵃琛ㄥご琛屼俊鎭?
{
if(toupper(a)=='P')
{
printf("name cputime needtime priority state \n");
}
else
{
printf("name cputime needtime count round state \n");
}
}
void print2(char chose,PCB *p)//鎵撳嵃姣忎竴琛岀殑鐘舵?佷俊鎭?
{
if(toupper(chose)=='P') {
printf("%s\t%d\t%d\t%d\t %c\n",p->name,p->cputime,p->needtime,p->prio,p->state);
}
else
{
printf("%s\t%d\t%d\t%d\t%d\t%c\n",p->name,p->cputime,p->needtime,p->count,p-
>round,p->state);
}
}
void print(char chose){ PCB *p;
print1(chose);
if(run!=NULL)
{
print2(chose,run); }
p=ready;
while(p!=NULL)
{
print2(chose,p);
p=p->next;
}
p=finish;
while(p!=NULL)
{
print2(chose,p);
p=p->next;
}
}
void insert_prio(PCB *q){ /*鍦ㄤ紭鍏堟暟绠楁硶涓?灏嗗皻鏈
畬鎴愮殑PCB鎸変紭鍏堟暟椤哄簭鎻掑叆鍒板氨缁 槦鍒椾腑锛?/
PCB *p,*s,*r; /*p,r鐢ㄦ潵鎺у埗灏辩华闃熷垪婊氬姩锛孲鎸囧悜鎻掑叆鐨勯槦鍒?/
s=q;
p=ready;
r=p;
if(s->prio>ready->prio) { s->next=ready;
ready=s;
}
else{
while(p)
{
if(p->prio>=s->prio)
{
r=p;
p=p->next;
}
else
break;
} //鎵惧埌瑕佹彃鍏ョ殑浣嶇疆 s->next=p;
r->next=s;
}
}
void insert_rr(PCB *q)//鍦ㄨ疆杞 硶涓 紝灏嗘墽琛屼簡涓?涓 椂闂寸墖鍗曚綅
锛堜负2锛夛紝 //浣嗗皻鏈 畬鎴愮殑杩涚?鐨凱CB锛屾彃鍒板氨缁 槦鍒楃殑
闃熷熬锛?
{
tail->next=q;
tail=q;
q->next=NULL;
}
幆杞 浆娉曞垵濮嬪寲 灏嗗氨缁 槦鍒椾繚瀛void roundrun_init(char chose)/*寰
樹负FIFO闃熷垪*/ {
PCB *p;
int i,time;
char na[10];
ready=NULL;
finish=NULL;
run=NULL;
printf("\t\t寰 幆杞 浆绠楁硶妯?嫙鍏ㄨ繃绋媆n\n"); printf("杈撳叆杩涚? 鐨勪
釜鏁?N:\n");
scanf("%d",&N);
for(i=0;iname,na); p->cputime=0;
p->needtime=time;
p->count=0;
p->state='W';
p->round=2;
if(ready!=NULL)
{
insert_rr(p);
}
else
{
p->next=ready; ready=p;
tail=p;
}
printf("褰撳墠灏辩华闃熷垪鐨勮繘绋嬬殑淇?伅\n");
print(chose);
}
printf("%d涓 繘绋嬪凡鎸塅IFO杩涘埌灏辩华闃熷垪涓璡n",N); printf("鎸夊洖杞
,敭寮?濮嬫ā寰 幆杞 浆绠楁硶.....\n"); fflush(stdin);
getchar();
run=ready;
ready=ready->next; run->state='R';
}
void roundrun(char chose){
int i=1;
while(run!=NULL) {
run->cputime+=1; run->needtime-=1; run->count+=1; if(run->needtime==0) {
run->next=finish; finish=run;
run->state='F'; run->prio=0;
run=NULL;
if(ready!=NULL) {
firstin();
}
}
else
{
if(run->count==run->round)
{
run->count=0; if(ready!=NULL) {
run->state='W';
insert_rr(run);
firstin();
}
}
}
printf("绗?d娆?墽琛屽惊鐜 疆杞 畻娉昞n",i++); print(chose); if(run)
{
printf("鎸夊洖杞,敭缁х画涓嬩竴娆″惊鐜 疆杞 畻娉?....\n"); }
else
printf("寰 幆杞 浆绠楁硶妯?嫙杩囩?缁撴潫锛侊紒\n"); fflush(stdin); getchar();
}
}