敘操作系統(tǒng)實驗報告二,實現(xiàn)處理器調(diào)度的進(jìn)程.doc
約4頁DOC格式手機打開展開
敘操作系統(tǒng)實驗報告二,實現(xiàn)處理器調(diào)度的進(jìn)程,敘操作系統(tǒng)實驗報告二實現(xiàn)處理器調(diào)度的進(jìn)程 全文4頁1332字時間:2005.4.10實驗題目:實現(xiàn)處理器調(diào)度的進(jìn)程年級:2002級 班級:計算機(5)姓名:學(xué)號:任課教師:實驗要求:選擇一個調(diào)度算法,實現(xiàn)處理器調(diào)度。在采用多道程序設(shè)計的系統(tǒng)中,往往有若干個進(jìn)程同時處于就緒狀態(tài)。當(dāng)就緒狀態(tài)進(jìn)程個數(shù)大于處理器數(shù)時,就必須依...
內(nèi)容介紹
此文檔由會員 黃藥師 發(fā)布
敘操作系統(tǒng)實驗報告二實現(xiàn)處理器調(diào)度的進(jìn)程
全文4頁1332字 時間:2005.4.10
實驗題目:實現(xiàn)處理器調(diào)度的進(jìn)程
年級:2002級 班級:計算機(5)
姓名: 學(xué)號: 任課教師:
實驗要求:
選擇一個調(diào)度算法,實現(xiàn)處理器調(diào)度。
在采用多道程序設(shè)計的系統(tǒng)中,往往有若干個進(jìn)程同時處于就緒狀態(tài)。當(dāng)就緒狀態(tài)進(jìn)程個數(shù)大于處理器數(shù)時,
就必須依照某種策略來決定哪些進(jìn)程優(yōu)先占用處理器。本實驗?zāi)M在單處理器情況下處理器調(diào)度,幫助學(xué)生
加深了解處理器調(diào)度的工作。
解題思路(流程圖):
主函數(shù)流程圖
實驗結(jié)果(部分源碼):
#include
#include
#include
struct PCB //定義結(jié)構(gòu)體PCB,用來描述一個進(jìn)程。
{char PID[3]; //表示進(jìn)程ID
int PTIME; //表示進(jìn)程所需要的運行時間
int PPRIORITY; //表示進(jìn)程的優(yōu)先級
char STATE; //表示進(jìn)程的狀態(tài),為r時表示就緒,為e時表示已執(zhí)行完
struct PCB *next;//指向下一個進(jìn)程
};
struct PCB *create() //創(chuàng)建進(jìn)程就緒隊列,一個按照進(jìn)程優(yōu)先級排序的有序隊列
{
//head為頭指針,tail為一個遍歷指針,pretail是指向tail所指的前一個結(jié)點的指針,p指向新申請到的結(jié)點
struct PCB *head,*tail,*pretail,*p;
int i; //用于for循環(huán)
char id[3];
int time;
int priority;
char state='r'; //初始時進(jìn)程的狀態(tài)都設(shè)為就緒
head=NULL; //初始時,頭指針為空
for(i=0;i<5;i++) //五個進(jìn)程,五次循環(huán)
{ pretail=tail=head;
p=(struct PCB *)malloc(sizeof(struct PCB));//申請一個新結(jié)點
printf("please input the process's ID:");//提示用戶輸入新進(jìn)程的ID
scanf("%s",id);
strcpy(p->PID,id);
printf("please input the process's running time:");//提示用戶輸入新進(jìn)程執(zhí)行完所需要的時間
scanf("%d",&time);
//如果用戶輸入的新進(jìn)程執(zhí)行完所需時間為0,則讓用戶重新輸入執(zhí)行完所需時間
while(time==0)
{
printf("time can not be zero!,please input againn");
printf("please input the process's running time:");
scanf("%d",&time);
}
p->PTIME =time;
printf("please input the process's priority:");//提示用戶輸入該進(jìn)程的優(yōu)先級
scanf("%d",&priority);
p->PPRIORITY =priority;
p->STATE =state;//創(chuàng)建時,將所有的進(jìn)程狀態(tài)都設(shè)為就緒狀態(tài)
if(head==NULL)
{head=pretail=tail=p;p->next =NULL;}//插入第一個進(jìn)程時,直接把頭指針指向這個進(jìn)程結(jié)點即可
else
{ while((p->PPRIORITY <=tail->PPRIORITY) &&(tail->next!=NULL))//遍歷整個鏈表,直到找到合適的插入位置
{
pretail=tail;
tail=tail->next;
}
if((p->PPRIORITY) >(tail->PPRIORITY))//找到了合適的位置則插入新進(jìn)程
{ if(head==tail)//如果此時鏈表中只有一個進(jìn)程結(jié)點
{
p->next =head;
head=p;
}
else//如果此時鏈表中有多個進(jìn)程結(jié)點
{
pretail->next =p;
pretail=p;
p->next =tail;
}
}
else //如果新進(jìn)程結(jié)點比鏈表中的所有進(jìn)程優(yōu)先級都高,則插入鏈表尾部
{ tail->next =p;
p->next =NULL;
}
}
}//創(chuàng)建完五個進(jìn)程結(jié)點組成的有序鏈表
printf("初始狀態(tài)如下:n");
for(p=head;p!=NULL;p=p->next )//顯示現(xiàn)在所有的進(jìn)程
{
printf("PID=%s,PTIME=%d,PPRIORITY=%d,STATE=%cn",p->PID ,p->PTIME,p->PPRIORITY ,p->STATE );
}
printf("nnnnnn");
return (head);//返回此鏈表的頭指針
}
void run(struct PCB *head)//模擬進(jìn)程運行的函數(shù)
{
//tail是一個遍歷指針,pretail是指向tail所指向的前一個進(jìn)程結(jié)點的指針,temp指向當(dāng)前運行的進(jìn)程結(jié)點
struct PCB *temp,*tail,*pretail;
while(head!=NULL)//如果鏈表不空
{
temp=head;
//temp指向鏈表的第一個進(jìn)程結(jié)點,因為是按優(yōu)先數(shù)排序的有序鏈表,所以第一個結(jié)點就是將要運行的進(jìn)程結(jié)點
printf("PID=%s,PTIME=%d,PPRIORITY=%d,STATE=%cn",temp->PID ,temp->PTIME,temp->PPRIORITY ,temp->STATE );//將此進(jìn)程結(jié)點信息顯示出來,
temp->PPRIORITY--;//將該進(jìn)程的優(yōu)先數(shù)減一
temp->PTIME--;//將該進(jìn)程運行完所需要的時間減一
if(head->next!=NULL)//如果該鏈表不只一個進(jìn)程
{
head=head->next ;
tail=pretail=head;
if(temp->PTIME ==0)//如果剛剛運行的進(jìn)程已運行完,做以下操作
{
temp->STATE='e';//修改進(jìn)程狀態(tài)為結(jié)束
printf("tttttPID=%s,PTIME=%d,PPRIORITY=%d,STATE=%cn",temp->PID ,temp->PTIME,temp->PPRIORITY ,temp->STATE );//再次顯示次進(jìn)程信息
free(temp);//釋放該進(jìn)程所占內(nèi)存空間
}
else //如果剛剛運行的進(jìn)程還沒有運行結(jié)束,將這個進(jìn)程結(jié)點再插入到鏈表隊列中,并保持鏈表的有序性
{
//此段代碼與建立鏈表函數(shù)create()中插入結(jié)點代碼一致,這里不再重復(fù)添加注釋。
//本來準(zhǔn)備將此段代碼作為一個子函數(shù)單獨寫出,但是考慮到這段代碼并不長,就直接用文本復(fù)制了一遍
while((temp->PPRIORITY <=tail->PPRIORITY) &&(tail->next!=NULL))
{
pretail=tail;
tail=tail->next;
}
if((temp->PPRIORITY) >(tail->PPRIORITY))
{
if(head==tail)
{
temp->next =head;
head=temp;
}
else
{
pretail->next =temp;
pretail=temp;
temp->next =tail;
}
}
else
{
tail->next =temp;
temp->next =NULL;
}
}
}
else //如果該鏈表中只有一個進(jìn)程結(jié)點了,做以下操作
{
head=tail=pretail=temp;//直接將head,tail,pretail都指向此結(jié)點
if(temp->PTIME ==0)//如果這個結(jié)點也執(zhí)行結(jié)束,則把這個結(jié)點狀態(tài)置為結(jié)束,并將此鏈表銷毀,釋放內(nèi)存
{
temp->STATE='e';
printf("tttttPID=%s,PTIME=%d,PPRIORITY=%d,STATE=%cn",temp->PID ,temp->PTIME,temp->PPRIORITY ,temp->STATE );
head=NULL;
free(temp);
}
}
}
}
void main()
{
struct PCB *y;
y=create();//創(chuàng)建鏈表
printf("執(zhí)行序列如下:n");
run(y); //模擬運行進(jìn)程
printf("the end!");//提示用戶所有進(jìn)程都已經(jīng)執(zhí)行完
}
述詳盡
全文4頁1332字 時間:2005.4.10
實驗題目:實現(xiàn)處理器調(diào)度的進(jìn)程
年級:2002級 班級:計算機(5)
姓名: 學(xué)號: 任課教師:
實驗要求:
選擇一個調(diào)度算法,實現(xiàn)處理器調(diào)度。
在采用多道程序設(shè)計的系統(tǒng)中,往往有若干個進(jìn)程同時處于就緒狀態(tài)。當(dāng)就緒狀態(tài)進(jìn)程個數(shù)大于處理器數(shù)時,
就必須依照某種策略來決定哪些進(jìn)程優(yōu)先占用處理器。本實驗?zāi)M在單處理器情況下處理器調(diào)度,幫助學(xué)生
加深了解處理器調(diào)度的工作。
解題思路(流程圖):
主函數(shù)流程圖
實驗結(jié)果(部分源碼):
#include
#include
#include
struct PCB //定義結(jié)構(gòu)體PCB,用來描述一個進(jìn)程。
{char PID[3]; //表示進(jìn)程ID
int PTIME; //表示進(jìn)程所需要的運行時間
int PPRIORITY; //表示進(jìn)程的優(yōu)先級
char STATE; //表示進(jìn)程的狀態(tài),為r時表示就緒,為e時表示已執(zhí)行完
struct PCB *next;//指向下一個進(jìn)程
};
struct PCB *create() //創(chuàng)建進(jìn)程就緒隊列,一個按照進(jìn)程優(yōu)先級排序的有序隊列
{
//head為頭指針,tail為一個遍歷指針,pretail是指向tail所指的前一個結(jié)點的指針,p指向新申請到的結(jié)點
struct PCB *head,*tail,*pretail,*p;
int i; //用于for循環(huán)
char id[3];
int time;
int priority;
char state='r'; //初始時進(jìn)程的狀態(tài)都設(shè)為就緒
head=NULL; //初始時,頭指針為空
for(i=0;i<5;i++) //五個進(jìn)程,五次循環(huán)
{ pretail=tail=head;
p=(struct PCB *)malloc(sizeof(struct PCB));//申請一個新結(jié)點
printf("please input the process's ID:");//提示用戶輸入新進(jìn)程的ID
scanf("%s",id);
strcpy(p->PID,id);
printf("please input the process's running time:");//提示用戶輸入新進(jìn)程執(zhí)行完所需要的時間
scanf("%d",&time);
//如果用戶輸入的新進(jìn)程執(zhí)行完所需時間為0,則讓用戶重新輸入執(zhí)行完所需時間
while(time==0)
{
printf("time can not be zero!,please input againn");
printf("please input the process's running time:");
scanf("%d",&time);
}
p->PTIME =time;
printf("please input the process's priority:");//提示用戶輸入該進(jìn)程的優(yōu)先級
scanf("%d",&priority);
p->PPRIORITY =priority;
p->STATE =state;//創(chuàng)建時,將所有的進(jìn)程狀態(tài)都設(shè)為就緒狀態(tài)
if(head==NULL)
{head=pretail=tail=p;p->next =NULL;}//插入第一個進(jìn)程時,直接把頭指針指向這個進(jìn)程結(jié)點即可
else
{ while((p->PPRIORITY <=tail->PPRIORITY) &&(tail->next!=NULL))//遍歷整個鏈表,直到找到合適的插入位置
{
pretail=tail;
tail=tail->next;
}
if((p->PPRIORITY) >(tail->PPRIORITY))//找到了合適的位置則插入新進(jìn)程
{ if(head==tail)//如果此時鏈表中只有一個進(jìn)程結(jié)點
{
p->next =head;
head=p;
}
else//如果此時鏈表中有多個進(jìn)程結(jié)點
{
pretail->next =p;
pretail=p;
p->next =tail;
}
}
else //如果新進(jìn)程結(jié)點比鏈表中的所有進(jìn)程優(yōu)先級都高,則插入鏈表尾部
{ tail->next =p;
p->next =NULL;
}
}
}//創(chuàng)建完五個進(jìn)程結(jié)點組成的有序鏈表
printf("初始狀態(tài)如下:n");
for(p=head;p!=NULL;p=p->next )//顯示現(xiàn)在所有的進(jìn)程
{
printf("PID=%s,PTIME=%d,PPRIORITY=%d,STATE=%cn",p->PID ,p->PTIME,p->PPRIORITY ,p->STATE );
}
printf("nnnnnn");
return (head);//返回此鏈表的頭指針
}
void run(struct PCB *head)//模擬進(jìn)程運行的函數(shù)
{
//tail是一個遍歷指針,pretail是指向tail所指向的前一個進(jìn)程結(jié)點的指針,temp指向當(dāng)前運行的進(jìn)程結(jié)點
struct PCB *temp,*tail,*pretail;
while(head!=NULL)//如果鏈表不空
{
temp=head;
//temp指向鏈表的第一個進(jìn)程結(jié)點,因為是按優(yōu)先數(shù)排序的有序鏈表,所以第一個結(jié)點就是將要運行的進(jìn)程結(jié)點
printf("PID=%s,PTIME=%d,PPRIORITY=%d,STATE=%cn",temp->PID ,temp->PTIME,temp->PPRIORITY ,temp->STATE );//將此進(jìn)程結(jié)點信息顯示出來,
temp->PPRIORITY--;//將該進(jìn)程的優(yōu)先數(shù)減一
temp->PTIME--;//將該進(jìn)程運行完所需要的時間減一
if(head->next!=NULL)//如果該鏈表不只一個進(jìn)程
{
head=head->next ;
tail=pretail=head;
if(temp->PTIME ==0)//如果剛剛運行的進(jìn)程已運行完,做以下操作
{
temp->STATE='e';//修改進(jìn)程狀態(tài)為結(jié)束
printf("tttttPID=%s,PTIME=%d,PPRIORITY=%d,STATE=%cn",temp->PID ,temp->PTIME,temp->PPRIORITY ,temp->STATE );//再次顯示次進(jìn)程信息
free(temp);//釋放該進(jìn)程所占內(nèi)存空間
}
else //如果剛剛運行的進(jìn)程還沒有運行結(jié)束,將這個進(jìn)程結(jié)點再插入到鏈表隊列中,并保持鏈表的有序性
{
//此段代碼與建立鏈表函數(shù)create()中插入結(jié)點代碼一致,這里不再重復(fù)添加注釋。
//本來準(zhǔn)備將此段代碼作為一個子函數(shù)單獨寫出,但是考慮到這段代碼并不長,就直接用文本復(fù)制了一遍
while((temp->PPRIORITY <=tail->PPRIORITY) &&(tail->next!=NULL))
{
pretail=tail;
tail=tail->next;
}
if((temp->PPRIORITY) >(tail->PPRIORITY))
{
if(head==tail)
{
temp->next =head;
head=temp;
}
else
{
pretail->next =temp;
pretail=temp;
temp->next =tail;
}
}
else
{
tail->next =temp;
temp->next =NULL;
}
}
}
else //如果該鏈表中只有一個進(jìn)程結(jié)點了,做以下操作
{
head=tail=pretail=temp;//直接將head,tail,pretail都指向此結(jié)點
if(temp->PTIME ==0)//如果這個結(jié)點也執(zhí)行結(jié)束,則把這個結(jié)點狀態(tài)置為結(jié)束,并將此鏈表銷毀,釋放內(nèi)存
{
temp->STATE='e';
printf("tttttPID=%s,PTIME=%d,PPRIORITY=%d,STATE=%cn",temp->PID ,temp->PTIME,temp->PPRIORITY ,temp->STATE );
head=NULL;
free(temp);
}
}
}
}
void main()
{
struct PCB *y;
y=create();//創(chuàng)建鏈表
printf("執(zhí)行序列如下:n");
run(y); //模擬運行進(jìn)程
printf("the end!");//提示用戶所有進(jìn)程都已經(jīng)執(zhí)行完
}
述詳盡
TA們正在看...
- 認(rèn)識圖形標(biāo)志教學(xué)設(shè)計教學(xué)設(shè)計.doc
- 認(rèn)識圖形資料優(yōu)秀教案.doc
- 認(rèn)識圖形資料小班教案.doc
- 認(rèn)識大于號,小于號和.doc
- 認(rèn)識大于號、小于號、等于號.doc
- 認(rèn)識大于等于和小于教學(xué)設(shè)計.doc
- 認(rèn)識孕酮和hcg產(chǎn)生的原理和作用.doc
- 認(rèn)識左右、前后、上下教學(xué)設(shè)計.doc
- 認(rèn)識左右上下前后教學(xué)設(shè)計.doc
- 認(rèn)識常見的數(shù)量關(guān)系資料教學(xué)課件.ppt