進程調(diào)度(C語言實現(xiàn))_第1頁
進程調(diào)度(C語言實現(xiàn))_第2頁
進程調(diào)度(C語言實現(xiàn))_第3頁
進程調(diào)度(C語言實現(xiàn))_第4頁
進程調(diào)度(C語言實現(xiàn))_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

#include<stdio.h>#include<stdio.h>#include<malloc.h>typedefstructProcessNode{//進程結點的基本結構charname;//進程名 intservice_time;//服務時間 intarrive_time;//到達時間 intpriority;//優(yōu)先級 structFCFS_time{//先到先服務 intfinish_time;//完成時間 intturnaround_time;//周轉時間 floatweigtharound_time;//帶權周轉時間 }FCFS_time;structSJF_time{//短作業(yè)優(yōu)先 intfinish_time; intturnaround_time; floatweigtharound_time; intflag; }SJF_time;structRR_time{//時間片輪轉的結點 intfinish_time; intturnaround_time; floatweigtharound_time; intflag_time;//賦值為進程的服務時間,為0則進程完成 }RR_time;structPri_time{//優(yōu)先權非搶占式 intfinish_time; intturnaround_time; floatweigtharound_time; }Pri_time; structProcessNode*next;}ProcessNode,*Linklist;voidmain(){ intchoice;Linklistp,head;Linklistread_information(); LinklistFCFS_scheduling(Linklisthead);LinklistSJF_scheduling(Linklisthead);LinklistRR_scheduling(Linklisthead);LinklistPri_scheduling(Linklisthead); head=read_information();//讀入進程的基本信息 do{ p=head->next;printf("\n"); printf("**********進程初始信息輸出**********\n");//輸出初始化后的進程基本信息 printf("\n"); printf("進程名稱"); printf("到達時間");printf("服務時間");printf("優(yōu)先級");printf("\n"); while(p) {printf("%c",p->name); printf("%d",p->arrive_time);printf("%d",p->service_time);printf("%d",p->priority);printf("\n"); p=p->next; } printf("\n");printf("************************************\n");//輸出進程的調(diào)用選擇項 printf("\n"); printf("1、FCFS----先到先服務\n"); printf("2、SJF-----短作業(yè)優(yōu)先\n"); printf("3、RR------時間片輪轉\n"); printf("4、Pri-----優(yōu)先權調(diào)度\n");printf("5、退出\n"); printf("\n"); printf("************************************\n"); printf("\n"); printf("請在1—5之間選擇:"); scanf("%d",&choice); printf("\n");printf("\n");switch(choice) { case1:FCFS_scheduling(head); break; case2:SJF_scheduling(head); break; case3:RR_scheduling(head);break; case4:Pri_scheduling(head);break;// case5:exit(); } }while(choice!=5); }Linklistread_information()//進程讀入函數(shù){inti;int num;//ProcessNode; Linklistpro; Linklistp;Linklisthead;printf("\n");printf("************進程調(diào)度算法************\n"); printf("\n"); printf("請輸入進程的個數(shù):");scanf("%d",&num); printf("\n"); printf("*************初始化信息*************\n"); printf("\n");head=(Linklist)malloc(sizeof(ProcessNode));//頭結點 head->next=NULL; p=head;for(i=1;i<=num;i++) {pro=(Linklist)malloc(sizeof(ProcessNode));//創(chuàng)建進程結點 printf("輸入第%d個進程信息:\n",i); printf("請輸入進程名:"); fflush(stdin); scanf("%c",&pro->name); printf("到達時間:"); scanf("%d",&pro->arrive_time); printf("服務時間:");scanf("%d",&pro->service_time); printf("優(yōu)先級↑:"); scanf("%d",&pro->priority); //pro->next=head->next;head->next=pro;//逆序建鏈p->next=pro;p=pro;//順序建鏈 //p++; pro->next=NULL; }printf("\n");returnhead;}LinklistFCFS_scheduling(Linklisthead)//先到先服務算法函數(shù){ Linklistp;Linklistq;//指向前一進程p=head->next;while(p)//初始化進程的完成時間、周轉時間、帶權周轉時間,初值均賦為0 { p->FCFS_time.finish_time=0; p->FCFS_time.turnaround_time=0; p->FCFS_time.weigtharound_time=0;p=p->next; }p=q=head->next;p->FCFS_time.finish_time=p->arrive_time;//避免第一個進程到達時間不為0while(p) {if(p->arrive_time<=q->FCFS_time.finish_time)//下一進程已到達,在等待中 { p->FCFS_time.finish_time=(p->service_time)+(q->FCFS_time.finish_time);//服務時間p->FCFS_time.turnaround_time=(p->FCFS_time.finish_time)-(p->arrive_time);//周轉時間 p->FCFS_time.weigtharound_time=(float)(p->FCFS_time.turnaround_time)/(p->service_time);//帶權周轉時間 } else { p->FCFS_time.finish_time=p->service_time+p->arrive_time;//服務時間p->FCFS_time.turnaround_time=(p->FCFS_time.finish_time)-(p->arrive_time);//周轉時間 p->FCFS_time.weigtharound_time=(float)(p->FCFS_time.turnaround_time)/(p->service_time);//帶權周轉時間 } q=p; p=p->next; }p=head->next;printf("********************************FCFS********************************\n");//輸出先到先服務調(diào)度后的進程信息 printf("\n"); printf("進程名稱"); printf("到達時間");printf("服務時間");printf("優(yōu)先級"); printf("完成時間"); printf("周轉時間"); printf("帶權周轉時間");printf("\n");while(p) { printf("%c",p->name); printf("%d",p->arrive_time);printf("%d",p->service_time);printf("%d",p->priority); printf("%d",p->FCFS_time.finish_time);printf("%d",p->FCFS_time.turnaround_time);printf("%0.2f",p->FCFS_time.weigtharound_time);printf("\n"); p=p->next; }printf("\n");printf("**********************************************************************\n");printf("\n");returnhead;}LinklistSJF_scheduling(Linklisthead)//短作業(yè)優(yōu)先算法{ Linklistp,r; Linklistq;//指向前一進程結點intnum=0;//記錄進程個數(shù)intadd_flag=0;//進程完成服務個數(shù) intservice_time_min; intarrive_time; intk; p=head->next;//首元結點while(p)//初始化進程的完成時間、周轉時間、帶權周轉時間,初值均賦為0 { p->SJF_time.finish_time=0; p->SJF_time.turnaround_time=0; p->SJF_time.weigtharound_time=0; p->SJF_time.flag=0; ++num; q=p;p=p->next; }q->next=head->next;//將創(chuàng)建的進程隊列變?yōu)檠h(huán)隊列p=head->next;q=p; p->SJF_time.finish_time=p->arrive_time+p->service_time;p->SJF_time.turnaround_time=(p->SJF_time.finish_time)-(p->arrive_time);//周轉時間p->SJF_time.weigtharound_time=(float)(p->SJF_time.turnaround_time)/(p->service_time);//帶權周轉時間 q->SJF_time.finish_time=p->SJF_time.finish_time;p->SJF_time.flag=1; add_flag=1; p=p->next;do{ if(p->SJF_time.flag==1){p=p->next;} elseif((p->arrive_time)>(q->SJF_time.finish_time)) { service_time_min=p->service_time; arrive_time=p->arrive_time; while(p->arrive_time==arrive_time&&p->SJF_time.flag==0)//尋找最短的作業(yè) { if((p->next->service_time)<(p->service_time)){service_time_min=p->next->service_time;p=p->next;} else{p=p->next;} } p=q->next; r=q; while(p->service_time!=service_time_min){p=p->next;}//指針指向最短作業(yè) p->SJF_time.finish_time=p->arrive_time+p->service_time; p->SJF_time.flag=1;++add_flag; p->SJF_time.turnaround_time=(p->SJF_time.finish_time)-(p->arrive_time);//周轉時間 p->SJF_time.weigtharound_time=(float)(p->SJF_time.turnaround_time)/(p->service_time);//帶權周轉時間q=p;p=r->next; } else { k=0; service_time_min=p->service_time; while(((p->arrive_time)<=(q->SJF_time.finish_time))&&k<=num)//尋找最短的作業(yè) { if(p->SJF_time.flag==1){p=p->next;++k;} elseif((p->SJF_time.flag!=1)&&((p->service_time)<service_time_min)) {service_time_min=p->service_time; p=p->next;++k;} else{p=p->next;++k;} } p=q->next; r=q; while(p->service_time!=service_time_min){p=p->next;}//指針指向最短作業(yè)p->SJF_time.finish_time=q->SJF_time.finish_time+p->service_time;p->SJF_time.turnaround_time=(p->SJF_time.finish_time)-(p->arrive_time);//周轉時間 p->SJF_time.weigtharound_time=(float)(p->SJF_time.turnaround_time)/(p->service_time);//帶權周轉時間p->SJF_time.flag=1;++add_flag; //q=p;p=p->next; q=p;p=r->next; } }while(add_flag!=num);for(p=head->next;num>0;num--)//斷開循環(huán)隊列 {q=p;p=p->next; } q->next=NULL;p=head->next;//指向鏈首,輸出短作業(yè)調(diào)度后的進程信息printf("\n");printf("********************************SJF*********************************\n"); printf("\n"); printf("進程名稱"); printf("到達時間");printf("服務時間");printf("優(yōu)先級"); printf("完成時間"); printf("周轉時間"); printf("帶權周轉時間");printf("\n");while(p) { printf("%c",p->name); printf("%d",p->arrive_time);printf("%d",p->service_time);printf("%d",p->priority); printf("%d",p->SJF_time.finish_time);printf("%d",p->SJF_time.turnaround_time);printf("%0.2f",p->SJF_time.weigtharound_time);printf("\n"); p=p->next; }printf("\n");printf("**********************************************************************\n");printf("\n");returnhead;}LinklistRR_scheduling(Linklisthead)//時間片輪轉算法{ Linklistq;//指向前一進程結點Linklistp; intq_time;//時間片大小 intnum=0;//記錄進程個數(shù)intadd_flag=0;//進程完成服務個數(shù) printf("請輸入時間片的大小:"); scanf("%d",&q_time);p=head->next;while(p)//初始化進程的完成時間、周轉時間、帶權周轉時間,初值均賦為0 { p->RR_time.finish_time=0; p->RR_time.turnaround_time=0; p->RR_time.weigtharound_time=0; p->RR_time.flag_time=p->service_time; q=p; ++num;p=p->next; } q->next=head->next;//將創(chuàng)建的進程隊列變?yōu)檠h(huán)隊列p=head->next;q->RR_time.finish_time=p->arrive_time; do{ /*printf("\n");printf("**************************************************************\n");printf("%c",p->name); printf("%d",p->arrive_time);printf("%d",p->service_time);printf("%d",p->priority); printf("%d",p->RR_time.finish_time);printf("\n");*/ if((p->RR_time.flag_time)>(q_time))//服務時間大于時間片 { p->RR_time.finish_time=(q->RR_time.finish_time)+(q_time);//累加完成時間p->RR_time.flag_time=(p->RR_time.flag_time)-(q_time); if((p->next->arrive_time)<=(p->RR_time.finish_time))//有進程等待 {q=p;p=p->next;} else//當前進程未完成,無進程等待,指針不向后移 {q=p;} }elseif((p->RR_time.flag_time)==0)//進程已經(jīng)完成 { p=p->next; }else { p->RR_time.finish_time=(q->RR_time.finish_time)+(p->RR_time.flag_time);p->RR_time.flag_time=0;++add_flag;p->RR_time.turnaround_time=(p->RR_time.finish_time)-(p->arrive_time);//周轉時間 p->RR_time.weigtharound_time=(float)(p->RR_time.turnaround_time)/(p->service_time);//帶權周轉時間if((p->next->arrive_time)<(p->RR_time.finish_time))//有進程等待 {q=p;p=p->next;} else//當前進程完成,無進程等待,指針向后移 //{q=p;q->RR_time.finish_time=p->next->

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論