資源簡介
自己寫的代碼和實驗報告,模擬了在批處理系統中的作業調度。適于操作系統初學者理解操作系統中的作業調度原理。(希望朋友們先根據要求自己實現代碼,然后再參考我的代碼。)

代碼片段和文件信息
#include?
#include?
#define?n?10?????????//后備隊列中JCB的最大數量
//作業控制塊
typedef?struct?
{
char?name[4];?????//作業名
int?length;???????//作業長度
int?printer;??????//打印機數量
int?tape;?????????//磁帶機數量
int?runtime;??????//運行時間
int?waittime; ??//等待時間
int?next; ??//指針
}?JCB;
//后備隊列(對結構)
JCB?jobTable[n]; ??//作業表
int?jobCount; ??//作業表中當前作業數量
int?head;????????????//作業表頭指針
//初始化函數
void?Init()
{
head=-1;
jobCount=0;
}
//入隊函數
void?PushQueue(JCB?job)
{
if(jobCount>=n)
{
printf(“隊列已滿,不能加入\n“);
return;
}
if(head==-1)
head=0;
jobTable[jobCount].length=job.length;
strcpy(jobTable[jobCount].namejob.name);
jobTable[jobCount].printer=job.printer;
jobTable[jobCount].runtime=job.runtime;
jobTable[jobCount].tape=job.tape;
jobTable[jobCount].waittime=job.waittime;
jobTable[jobCount-1].next=jobCount;
jobTable[jobCount].next=-1;
jobCount++;
}
//出隊函數
void?PopQueue(int?num)
{
if(jobCount==0)
{
printf(“空隊不能出隊“);
return;
}
if(num>=jobCount)
{
printf(“隊列中不存在該元素“);
return;
}
if(jobCount==1)
{
head=-1;
jobTable[0].next=-1;
jobCount=0;
}
else
{
jobTable[num-1].next=jobTable[num].next;
jobTable[num].next=-1;
jobCount--;
}
}
//系統資源
int?memory=65536;?????//主存大小64MB,65536KB
int?tape=4;???????????//磁帶機數量
int?printer=2;????????//打印機數量
?
//作業調度函數
void?Schedule()
{
int?currJobmaxJob;
double?currJobRatiomaxJobRatio;
while(head!=-1)
{
currJob=maxJob=head;
currJobRatio=maxJobRatio=0;
//找出響應比最大的作業
while(1)
{
//找出滿足資源的作業
if(jobTable[currJob].length<=memory?&&?jobTable[currJob].printer<=printer?&&?jobTable[currJob].tape<=tape)?????
{
currJobRatio=(double)jobTable[currJob].waittime/jobTable[currJob].runtime;?????//計算響應比
if(currJobRatio>maxJobRatio)
{
maxJobRatio=currJobRatio;
maxJob=currJob;
}
}
if(jobTable[currJob].next==-1)
break;
else
currJob=jobTable[currJob].next;
}
//輸出響應比最大的作業、分配資源
if(maxJobRatio!=0)
{
memory-=jobTable[maxJob].length;
tape-=jobTable[maxJob].tape;
printer-=jobTable[maxJob].printer;
printf(“選中作業的作業名為:%s\n“jobTable[maxJob].name);
PopQueue(maxJob);
}
}
}
void?main()
{
//用于作業的臨時變量
char?tmp_name[4];
int?tmp_length;
int?tmp_printer;
int?tmp_tape;
int?tmp_runtime;
int?tmp_waittime;
int?tmp_count;?????//記錄輸入作業數量
JCB?tmp_job;???????//臨時作業變量
printf(“請輸入作業相關信息,以作業名為Q為輸入結束。\n\n按任意鍵進入輸入模式:“);
getchar();
Init();
while(1)
{
tmp_count=1;
if(tmp_count>n)
{
printf(“達到最大作業數,輸入結束。“);
break;
}
//輸入作業名、作業大小、磁帶機數、打印機數、估計執行時間、等待時間
printf(“作業名:“);
scanf(“%s“tmp_name);
if(strcmp(tmp_name“Q“)==0||strcmp(tmp_name“q“)==0)
break;
printf(“作業大小:“);
scanf(“%d“&tmp_length);
printf(“磁帶機數:“);
scanf(“%d“&tmp_printer);
printf(“打印機數:“);
scanf(“%d“&tmp_tape);
printf(“估計運行時間:“);
scanf(“%d“&tmp
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????3690??2009-11-30?17:23??批處理系統的作業調度\JobSchedule.c
?????文件??????42496??2009-12-04?22:26??批處理系統的作業調度\實驗報告.doc
?????文件?????133632??2009-12-04?22:28??批處理系統的作業調度\實驗要求.doc
?????目錄??????????0??2009-12-04?22:28??批處理系統的作業調度
-----------?---------??----------?-----??----
???????????????179818????????????????????4
評論
共有 條評論