天天看點

java實作首次适應算法 作業系統實驗

因為作業系統實驗需要,是以就花了點時間做了個首次适應算法的java實作

任務要求

程式設計實作首次适應算法。已知作業名、作業大小、作業送出時間、記憶體容量、碎片大小,要求使用分區大小不等的記憶體分區方法和首次适應配置設定算法給每次到來的作業配置設定記憶體。輸出記憶體分區情況和配置設定情況。

首次适應算法(first fit):

空閑分區按位址遞增的次序排列。在配置設定記憶體時,從鍊首開始順序查找,直至找到一個大小能滿足要求的空閑分區為止;如果分區大小-作業大小<=碎片,則直接配置設定,否則,按照作業的大小,從該分區中劃出一塊記憶體空間配置設定給請求者,餘下的空閑分區仍留在空閑鍊中。若從鍊首直至鍊尾都不能找到一個能滿足要求的分區,則此次記憶體配置設定失敗,傳回。

釋放作業的代碼

private void release(Process p) {
		Node head=header;
		int start=p.start;
		int end=p.start+p.size;
		//選擇處理
		//處理作業前有空閑區
		while(head!=null) {
			//作業前有空閑區
			//兩種情況
			if(getBack(head)==start) {
				//兩個空閑分區,夾着
				if(head.next!=null && head.next.start==end) {//兩個空閑區間以及作業,三個合并
					head.size+=head.next.size+p.size;
					head.next=head.next.next;
				}else {//回收區後沒有了,或者是另一個作業
					head.size+=p.size;
				}
				return ;
			}else if(head.start==end){//處理作業前沒有空閑區,作業後有空閑區
				head.start-=p.size;
				head.size+=p.size;
				return;
			} 
			head=head.next;
		}
		//處理作業夾在兩個作業中間
		insertNode(p);
	}
           

作業加入的算法

public boolean insertAfter(Process p) {
		Node head=header;
		int ii=0;
		int size=p.size;
		while(head.size<size) {
			if(head.next==null) {
				System.out.println("記憶體不足配置設定失敗!!");
				return false;
			}
			head=head.next;
			ii++;
		}
		//找到對應的空閑Node
		p.start=head.start+head.size-p.size;
		//判斷碎片大小
		if(head.size-size<=lessSize) {
			p.size=head.size;
			deleteNode(head);
			return true;
		}
		if(ii==0) {
			header.size-=size;
			return true;
		}
		head.size-=size;
		return true;
	}
           

項目已上傳到git,需要的可以下載下傳

https://github.com/coder-oyz/data/tree/test6