内存管理中首次适配算法的 C++ 程序
c++server side programmingprogramming更新于 2024/10/5 3:05:00
给定 n 个进程和 m 个内存块大小,任务是使用首次适配内存管理算法为相应进程找到最适合的内存块。
什么是首次适配内存管理算法?
有多种内存分区算法可供操作系统使用,将内存块分配给进程,如 −
- 首次适配算法
- 下次适配算法
- 最佳适配算法
- 最差适配算法
- 快速适配算法
首次适配算法是所有进程中最简单的内存块分配技术。在此算法中,指针跟踪内存中的所有空闲块,并接受将内存块分配给即将到来的进程的请求。之后,指针开始搜索进程的最大第一个空闲块,并将该内存块分配给即将到来的进程。在此过程中,创建了两个分区,一个用于空洞,另一个用于存储进程。
使用优先适应算法的优点是即将到来的进程的内存分配速度最快,因为它为新进程分配了最大的优先适应算法。
使用优先适应算法的缺点是内存浪费,这将导致其他进程的内存不足。
示例
Input-: block_size[] = {300, 50, 200, 350, 70} process_size[] = {200, 47, 212, 426, 10} Output-: Process No. Process Size Block no. 1 200 1 2 47 1 3 212 4 4 426 Not Allocated 5 10 1
以下程序中使用的方法如下 −
- 将块和进程输入数组中
- 将所有内存块设置为空闲
- 检查(进程大小)是否<=(内存块大小),然后将进程分配给内存块
- 否则继续遍历其他块,直到(进程大小)<=(内存块大小)不成立。
算法
开始 步骤 1-> 声明函数来计算最佳匹配内存块 void First_Fit(int block_size[], int total_blocks, int process_size[], int total_process) 声明 int assignment[total_process] 调用函数 memset(allocation, -1, sizeof(allocation)) 循环 for i = 0 and i < total_process and i++ 循环 for j = 0 and j < total_blocks and j++ 如果 block_size[j] >= process_size[i] 设置 assignment[i] = j 设置 block_size[j] -= process_size[i] 结束 结束 结束 循环 For i = 0 and i < total_process and i++ 如果分配[i] != -1 设置分配[i] + 1 结束 否则 打印未分配 结束 结束 步骤 2->在 main() 中 为块声明一个数组,其形式为 int block_size[] = {300, 50, 200, 350, 70} 为进程声明一个数组,其形式为 int process_size[] = {200, 47, 212, 426, 10} 计算总块数 int total_blocks = sizeof(block_size) / sizeof(block_size[0] 计算总进程数 int total_process = sizeof(process_size) / sizeof(process_size[0]) 调用 First_Fit(block_size, total_blocks, process_size, total_process) 停止
示例
#include<bits/stdc++.h> using namespace std; // 函数根据 First fit 算法为 // 块分配内存 void First_Fit(int block_size[], int total_blocks, int process_size[], int total_process) { int allocation[total_process]; memset(allocation, -1, sizeof(allocation)); //此 for 循环将挑选每个进程并为其分配第一个适合的块 for (int i = 0; i < total_process; i++) { for (int j = 0; j < total_blocks; j++) { if (block_size[j] >= process_size[i]) { allocation[i] = j; block_size[j] -= process_size[i]; break; } } } cout << "\nProcess No.\tProcess Size\tBlock no.\n"; for (int i = 0; i < total_process; i++) { cout << " " << i+1 << "\t\t" << process_size[i] << "\t\t"; if (allocation[i] != -1) cout << allocation[i] + 1; else cout << "Not Allocated"; cout << endl; } } int main() { //创建数组来存储块大小 int block_size[] = {300, 50, 200, 350, 70}; //创建数组来存储进程大小 int process_size[] = {200, 47, 212, 426, 10}; //包含块总数的变量 total_blocks int total_blocks = sizeof(block_size) / sizeof(block_size[0]); //包含块总数的变量 total_process int total_process = sizeof(process_size) / sizeof(process_size[0]); //调用函数 First_fit First_Fit(block_size, total_blocks, process_size, total_process); return 0 ; }
输出
Process No. Process Size Block no. 1 200 1 2 47 1 3 212 4 4 426 Not Allocated 5 10 1