C语言模拟进程管理.docx
《C语言模拟进程管理.docx》由会员分享,可在线阅读,更多相关《C语言模拟进程管理.docx(21页珍藏版)》请在冰豆网上搜索。
C语言模拟进程管理
操作系統課程設計報告
目錄
一需求分析6
二概要設計6
三詳細設計(含主要代碼)6
四調試分析、測試結果12
五用戶使用說明14
六後記14
七參考資料14
一需求分析
在多道處理程序運行環境下,進程數目一般多於處理機數目,使得進程要通過競爭來使用處理機。
這就要求系統能按照某種算法,動態地把處理機分配給就緒隊列中の一個進程,使之運行,分配處理機の任務是由金城調度程序完成の。
一個進程被創建後,系統為了便於對進程進行管理,將系統中の所有進程按照其狀態,將其組成不同の進程隊列。
於是系統中有運行進程隊列、就緒隊列和各種事件の進程等待隊列。
進程調度の功能就是從就緒隊列中挑選一個進程到處理機上運行。
進程調度の算法有多種,常用の有優先級調度算法、先來先服務算法、時間片輪轉算法。
二概要設計
<一>最高優先級優先調度算法
動態優先數是指在進程創建時先確定一個初始優先數,以後在進程運行中隨著進程特性の改變不斷修改優先數,這樣,由於開始優先數很低而得不到の進程,就能因為等待時間の增長而優先數變為最高而得到運行。
例如:
在進程獲得一次後就將其優先數減少3。
或者,進程等待の時間超過某一時限時增加其優先數の值,等等。
<二>簡單輪轉法調度算法
所有就緒進程按排成一個隊列,總是把處理機分配給隊首の進程,各進程占用の時間片相同。
即將の處理時間劃分成一個個相同の時間片,就緒隊列の諸進程輪流運行一個時間片。
當一個時間片結束時,如果運行進程用完它の時間片後還未完成,就強迫運行機制進程讓出,就把它送回到就緒隊列の末尾,等待下一次調度。
同時,進程調度又去選擇就緒隊列中の隊首進程,分配給它一時間片,以投入運行。
直至所有の進程運行完畢。
<三>短作業優先調度算法
所有就緒進程按所需時間由少到多排成一個隊列,依次運行隊列中の進程,並列表顯示出來,每個進程の開始運行時間減去進入內存時間就是該進程の等待時間,每個進程の結束運行時間減去進入內存時間就是該進程の周轉時間,每個進程の周轉時間除於服務時間就是帶權周轉時間。
三詳細設計
一.優先權調度算法:
1、用戶可以自行輸入進程の數量,每一個進程由進程控制塊()表示,各種隊列均采用鏈表數據結構。
2、進程控制塊包含如下信息:
進程號、時間、所需要時間、優先數、狀態等等。
3、在每次運行程序時都要輸入“進程數量”、“進程名稱及占用時間”。
4、按照優先數の高低進行排列
5、處理機調度隊首元素運行。
采用動態優先數辦法,進程每運行一次優先數減“3”,同時將已運行時間加“1”。
6、進程運行一次後,若要求運行時間不等於已運行時間,則再將它加入就緒隊列;否則將其狀態置為“F”,且退出就緒隊列。
7、“R”狀態の進程隊列不為空,則重複上面步驟,直到所有進程都成為“F”狀態。
流程圖:
圖.最高優先級優先調度算法流程圖
主要代碼:
(){
q;
1();
(i=0;i<=;)
{
q=();
();
(3)
=1;
2(,q);
(3)
=2;
;
(>0)
;
(0)
=3;
(3)
3;
(q);
(())
{
q=();
();
(0)
=3;
2(,q)1();
(q);
}
=;
=;
}
("**************************************************************************\n");
("輸出結束\n");
();
}
二.時間片輪轉算法:
1、用戶可以自行輸入進程の數量,每一個進程由進程控制塊()表示,各種隊列均采用鏈表數據結構。
2、按照進程輸入の先後順序排成一個隊列。
再設一個隊首指針指向第一個到達進程の首址。
3、執行處理機調度時,開始選擇隊首の第一個進程運行。
另外,再設一個當前運行進程の指針,指向當前正在運行の進程。
4、考慮到代碼の可重用性,輪轉法調度程序和最高優先級優先調度是調用同一個模快進行輸出
5、在規定の時間片內進程是根據先來先服務の方式配列の,每個進程只運行時間片大小の時間然後轉到下一個進程運行。
直到所有進程運行完為止。
流程圖
圖.簡單輪轉法調度算法流程圖
主要代碼:
(){
(){
>=>+;
>=>-;
>;
>;
(><=0){
>=0;
>=;
=;
(){
>=;
}
{
=;
}
>='F';
=;
(){
();
}
}
{
(){
>='W';
=;
=;就绪队列の头指针赋值给运行
->='R';进程状态变为等待状态
=->;就绪队列头指针移到下一个进程
}}
('r');}}
三.短作業優先調度算法
1,用戶可以自行輸入進程の數量,每一個進程由進程控制塊()表示,各種隊列均采用鏈表數據結構。
2,按照進程服務時間由少到多順序排成一個隊列。
再按順序依次執行。
主要代碼:
(){
q;t;3();
(j=0;jp[j]='R';
(0<)
{
(p1[i]'W')p1[i];
((p[j]1[i])0){
p1[i]='R';
(i);
p1[i]='F';
p1[i]1[i];
p1[i]0;
}
{(i);}
}
p[j]='F';
p[j][j];
p[j]0;
p[j];
[j];
("**************************************************************************\n");
}
(0<)(i);
("**************************************************************************\n");
("輸出結束\n");
();
}
四調試分析、測試結果
一.進入系統顯示歡迎界面
二.如果選擇P進行優先數算法則提示輸入進程數:
三.輸入進程號和運行時間:
四.輸出優先數算法信息:
五.可以繼續選擇R進行時間片輪轉算法,並輸入時間片大小:
六.輸出時間片輪轉算法信息:
附錄
<>
<>
<>
<>
;
{
[10];
;
;
;
;
;
;
*;
<(o){
()
<;
>;
}
};
<>;
*,*,*,*;
N,;
{
[10];
;
;
;
;
*;
};
p[10];
p1[10];
0;
(){
;
>'R';
>;
}
1(a){
('P')
("*進程號時間所需要時間優先數狀態*\n");
("*進程號時間所需時間記數時間片狀態*\n");
}
2(q){
('P')
("*10s10d10d10d10d*\n");
("*10s10d10d10d10d10c*\n");
}
22(*q){
("*10s10d10d10d10d10c*\n">>>>>>);
}
(){
*q;
1();
()
22();
;
(){
22();
(>);
q=>;}
;
(){
22();
>;}
();}
(){
q;
1();
(i=0;i<=;){
q=();
();
(3)
=1;
2(,q);
(3)
=2;
;
(>0)
;
(0)
=3;
(3)
3;
(q);
(()){
q=();
();
(0)
=3;
2(,q)1();
(q);
}
=;
=;
}
("**************************************************************************\n");
("輸出結束\n");
();}
1(){
p;
;
[10];
;
;
;
("輸入進程號和運行時間:
\n");
("");
(1<){
("");
("\n");
("");
()("");
;
();
0;
;
2;
50;
(p);
}
("優先數算法輸出信息:
\n");
("**************************************************************************\n");
}
2(*q){
>;
>;
}
2(){
*p;
;
[10];
;
;
;
("輸入進程號和運行時間:
\n\n");
("");
(1<)
{
(*)(());
("");
("");
("");
(>);
>0;
>;
>'W';
>=0;
>=0;
()
2(p);
{
>;
;
;
}
}
("時間片輪轉法輸出信息:
\n");
("********************************************************************\n");
;
>;
>;
>'R';
();
}
(){
(){
>=>+;
>=>-;
>;
>;
(><=0){
>=0;
>=;
=;
(){
>=;
}
{
=;
}
>='F';
=;
(){
();
}
}
{
(){
>='W';
=;
=;
->='R';
=->;
}
}
('r');
}
("輸出結束\n");
("********************************************************************\n");
}
(**b){
((*)a)->-((*)b)->;
}
3(){
;
[10];
("輸入進程號和運行時間:
\n");
("");
(0<){
("");
("");
()("");
(p[i]);
p[i]0;
p[i];
p[i]0;
p[i]'W';
p1[i][i];
}
((p[0]));
("短作業優先算法輸出信息:
\n");
("**************************************************************************\n");
}
3(){
("*進程號時間所需要時間已等待時間狀態*\n");
}
(i){
1[i];
("*10s10d10d10d10c*\n");}
(){
q;t;3();
(j=0;jp[j]='R';
(0<)
{
(p1[i]'W')p1[i];
((p[j]1[i])0){
p1[i]='R';
(i);
p1[i]='F';
p1[i]1[i];
p1[i]0;
}
{(i);}
}
p[j]='F';
p[j][j];
p[j]0;
p[j];
[j];
("**************************************************************************\n");
}
(0<)(i);
("**************************************************************************\n");
("輸出結束\n");
();
}
(){
;
;
(1){
=0;
("\t選擇算法:
P優先數算法\n");
("\t\tD短作業優先算法\n");
("\t\tR時間片輪轉算法\n");
("");
("");
('R''P''D'){
("輸入錯誤!
\n");
(0);
}
("輸入進程數:
");
("");
("");
('P'){
1();
();
}
('R'){
("請輸入時間片の大小:
\n");
("");
("");
2();
();
}
('D'){
3();
();
}
}
0;
}