一、簡介
1.1 背景
在計(jì)算機(jī)科學(xué)領(lǐng)域,進(jìn)程調(diào)度是操作系統(tǒng)中一個(gè)關(guān)鍵的組成部分,它負(fù)責(zé)協(xié)調(diào)系統(tǒng)中各個(gè)進(jìn)程的執(zhí)行順序,以最大程度地提高系統(tǒng)資源利用率。在這篇博客中,將深入探討基于優(yōu)先級的輪轉(zhuǎn)調(diào)度算法,該算法結(jié)合了進(jìn)程的優(yōu)先級
和時(shí)間片輪轉(zhuǎn)
的思想,以實(shí)現(xiàn)高效的任務(wù)執(zhí)行。
1.2 目的
本文的主要目的是解釋和分析一個(gè)使用C++編寫的簡單進(jìn)程調(diào)度程序。將詳細(xì)介紹程序的結(jié)構(gòu)和實(shí)現(xiàn)細(xì)節(jié),同時(shí)提供示例以幫助讀者理解基于優(yōu)先級的輪轉(zhuǎn)調(diào)度算法的工作原理。
1.3 代碼概覽
程序需要使用一個(gè)結(jié)構(gòu)體 content
來表示進(jìn)程,包括進(jìn)程名、優(yōu)先級、到達(dá)時(shí)間、需要時(shí)間、已用時(shí)間和進(jìn)程狀態(tài)等信息。主要功能包括增加進(jìn)程、打印結(jié)果以及實(shí)現(xiàn)基于優(yōu)先級的輪轉(zhuǎn)調(diào)度。以下是進(jìn)程調(diào)度程序的框架:
程序框架
{
m
a
i
n
主函數(shù):用于循環(huán)菜單操作
m
a
r
k
主菜單:提示用戶包括輸入時(shí)間片、打印結(jié)果等
p
r
t
函數(shù):進(jìn)程調(diào)度算法以及輸出進(jìn)程調(diào)度的結(jié)果
a
d
d
函數(shù):增加進(jìn)程信息
c
o
n
t
e
n
t
結(jié)構(gòu)體:進(jìn)程名、優(yōu)先級、到達(dá)時(shí)間、需要時(shí)間、已用時(shí)間和進(jìn)程狀態(tài)等信息
程序框架\begin{cases} main主函數(shù):用于循環(huán)菜單操作\\mark主菜單:提示用戶包括輸入時(shí)間片、打印結(jié)果等\\prt函數(shù):進(jìn)程調(diào)度算法以及輸出進(jìn)程調(diào)度的結(jié)果\\add函數(shù):增加進(jìn)程信息\\content結(jié)構(gòu)體:進(jìn)程名、優(yōu)先級、到達(dá)時(shí)間、需要時(shí)間、已用時(shí)間和進(jìn)程狀態(tài)等信息 \end{cases}
程序框架?
?
??main主函數(shù):用于循環(huán)菜單操作mark主菜單:提示用戶包括輸入時(shí)間片、打印結(jié)果等prt函數(shù):進(jìn)程調(diào)度算法以及輸出進(jìn)程調(diào)度的結(jié)果add函數(shù):增加進(jìn)程信息content結(jié)構(gòu)體:進(jìn)程名、優(yōu)先級、到達(dá)時(shí)間、需要時(shí)間、已用時(shí)間和進(jìn)程狀態(tài)等信息?
二、進(jìn)程調(diào)度算法概述
2.1 優(yōu)先級調(diào)度算法
優(yōu)先級調(diào)度算法是一種常見的進(jìn)程調(diào)度策略,它根據(jù)進(jìn)程的優(yōu)先級來確定執(zhí)行順序。在我們的程序中,每個(gè)進(jìn)程都被賦予一個(gè)優(yōu)先級 (f),并根據(jù)該優(yōu)先級進(jìn)行排序。較高優(yōu)先級的進(jìn)程將在較低優(yōu)先級的進(jìn)程之前執(zhí)行。
2.2 輪轉(zhuǎn)調(diào)度算法
輪轉(zhuǎn)調(diào)度算法引入了時(shí)間片
的概念,即每個(gè)進(jìn)程被分配的執(zhí)行時(shí)間。在我們的實(shí)現(xiàn)中,用戶可以輸入時(shí)間片的大小,這將影響每個(gè)進(jìn)程的運(yùn)行時(shí)間。當(dāng)一個(gè)進(jìn)程用完它的時(shí)間片后,調(diào)度程序?qū)⑶袚Q到下一個(gè)就緒隊(duì)列中的進(jìn)程,以此類推。
三、代碼詳解
3.1 結(jié)構(gòu)體定義
在程序中,使用一個(gè)名為 content
的結(jié)構(gòu)體來表示每個(gè)進(jìn)程的信息。這個(gè)結(jié)構(gòu)體包含進(jìn)程名 (name
)、優(yōu)先級 (f
)、到達(dá)時(shí)間 (arrtime
)、所需時(shí)間 (needtime
)、已用時(shí)間 (gettime
) 以及進(jìn)程狀態(tài) (process
)。
struct content
{
string name; // 進(jìn)程名
int f; // 優(yōu)先級
int arrtime; // 到達(dá)時(shí)間
int needtime; // 所需時(shí)間
int gettime; // 已用時(shí)間
string process; // 進(jìn)程狀態(tài)
};
這個(gè)結(jié)構(gòu)體的定義來組織和存儲每個(gè)進(jìn)程的相關(guān)信息。
3.2 主菜單函數(shù) (mark)
主菜單函數(shù) mark
用于引導(dǎo)用戶進(jìn)行操作選擇。用戶可以選擇增加進(jìn)程、打印進(jìn)程狀態(tài),或結(jié)束任務(wù)。該函數(shù)返回用戶的選擇。
int mark()
{
int pd;
cout << "增加進(jìn)程并調(diào)度進(jìn)程,請按1\n打印進(jìn)程,請按2\n任務(wù)結(jié)束,請按0" << endl;
cin >> pd;
if (pd < 0 || pd > 2)
{
return mark();
}
return pd;
}
3.3 增加進(jìn)程函數(shù) (add)
增加進(jìn)程函數(shù) add
用于向進(jìn)程數(shù)組中添加新的進(jìn)程。用戶需要輸入進(jìn)程的名稱、優(yōu)先級以及所需時(shí)間。這個(gè)函數(shù)返回一個(gè)標(biāo)志,指示是否繼續(xù)增加進(jìn)程。
int add(struct content a[], int i)
{
char pd;
cout << "請輸入進(jìn)程名:";
cin >> a[i].name;
cout << "請輸入進(jìn)程的優(yōu)先級:";
cin >> a[i].f;
cout << "請輸入進(jìn)程需要的時(shí)間:";
cin >> a[i].needtime;
a[i].arrtime = i; // 設(shè)置到達(dá)時(shí)間
a[i].gettime = 0; // 初始化已用時(shí)間
a[i].process = 'W'; // 初始化進(jìn)程狀態(tài)(等)
cout << "還要繼續(xù)增加進(jìn)程嗎,是(Y)否(N)";
cin >> pd;
if (pd == 'N')
return 0;
return 1;
}
函數(shù)允許用戶連續(xù)添加多個(gè)進(jìn)程,直到用戶選擇停止。
3.4 打印結(jié)果函數(shù) (prt)
打印結(jié)果函數(shù) prt
負(fù)責(zé)對進(jìn)程進(jìn)行排序,并根據(jù)優(yōu)先級和到達(dá)時(shí)間打印進(jìn)程狀態(tài)。該函數(shù)還包括遞歸調(diào)用以模擬進(jìn)程的運(yùn)行。
void prt(struct content a[], int n, int time)
{
// (排序和打印結(jié)果的實(shí)現(xiàn))
int i,j,pd=0;
//排序
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-i-1;j++)
{
if(a[j].f<a[j+1].f||(a[j].f==a[j+1].f&&a[j].arrtime>a[j+1].arrtime))//先根據(jù)優(yōu)先級,后根據(jù)到達(dá)時(shí)間判斷
{
struct content temp;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
a[0].process='R';//改變第一個(gè)進(jìn)程的狀態(tài)(運(yùn)行)
for(i=0;i<=n;i++)
{
if(a[i].gettime<a[i].needtime)
{
pd=1;
break;
}
}
if(pd==0)
{
a[0].process='F';//修改最后進(jìn)程完成狀態(tài)
}
cout<<"進(jìn)程名 優(yōu)先級 到達(dá)時(shí)間 需要時(shí)間 已用時(shí)間 進(jìn)程狀態(tài)"<<endl;
for(i=0;i<=n;i++)
{
cout<<a[i].name<<"\t"<<a[i].f<<"\t"<<a[i].arrtime<<"\t "<<a[i].needtime<<"\t "<<a[i].gettime<<"\t "<<a[i].process<<endl;
}
if (pd == 0)
{
return; // 退出遞歸
}
// 修改數(shù)據(jù)
a[0].f -= 1;
a[0].gettime += time;
a[0].process = 'W';
if (a[0].gettime >= a[0].needtime)
{
a[0].f = -1000;
a[0].gettime = a[0].needtime;
a[0].process = 'F';
}
prt(a, n, time); // 遞歸打印
}
這個(gè)函數(shù)通過遞歸調(diào)用自身,模擬了進(jìn)程的調(diào)度和執(zhí)行過程。在打印結(jié)果時(shí),它顯示了每個(gè)進(jìn)程的詳細(xì)信息,包括進(jìn)程名、優(yōu)先級、到達(dá)時(shí)間、需要時(shí)間、已用時(shí)間和進(jìn)程狀態(tài)。文章來源:http://www.zghlxwxcb.cn/news/detail-808871.html
3.5 主函數(shù)(main)
int main()
{
int time; // 時(shí)間片大小
int i = -1; // 記錄進(jìn)程個(gè)數(shù)和到達(dá)時(shí)間
struct content a[10];
cout << "請輸入時(shí)間片大?。?;
cin >> time;
while (1)
{
int pd = mark(); // 主菜單判斷
if (pd == 0)
break; // 退出
if (pd == 1)
{
while (1)
{
i++;
int pd = add(a, i);
if (pd == 0)
break; // 增加進(jìn)程完畢,退出
}
}
if (pd == 2)
{
prt(a, i, time);
continue;
}
prt(a, i, time);
}
}
3.6 運(yùn)行示例
文章來源地址http://www.zghlxwxcb.cn/news/detail-808871.html
到了這里,關(guān)于【進(jìn)程調(diào)度】基于優(yōu)先級的輪轉(zhuǎn)調(diào)度C++實(shí)現(xiàn)算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!