内存管理中首次适配算法的 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

相关文章