操作系統(tǒng)課程設(shè)計 動態(tài)分區(qū)分配存儲管理

上傳人:奇異 文檔編號:28385489 上傳時間:2021-08-27 格式:DOC 頁數(shù):43 大?。?05.03KB
收藏 版權(quán)申訴 舉報 下載
操作系統(tǒng)課程設(shè)計 動態(tài)分區(qū)分配存儲管理_第1頁
第1頁 / 共43頁
操作系統(tǒng)課程設(shè)計 動態(tài)分區(qū)分配存儲管理_第2頁
第2頁 / 共43頁
操作系統(tǒng)課程設(shè)計 動態(tài)分區(qū)分配存儲管理_第3頁
第3頁 / 共43頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《操作系統(tǒng)課程設(shè)計 動態(tài)分區(qū)分配存儲管理》由會員分享,可在線閱讀,更多相關(guān)《操作系統(tǒng)課程設(shè)計 動態(tài)分區(qū)分配存儲管理(43頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、操作系統(tǒng)課程設(shè)計 合肥工業(yè)大學(xué)宣城校區(qū) 《操作系統(tǒng)》 課程設(shè)計報告 課程設(shè)計題目:動態(tài)分區(qū)分配存儲管理 學(xué)生姓名: 方晨宇 學(xué)號: 2014217143 專業(yè)班級: 物聯(lián)

2、網(wǎng)1班 指導(dǎo)老師: 田衛(wèi)東 院系名稱: 信息工程系 2016年12月23日 一、課程設(shè)計概述 4 1.1設(shè)計任務(wù) 4 1.2設(shè)計要求 4 1.3設(shè)計目的 4 二、原理及算法描述 4 2.1動態(tài)分區(qū)分配算法原理 4 2.1.1 首次適應(yīng)算法 4 2.1.2 循環(huán)首次適應(yīng)算法 5 2.1.3 最佳適應(yīng)算法 5 2.1.4 最壞適應(yīng)算法 5 2.1.5 緊湊算法

3、 6 三、開發(fā)環(huán)境 6 四、重要算法和設(shè)計思路描述 6 4.1設(shè)計 首次適應(yīng)算法 6 4.2設(shè)計 循環(huán)首次適應(yīng)算法 6 4.3設(shè)計 最佳適應(yīng)算法 6 4.4設(shè)計 最壞適應(yīng)算法 7 4.5設(shè)計分區(qū)回收算法 7 4.6設(shè)計緊湊算法 7 五、程序?qū)崿F(xiàn)-數(shù)據(jù)結(jié)構(gòu) 7 5.1空閑分區(qū)的數(shù)據(jù)結(jié)構(gòu)----循環(huán)雙向鏈表 7 5.2進程的數(shù)據(jù)結(jié)構(gòu)---單向循環(huán)隊列 8 六、程序?qū)崿F(xiàn)---程序清單 9 七、總結(jié) 41 一、課程設(shè)計概述 1.1設(shè)計任務(wù) 動態(tài)分區(qū)分配存儲管理 1.2設(shè)計要求 1.建立描述內(nèi)存分配狀況的數(shù)據(jù)結(jié)構(gòu); 2.建立描述進程的數(shù)據(jù)

4、結(jié)構(gòu); 3.使用兩種方式產(chǎn)生進程:a 自動產(chǎn)生 b手動輸入; 4.在屏幕上顯示內(nèi)存的分配狀況,每個進程的執(zhí)行狀況; 5.建立分區(qū)分配和回收算法,支持緊湊算法; 6.時間的流逝可用下面幾種方法模擬:a按鍵盤,每按一次可認(rèn)為過一個時間單位;b響應(yīng)WM-TIMER; 7.將一批進程的執(zhí)行情況存入磁盤文件,以后可以讀出并重放; 8.支持算法:首次適應(yīng)算法,循環(huán)首次適應(yīng)算法,最佳適應(yīng)算法,最壞適應(yīng)算法; 1.3設(shè)計目的 旨在讓我們更好的了解動態(tài)分區(qū)管理方面的知識。 二、原理及算法描述 2.1動態(tài)分區(qū)分配算法原理 2.1.1 首次適應(yīng)算法

5、 *算法概述:分配內(nèi)存時,從鏈?zhǔn)组_始順序查找,找到滿足的空閑分區(qū)則劃出空間分配,余下的空閑空間仍保留在空閑鏈表中 *實現(xiàn)算法:分配時從空閑鏈表的第一個空閑節(jié)點查找,若找到可以放下當(dāng)前的進程的空閑節(jié)點,則分配 2.1.2 循環(huán)首次適應(yīng)算法 *算法描述:由首次適應(yīng)算法演變,只是每次分配改為由上一次找到的空閑分區(qū)開始查找合適空閑節(jié)點 *實現(xiàn)算法:在首次適應(yīng)算法的基礎(chǔ)上,將指針置為static,不必每次從頭查找空閑分區(qū) 2.1.3 最佳適應(yīng)算法 *算法描述:每次為作業(yè)分配內(nèi)存時,總是把能滿足要求、又是最小的空閑分區(qū)分配給作業(yè) *實現(xiàn)算法:每次為進程分配內(nèi)存時,查找能放

6、下該進程的而且是最小的空閑分區(qū),避免了每次將空閑分區(qū)從小到大排序。 2.1.4 最壞適應(yīng)算法 *算法描述:每次為作業(yè)分配內(nèi)存時,總是挑選一個最大的空閑分區(qū)分割給作業(yè)使用 *算法實現(xiàn):算法與最佳適應(yīng)算法幾乎相同,每次查找最大空閑分區(qū)節(jié)點,將其分配給進程。 回收分區(qū): 當(dāng)進程運行完畢釋放內(nèi)存時,系統(tǒng)根據(jù)回收區(qū)的首址,從空閑區(qū)鏈(表)中找到相應(yīng)的插入點,此時可能出現(xiàn)以下四種情況之一; 1)回收區(qū)與插入點的前一個空閑分區(qū)F1相鄰接,此時應(yīng)將回收區(qū)與插入點的前一分區(qū)合并,不必為回收區(qū)分配新表項,而只需修改其前一分區(qū)F1的大小.

7、 2)回收分區(qū)與插入點的后一空閑分區(qū)F2相鄰接,此時也可將兩分區(qū)合并,形成新的空閑分區(qū),但用回收區(qū)的首址作為新空閑區(qū)的首址,大小為兩者之和. 3)回收區(qū)同時與插入點的前,后兩個分區(qū)鄰接,此時將三個分區(qū)合并,使用F1的表項和F1的首址,取消F2的表項,大小為三者之和. 4)回收區(qū)既不與F1相鄰接,又不與F2鄰接.這時應(yīng)為回收區(qū)單獨建立一新表項,填寫回收區(qū)的首址和大小,并根據(jù)其首址插入到空閑鏈中的適當(dāng)位置. 2.1.5 緊湊算法 通過修改每個進程在內(nèi)存中的標(biāo)志位status,虛擬將進程重新分配到內(nèi)存中,此時的分配滿足緊湊,

8、避免移動所有在內(nèi)存中的進程 三、開發(fā)環(huán)境 此程序是本小組利用c++語言在VS2013中實現(xiàn)的 四、重要算法和設(shè)計思路描述 4.1設(shè)計 首次適應(yīng)算法 每次為進程分配內(nèi)存時,都首先從雙向空閑鏈表的第一個空閑節(jié)點開始查找,如果該空閑分區(qū)只比進程大一點點,則把該空閑分區(qū)全部分配給該進程,之后刪除該空閑節(jié)點;如果空閑分區(qū)比進程大很多,則按需分配,修改該空閑區(qū)的起始位置和大??;利用循環(huán)依次查找各個節(jié)點,為進程分配內(nèi)存。當(dāng)指針指向頭結(jié)點時,說明空閑鏈表已經(jīng)查找完畢,沒有合適的空閑分區(qū)為該進程分配,return FALSE。 4.2設(shè)計 循環(huán)首次適應(yīng)算法 與首次適應(yīng)算法類似,只不過每

9、次為進程分配內(nèi)存時,不再指向空閑鏈表的頭部,設(shè)置指向頭部的指針是靜態(tài)static的,運行期間不再改變,則每次分配時從上一次分配的空閑分區(qū)的下一個開始。 4.3設(shè)計 最佳適應(yīng)算法 根據(jù)最佳適應(yīng)算法的原理,每次從最小的而且能放下該進程的空閑分區(qū)開始分配,于是設(shè)計算法,每次查找空閑鏈表中最小的而且能放下該進程的空閑分區(qū),避免了將空閑分區(qū)鏈表每次從小到大排序,提高效率。 4.4設(shè)計 最壞適應(yīng)算法 與最佳適應(yīng)算法類似,每次查找空閑鏈表中最大的空閑分區(qū)進行分配,避免了將空閑分區(qū)鏈表每次從大到小排序,提高效率。 4.5設(shè)計分區(qū)回收算法 設(shè)計一個函數(shù),時刻檢查進程的運行狀態(tài),當(dāng)進程已經(jīng)

10、運行完畢,則回收該進程所占用的內(nèi)存分區(qū)。對內(nèi)存分區(qū)狀態(tài)進行查找,若回收區(qū)與插入點的前一個空閑分區(qū)F1相鄰接,此時應(yīng)將回收區(qū)與插入點的前一分區(qū)合并,不必為回收區(qū)分配新表項,而只需修改其前一分區(qū)F1的大小.若回收分區(qū)與插入點的后一空閑分區(qū)F2相鄰接,此時也可將兩分區(qū)合并,形成新的空閑分區(qū),但用回收區(qū)的首址作為新空閑區(qū)的首址,大小為兩者之和.若回收區(qū)同時與插入點的前,后兩個分區(qū)鄰接,此時將三個分區(qū)合并,使用F1的表項和F1的首址,取消F2的表項,大小為三者之和.若回收區(qū)既不與F1相鄰接,又不與F2鄰接.這時應(yīng)為回收區(qū)單獨建立一新表項,填寫回收區(qū)的首址和大小,并根據(jù)其首址插入到空閑鏈中的適當(dāng)位置。

11、4.6設(shè)計緊湊算法 通過修改每個進程在內(nèi)存中的標(biāo)志位status,虛擬將進程重新分配到內(nèi)存中,此時的分配滿足緊湊,避免移動所有在內(nèi)存中的進程 五、程序?qū)崿F(xiàn)-數(shù)據(jù)結(jié)構(gòu) 5.1空閑分區(qū)的數(shù)據(jù)結(jié)構(gòu)----循環(huán)雙向鏈表 typedef struct fData { unsigned int size; unsigned int StartPosition; }fdata; FreeList::FreeList() { //建立頭結(jié)點 head = new fnode; head->prior = head; head->next = head;

12、 //在建立第一個結(jié)點并指向整個內(nèi)存空間 fnode *p, *s; p = head->next; s = new fnode; s->data.size = MEMORY_MAX; s->data.StartPosition = 0; s->next = p; s->prior = p->prior; p->prior->next = s; p->prior = s; } 5.2進程的數(shù)據(jù)結(jié)構(gòu)---單向循環(huán)隊列 typedef struct pData { unsigned int ID; unsigned int size;

13、 //所占內(nèi)存空間 unsigned int execTime; //要求服務(wù)時間 unsigned int usedTime=0; //已經(jīng)運行的時間 bool status = 0; //0沒有調(diào)入內(nèi)存,1調(diào)入內(nèi)存 unsigned int StartPosition; //調(diào)入內(nèi)存中的始址 unsigned int memSize = 0; //在內(nèi)存中實際占用的內(nèi)存空間 }pdata; ProcessQueue::ProcessQueue() { front = new pnode

14、; //產(chǎn)生頭結(jié)點,指針為front; rear = front; front->next = NULL; } 六、程序?qū)崿F(xiàn)---程序清單 #include #include #include #include #include "ProcessQueue.h" #include"FreeList.h" using namespace std; //全局變量 ProcessQueue processqueue; FreeList freelist; v

15、oid CALLBACK TimerProc(HWND hwnd, UINT Msg, UINT idEvent, DWORD dwTime); void CALLBACK TimerProcBF(HWND hwnd, UINT Msg, UINT idEvent, DWORD dwTime); int main(int argc, char* argv[]) { out.open("out.txt", ios::out | ios::trunc); //打開日志文件 out.close(); //關(guān)閉日志文件 FreeList freelist1; //中

16、間文件 int nChoice = -1; //操作選擇 do { //顯示主菜單 cout << "*******動態(tài)分區(qū)測試程序********" << endl; cout << "* 0-退出 *" << endl; cout << "* 1-自動產(chǎn)生進程 *" << endl; cout << "* 2-進行一次分配 *" << endl; cout << "* 3-首次適應(yīng)算法 *" << endl; co

17、ut << "*-----------------------------*" << endl; cout << "* 4-最佳適應(yīng)算法 *" << endl; cout << "* 5-手動輸入進程 *" << endl; cout << "* 6-鍵盤模擬時間 *" << endl; cout << "* 7-緊湊算法 *" << endl; cout << "* 8- *" << endl; cout << "***

18、*********************** ****" << endl; cout << "請輸入數(shù)字選擇操作:"; cin >> nChoice; switch (nChoice) { case 0: //退出 cout << "當(dāng)前選擇操作:退出。" << endl; cout << "<-- 程序退出 -->" << endl; //選擇退出 break; case 1: system("cls"); //清除屏幕 int sum; cout << "請輸入生成變量的個數(shù): ";

19、 cin >> sum; processqueue.autoCreatProcess(sum); processqueue.showProcess(); break; case 2: system("cls"); //清除屏幕 processqueue.assignMemory(freelist.getHead()); processqueue.showProcess(); break; case 3: system("cls"); //清除屏幕 //UINT timerId = 1;

20、 MSG msg; // int n = GetMessage(&msg, NULL, NULL, NULL); //Wait for message, block the thread when getting no message SetTimer(NULL, 1, 1000, TimerProc); //每間隔1000毫秒定時器發(fā)送 一條信息,并執(zhí)行回調(diào)函數(shù)中的代碼 int nTemp; while ((nTemp = GetMessage(&msg, NULL, NULL, NULL)) && (-1 != nTemp) && (0 !

21、= nTemp)) { if (WM_TIMER == msg.message) { cout << "I got a message" << endl; TranslateMessage(&msg); DispatchMessage(&msg); } } break; case 4: system("cls"); //清除屏幕 SetTimer(NULL, 2, 1000, TimerProcBF); //每間隔1000毫秒定時器發(fā)送 一條信息,并執(zhí)行回調(diào)函數(shù)中的代碼

22、 while ((nTemp = GetMessage(&msg, NULL, NULL, NULL)) && (-1 != nTemp) && (0 != nTemp)) { if (WM_TIMER == msg.message) { cout << "I got a message" << endl; TranslateMessage(&msg); DispatchMessage(&msg); } } break; case 5: system("cls"); //清除屏

23、幕 unsigned int size, execTime; cout << "進程大小和請求服務(wù)時間: "<> size>>execTime; processqueue.manualCreatProcess(size,execTime); processqueue.showProcess(); break; case 6: system("cls"); //清除屏幕 char a[5]; cin.getline(a,10); while (a[0]!=0) {

24、 processqueue.assignMemory(freelist.getHead()); processqueue.timePassed(freelist.getHead()); processqueue.showProcess(); freelist.showFreeList(); out.open("out.txt", ios::out | ios::app); //打開日志文件 cout << "---------------------------------------------------" << endl;

25、 out << "---------------------------------------------------" << endl; out.close(); //關(guān)閉日志文件 cin.getline(a, 10); } break; case 7: system("cls"); //清除屏幕 pact(); freelist = freelist1; //可能有內(nèi)存泄露 processqueue.assignMemory(freelist.getHead()); processque

26、ue.showProcess(); freelist.showFreeList(); cout << "---------------------------------------------------" << endl; break; default: cout << "功能選擇錯誤,請在0到9之間選擇,==>" << endl; break; } } while (nChoice != 0); return 0; } void CALLBACK TimerProc(HWND hwnd, UINT Msg

27、, UINT idEvent, DWORD dwTime) { processqueue.assignMemory(freelist.getHead()); processqueue.timePassed(freelist.getHead()); processqueue.showProcess(); freelist.showFreeList(); out.open("out.txt", ios::out | ios::app); //打開日志文件 cout << "-----------------------------------------------

28、----" << endl; out << "---------------------------------------------------" << endl; out.close(); //關(guān)閉日志文件 } void CALLBACK TimerProcBF(HWND hwnd, UINT Msg, UINT idEvent, DWORD dwTime) { processqueue.assignMemory(freelist.getHead(),bf); processqueue.timePassed(freelist.getHead()); pr

29、ocessqueue.showProcess(); freelist.showFreeList(); out.open("out.txt", ios::out | ios::app); //打開日志文件 cout << "---------------------------------------------------" << endl; out << "---------------------------------------------------" << endl; out.close(); //關(guān)閉日志文件 } #include "FreeLi

30、st.h" FreeList::FreeList() { //建立頭結(jié)點 head = new fnode; head->prior = head; head->next = head; //在建立第一個結(jié)點并指向整個內(nèi)存空間 fnode *p, *s; p = head->next; s = new fnode; s->data.size = MEMORY_MAX; s->data.StartPosition = 0; s->next = p; s->prior = p->prior; p->prior->next

31、= s; p->prior = s; } FreeList::~FreeList() { } //在指定位置添加結(jié)點 bool FreeList::listInsert(fnode * freenode,fnode * position) { if (position) { freenode->next = position; freenode->prior = position->prior; position->prior->next = freenode; position->prior = freenode; retu

32、rn true; } else return false; } //在指定位置刪除結(jié)點 bool FreeList::listDelete(fnode * position) { if (position && (position != head)) //該節(jié)點必須不為空而且還不是指向頭結(jié)點 { position->next->prior = position->prior; position->prior->next = position->next; delete position; return true; } el

33、se return false; } bool FreeList::FF(PelementType &process) { fnode * freenode; freenode = head->next; while (freenode != head) { //先刪除找到的第一個合適的結(jié)點 if (freenode->data.size >= process.size) { //如果小于最小分割區(qū)間則整體分割 if ((freenode->data.size - process.size) < uSIZE) {

34、 process.status = 1; //狀態(tài)置1 process.memSize = freenode->data.size; process.StartPosition = freenode->data.StartPosition; listDelete(freenode); //刪除該節(jié)點 return true; } else //否則按需分割,其余部分留下來 { process.status = 1; //狀態(tài)置1 process.memSiz

35、e = process.size; //確定實際占用位置 process.StartPosition = freenode->data.StartPosition; //確定所占起始位置 freenode->data.size -= process.size; //新的size freenode->data.StartPosition = process.StartPosition + process.memSize; //始址加大小 return true; } } free

36、node = freenode->next; } return false; } bool FreeList::NF(PelementType &process) { static fnode * freenode = head->next; while (freenode != head) { //先刪除找到的第一個合適的結(jié)點 if (freenode->data.size >= process.size) { //如果小于最小分割區(qū)間則整體分割 if ((freenode->data.size - process.size)

37、< uSIZE) { process.status = 1; //狀態(tài)置1 process.memSize = freenode->data.size; process.StartPosition = freenode->data.StartPosition; listDelete(freenode); //刪除該節(jié)點 return true; } else //否則按需分割,其余部分留下來 { process.status = 1; //狀態(tài)置1

38、 process.memSize = process.size; //確定實際占用位置 process.StartPosition = freenode->data.StartPosition; //確定所占起始位置 freenode->data.size -= process.size; //新的size freenode->data.StartPosition = process.StartPosition + process.memSize; //始址加大小 return true;

39、 } } freenode = freenode->next; } return false; } bool FreeList::BF(PelementType &process) { fnode * minNode=NULL; fnode *p; p = head->next; while (p != head) { if (!minNode) //如果還沒有找到合適的值 { if (p->data.size > process.size) //找到第一個可以裝下進程的結(jié)點 minNode = p;

40、 } else //如果有一個值已經(jīng)可以裝下該進程,接下來需要找到最小的那個點 { if ((p->data.size >= process.size) && (p->data.size < minNode->data.size)) //找到了更小可以裝下的進程,則替換掉 { minNode = p; } } p = p->next; } if (!minNode) //所有的點都比進程小,則返回false return false; //將最小找到的可以裝下的結(jié)點分配給進程 //如果

41、小于最小分割區(qū)間則整體分割 if ((minNode->data.size - process.size) < uSIZE) { process.status = 1; //狀態(tài)置1 process.memSize = minNode->data.size; process.StartPosition = minNode->data.StartPosition; listDelete(minNode); //刪除該節(jié)點 } else //否則按需分割,其余部分留下來 { process.status = 1;

42、 //狀態(tài)置1 process.memSize = process.size; //確定實際占用位置 process.StartPosition = minNode->data.StartPosition; //確定所占起始位置 minNode->data.size -= process.size; //新的size minNode->data.StartPosition = process.StartPosition + process.memSize; //始址加大小 } return t

43、rue; } bool FreeList::WF(PelementType &process) { fnode * maxNode = NULL; fnode *p; p = head->next; while (p != head) { if (!maxNode) //如果還沒有找到合適的值 { if (p->data.size > process.size) //找到第一個可以裝下進程的結(jié)點 maxNode = p; } else //如果有一個值已經(jīng)可以裝下該進程,接下來需要找到最小的那個點 {

44、 if (p->data.size > maxNode->data.size) //找到了更小可以裝下的進程,則替換掉 { maxNode = p; } } p = p->next; } if (!maxNode) //所有的點都比進程小,則返回false return false; //將最小找到的可以裝下的結(jié)點分配給進程 //如果小于最小分割區(qū)間則整體分割 if ((maxNode->data.size - process.size) < uSIZE) { process.status =

45、 1; //狀態(tài)置1 process.memSize = maxNode->data.size; process.StartPosition = maxNode->data.StartPosition; listDelete(maxNode); //刪除該節(jié)點 } else //否則按需分割,其余部分留下來 { process.status = 1; //狀態(tài)置1 process.memSize = process.size; //確定實際占用位置 process.StartPosition

46、= maxNode->data.StartPosition; //確定所占起始位置 maxNode->data.size -= process.size; //新的size maxNode->data.StartPosition = process.StartPosition + process.memSize; //始址加大小 } return true; } bool FreeList::memoryRecycle(pData process) { fnode * freenode; fnode

47、* inode; //需要添加的結(jié)點 freenode = head->next; //如果在鏈?zhǔn)? if (process.StartPosition < freenode->data.StartPosition) { if ((process.StartPosition + process.memSize) == freenode->data.StartPosition) //如果后面的空閑快與其鄰接 { freenode->data.StartPosition = process.StartPosition;

48、 //則將起始置為process的起始位置 freenode->data.size += process.memSize; return true; } else if ((process.StartPosition + process.memSize) < freenode->data.StartPosition) { //添加一個結(jié)點 inode = new fnode; inode->data.size = process.memSize; inode->data.StartPosition = process.

49、StartPosition; listInsert(inode, freenode); return true; } else return false; } while (freenode != head) { //如果在鏈尾 if (freenode == head) { if (process.StartPosition == (freenode->data.StartPosition + freenode->data.size)) //如果與前一個存儲塊相鄰 { freenode->data

50、.size += process.memSize; return true; } else if (process.StartPosition > (freenode->data.StartPosition + freenode->data.size)) { //添加一個結(jié)點 inode = new fnode; inode->data.size = process.memSize; inode->data.StartPosition = process.StartPosition; listInsert(inode,

51、freenode->next); return true; } else return false; } //如果在中間某處 if (process.StartPosition > freenode->data.StartPosition&&process.StartPosition < freenode->next->data.StartPosition) { if ((process.StartPosition == (freenode->data.StartPosition + freenode->data.size))

52、 && ((process.StartPosition + process.memSize) < freenode->next->data.StartPosition)) { //只與左相鄰 freenode->data.size += process.memSize; return true; } else if (((process.StartPosition + process.memSize) == freenode->next->data.StartPosition) && (process.StartPosition > (freeno

53、de->data.StartPosition + freenode->data.size))) { //只與右相鄰 freenode->next->data.StartPosition = process.StartPosition; freenode->next->data.size += process.memSize; return true; } else if (((process.StartPosition + process.memSize) == freenode->next->data.StartPosition) &&

54、 (process.StartPosition == (freenode->data.StartPosition + freenode->data.size))) { //既與左相鄰又與右相鄰 freenode->data.size = freenode->data.size + process.memSize + freenode->next->data.size; listDelete(freenode->next); //刪除后面的結(jié)點 return true; } else { //都不相鄰 inode

55、 = new fnode; inode->data.size = process.memSize; inode->data.StartPosition = process.StartPosition; listInsert(inode, freenode->next); return true; } } freenode = freenode->next; } return false; } void FreeList::showFreeList() { out.open("out.txt", ios::out

56、| ios::app); //打開日志文件 fnode * p; p = head->next; cout << "StartPosition size" << endl; out << "StartPosition size" << endl; while (p != head) { cout << p->data.StartPosition << \t << p->data.size << endl; out << p->data.StartPosition << \t << p->data.size << endl; p = p->next

57、; } out.close(); //關(guān)閉日志文件 } void FreeList::setHead(fNode * Head) { head = Head; } #include "ProcessQueue.h" ProcessQueue::ProcessQueue() { front = new pnode; //產(chǎn)生頭結(jié)點,指針為front; rear = front; front->next = NULL; } ProcessQueue::~ProcessQueue() { pnode *p, *u; p

58、 = front; while (p) { u = p; p = p->next; delete(u); } front = NULL; rear = NULL; } //判隊空 bool ProcessQueue::queueEmpty() { if (front == rear) return true; //隊空,返回true else return false; //隊不空 } //取隊頭元素 bool ProcessQueue::getFront(PelementType &x) { if (q

59、ueueEmpty()) return false; //隊空 else { x = front->next->data; //front指示的下一個單元才是隊頭元素 return true; } } //入隊(插入) void ProcessQueue::inQueue(PelementType x) { pnode* P = new pnode; //申請內(nèi)存,產(chǎn)生新節(jié)點 P->data = x; P->next = NULL; rear->next = P; rear = P; //尾指針指向新的節(jié)點(新隊尾) }

60、 //出隊(刪除)****************這里有些疑問???? void ProcessQueue::outQueue(pnode * &position) { pnode * u; u = position->next; position->next = u->next; delete u; } //自動產(chǎn)生進程 void ProcessQueue::autoCreatProcess(unsigned int sum) { //static unsigned int id = 0; srand((unsigned)time(NULL));

61、 //產(chǎn)生隨機數(shù)種子 pnode * process; //unsigned int ssize, sexecTime; //隨機大小和隨機服務(wù)時間 for (unsigned int i = 0; i < sum; i++) { process = new pnode; process->data.ID = (id++); process->data.size = (unsigned int)1024 + rand() % 1073741824; //大小的范圍在1k--1G之間 process->data.ex

62、ecTime = (unsigned int)5 + rand() % 30; //服務(wù)時間的范圍在5--35之間 //插入結(jié)點 process->next = NULL; rear->next = process; rear = process; } } //手工輸入進程 void ProcessQueue::manualCreatProcess(unsigned int size,unsigned int execTime) { pnode * process; process = new pnode; proces

63、s->data.ID = (id++); process->data.size = size; process->data.execTime = execTime; //插入隊尾 process->next = NULL; rear->next = process; rear = process; } //顯示內(nèi)存的分配狀況和執(zhí)行情況 void ProcessQueue::showProcess() { out.open("out.txt", ios::out|ios::app); //打開日志文件 pnode * process; i

64、f (queueEmpty()) cout << "隊列中無進程" << endl; else { process = front->next; cout << "ID size execTime usedTime status StartPosition memSize" << endl; out << "ID size execTime usedTime status StartPosition memSize" << endl; while (process != NULL) { cout <data.ID<<\t<

65、< process->data.size << \t << process->data.execTime << \t << process->data.usedTime << \t << process->data.status << \t; out << process->data.ID << \t << process->data.size << \t << process->data.execTime << \t << process->data.usedTime << \t << process->data.status << \t; if (process->data

66、.status) { cout << process->data.StartPosition << \t << process->data.memSize; out << process->data.StartPosition << \t << process->data.memSize; } cout << endl; out << endl; process = process->next; } } out.close(); } void ProcessQueue::timePassed(fNode * head) { FreeList freelist; freelist.setHead(head); pnode * process; //檢索結(jié)點的前一個結(jié)點 pnode * u; //當(dāng)前節(jié)點 if (queueEmpty()) return

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!