一、實(shí)驗(yàn)?zāi)康?/strong>
(1)了解進(jìn)程實(shí)體PCB結(jié)構(gòu);
(2)理解進(jìn)程不同狀態(tài)和狀態(tài)之間的轉(zhuǎn)換過(guò)程;
(3)掌握優(yōu)先數(shù)的調(diào)度算法和先來(lái)先服務(wù)算法;
二、實(shí)驗(yàn)內(nèi)容與要求
設(shè)計(jì)一個(gè)有 N個(gè)進(jìn)程共行的進(jìn)程調(diào)度程序
四、實(shí)驗(yàn)步驟
(1)實(shí)驗(yàn)設(shè)計(jì)
進(jìn)程調(diào)度算法:采用最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法(即把處理機(jī)分配給優(yōu)先數(shù)最高的進(jìn)程)和先來(lái)先服務(wù)算法。每個(gè)進(jìn)程有一個(gè)進(jìn)程控制塊( PCB)表示。
進(jìn)程控制塊可以包含如下信息:進(jìn)程名、優(yōu)先數(shù)、到達(dá)時(shí)間、需要運(yùn)行時(shí)間、已用CPU時(shí)間、進(jìn)程狀態(tài)等等。
進(jìn)程的優(yōu)先數(shù)及需要的運(yùn)行時(shí)間可以事先人為地指定(也可以由隨機(jī)數(shù)產(chǎn)生)。
進(jìn)程的到達(dá)時(shí)間為進(jìn)程輸入的時(shí)間。進(jìn)程的運(yùn)行時(shí)間以時(shí)間片為單位進(jìn)行計(jì)算。每個(gè)進(jìn)程的狀態(tài)可以是就緒 W(Wait)、運(yùn)行R(Run)、或完成F(Finish)三種狀態(tài)之一。
就緒進(jìn)程獲得 CPU后都只能運(yùn)行一個(gè)時(shí)間片。用已占用CPU時(shí)間加1來(lái)表示。如果運(yùn)行一個(gè)時(shí)間片后,進(jìn)程的已占用 CPU時(shí)間已達(dá)到所需要的運(yùn)行時(shí)間,則撤消該進(jìn)程,如果運(yùn)行一個(gè)時(shí)間片后進(jìn)程的已占用CPU時(shí)間還未達(dá)所需要的運(yùn)行時(shí)間,也就是進(jìn)程還需要繼續(xù)運(yùn)行,此時(shí)應(yīng)將進(jìn)程的優(yōu)先數(shù)減1(即降低一級(jí)),然后把它插入就緒隊(duì)列等待CPU。每進(jìn)行一次調(diào)度程序都打印一次運(yùn)行進(jìn)程、就緒隊(duì)列、以及各個(gè)進(jìn)程的 PCB,以便進(jìn)行檢查。
重復(fù)以上過(guò)程,直到所要進(jìn)程都完成為止。
#include<bits/stdc++.h>
using namespace std;
#define getpch(type) (type *)malloc(sizeof(type))
int t = 0;
struct pcb {
char name[10]; //進(jìn)程名
char state; //W/R/F
int super; //優(yōu)先數(shù)
int ntime; //總運(yùn)行時(shí)間
int rtime; //已耗時(shí)
int arrive_time; //到達(dá)時(shí)間
struct pcb* link;
} *ready = NULL, * p;
typedef struct pcb PCB;
int suanfa;
void sort() { //優(yōu)先集排序
p->link = NULL;
if (ready == NULL)
ready = p;
else {//分saunfa =1和saunfa =2兩種情況 既分算法為
//采用最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法和先來(lái)先服務(wù)算法。
if (p->super > ready->super&&suanfa==1) {
p->link = ready;
ready = p;
}
else {
PCB* f = ready;
while (1) {
if (f->link == NULL) {
f->link = p;
return;
}
else if (p->super > f->link->super && suanfa == 1) {
PCB* s = f->link;
f->link = p;
p->link = s;
return;
}
else if (p->arrive_time < f->link->arrive_time&&suanfa == 2) {
PCB* s = f->link;
f->link = p;
p->link = s;
return;
}
f = f->link;
}
}
}
}
void input() { //輸入
srand((unsigned)time(NULL));
int n;
cout << "請(qǐng)輸入進(jìn)程數(shù)目:";
cin >> n;
int time = 1;
for (int i = 0; i < n; i++) {
p = getpch(PCB);
cout << "請(qǐng)分別輸入進(jìn)程名、進(jìn)程優(yōu)先數(shù)、運(yùn)行時(shí)間:";
cin >> p->name >> p->super >> p->ntime;
p->state = 'W';
p->rtime = 0;
p->arrive_time = time;
time++;
sort();
}
}
void disp(PCB* pr) { //輸出模板
cout << "進(jìn)程名:" << pr->name << " ";
cout << "進(jìn)程狀態(tài):" << pr->state << " ";
cout << "進(jìn)程優(yōu)先數(shù):" << pr->super << " ";
cout << "進(jìn)程總運(yùn)行時(shí)間:" << pr->ntime << " ";
cout << "進(jìn)程到達(dá)時(shí)間:" << pr->arrive_time << " ";
cout << "進(jìn)程已經(jīng)耗時(shí):" << pr->rtime << endl;
}
void check() { //輸出
cout << "-------------------" << " 正在運(yùn)行中的進(jìn)程 " << "------------------------------" << endl;
disp(p);
cout << "-------------------" << " 就緒隊(duì)列中的進(jìn)程 " << "------------------------------" << endl;
PCB* pr = ready;
while (pr != NULL) {
disp(pr);
pr = pr->link;
}
}
void destroy() { /*建立進(jìn)程撤消函數(shù)*/
cout << "進(jìn)程" << p->name << "運(yùn)行完成,耗時(shí)" << p->ntime << "個(gè)CPU時(shí)間片" << endl;
free(p);
p = NULL;
}
void PSAandFCFS() { //主要運(yùn)行函數(shù)
p = ready;
ready = ready->link;
t++;
cout << endl << "這是第" << t << "個(gè)CPU時(shí)間片" << endl;
p->state = 'R';
check();
p->rtime++;
if (p->ntime == p->rtime)
destroy();
else {
p->super -= 1;
p->state = 'W';
sort();
}
if (p == NULL && ready == NULL)
cout << "全部完成,共耗時(shí)" << t << "個(gè)CPU時(shí)間片" << endl;
}
int main() { /*主函數(shù)*/
cout << "請(qǐng)輸入你想使用的算法 輸入 1 表示最高優(yōu)先級(jí)優(yōu)先算法 輸入 2 表示先來(lái)先服務(wù)算法"<<endl;
cin >> suanfa;
input();
while (p != NULL || ready != NULL)
PSAandFCFS();
return 0;
}
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-740785.html
五、實(shí)驗(yàn)結(jié)果與分析
1.測(cè)試數(shù)據(jù)及結(jié)果
第一組數(shù)據(jù)????選擇算法2 既先來(lái)先運(yùn)行算法 4組數(shù)據(jù)
??
?
?
第二組數(shù)據(jù)?采用算法1 既優(yōu)先級(jí)優(yōu)先算法 4組數(shù)據(jù)
1 4
a 1 1
b 3 2
c 2 3
d 10 1
?
第三組數(shù)據(jù)??采用算法1 既優(yōu)先級(jí)優(yōu)先算法 3組數(shù)據(jù)
1 3
a 3 2
b 8 1
c 1 3
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-740785.html
?
到了這里,關(guān)于操作系統(tǒng):實(shí)驗(yàn)一:進(jìn)程調(diào)度實(shí)驗(yàn)——最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法以及先來(lái)先服務(wù)算法 源碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!