实验三进程调度模拟程序
實驗三 進程調度模擬程序??
??????????????? 專業:物聯網工程?? 姓名:王鸞? 學號:201306104128
一、 實驗目的和要求
目的:
用高級語言完成一個進程調度程序,以加深對進程的概念及進程調度算法的理解。
實驗要求
設計一個有 N(N不小于5)個進程并發執行的進程調度模擬程序。
進程調度算法:“時間片輪轉法”調度算法對N個進程進行調度。
?
二、實驗內容
完成兩個算法(簡單時間片輪轉法、多級反饋隊列調度算法)的設計、編碼和調試工作,完成實驗報告。
??? 1) 每個進程有一個進程控制塊(PCB)表示。進程控制塊包含如下信息:進程名、優先級、到達時間、需要運行時間、已用CPU時間、進程狀態等等。
??? 2) 每個進程的狀態可以是就緒 r(ready)、運行R(Running)、或完成F(Finished)三種狀態之一。
??? 3) 就緒進程獲得 CPU后都只能運行一個時間片。用已占用CPU時間加1來表示。
??? 4) 如果運行一個時間片后,進程的已占用 CPU時間已達到所需要的運行時間,則撤消該進程,如果運行一個時間片后進程的已占用CPU時間還未達所需要的運行時間,也就是進程還需要繼續運行,應把它插入就緒隊列等待下一次調度。
??? 5) 每進行一次調度,程序都打印一次運行進程、就緒隊列中各個進程的 PCB,以便進行檢查。
6) 重復以上過程,直到所要進程都完成為止。
?
三、實驗原理及核心算法:
“輪轉法”有簡單輪轉法、多級反饋隊列調度算法。
??? (1). 簡單輪轉法的基本思想是:
所有就緒進程按 FCFS排成一個隊列,總是把處理機分配給隊首的進程,各進程占用CPU的時間片長度相同。如果運行進程用完它的時間片后還未完成,就把它送回到就緒隊列的末尾,把處理機重新分配給隊首的進程。直至所有的進程運行完畢。
??? (2). 多級反饋隊列調度算法的基本思想是:
將就緒隊列分為N級(N=3~5),每個就緒隊列優先數不同并且分配給不同的時間片:隊列級別越高,優先數越低,時間片越長;級別越小,優先數越高,時間片越短。
系統從第一級調度,當第一級為空時,系統轉向第二級隊列,.....當處于運行態的進程用完一個時間片,若未完成則放棄CPU,進入下一級隊列。
當進程第一次就緒時,進入第一級隊列。
四、實驗環境
自主選擇實驗環境。可以選用Turbo C作為開發環境。也可以選用Windows下的可視化環境,利用各種控件較為方便。
?
五、實驗方法、步驟及結果測試
1.源程序名:壓縮包文件(rar或zip)中源程序名 hm.c
可執行程序名:hm.exe
2.原理分析及流程圖
??
3.主要程序段及其解釋:
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
int i,k,num,m,n;
#define N 25
struct JCB{
??????? char name[10];????? //進程名
??????? float AT;?????????? //到達時間?
??????? float RT;?????????? //運行時間?
??????? float S;??????????? //開始時間??????
??????? float F;??????????? //完成時刻?
??????? float CT;???? //已用CPU時間
char status[25];?????? //狀態
??????? float p;??????????? //優先級
}jcb[N],temp;
void input()??????????????? //用戶輸入模塊
{
??? int i;?
??? do{
??????? printf("\n請輸入作業數(3-24):");
??????? scanf("%d",&num);
??????? printf("\n");
??????? if(num<3||num>24)
{
??????????? printf("輸入錯誤,請重新輸入!\n");
??????? }
??? }
??? while(num<3||num>24);
??? for(i=0;i<num;i++)
{
??????? strcpy(jcb[i].status,"r");?? //在調度之前所有的進程的狀態都是等待
??????? printf("第%d個作業名:",i+1);??
??????? scanf("%s",&jcb[i].name);??
??????? printf("\n提交時間:");??
??????? scanf("%f",&jcb[i].AT);??
??????? printf("\n運行時間:");??
??????? scanf("%f",&jcb[i].RT);
??????? printf("\n");
??? }
}
void output()???????????? //輸出模塊
{
??? printf("*************************************\n");
??? printf(" 作業名 到達時間 運行時間 已用CPU時間\n");
??? for(i=0;i<num;i++)
??? {
??????? printf("?? %-9s%-9.0f%-9.0f%-10.0f%\n",jcb[i].name,jcb[i].AT,jcb[i].RT,jcb[i].CT);
??? }
??? printf("*************************************\n");
}
void simple()???? //簡單輪轉法
{
int time=1,m=0,ge=0;???? //time代表時間
int i,j;
int a[25];
while(1)
{
??????? for(j=0;j<num;j++)
??????? {
??????????? if(jcb[j].AT>=time)//判斷當時有多少作業到達
{??????????????
?? a[m]=j;
????? m++;
}
??????? }
for(i=0;i<m;i++)????? //每m個為一個循環
{
if(strcmp(jcb[a[i]].status,"f")==0) continue;//已調度完畢的則不需要再調度
??????????? else jcb[a[i]].CT++;???????????? //CPU時間加一
if(jcb[a[i]].CT==jcb[a[i]].RT)? //如果該進程的使用CPU時間等于運行時間,則它的狀態為完成。
strcpy(jcb[a[i]].status,"f");
time++;
output();
}
for(i=0;i<num;i++)???? //判斷是否所有調度都完成 是則退出while
{
if(strcmp(jcb[a[i]].status,"f")==0) ge++;
if(ge==num) break;
}
if(ge==num) break;
??
}
}
main()
{
??? int n;?
??? do{
input();
printf("進程調度模擬程序\n");?
printf("0:exit退出\n\n");
scanf("%d",&n);
printf("\n");
if(n==0) continue;
else simple();
}
while(n!=0);?
}
4.運行結果及分析
5.總結
?? 本次實驗程序中,剛開始遇到一些問題,如CPU已用時間算法,后來查閱網上資料和詢問同學得到解決。
轉載于:https://www.cnblogs.com/kingluan/p/5070204.html
總結
以上是生活随笔為你收集整理的实验三进程调度模拟程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开始逆向objc基础准备(一)简单认识一
- 下一篇: react问答 项目开发