內(nèi)存動態(tài)分配和回收的模擬實驗_第1頁
內(nèi)存動態(tài)分配和回收的模擬實驗_第2頁
內(nèi)存動態(tài)分配和回收的模擬實驗_第3頁
內(nèi)存動態(tài)分配和回收的模擬實驗_第4頁
內(nèi)存動態(tài)分配和回收的模擬實驗_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、操作系統(tǒng)實驗報告內(nèi)存動態(tài)分區(qū)分配和回收的模擬實現(xiàn) 班級:2013級軟件工程1班 學(xué)號:X X X 姓名:蕭氏一郎數(shù)據(jù)結(jié)構(gòu)說明:Struct SubAreaListA 分配空間鏈表Struct SubAreaListF 空閑分區(qū)鏈表Viod Swap(Task&task,Task&task1)交換作業(yè)順序函數(shù)Viod InitDate()初始化鏈表Viod MAllocate(Task task,int M)為申請分配內(nèi)存Viod MFree(Task task,intN)釋放內(nèi)存流程圖:a. 內(nèi)存分配Yes從頭開始查表表NO 檢查完成?YesNO繼續(xù)檢索下一項M.size>

2、;u/size?NOYes將該分區(qū)移出返回將該分區(qū)分配給請求者,修改有關(guān)數(shù)據(jù)從該分區(qū)劃出u.size大小的分區(qū)M.size-u.size,<=size? b.內(nèi)存回收回收區(qū)NONONONOYesYesYesYes返 回將該表以上的所有表格下移一格與后一可用區(qū)合并與后一可用分區(qū)合并把所釋放的可用區(qū)與前一分區(qū)合并將該表目以上所有表目上移一格,并插入新釋放的可用區(qū)表目所釋放的可用區(qū)的size=0后釋放的可用區(qū)與后一可用區(qū)合并與后一可用分區(qū)相鄰且不為空表目不是第一個木目標(biāo)且與前一個可用去相鄰?順序次檢索可用資源表直到找到某表目的m.addr>aa或m.size=0 源代碼:#include

3、 <stdio.h>#include <stdlib.h>#include <string.h>#define SIZE_MIN 2#define MEMSIZE_MAX 1024#define FALSE 0#define TRUE !FALSE/*采用最佳分配法*/typedef int BOOL;typedef struct _MEM_LINK char cName; /*作業(yè)名*/ int iStartAddr; /*分區(qū)起始地址*/ int iMemSize; /*分區(qū)大小*/ BOOL iState; /*分區(qū)狀態(tài),1表示已分配, 0表示未分配*

4、/ struct _MEM_LINK* next; MEM_LINK, *PMEM_LINK;PMEM_LINK g_pslnkHead;/*初始化內(nèi)存使用情況*/void init() g_pslnkHead=(PMEM_LINK)malloc(sizeof(MEM_LINK); memset(g_pslnkHead, 0, sizeof(MEM_LINK); g_pslnkHead->iMemSize = MEMSIZE_MAX;int menu() int i; printf("nn1. 分配內(nèi)存n"); printf("2. 回收內(nèi)存n")

5、; printf("3. 顯示內(nèi)存使用情況n"); printf("4. 退出n"); printf("n請輸入選擇:"); scanf("%d",&i); getchar(); return(i);/*分配內(nèi)存函數(shù),c為作業(yè)名,usize是要分配的大小*/int my_malloc(char c,int usize) PMEM_LINK psNewMem = NULL, plnkTmp = NULL; BOOL bRepeatName = FALSE; int iTmp = g_pslnkHead->

6、;iMemSize - usize*SIZE_MIN; if (iTmp <= 0) /* 如果沒有足夠的空間分配 */ return FALSE; plnkTmp = g_pslnkHead; while (plnkTmp != NULL) if (plnkTmp->cName = c) bRepeatName = TRUE; break; plnkTmp = plnkTmp->next; if (bRepeatName) /* 如果作業(yè)名重復(fù) */ return FALSE; /* 創(chuàng)建新的節(jié)點 */ psNewMem = (PMEM_LINK)malloc(sizeof

7、(MEM_LINK); /* 結(jié)構(gòu)體設(shè)零 */ memset(psNewMem, 0, sizeof(MEM_LINK); /* 設(shè)置節(jié)點內(nèi)容 */ psNewMem->cName = c; psNewMem->iMemSize = usize*SIZE_MIN; psNewMem->iStartAddr= MEMSIZE_MAX - g_pslnkHead->iMemSize; psNewMem->iState = TRUE; plnkTmp = g_pslnkHead; /* 查找鏈表最尾節(jié)點 */ while (plnkTmp->next != NUL

8、L) plnkTmp = plnkTmp->next; /* 把新創(chuàng)建的節(jié)點加入到鏈表中 */ plnkTmp->next = psNewMem; /* 在整體內(nèi)存中去掉以分配的部分 */ g_pslnkHead->iMemSize -= usize*SIZE_MIN; return TRUE;/*回收內(nèi)存函數(shù),c是撤銷的進(jìn)程的作業(yè)名;*/int my_free(char c) PMEM_LINK plnkBK = g_pslnkHead, /* 保留上次搜索的節(jié)點 */ plnkTmp = g_pslnkHead->next; BOOL bFind = FALSE;

9、int iFreeSize = 0; /* 搜索鏈表 */ while (plnkTmp != NULL) if (plnkTmp->cName = c) /* 如果找到節(jié)點,退出循環(huán) */ bFind = TRUE; break; plnkBK = plnkTmp; plnkTmp = plnkTmp->next; if (bFind) /* 把找到的節(jié)點從鏈表中摘除并釋放 */ g_pslnkHead->iMemSize += plnkTmp->iMemSize; plnkBK->next = plnkTmp->next; /* 保留要釋放內(nèi)存的大小 *

10、/ iFreeSize = plnkTmp->iMemSize; /* 釋放 */ free(plnkTmp); /* 把未釋放內(nèi)存的開始地址提前, 防止內(nèi)存碎片 */ plnkTmp = plnkBK->next; while (plnkTmp != NULL) plnkTmp->iStartAddr -= iFreeSize; plnkTmp = plnkTmp->next; return bFind;void disp() PMEM_LINK pTmp; int i = 0; pTmp = g_pslnkHead; printf("n分區(qū)號 作業(yè)名 起始

11、地址 分區(qū)大小 狀態(tài)"); while(pTmp) printf("n%4d %c %4d %4d %4d", i, pTmp->cName, pTmp->iStartAddr, pTmp->iMemSize, pTmp->iState); pTmp = pTmp->next; i+; void main() int i; char c; init(); i = menu(); while (i!=4) if (i=1) printf("n作業(yè)名(一個字符):"); scanf("%c",&c); printf("作業(yè)占內(nèi)存大?。?quot;); scanf("%d", &i); if(my_malloc(c,i) printf("n分配成功!"); else printf("n分配失??!"); else if (i

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論