|
實(shí)驗(yàn)一 進(jìn)程調(diào)度
一、實(shí)驗(yàn)?zāi)康?br />
通過這次實(shí)驗(yàn),加深對(duì)進(jìn)程概念的理解,進(jìn)一步掌握進(jìn)程狀態(tài)的轉(zhuǎn)變、進(jìn)程調(diào)度的策略及對(duì)系統(tǒng)性能的評(píng)價(jià)方法。
二、實(shí)驗(yàn)內(nèi)容
設(shè)計(jì)程序模擬進(jìn)程的輪轉(zhuǎn)法調(diào)度過程。假設(shè)初始狀態(tài)為:有n個(gè)進(jìn)程處于就緒狀態(tài),有m個(gè)進(jìn)程處于阻塞狀態(tài)。采用輪轉(zhuǎn)法進(jìn)程調(diào)度算法進(jìn)行調(diào)度(調(diào)度過程中,假設(shè)處于執(zhí)行狀態(tài)的進(jìn)程不會(huì)阻塞),且每過t個(gè)時(shí)間片系統(tǒng)釋放資源,喚醒處于阻塞隊(duì)列隊(duì)首的進(jìn)程。
三、源程序
#include<stdio.h>
#define N50
structPCB
{
int pn; //process name進(jìn)程名字
int at; //arrival time到達(dá)時(shí)間
int st; //service time服務(wù)時(shí)間
int ct; //completion time完成時(shí)刻
int sc; //sign completion標(biāo)志是否完成
int st1; //剩余服務(wù)時(shí)間
}process[N];
intsjp(int n)
{
int i,j,T;
printf("\n請(qǐng)輸入時(shí)間片:\n");
scanf("%d",&T);
for(i=1;i<=n;i++) //收集進(jìn)程信息
{
process[ i].sc=0;
printf("\n%d:\n請(qǐng)依次輸入進(jìn)程的信息\n請(qǐng)輸入pn:",i);
scanf("%d",&process[ i].pn);
printf("請(qǐng)輸入at:");
scanf("%d",&process[ i].at);
printf("請(qǐng)輸入st:");
scanf("%d",&process[ i].st);
process[ i].st1=process[ i].st;
}
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++) //按照各進(jìn)程到達(dá)時(shí)間升序,對(duì)進(jìn)程排序 注意:穩(wěn)定的排序
{
if(process[j].at<process[ i].at)
{
process[0]=process[j];
process[j]=process[ i];
process[ i]=process[0];
}
}
//for(i=1;i<=n;i++) //檢查排序是否正確
//printf("%d\t",process[ i].pn);
int time=process[1].at; //當(dāng)前時(shí)間的初值
int flag=1;
int sum=0; //記錄完成的進(jìn)程數(shù)
printf("\n第幾次調(diào)度進(jìn)程 運(yùn)行的進(jìn)程pn 開始運(yùn)行時(shí)間 運(yùn)行時(shí)間 剩余服務(wù)時(shí)間 結(jié)束時(shí)間\n");
int z=1; //記錄第幾次調(diào)度進(jìn)程
while(sum<n)
{
flag=0; //標(biāo)志就緒隊(duì)列中是否還有進(jìn)程
for(i=1;i<=n;i++) //時(shí)間片輪轉(zhuǎn)法執(zhí)行各進(jìn)程
{
if(process[ i].sc==1)continue; //已完成的進(jìn)程
else
{
if(process[ i].st1<=T&&time>=process[ i].at)//未完成的進(jìn)程但是還需服務(wù)的時(shí)間少于等于一個(gè)時(shí)間片
{
flag=1;
time=time+process[ i].st1;
process[ i].sc=1;
process[ i].ct=time;
printf("%8d%12d%15d%11d%11d%11d\n",z++,process[ i].pn,time-process[ i].st1,process[ i].st1,0,time);
process[ i].st1=0;
}
elseif(process[ i].st1>T&&time>=process[ i].at)//未完成的進(jìn)程但其還需服務(wù)時(shí)間至少大于一個(gè)時(shí)間片
{
flag=1;
time=time+T;
process[ i].st1-=T;
printf("%8d%12d%15d%11d%11d%11d\n",z++,process[ i].pn,time-T,T,process[ i].st1,time);
}
if(process[ i].sc==1)sum++; //一個(gè)進(jìn)程執(zhí)行完就+1
}
}
if(flag==0&&sum<n) // 還有沒執(zhí)行的進(jìn)程,且沒進(jìn)入就就緒隊(duì)列
{
for(i=1;i<=n;i++)
if(process[ i].sc==0){time=process[ i].at;break;}
}
}
return 0;
}
intmain()
{
int n;
printf("\t\t時(shí)間片輪轉(zhuǎn)調(diào)度算法\n");
printf("請(qǐng)輸入總進(jìn)程數(shù):\n");
scanf("%d",&n);
sjp(n);
return 0;
}
三、運(yùn)行結(jié)果
四、實(shí)驗(yàn)心得體會(huì)
這次的實(shí)驗(yàn)有了很大的收獲,加深對(duì)進(jìn)程概念的理解,進(jìn)一步掌握進(jìn)程狀態(tài)的轉(zhuǎn)變、進(jìn)程調(diào)度的策略及對(duì)系統(tǒng)性能的評(píng)價(jià)方法。
|
|