常见的动态内存分配算法

参考:《现代操作系统》page105. 《深入理解计算机操作系统》page567

首先假定我们知道每个进程所需要的内存,那么我们应该如何在内存中寻找合适的内存供进程使用??

1,首次适配算法:

首次适配算法指存储管理器,沿着段链表进行搜索直到找到一个足够大的空闲区域。如果空闲区域和进程所需要的区域刚好相等那么刚好,如果大则将该区域分为两部分,一部分供进程使用,另一部分成为新的空闲区域。首次适配算法很快因为它减少了搜索的次数,只要搜索到就分配。

2,下次适配算法:

它的工作方式和首次适配算法很像,不同点是每次找到合适的内存时都会记录当时的位置,而下次查找时都会从该节点查找,而不会从链表头在开始查找。(Bays 1977)的仿真证明该算法性能略低于首次适配算法。

3,最佳适配算法:

最佳适配算法搜索整个链表找出能够容纳进程的最小区域。最最佳适配算法试图找到最接近实际需要的空闲区域。最佳适配算法比前两个算法都要慢,因为每次都要搜索整个链表。但是让人感到意外的是它比前两个算法都浪费空间,因为它会产生大量的无法使用的小空闲区域。

4, 最差匹配算法:

对于最佳匹配算法会产生小的无法使用的内存,基于此又出现了最差匹配算法即:每次找最大的空闲区域,从而使新的空闲区域比较大可以继续使用。仿真表明该算法也不是一个好主意。

5,快速适配算法:

它为那些经常使用的空闲区维护单独的链表。如一个n项的表,该表的第一项指向内存大小为4k内存区域的表头,第二项指向8k等等。快算适配算法寻找一个大小指定的空闲区域是十分快速的,但是内存区域的合并仍然很慢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C++实现顺序搜索动态内存分配算法的示例代码: ```c++ #include <iostream> using namespace std; const int MAX_SIZE = 100; // 内存大小 int memory[MAX_SIZE]; // 内存数组 int processNum = 0; // 进程数量 // 进程结构体 struct Process { int id; // 进程ID int size; // 进程大小 int start; // 进程在内存中的起始位置 }; // 初始化内存 void initMemory() { for (int i = 0; i < MAX_SIZE; i++) { memory[i] = -1; } } // 输出内存分配情况 void printMemory() { for (int i = 0; i < MAX_SIZE; i++) { if (i % 10 == 0) { cout << endl; } if (memory[i] == -1) { cout << "0 "; } else { cout << memory[i] << " "; } } cout << endl; } // 顺序搜索动态内存分配算法 void sequentialSearch(Process p) { int i = 0; while (i < MAX_SIZE) { if (memory[i] == -1) { int j = i + 1; while (j < MAX_SIZE && memory[j] == -1 && j - i + 1 < p.size) { j++; } if (j - i + 1 >= p.size) { p.start = i; for (int k = i; k < i + p.size; k++) { memory[k] = p.id; } processNum++; cout << "进程" << p.id << "已成功分配内存,起始位置为" << p.start << endl; return; } else { i = j + 1; } } else { i++; } } cout << "内存不足,进程" << p.id << "分配失败" << endl; } int main() { initMemory(); // 初始化内存 Process p1 = {1, 5, 0}; // 创建进程1,大小为5 Process p2 = {2, 3, 0}; // 创建进程2,大小为3 Process p3 = {3, 4, 0}; // 创建进程3,大小为4 sequentialSearch(p1); // 顺序搜索动态内存分配算法分配进程1 printMemory(); // 输出内存分配情况 sequentialSearch(p2); // 顺序搜索动态内存分配算法分配进程2 printMemory(); // 输出内存分配情况 sequentialSearch(p3); // 顺序搜索动态内存分配算法分配进程3 printMemory(); // 输出内存分配情况 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值