1. 程式人生 > >【作業系統】C語言模擬作業系統實現動態分割槽分配演算法

【作業系統】C語言模擬作業系統實現動態分割槽分配演算法

#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define N 10000
int n1;//空閒分割槽的個數
int n2;//作業區的個數
struct kongxian
{
	int start;  //起址
	int end;    //結束
	int length;  //長度
}kongxian[N];
struct zuoye
{
	int start;  //起址
	int end;   //結束
	int length;  //長度
}zuoye[N];
int cmp1(const void *a, const void *b)
{
	return (*(struct kongxian *)a).start - (*(struct kongxian *)b).start;
}
int cmp2(const void *a, const void *b)
{
	return (*(struct zuoye *)a).start - (*(struct zuoye *)b).start;
}
void init()
{
	n1 = 1;  //初始時只有一個空閒區
	n2 = 0;  //初始沒有作業
	kongxian[0].start = 0;
	kongxian[0].end = 511;
	kongxian[0].length = 512;
}
void print1() //列印空閒分割槽
{
	int i;
	for (i = 0; i<n1; i++)
		printf("空閒分割槽ID:%d 起止:%d 結束:%d 長度:%d\n", i, kongxian[i].start, kongxian[i].end, kongxian[i].length);
}
void print2() //列印作業分割槽
{
	int i;
	for (i = 0; i<n2; i++)
		printf("作業分割槽ID:%d 起止:%d 結束:%d 長度:%d\n", i, zuoye[i].start, zuoye[i].end, zuoye[i].length);
}
int main()
{
	int i, j, t, len, flag, id;
	int front, middle, behind;
	int t1, t2;
	init();
	print1();
	printf("輸入1裝入新作業,輸入0回收作業,輸入-1結束\n");
	while (scanf("%d", &t) != EOF)
	{
		if (t == 1)  //裝入新作業
		{
			printf("請輸入作業的佔用空間的長度 ");
			scanf("%d", &len);
			flag = 0;
			for (i = 0; i<n1; i++)
			{
				if (kongxian[i].length >= len)  //首次適應演算法
				{
					flag = 1;
					break;
				}
			}
			if (!flag)
			{
				printf("記憶體分配失敗\n");
			}
			else
			{
				//將該作業加入作業區裡
				zuoye[n2].start = kongxian[i].start;
				zuoye[n2].end = zuoye[n2].start + len;
				zuoye[n2].length = len;
				n2++;  //作業數加1
				if (kongxian[i].length == len) //該分割槽全部用於分配,刪除該空閒分割槽
				{
					for (j = i; j<n1 - 1; j++)
					{
						kongxian[j].start = kongxian[j + 1].start;
						kongxian[j].end = kongxian[j + 1].end;
						kongxian[j].length = kongxian[j + 1].length;
					}
					n1--;
				}
				else  //該空閒分割槽部分用於分配,剩餘的留在空閒分割槽中
				{
					kongxian[i].start += len;
					kongxian[i].length -= len;
				}
			}
		}
		else if (t == 0)
		{
			printf("輸入要回收的作業ID ");
			scanf("%d", &id);
			front = middle = behind = 0;
			for (i = 0; i<n1; i++)
			{
				if (kongxian[i].start>zuoye[id].end)
					break;
				if (kongxian[i].end == zuoye[id].start)  //待回收的作業上面有空閒分割槽
				{
					front = 1;
					t1 = i;
				}
				if (kongxian[i].start == zuoye[id].end)  //待回收的作業下面有空閒分割槽
				{
					behind = 1;
					t2 = i;
				}
			}
			if (!front&&!behind)  //待回收的作業上下均沒有空閒分割槽
			{
				kongxian[n1].start = zuoye[id].start;
				kongxian[n1].end = zuoye[id].end;
				kongxian[n1].length = zuoye[id].length;
				n1++;  //空閒分割槽增加一個
				qsort(kongxian, n1, sizeof(struct kongxian), cmp1); //插入空閒分割槽後排序
				for (j = id; j<n2 - 1; j++)  //在作業分割槽中刪除該作業
				{
					zuoye[j].start = zuoye[j + 1].start;
					zuoye[j].end = zuoye[j + 1].end;
					zuoye[j].length = zuoye[j + 1].length;
				}
				n2--;
			}
			if (front &&behind)  //待回收的作業上下均有空閒分割槽
				middle = 1;
			if (front&&!middle)  //合併待回收的作業和上面的空閒分割槽
			{
				kongxian[t1].end += zuoye[id].length;
				kongxian[t1].length += zuoye[id].length;
				for (j = id; j<n2 - 1; j++)  //在作業分割槽中刪除該作業
				{
					zuoye[j].start = zuoye[j + 1].start;
					zuoye[j].end = zuoye[j + 1].end;
					zuoye[j].length = zuoye[j + 1].length;
				}
				n2--;
			}
			if (middle)  //合併待回收的作業和上下的空閒分割槽
			{
				kongxian[t1].end = kongxian[t2].end;
				kongxian[t1].length += (zuoye[id].length + kongxian[t2].length);
				//刪除空閒分割槽t2
				for (j = t2; j<n1 - 1; j++)
				{
					kongxian[j].start = kongxian[j + 1].start;
					kongxian[j].end = kongxian[j + 1].end;
					kongxian[j].length = kongxian[j + 1].length;
				}
				n1--;
				for (j = id; j<n2 - 1; j++)  //在作業分割槽中刪除該作業
				{
					zuoye[j].start = zuoye[j + 1].start;
					zuoye[j].end = zuoye[j + 1].end;
					zuoye[j].length = zuoye[j + 1].length;
				}
				n2--;
			}
			if (behind &&!middle) //合併待回收的作業和下面的分割槽
			{
				kongxian[t2].start -= zuoye[id].length;
				kongxian[t2].length += zuoye[id].length;
				for (j = id; j<n2 - 1; j++)  //在作業分割槽中刪除該作業
				{
					zuoye[j].start = zuoye[j + 1].start;
					zuoye[j].end = zuoye[j + 1].end;
					zuoye[j].length = zuoye[j + 1].length;
				}
				n2--;
			}
		}
		else
		{
			printf("操作結束\n");
			break;
		}
		print1();
		print2();
	}
	return 0;
}

相關推薦

作業系統C語言模擬作業系統實現磁碟排程演算法——電梯排程演算法

#include<stdio.h> #include<stdlib.h> #include<time.h> int *Init(int arr[]) { int

作業系統C語言模擬作業系統實現動態分割槽分配演算法

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #defi

6C++進階系列(動態記憶體分配

問題:之前在寫程式的時候計劃好我們需要哪些資料,都定義好,但是有些時候我們並不知道我要處理的程式規模有多大,也不知道陣列開多大合適,是儘量大?分配了太大空間可能會造成記憶體的浪費。只有在程式真正執行起來才會知道這次執行要處理的資料規模有多大——那就有人想,能不能用變數來確定陣

C語言鄰接表的實現

原文連結:C語言鄰接表的實現 這篇博文的程式碼寫的很好,我就直接合並在一起貼出來了,方便自己使用,至於文章內容有需要可以看上述原文   #define OK 1 #define ERROR 0 #define MVNum 100 #include<stdio.h> #in

LinuxC語言實現資料夾拷貝

在《【Linux】利用C語言檔案流複製單一檔案》(點選開啟連結)講述瞭如何用C語言拷貝檔案,但是這隻能拷貝單一檔案。如果你要用LinuxC拷貝整個資料夾,同樣要像《【Java】利用檔案輸入輸出流完成把一個資料夾內的所有檔案拷貝的另一的資料夾的操作》(點選開啟連結)一樣,先用

C語言之變量存儲類型

art 技術分享 .net ont alt enter fill img 分享 【精】C語言之變量存儲類型

C語言文件操作詳解

pri void rfi 識別 archive format 隨機 stat 文本文 轉自:http://www.cnblogs.com/likebeta/archive/2012/06/16/2551780.html C語言中沒有輸入輸出語句,所有的輸入輸出功能都用

C語言 printf格式控制符 完全解析

china int 數字 大於 轉換 OS 組成 字符數 無符號 printf的格式控制的完整格式:% - 0 m.n l或h 格式字符下面對組成格式說明的各項加以說明:①%:表示格式說明的起始符號,不可缺少。②-:

STLHDU2024C語言合法標識符水題

AI info targe == () 簡潔 技術分享 type #define 鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2024 既然要求了全體同學都要刷完杭電100題,那我還是以身作則,也都給刷完吧~~~ 這些水題真的是

複習c語言幾道簡單程式設計題

最近在複習c語言的一些知識點,以下是整理的幾道比較重要的程式設計題: 1.列印100-200之間的素數 為了統計素數的個數,可設定一個計數器count; 方法1: #include<stdio.h> int main() { int i = 0; int count =

函式C語言(三)

函式是一組一起執行一個任務的語句。每個 C 程式都至少有一個函式,即主函式 main() ,所有簡單的程式都可以定義其他額外的函式。  定義函式 return_type function_name( parameter list ) { body of the

良心C語言零基礎學習,C語言初學者入門基礎知識講解

C++ 其實是一種中級語言,它是 Bjarne Stroustrup 於 1979 年和以往的積累在貝爾實驗室開始設計開發的一種計算機語言。C++ 進一步擴充和完善了 C 語言,不僅是一種面向物件的程式設計語言,還要提到的C++ 可運行於多種平臺上,比如Windows還有

分類 - C語言再學習

專欄達人 授予成功建立個人部落格專欄

OpenJudgec語言_A*B問題

描述 輸入兩個正整數A和B,求A*B。 輸入一行,包含兩個正整數A和B,中間用單個空格隔開。1 <= A,B <= 50000。 輸出一個整數,即A*B的值。 樣例輸入 3 4 樣例輸出 12 提示注意乘積的範圍和資料型別的選擇

筆記c語言學習筆記part1

最近學習oc,把之前學得很水的c語言重新過了一遍,打算整理一些基礎的東西,方便以後回顧 1.c程式編譯的過程 /* 1.預處理(Preprocessing):對源程式進行“替代”工作,生成一個沒有巨集定義、沒有條件編譯指令、沒有特殊

作業系統總結動態分割槽分配演算法

基於順序搜尋的動態分割槽分配演算法 首次適應演算法(FF) 空閒分割槽排成一個鏈,從鏈首開始查詢,知道找到一個大小能滿足的要求的分割槽為止。 迴圈首次適應NF 不是每次都是從鏈首查詢,而是從上次找到的空閒分割槽開始查詢,找到下一個能滿足要求的空閒

NetSNMP## C語言傳送SNMP Trap訊息

專案需求系統利用SNMP Trap訊息上報狀態給NMS,考慮使用net-snmp提供的SNMP庫函式實現該功能,且需要根據不同埠使用不同的session。 1)標頭檔案 為了使用 netsnmp 的 API,必須 include 以下這些標頭檔案: #include &

續集 C語言圖形和函式影象的繪製其他部分 第二章

           第二章【續集】 圖形和函式影象的繪製       圓形和拋物線的繪製 繪製函式影象的第二種方法 同一座標系下繪製多個函式影象(交叉影象) 4、圓形和拋物線的繪製    有了

20150127 ARM C語言+位域聯合體

結構體位域struct Fpga{unsigned int a:1;unsigned int b:1;unsigned int c:1;}; 聯合體:多個成員共用一塊儲存空間(佔最大資料型別空間)同一時刻只能用一個成員union FPH{unsigned int p;unsigned char ch;};un

轉載c語言結構體指標初始化

轉載來自:http://www.cnblogs.com/losesea/archive/2012/11/15/2772526.html   今天來討論一下C中的記憶體管理。 記得上週在飯桌上和同事討論C語言的崛起時,講到了記憶體管理方面 我說所有指標使用前都必須初始化