操作系統(tǒng)課程設(shè)計 動態(tài)分區(qū)分配存儲管理
《操作系統(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
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ù)時間: "<
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 <
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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 川渝旅游日記成都重慶城市介紹推薦景點美食推薦
- XX國有企業(yè)黨委書記個人述責(zé)述廉報告及2025年重點工作計劃
- 世界濕地日濕地的含義及價值
- 20XX年春節(jié)節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)人到場心到崗
- 大唐女子圖鑒唐朝服飾之美器物之美繪畫之美生活之美
- 節(jié)后開工第一課輕松掌握各要點節(jié)后常見的八大危險
- 廈門城市旅游介紹廈門景點介紹廈門美食展示
- 節(jié)后開工第一課復(fù)工復(fù)產(chǎn)十注意節(jié)后復(fù)工十檢查
- 傳統(tǒng)文化百善孝為先孝道培訓(xùn)
- 深圳城市旅游介紹景點推薦美食探索
- 節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)勿忘安全本心人人講安全個個會應(yīng)急
- 預(yù)防性維修管理
- 常見閥門類型及特點
- 設(shè)備預(yù)防性維修
- 2.乳化液泵工理論考試試題含答案