操作系統實驗--進程調度

一、實驗名稱

進程調度

二、實驗內容

編寫模擬程序實現FIFO算法,短作業優先調度算法和輪轉法,比較他們的不同之處。

三、實驗原理和設計思路

        不同的調度算法,平均週轉時間和平均帶權週轉時間有很大差別,應根據具體情況具體選擇。
        FIFO算法當每次有新的分頁需要調入時,會選擇調入內存時間最久的分頁換出。
        短作業優先調度算法:以進入系統的作業所要求的CPU時間爲標準,是指對短作業或者短進程優先調度的算法,將每個進程與其估計運行時間進行關聯選取估計計算時間最短的作業投入運行。
        輪轉法:每個進程被分配一個時間段,稱作它的時間片,即該進程允許運行的時間。如果在時間片結束時進程還在運行,則CPU將被剝奪並分配給另一個進程。如果進程在時間片結束前阻塞或結束,則CPU當即進行切換。調度程序所要做的就是維護一張就緒進程列表,當進程用完它的時間片後,它被移到隊列的末尾。

四、核心代碼

//先進先出算法
void FIFO() {
	int i,j;
//輸出FIFO算法
	cout<<"FIFO算法:"<<endl;
	cout<<"進程名"<<setw(10)<<"等待時間"<<endl;
	for ( i=0; i<quantity; i++ ) {
		cout<<pcbs[i].name<<setw(10)<<pcbs[i].wait_time<<endl;

		for ( j=i+1; j<quantity; j++ ) {
			pcbs[j].wait_time+=pcbs[i].time;
		}
	}
	cout<<endl;
}
// 非搶佔式短作業算法
void nsjf(){
int queue[MAXPCB];// 輸出時的順序
int passed_time=0;// 記錄 已經過去的時候 便於計算等待時間
int i,j;
int min;//最小數座標
for(i=0;i<quantity;i++)
{
	// 第一個進程 直接進入隊列
if(i==0)
{
queue[i]=0;
pcbs[i].finished=1;
pcbs[i].wait_time+=passed_time;
passed_time+=pcbs[i].time;
}
// 尋找除finish之外 所需時間最少的進程
else
{
	for(j=0;j<quantity;j++)
	{
	if(pcbs[j].finished==0)
	{
	min=j;
	break;
	}
	}
	for(j=0;j<quantity;j++)
	{
	if(pcbs[j].finished==0&&pcbs[min].time>pcbs[j].time)
	{
	 min=j;
	}
	}
	queue[i]=min;
pcbs[min].finished=1;
pcbs[min].wait_time+=passed_time;
passed_time+=pcbs[min].time;
}
}
//輸出nsjf調度
	cout<<"nsjf算法(非搶佔):"<<endl;
	cout<<"進程名"<<setw(10)<<"等待時間"<<endl;
	for ( i=0; i<quantity; i++ ) {
		cout<<pcbs[queue[i]].name<<setw(10)<<pcbs[queue[i]].wait_time<<endl;
	}
	cout<<endl;
}
//時間片輪轉調度算法
void timer() {
	int i,j,number,flag=1;
	int passed_time=0;
	int max_time=0;
	int round=0;
	int queue[1000];
	int total=0;

	while ( flag==1 ) {
		flag=0;
		number=0;
		for ( i=0; i<quantity; i++ ) {
			if ( pcbs[i].finished==0 ) {
				number++;
				j=i;
			}
		}
		if ( number==1 ) {
			queue[total]=j;
			total++;
			pcbs[j].finished=1;
		}
		if ( number>1 ) {
			for ( i=0; i<quantity; i++ ) {
				if ( pcbs[i].finished==0 ) {
					flag=1;
					queue[total]=i;
					total++;
					if ( pcbs[i].time<=block_time* ( round+1 ) ) {
						pcbs[i].finished=1;
					}
				}
			}
		}
		round++;
	}

	if ( queue[total-1]==queue[total-2] ) {
		total--;
	}

	cout<<"時間片輪轉算法(時間片爲2s):"<<endl;
	cout<<"處理進程順序爲:";
	for ( i=0; i<total; i++ ) {
		cout<<pcbs[queue[i]].name<<"--->>";
	}
	cout<<"over";
    cout<<endl;
	cout<<endl;  
}

五、結果截圖(部分)

在這裏插入圖片描述
在這裏插入圖片描述

雨聽

青苔入鏡 檐下風鈴 搖晃曾經 回憶 無從剪接
微信搜索【海轟Pro】
相互學習,共同進步!
海轟會不間斷更新源碼的 Thanks♪(・ω・)ノ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章