一、實(shí)驗(yàn)?zāi)康?/h3>
進(jìn)程調(diào)度是處理機(jī)管理的核心內(nèi)容。本實(shí)驗(yàn)要求用高級(jí)語(yǔ)言編寫(xiě)模擬進(jìn)程調(diào)度程序,以 便加深理解有關(guān)進(jìn)程控制快、進(jìn)程隊(duì)列等概念,并體會(huì)和了解優(yōu)先數(shù)算法和時(shí)間片輪轉(zhuǎn)算法 的具體實(shí)施辦法。
二、實(shí)驗(yàn)要求
1.設(shè)計(jì)進(jìn)程控制塊 PCB 的結(jié)構(gòu),通常應(yīng)包括如下信息:
進(jìn)程名、進(jìn)程優(yōu)先數(shù)(或輪轉(zhuǎn)時(shí)間片數(shù))、進(jìn)程已占用的 CPU 時(shí)間、進(jìn)程到完成還需要的時(shí)間、進(jìn)程的狀態(tài)、當(dāng)前隊(duì)列指針等。
2.編寫(xiě)兩種調(diào)度算法程序:
優(yōu)先數(shù)調(diào)度算法程序
循環(huán)輪轉(zhuǎn)調(diào)度算法程序
3.按要求輸出結(jié)果。
三、實(shí)驗(yàn)過(guò)程
分別用兩種調(diào)度算法對(duì)伍個(gè)進(jìn)程進(jìn)行調(diào)度。每個(gè)進(jìn)程可有三種狀態(tài);執(zhí)行狀態(tài)(RUN)、
就緒狀態(tài)(READY,包括等待狀態(tài))和完成狀態(tài)(FINISH),并假定初始狀態(tài)為就緒狀態(tài)。
?(一)進(jìn)程控制塊結(jié)構(gòu)如下:
?NAME——進(jìn)程標(biāo)示符
?PRIO/ROUND——進(jìn)程優(yōu)先數(shù)/進(jìn)程每次輪轉(zhuǎn)的時(shí)間片數(shù)(設(shè)為常數(shù) 2)
?CPUTIME——進(jìn)程累計(jì)占用 CPU 的時(shí)間片數(shù)
?NEEDTIME——進(jìn)程到完成還需要的時(shí)間片數(shù)
?STATE——進(jìn)程狀態(tài)
?NEXT——鏈指針
?注:
?1.為了便于處理,程序中進(jìn)程的的運(yùn)行時(shí)間以時(shí)間片為單位進(jìn)行計(jì)算;
?2.各進(jìn)程的優(yōu)先數(shù)或輪轉(zhuǎn)時(shí)間片數(shù),以及進(jìn)程運(yùn)行時(shí)間片數(shù)的初值,均由用戶在程序運(yùn)行時(shí)給定。
(二)進(jìn)程的就緒態(tài)和等待態(tài)均為鏈表結(jié)構(gòu),共有四個(gè)指針如下:
?RUN——當(dāng)前運(yùn)行進(jìn)程指針
?READY——就需隊(duì)列頭指針
?TAIL—— 就需隊(duì)列尾指針
?FINISH—— 完成隊(duì)列頭指針
(三)程序說(shuō)明
?1. 在優(yōu)先數(shù)算法中,進(jìn)程優(yōu)先數(shù)的初值設(shè)為:
?50-NEEDTIME
每執(zhí)行一次,優(yōu)先數(shù)減 1,CPU 時(shí)間片數(shù)加 1,進(jìn)程還需要的時(shí)間片數(shù)減 1。在輪轉(zhuǎn)法中,采用固定時(shí)間片單位(兩個(gè)時(shí)間片為一個(gè)單位),進(jìn)程每輪轉(zhuǎn)一次,CPU時(shí)間片數(shù)加 2,進(jìn)程還需要的時(shí)間片數(shù)減 2,并退出 CPU,排到就緒隊(duì)列尾,等待下一次調(diào)度。
?2. 程序的模塊結(jié)構(gòu)如下:
?整個(gè)程序可由主程序和如下 7 個(gè)過(guò)程組成:
?2
?(1)INSERT1——在優(yōu)先數(shù)算法中,將尚未完成的 PCB 按優(yōu)先數(shù)順序插入到就緒隊(duì)列中;
?(2)INSERT2——在輪轉(zhuǎn)法中,將執(zhí)行了一個(gè)時(shí)間片單位(為 2),但尚未完成的進(jìn)程
的 PCB,插到就緒隊(duì)列的隊(duì)尾;
?(3)FIRSTIN——調(diào)度就緒隊(duì)列的第一個(gè)進(jìn)程投入運(yùn)行;
?(4)PRINT——顯示每執(zhí)行一次后所有進(jìn)程的狀態(tài)及有關(guān)信息。
?(5)CREATE——?jiǎng)?chuàng)建新進(jìn)程,并將它的 PCB 插入就緒隊(duì)列;
?(6)PRISCH——按優(yōu)先數(shù)算法調(diào)度進(jìn)程;
?(7)ROUNDSCH——按時(shí)間片輪轉(zhuǎn)法調(diào)度進(jìn)程。
?主程序定義 PCB 結(jié)構(gòu)和其他有關(guān)變量。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-744848.html
代碼:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-744848.html
Main.cpp
#include<iostream>
#include<string>
using namespace std;
typedef struct node
{
char name[20]; //進(jìn)程名
int prio; //進(jìn)程優(yōu)先級(jí)
int round; //分配CPU的時(shí)間片
int cputime; //CPU執(zhí)行時(shí)間
int needtime; //進(jìn)程執(zhí)行所需時(shí)間
char state; //進(jìn)程狀態(tài)
int count; //記錄執(zhí)行次數(shù)
struct node *next; //鏈表指針
}PCB;
int num;
//定義三個(gè)隊(duì)列,就緒隊(duì)列,執(zhí)行隊(duì)列,完成隊(duì)列
PCB *ready = NULL; //就緒隊(duì)列
PCB *run = NULL; //執(zhí)行隊(duì)列
PCB *finish = NULL; //完成隊(duì)列
//取得第一個(gè)就緒節(jié)點(diǎn)
void GetFirst()
{
run = ready;
if (ready != NULL)
{
run->state = 'R';
ready = ready->next;
run->next = NULL;
}
}
//優(yōu)先級(jí)輸出隊(duì)列
void Output1()
{
PCB *p;
p = ready;
while (p != NULL)
{
cout << p->name << "\t" << p->prio << "\t" << p->cputime << "\t" << p->needtime << "\t " << p->state << " \t " << p->count << endl;
p = p->next;
}
p = finish;
while (p != NULL)
{
cout << p->name << "\t" << p->prio << "\t" << p->cputime << "\t" << p->needtime << "\t " << p->state << " \t " << p->count << endl;
p = p->next;
}
p = run;
while (p != NULL)
{
cout << p->name << "\t" << p->prio << "\t" << p->cputime << "\t" << p->needtime << "\t " << p->state << " \t " << p->count << endl;
p = p->next;
}
}
//輪轉(zhuǎn)法輸出隊(duì)列
void Output2()
{
PCB *p;
p = ready;
while (p != NULL)
{
cout << p->name << "\t" << p->round << "\t" << p->cputime << "\t" << p->needtime << "\t " << p->state << "\t " << p->count << endl;
p = p->next;
}
p = finish;
while (p != NULL)
{
cout << p->name << "\t" << p->round << "\t" << p->cputime << "\t" << p->needtime << "\t " << p->state << "\t " << p->count << endl;
p = p->next;
}
p = run;
while (p != NULL)
{
cout << p->name << "\t" << p->round << "\t" << p->cputime << "\t" << p->needtime << "\t " << p->state << "\t " << p->count << endl;
p = p->next;
}
}
//創(chuàng)建優(yōu)先級(jí)隊(duì)列
//創(chuàng)建優(yōu)先級(jí)隊(duì)列,規(guī)定優(yōu)先數(shù)越小,優(yōu)先級(jí)越低
void InsertPrio(PCB *in)
{
PCB *fst, *nxt;
fst = nxt = ready;
if (ready == NULL) //如果隊(duì)列為空,則為第一個(gè)元素
{
in->next = ready;
ready = in;
}
else //查到合適的位置進(jìn)行插入
{
if (in->prio >= fst->prio) //比第一個(gè)還要大,則插入到隊(duì)頭
{
in->next = ready;
ready = in;
}
else
{
while (fst->next != NULL) //移動(dòng)指針查找第一個(gè)比它小的元素的位置進(jìn)行插入
{
nxt = fst;
fst = fst->next;
}
if (fst->next == NULL) //已經(jīng)搜索到隊(duì)尾,則其優(yōu)先級(jí)數(shù)最小,將其插入到隊(duì)尾即可
{
in->next = fst->next;
fst->next = in;
}
else //插入到隊(duì)列中
{
nxt = in;
in->next = fst;
}
}
}
}
//將進(jìn)程插入到就緒隊(duì)列尾部
void InsertTime(PCB *in)
{
PCB *fst;
fst = ready;
if (ready == NULL)
{
in->next = ready;
ready = in;
}
else
{
while (fst->next != NULL)
{
fst = fst->next;
}
in->next = fst->next;
fst->next = in;
}
}
//將進(jìn)程插入到完成隊(duì)列尾部
void InsertFinish(PCB *in)
{
PCB *fst;
fst = finish;
if (finish == NULL)
{
in->next = finish;
finish = in;
}
else
{
while (fst->next != NULL)
{
fst = fst->next;
}
in->next = fst->next;
fst->next = in;
}
}
//優(yōu)先級(jí)調(diào)度輸入函數(shù)
void PrioCreate()
{
PCB *tmp;
int i;
cout << "Enter the name and needtime:" << endl;
for (i = 0; i < num; i++)
{
if ((tmp = (PCB *)malloc(sizeof(PCB))) == NULL)
{
cerr << "malloc" << endl;
exit(1);
}
cin >> tmp->name;
getchar();
cin >> tmp->needtime;
tmp->cputime = 0;
tmp->state = 'W';
tmp->prio = 50 - tmp->needtime; //設(shè)置其優(yōu)先級(jí),需要的時(shí)間越多,優(yōu)先級(jí)越低
tmp->round = 0;
tmp->count = 0;
InsertPrio(tmp); //按照優(yōu)先級(jí)從高到低,插入到就緒隊(duì)列
}
cout << "進(jìn)程名\t優(yōu)先級(jí)\tcpu時(shí)間\t需要時(shí)間 進(jìn)程狀態(tài) 計(jì)數(shù)器" << endl;
}
//時(shí)間片輸入函數(shù)
void TimeCreate()
{
PCB *tmp;
int i;
cout << "輸入進(jìn)程名字和進(jìn)程時(shí)間片所需時(shí)間:" << endl;
for (i = 0; i < num; i++)
{
if ((tmp = (PCB *)malloc(sizeof(PCB))) == NULL)
{
cerr << "malloc" << endl;
exit(1);
}
cin >> tmp->name;
getchar();
cin >> tmp->needtime;
tmp->cputime = 0;
tmp->state = 'W';
tmp->prio = 0;
tmp->round = 2;
tmp->count = 0;
InsertTime(tmp);
}
cout << "進(jìn)程名\t輪數(shù)\tCPU時(shí)間\t需要時(shí)間 進(jìn)程狀態(tài) 計(jì)數(shù)器" << endl;
}
//按照優(yōu)先級(jí)調(diào)度,每次執(zhí)行一個(gè)時(shí)間片
void Priority()
{
int flag = 1;
GetFirst();
while (run != NULL)
{
Output1();
while (flag)
{
run->prio -= 3; //優(yōu)先級(jí)減去三
run->cputime++; //CPU時(shí)間片加一
run->needtime--;//進(jìn)程執(zhí)行完成的剩余時(shí)間減一
if (run->needtime == 0)//如果進(jìn)程執(zhí)行完畢,將進(jìn)程狀態(tài)置為F,將其插入到完成隊(duì)列
{
run->state = 'F';
run->count++;
InsertFinish(run);
flag = 0;
}
else //將進(jìn)程狀態(tài)置為W,入就緒隊(duì)列
{
run->state = 'W';
run->count++; //進(jìn)程執(zhí)行的次數(shù)加一
InsertTime(run);
flag = 0;
}
}
flag = 1;
GetFirst(); //繼續(xù)取就緒隊(duì)列隊(duì)頭進(jìn)程進(jìn)入執(zhí)行隊(duì)列
}
}
void RoundRun() //時(shí)間片輪轉(zhuǎn)調(diào)度算法
{
int flag = 1;
GetFirst();
while (run != NULL)
{
Output2();
while (flag)
{
run->count++;
run->cputime++;
run->needtime--;
if (run->needtime == 0) //進(jìn)程執(zhí)行完畢
{
run->state = 'F';
InsertFinish(run);
flag = 0;
}
else if (run->count == run->round)//時(shí)間片用完
{
run->state = 'W';
run->count = 0; //計(jì)數(shù)器清零,為下次做準(zhǔn)備
InsertTime(run);
flag = 0;
}
}
flag = 1;
GetFirst();
}
}
int main(void)
{
int n;
cout << "輸入進(jìn)程個(gè)數(shù):" << endl;
cin >> num;
getchar();
cout << "-----------------進(jìn)程調(diào)度算法模擬----------------------" << endl;
cout << " 1、優(yōu)先級(jí)調(diào)度算法" << endl;
cout << " 2、循環(huán)輪轉(zhuǎn)調(diào)度算法 " << endl;
cout << "-------------------------------------------------------" << endl;
cout << "輸入選擇序號(hào):" << endl;
cin >> n;
switch (n)
{
case 1:
cout << "優(yōu)先級(jí)調(diào)度:" << endl;
PrioCreate();
Priority();
Output1();
break;
case 2:
cout << "循環(huán)輪轉(zhuǎn)算法:" << endl;
TimeCreate();
RoundRun();
Output2();
break;
case 0:
exit(1);
break;
default:
cout << "Enter error!" << endl;
break;
}
cout << endl;
return 0;
}
到了這里,關(guān)于計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)-進(jìn)程調(diào)度模擬算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!