文章目錄
- 一、實驗目的
- 二、實驗內容與設計思想
- 實驗內容
- 設計思路
- 三、實驗代碼實現
- 四、總結
一、實驗目的
理解動態異長存儲分區資源管理,掌握所需數據結構和管理程序,了解各種存儲分配算法的優點和缺點。
二、實驗內容與設計思想
實驗內容
1.分析unix最先適應存儲分配算法,即map數據結構,存儲分配函數malloc()和存儲釋放函數mfree(),找出與算法有關的成分;
2.修改上述與算法有關的成分,使其分別體現最佳適應分配原則和最壞適應分配原則;
設計思路
-
數據結構設計
定義 5 個進程(P0-P4)共享 3 類資源(R0-R2),關鍵數據結構包括:
avail[R]:當前可用資源數
max[P][R]:各進程對資源的最大需求
allot[P][R]:各進程已分配的資源
need[P][R]:各進程仍需的資源(need = max - allot) -
安全狀態檢查函數 isSafe()
核心邏輯:
計算各進程的需求矩陣 need
初始化工作向量 work(可用資源)和完成標志 finish
尋找可運行的進程(need <= work),模擬資源回收,更新work并標記進程完成
若所有進程完成則系統安全,否則不安全
三、實驗代碼實現
#include <stdio.h>
#include <stdlib.h>typedef struct Block {int start;int size;struct Block *next;
} Block;Block *freeList;void initMemory(int size) {freeList = (Block *)malloc(sizeof(Block));freeList->start = 0;freeList->size = size;freeList->next = NULL;
}void printFreeList() {Block *current = freeList;while (current != NULL) {printf("(%d, %d)\n", current->start, current->size);current = current->next;}
}void coalesce() {Block *current = freeList;while (current != NULL && current->next != NULL) {if (current->start + current->size == current->next->start) {current->size += current->next->size;Block *temp = current->next;current->next = temp->next;free(temp);} else {current = current->next;}}
}void mfree(int start) {Block *current = freeList, *prev = NULL;while (current != NULL && current->start != start) {prev = current;current = current->next;}if (current == NULL) return;Block *newBlock = (Block *)malloc(sizeof(Block));newBlock->start = start;newBlock->size = current->size;newBlock->next = current->next;if (prev == NULL) {freeList = newBlock;} else {prev->next = newBlock;}free(current);coalesce();
}int mallocFirstFit(int size) {Block *current = freeList, *prev = NULL;while (current != NULL) {if (current->size >= size) {if (current->size == size) {if (prev == NULL) {freeList = current->next;} else {prev->next = current->next;}free(current);return current->start;} else {Block *newBlock = (Block *)malloc(sizeof(Block));newBlock->start = current->start + size;newBlock->size = current->size - size;newBlock->next = current->next;current->size = size;current->next = newBlock;return current->start;}}prev = current;current = current->next;}return -1;
}int main() {initMemory(1000);int allocated1 = mallocFirstFit(100);printf("Allocated 1: %d\n", allocated1);int allocated2 = mallocFirstFit(200);printf("Allocated 2: %d\n", allocated2);int allocated3 = mallocFirstFit(300);printf("Allocated 3: %d\n", allocated3);printFreeList();mfree(allocated1);mfree(allocated2);mfree(allocated3);printFreeList();return 0;
}
結果:
四、總結
- 遇到的問題
- 致命語法錯誤:行頭缺失
遇到的問題
函數命名沖突:malloc函數是標準庫函數,在代碼中重新定義會導致沖突。
編譯后提示錯誤,malloc 函數是標準庫函數,重新定義會導致沖突。mfree 函數參數類型與標準庫函數不匹配。指針轉換為整數類型時需要進行類型轉換。
參數類型不匹配:mfree函數參數類型與標準庫函數不匹配。
類型轉換問題:指針轉換為整數類型時需要進行類型轉換。
空閑列表更新問題:程序在分配和釋放內存后,空閑列表顯示的結果是相同的,這意味著分配和釋放操作沒有正確更新空閑列表。
通過這次實驗,我對動態異長存儲分區資源管理有了更深入的理解。我不僅掌握了所需的數據結構和管理程序,還了解了各種存儲分配算法的優缺點。在今后的學習和工作中,我將更加注重基礎知識的學習和積累,提高自己的編程能力和問題解決能力。同時,我也會更加注重代碼的質量和可維護性,養成良好的編程習慣。
對于后續的實驗,我計劃對代碼進行進一步的修改和完善,實現最佳適應分配原則和最壞適應分配原則。我相信通過不斷的實踐和學習,我能夠更好地掌握操作系統的相關知識和技能。