版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn) 成績姓名學(xué)號(hào)華中師范大學(xué)計(jì)算機(jī)科學(xué)系實(shí)驗(yàn)報(bào)告書實(shí)驗(yàn)題目:內(nèi)存管理、分配與回收課程名稱: 操作系統(tǒng)主講教師: 輔導(dǎo)教師: 課程編號(hào): 班 級(jí): 實(shí)驗(yàn)時(shí)間:一、實(shí)驗(yàn)?zāi)康模海?)掌握內(nèi)存分區(qū)管理的基本思想,理解內(nèi)存分配表。(2)深入理解可變分區(qū)的內(nèi)存分配策略,掌握首先適應(yīng)算法、最佳適應(yīng)算法和 最壞適應(yīng)算法。(3)掌握內(nèi)存碎片產(chǎn)生的途徑以及解決碎片的方法拼接技術(shù)。(4)實(shí)現(xiàn)分區(qū)的回收。針對(duì)內(nèi)存管理的相關(guān)活動(dòng),研究內(nèi)存空閑隊(duì)列的動(dòng)態(tài)組織與管理問題,以及 在此基礎(chǔ)上執(zhí)行的內(nèi)存分配與回收活動(dòng)。二、實(shí)驗(yàn)內(nèi)容:本實(shí)驗(yàn)將利用伙伴系統(tǒng)來組織內(nèi)存空閑塊隊(duì)列和已使用內(nèi)存塊隊(duì)列。 從初始 化快照、某一組作業(yè)申請(qǐng)內(nèi)存
2、塊前的快照、 分配成功后的快照等狀態(tài)出發(fā), 結(jié)合 內(nèi)存分配原語(算法)和內(nèi)存回收原語(算法)的實(shí)現(xiàn),結(jié)合實(shí)際內(nèi)存塊的動(dòng)態(tài) 分配與回收情況(某一快照) ,研究內(nèi)存空閑塊隊(duì)列的組織、變化及其隊(duì)列管理 方面的問題。具體內(nèi)容如下:(1)實(shí)現(xiàn)內(nèi)存分配算法和內(nèi)存回收算法。(2)以伙伴系統(tǒng)的組織方式管理內(nèi)存空閑隊(duì)列和已使用內(nèi)存塊隊(duì)列,具體的組 織策略應(yīng)分別考慮首次適應(yīng)策略、最佳適應(yīng)策略和最壞適應(yīng)策略。(3)考慮在某一內(nèi)存使用一段時(shí)間的快照,給出一組作業(yè)的內(nèi)存申請(qǐng),判斷該 申請(qǐng)是否可以被滿足。三、實(shí)驗(yàn)要求(1)分配算法中切割空閑區(qū)是從低地址開始;(2)需考慮門限值情況,門限值是指切割空閑區(qū)后剩下的區(qū)域若小于一
3、個(gè)用戶 給定的值時(shí),就不切割該空閑區(qū),統(tǒng)統(tǒng)分給申請(qǐng)者,這個(gè)值由用戶指定;(3)回收算法需要考慮上鄰、下鄰、上下鄰和不相鄰四種情況。四、實(shí)驗(yàn)環(huán)境:實(shí)踐平臺(tái): windows 編寫環(huán)境: CodeBlocks 編譯器: g+五、實(shí)驗(yàn)設(shè)計(jì)原理(1)可變分區(qū)基本思想 可變分區(qū)是指系統(tǒng)不預(yù)先劃分固定分區(qū),而是在裝入程序時(shí)劃分,使程序分 配的大小正好等于程序的需求量, 且分區(qū)的個(gè)數(shù)是可變的, 這樣有較大的靈活性, 較之固定分區(qū)能獲得更好的內(nèi)存利用率。其狀態(tài)如圖所示:(2)內(nèi)存分配表 內(nèi)存分配表由兩張表格組成:一張是已分配表,記錄已裝入的程序在內(nèi)存中 占用分區(qū)的起始地址和長度, 并表之位指出占用分區(qū)的程序名
4、; 另一張是空閑區(qū) 表,記錄內(nèi)存中可供分配的空閑區(qū)的起始地址和長度, 用標(biāo)志位指出該分區(qū)是未 分配的空閑區(qū)。其基本結(jié)構(gòu)如圖所示:(3)分配策略 首次適應(yīng)算法( First Fit ):從空閑分區(qū)表的第一個(gè)表目起查找該表,把 最先能夠滿足要求的空閑區(qū)分配給作業(yè), 這種方法的目的在于減少查找時(shí)間。 為 適應(yīng)這種算法, 空閑分區(qū)表 (空閑區(qū)鏈) 中的空閑分區(qū)要按地址由低到高進(jìn)行排 序。該算法優(yōu)先使用低址部分空閑區(qū), 在低址空間造成許多小的空閑區(qū), 在高地 址空間保留大的空閑區(qū)。 最佳適應(yīng)算法( Best Fit) :從全部空閑區(qū)中找出能滿足作業(yè)要求的、且大 小最小的空閑分區(qū),這種方法能使碎片盡量小。
5、為適應(yīng)此算法,空閑分區(qū)表(空 閑區(qū)鏈)中的空閑分區(qū)要按從小到大進(jìn)行排序, 自表頭開始查找到第一個(gè)滿足要 求的自由分區(qū)分配。該算法保留大的空閑區(qū),但造成許多小的空閑區(qū)。 最差適應(yīng)算法( Worst Fit) : 從全部空閑區(qū)中找出能滿足作業(yè)要求的、且 大小最大的空閑分區(qū), 從而使鏈表中的結(jié)點(diǎn)大小趨于均勻, 適用于請(qǐng)求分配的內(nèi) 存大小范圍較窄的系統(tǒng)。為適應(yīng)此算法,空閑分區(qū)表(空閑區(qū)鏈)中的空閑分區(qū) 按大小從大到小進(jìn)行排序,自表頭開始查找到第一個(gè)滿足要求的自由分區(qū)分配。 該算法保留小的空閑區(qū),盡量減少小的碎片產(chǎn)生。(4)碎片拼接 采用可變分區(qū)存儲(chǔ)管理方案后,經(jīng)過一段時(shí)間的分配回收,內(nèi)存中會(huì)存在很 多
6、很小的空閑塊。 需要在適當(dāng)時(shí)刻進(jìn)行碎片整理, 通過內(nèi)存中移動(dòng)程序, 把所有 空閑碎片合并成一個(gè)連續(xù)的大空閑區(qū)且放在內(nèi)存的一端, 而把所有程序占用區(qū)放 在內(nèi)存另一端。(5)分區(qū)的回收 當(dāng)用戶執(zhí)行結(jié)束后,系統(tǒng)要收回已經(jīng)使用完畢的分區(qū),將其記錄在空閑區(qū)表 中。一般情況下應(yīng)考慮四種情況:1. 回收分區(qū)的上鄰分區(qū)是空閑的,需要將這兩個(gè)相鄰的空閑分區(qū)合并成一 個(gè)更大的空閑區(qū),然后修改空閑區(qū)表。2. 回收分區(qū)的下鄰分區(qū)是空閑的,需要將這兩個(gè)相鄰的空閑分區(qū)合并成一 個(gè)更大的空閑區(qū),然后修改空閑區(qū)表。3. 回收分區(qū)上下鄰區(qū)都是空閑的,需要將三者合并成一個(gè)更大的空閑區(qū), 然后修改空閑表。4. 回收區(qū)的上鄰下鄰區(qū)都
7、不是空閑的,則直接將空閑區(qū)記錄在空閑表中五、實(shí)驗(yàn)詳細(xì)實(shí)現(xiàn)過程與算法流程(一)數(shù)據(jù)結(jié)構(gòu)1. 作業(yè)結(jié)構(gòu) 本實(shí)驗(yàn)的重點(diǎn)是對(duì)內(nèi)存的管理、分配與回收,所以作業(yè)的內(nèi)部結(jié)構(gòu)簡單,僅 包含:進(jìn)程名( name)、程序大小( size)和內(nèi)部指針( next),其結(jié)構(gòu)如圖:2. 分配表結(jié)構(gòu)本實(shí)驗(yàn)的分配表結(jié)構(gòu)包含:進(jìn)程名兼區(qū)名( name)、地址( address)、程序大 ?。?size)、狀態(tài)( state)和內(nèi)部指針( next),其結(jié)構(gòu)如圖:2. 隊(duì)列結(jié)構(gòu)作業(yè)隊(duì)列( joblist )、占用表隊(duì)列( occupiedlist)和空閑表隊(duì)列( blanklist )。 其結(jié)構(gòu)如圖所示:二)程序結(jié)構(gòu)思維導(dǎo)圖六
8、、實(shí)驗(yàn)測(cè)試與過程分析(1)實(shí)驗(yàn)數(shù)據(jù)內(nèi)存大小設(shè)置為 1024k。進(jìn)行 CreateJob操作后,由計(jì)算機(jī)隨機(jī)生成一個(gè)作業(yè), 每生成一個(gè)作業(yè),作業(yè)名累次加 1,作業(yè)大小隨機(jī)設(shè)置位 200k500k 大小,其結(jié) 構(gòu)如圖所示:2)測(cè)試首先適應(yīng)算法( FF) 創(chuàng)建 5 個(gè)作業(yè),作業(yè)隊(duì)列、空閑表隊(duì)列、占用隊(duì)列如圖所示: 分配內(nèi)存直至內(nèi)存不足: 依次終止 JOB2、 JOB1、 JOB3 分配內(nèi)存直至不足:對(duì) FF 算法進(jìn)行了多組測(cè)試,僅記錄了一組測(cè)試結(jié)果。通過多組測(cè)試的結(jié)果 分析,每次劃分內(nèi)存空間, 均是從低地址處開始劃分, 在結(jié)束作業(yè),收回內(nèi)存時(shí), 根據(jù)相鄰情況與否,進(jìn)行合并后在 按地址升序 插入到空閑
9、隊(duì)列中。( 3)最佳適應(yīng)算法( BF) 創(chuàng)建 5 個(gè)作業(yè),作業(yè)隊(duì)列、空閑表隊(duì)列、占用隊(duì)列如圖所示: 終止作業(yè) JOB2、 JOB1:對(duì) BF 算法進(jìn)行了多組測(cè)試,僅記錄了一組測(cè)試結(jié)果。通過多組測(cè)試的結(jié)果 分析,每次劃分內(nèi)存空間, 均是從低地址處開始劃分, 在結(jié)束作業(yè),收回內(nèi)存時(shí), 根據(jù)相鄰情況與否,進(jìn)行合并后按照 空閑塊的大小升序 插入空閑隊(duì)列中。4)最壞適應(yīng)算法( WF) 創(chuàng)建 5 個(gè)作業(yè),作業(yè)隊(duì)列、空閑表隊(duì)列、占用隊(duì)列如圖所示: 終止作業(yè) JOB2、 JOB1:對(duì) WF 算法進(jìn)行了多組測(cè)試,僅記錄了一組測(cè)試結(jié)果。通過多組測(cè)試的結(jié)果 分析,每次劃分內(nèi)存空間, 均是從低地址處開始劃分, 在結(jié)束
10、作業(yè),收回內(nèi)存時(shí), 根據(jù)相鄰情況與否,進(jìn)行合并后按照 空閑塊的大小降序 插入空閑隊(duì)列中。六、實(shí)驗(yàn)結(jié)果分析(問題的發(fā)現(xiàn)、分析、解決方案與創(chuàng)新)1. 在設(shè)計(jì)分配表數(shù)據(jù)結(jié)構(gòu)的時(shí)候, 起初考慮了順序表結(jié)構(gòu), 發(fā)現(xiàn)在執(zhí)行整個(gè) 內(nèi)存的分配與回收的過程中, 需要較多地進(jìn)行刪除、 插入操作,順序表并不合適, 遂改為鏈表結(jié)構(gòu),實(shí)現(xiàn)相關(guān)的鏈表操作。2. 因?yàn)樵O(shè)計(jì)了鏈表的數(shù)據(jù)結(jié)構(gòu), 對(duì)不同算法中占用表和空閑表中塊的排序極 為困難,換一種思路,便是在回收合并的時(shí)候,如果有相鄰的空閑塊,把它們摘 取下來, 進(jìn)行合并, 把合并后的結(jié)果再插入到空閑表中, 這樣的方式與之前想過 的在空閑表原有的塊上合并相鄰空閑塊更為簡單,容
11、易實(shí)現(xiàn),十分地方便。3. 在考慮到瀏覽結(jié)果的方便性和直觀性, 通過相應(yīng)的格式控制, 以表格的形 式展現(xiàn)各個(gè)隊(duì)列的狀態(tài), 各個(gè)作業(yè)在何種操作后進(jìn)入何種隊(duì)列有了清晰的直觀的 追蹤,充分地展示內(nèi)存分配過程。七、源程序(加注釋)見附頁八、實(shí)驗(yàn)體會(huì)與改進(jìn)意見(1)實(shí)驗(yàn)體會(huì)1. 本次實(shí)驗(yàn)主要是熟悉內(nèi)存管理的相關(guān)概念及內(nèi)存管理的各部分內(nèi)容, 并明 確內(nèi)存管理中所運(yùn)用到的數(shù)據(jù)結(jié)構(gòu)、 控制機(jī)制的基本原理, 代碼實(shí)現(xiàn)了三種內(nèi)存 分配策略,分區(qū)的回收, 代碼實(shí)現(xiàn)了實(shí)驗(yàn)所需要的各種隊(duì)列的部分基本操作, 實(shí) 現(xiàn)代碼復(fù)用。2. 通過編程自行模擬了操作系統(tǒng)的內(nèi)存分配與回收, 充分理解了分配表的重 要作用,更深入了其中的邏輯
12、過程,而且對(duì)自己的編程能力也有所提高。 (2)改進(jìn)意見1. 由于一些其他原因,本實(shí)驗(yàn)中對(duì)碎片整合問題沒有實(shí)現(xiàn)?,F(xiàn)主要描述一下 實(shí)現(xiàn)思路:可設(shè)置一個(gè) fragdisposal 函數(shù)來處理碎片整合問題,設(shè)置一個(gè)指針 reoccupied ,從占用隊(duì)列( blanklist )中依次取出空閑塊加入到 reoccupied 指針后,形成新的占用隊(duì)列。 對(duì)于空閑隊(duì)列刪除原有隊(duì)列塊, 新的空閑隊(duì)列只有 一個(gè)空閑塊,其地址為占用隊(duì)列最后一個(gè)占用塊的 address+size 。2. 本實(shí)驗(yàn)中計(jì)算機(jī)生成的作業(yè)大小范圍為 200k500k,內(nèi)存區(qū)大小為 1024k, 則會(huì)出現(xiàn),則大部分可能出現(xiàn)內(nèi)存區(qū)只能存放 2
13、到 3個(gè)的作業(yè),可以適當(dāng)?shù)恼{(diào)小 作業(yè)大小范圍或者調(diào)大內(nèi)存大小, 從而觀察多個(gè)作業(yè)的內(nèi)存管理、 分配和回收的 情況,更細(xì)致地對(duì)內(nèi)存管理進(jìn)行追蹤。附頁:實(shí)驗(yàn)三 .cpp#include<stdio.h> #include<stdlib.h> #include<time.h>#define MAX_MEMARY 1024#define MIN 100#define FREE 0#define BUSY 1/ 作業(yè)結(jié)構(gòu)typedef struct JOBint name; / 進(jìn)程名int size; / 大小 struct JOB *next; / 指針 JOB;
14、/ 分配結(jié)構(gòu)typedef struct M_JOBint name;/進(jìn)程名int address;/地址int size;/大小int state;/狀態(tài)struct M_JOB*next; /指針M_JOB;int n;/JOB 隊(duì)列結(jié)構(gòu)typedef struct Queue_JOBJOB *head;JOB *tail;int len;Queue;/ 作業(yè)隊(duì)列Queue_JOB joblist;/M_JOB隊(duì)列結(jié)構(gòu)typedef struct Queue_M_JOBM_JOB *head;M_JOB *tail;int len;Queue_M_JOB;/ 占用、空閑隊(duì)列Queue_M
15、_JOB occupiedlist, blanklist;void MainMenu()printf("t|n");printf("t|MainMenu|n");printf("t|n");printf("t|Use FF press1|n");printf("t|n");printf("t|Use BF press2|n");printf("t|n");printf("t|Use WF press3|n");printf("
16、t|n");printf("t|Exit press0|n");printf("t|n");system("cls");printf("t printf("t|n");|n");void SubMenu()system("cls");printf("t n");printf("t|n");printf("t| SubMenu |n"); printf("t|n");printf(&quo
17、t;t| Create Job press1 |n"); printf("t| |n");printf("t| Distribute Memory press2 |n");printf("t| printf("t| printf("t| printf("t| printf("t|End JobExit|n");press3 |n");|n");press0 |n");|n");printf("t|n");/ 創(chuàng)建作業(yè)插入作業(yè)隊(duì)
18、列尾void CreateJob() JOB *p;p = new JOB();p->name = +n;p->size = rand() % 300 + 200; p->next = NULL;if(joblist.head = NULL) joblist.head = p; joblist.tail = p; joblist.len+;else joblist.tail->next = p; joblist.tail = p; joblist.len+;/ 取出作業(yè)隊(duì)列隊(duì)首元素JOB *PopFromJobList()JOB *q; if(joblist.len =
19、 0) printf("the job list is empty!n");else q = joblist.head; joblist.head = joblist.head->next; joblist.len-; return q;/ 打印作業(yè)隊(duì)列 void PrintJobList()JOB *p; p = joblist.head; printf("nt#job list:n"); if(joblist.len = 0) printf("tjob list is empty!n");else printf("
20、tn");printf("t|namet|sizet|n"); printf("tn");while(p != NULL)printf("t|JOB%dt|%dkt|n", p->name, p->size); p = p->next; printf("tn");/ 打印空閑表void PrintBlankList()M_JOB *p;p = blanklist.head->next;printf("nt#blank list:n");if(blanklist.
21、len = 0)printf("tblank list is empty!n");elseprintf("tn");printf("t|namet|address|sizet|n");printf("tn");while(p != NULL) printf("t|JOB%dt|%dt|%dkt|n", p->size);p = p->next;printf("tn");/ 打印占用表void PrintOccupiedList()M_JOB *p;p = occu
22、piedlist.head->next; printf("nt#occupied list:n"); if(occupiedlist.len = 0) printf("toccupied list is empty!n");elseprintf("tn");printf("t|namet|address|sizet|n");printf("tn");while(p != NULL) printf("t|JOB%dt|%dt|%dkt|n", p->size);p
23、= p->next;printf("tn");/ 初始化各隊(duì)列void InitList()/ 初始空閑塊M_JOB *q = new M_JOB(); q->name = 0;p->name,p->name,p->address,p->address,q->address = 0;q->size = MAX_MEMARY; q->state = FREE;q->next = NULL;/ 初始空閑塊入空閑隊(duì)列 blanklist.head = new M_JOB(); blanklist.head->nex
24、t = q; blanklist.tail = q;blanklist.len+;/ 初始化占用隊(duì)列 occupiedlist.head = new M_JOB(); occupiedlist.head->next = NULL; occupiedlist.tail = occupiedlist.head; occupiedlist.len = 0;/ 加入到占用隊(duì)列void AddToOccupiedList(M_JOB *point)M_JOB *q = occupiedlist.head->next, *s = occupiedlist.head; / 如果空,加入到隊(duì)首 i
25、f(q = NULL)occupiedlist.head->next = point; occupiedlist.len+;return;/ 按地址升序排列占用隊(duì)列while(q != NULL) if(point->address < q->address) point->next = q; s->next = point; occupiedlist.len+; break;s = q;q = q->next;/ 如果地址大于前面元素,則加入到隊(duì)列尾if(q = NULL) s->next = point; occupiedlist.len+;
26、void InsertIntoBlankList(M_JOB *point, int i)M_JOB *q = blanklist.head->next, *s = blanklist.head; / 如果空,加入到隊(duì)首if(q = NULL)blanklist.head->next = point; blanklist.len+;return;while(q != NULL)/ 首先適應(yīng)算法插入空閑隊(duì)列中 if(point->address < q->address && i = 1) point->next = q; s->next
27、 = point; blanklist.len+;return;/ 最佳適應(yīng)算法插入空閑隊(duì)列中else if(point->size < q->size && i = 2) point->next = q; s->next = point; blanklist.len+;return;/ 最壞適應(yīng)算法插入空閑隊(duì)列中else if(point->size > q->size && i = 3) point->next = q; s->next = point; blanklist.len+;return;
28、elses = q;q = q->next;/ 插入隊(duì)尾if(q = NULL)s->next = point;blanklist.len+;return;/ 按相應(yīng)算法分配內(nèi)存void Distribute(int i)M_JOB *q = blanklist.head->next, *s = blanklist.head;M_JOB *p = new M_JOB();/ 空閑隊(duì)列空,內(nèi)存不足if(q = NULL)printf("ntTip:not enough memory!n"); return;/ 從作業(yè)隊(duì)列中取出作業(yè)JOB *pjob = Po
29、pFromJobList(); while(q != NULL)if(q->size >= pjob->size)/ 如果分配后剩余大小不足 100k 就全部分配給該作業(yè) if(q->size - pjob->size < 100)s->next = q->next; blanklist.len-;q->name = pjob->name; q->state = BUSY; q->next = NULL;AddToOccupiedList(q);break;/ 否則進(jìn)行切割elsep->name = pjob->
30、;name; p->address = q->address; p->size = pjob->size;p->state = BUSY;p->next = NULL;/ 占用的內(nèi)存進(jìn)占用表 AddToOccupiedList(p);q->name = 0; q->address = q->address + pjob->size; q->size = q->size - pjob->size;q->state = FREE; s->next = q->next; blanklist.len-;/
31、剩下的空閑內(nèi)存重新按算法插入空閑表 InsertIntoBlankList(q, i);break; s = q;q = q->next;/ 沒有滿足大小的空閑塊則內(nèi)存不足,/ 將取出的作業(yè)重新加入到作業(yè)隊(duì)列隊(duì)首 if(q = NULL)printf("ntTip:not enough memory!n"); pjob->next = joblist.head;joblist.head = pjob; joblist.len+; / 從占用隊(duì)列中取出占用塊 M_JOB *PopFromOccupiedList(int id)M_JOB *q = occupied
32、list.head->next, *s = occupiedlist.head; if(occupiedlist.len = 0) printf("ntTip:the occupied list is empty!n"); return NULL; while(q != NULL) if(q->name = id) s->next = q->next; q->name = 0; q->state = FREE; q->next = NULL; occupiedlist.len-; return q; s = q; q = q->
33、;next; if(q = NULL) printf("ntTip:can not find the job!n");return NULL;/ 空閑塊合并 M_JOB *Merge(M_JOB *point)M_JOB *q = blanklist.head->next, *s = blanklist.head; M_JOB *x, *y;M_JOB *merged = new M_JOB();/ 如果空閑表為空,無需合并直接返回 point 空閑快 if(q = NULL) return point;while(q != NULL)/ 指向可以合并的單元if(po
34、int->address + point->size = q->address | q->address +q->size = point->address)/指向可合并單元/鄰下找鄰上if(point->address + point->size = q->address)x = q;s->next = q->next;q = q->next;blanklist.len-;if(q = NULL)point->name = 0;/point->address = point->address; poin
35、t->size = x->size + point->size; point->state = FREE; point->next = NULL;return point;elsewhile(q != NULL)/ 查找是否鄰上if(q->address + q->size = point->address)y = q;s->next = q->next; blanklist.len-;x->size + y->sizepoint->name = 0; point->address = y->addres
36、s; point->sizepoint->size;point->state = FREE; point->next = NULL; delete x; delete y;return point; s = q; q = q->next;/ 沒有鄰上則合并兩個(gè)空閑塊 if(q = NULL)point->name = 0;/point->address = point->address; point->size = x->size + point->size; point->state = FREE;point->n
37、ext = NULL;return point;/ 鄰上找鄰下if(q->address + q->size = point->address)x = q;s->next = q->next;q = q->next;blanklist.len-;if(q = NULL)point->name = 0;point->address = x->address; point->size = x->size + point->size; point->state = FREE;point->next = NULL;re
38、turn point;elsewhile(q != NULL)+ point->size = q->address)/ 查找是否鄰下 if(point->addressy = q;s->next = q->next; blanklist.len-;merged->name = 0; merged->address = x->address; merged->size = x->size + y->size +point->size;merged->state = FREE; merged->next = NUL
39、L; delete x;delete y;delete point;return merged;s = q;q = q->next;/ 沒有鄰下則合并兩個(gè)空閑塊 if(q = NULL)point->name = 0; point->address = x->address; point->size = x->size + point->size; point->state = FREE;point->next = NULL;return point;elses = q;q = q->next;return point;void En
40、dJob(int i) printf("ntinput the number:"); int id;M_JOB *pop, *merged; scanf("%d",&id);pop = PopFromOccupiedList(id); if(pop != NULL) merged = Merge(pop);InsertIntoBlankList(merged, i);/ 首先適應(yīng)算法void FF()int m;SubMenu();printf("ntYour select:"); while(scanf("%d", &m) != EOF) printf("tn");if(m = 1)CreateJob();else if(m = 2)Distribute(1);else if(m = 3) EndJob(1);else if(m = 0) break;correctelse printf("tyour input is error, please input the number!n");printf("ntYour select:"); continue; PrintJobList(); PrintOccupiedLis
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 外貿(mào)公司管理制度
- 學(xué)生違紀(jì)處理細(xì)則制度
- 課前三分鐘勵(lì)志演講稿合集六篇
- 商場工作計(jì)劃范文大全5篇
- 2025民間借貸合同的格式
- IT寒假實(shí)習(xí)報(bào)告【五篇】
- 2025員工勞動(dòng)合同規(guī)范模板
- 乒乓球比賽的作文錦集7篇
- 2024年電子商務(wù)合同立法國際比較
- 競聘安全演講稿集錦五篇
- 2024年中考化學(xué)重點(diǎn)復(fù)習(xí):工藝流程題
- 護(hù)理工作年終總結(jié)匯報(bào)
- 2024年度考研政治全真模擬試卷及答案(共六套)
- 耕地提質(zhì)改造項(xiàng)目提質(zhì)改造面積申請(qǐng)確認(rèn)情況表
- 軍事網(wǎng)絡(luò)協(xié)議分析
- 三農(nóng)領(lǐng)域法律法規(guī)解讀手冊(cè)
- 上海市寶山區(qū)行知實(shí)驗(yàn)2025屆高一數(shù)學(xué)第一學(xué)期期末統(tǒng)考試題含解析
- 噴涂工程合同范本
- 01685《動(dòng)漫藝術(shù)概論》自考必背考試題庫(含答案)
- 2024年廣東省高中學(xué)業(yè)水平合格性考試語文試卷真題(含答案解析)
- CJ/T 83-2016 水處理用斜管
評(píng)論
0/150
提交評(píng)論