用于内存管理中的First Fit算法的C ++程序

给定n个进程和m个内存块大小,任务是使用第一种适合内存管理算法为相应的进程找到最适合的内存块。

什么是首次适合内存管理算法?

有多种可用的内存分区算法,操作系统可使用这些算法将内存块分配给以下进程:

  • 首次拟合算法

  • 下一步拟合算法

  • 最佳拟合算法

  • 最差拟合算法

  • 快速拟合算法

First Fit算法是将内存块分配给所有进程的最简单技术。在这种算法中,指针跟踪内存中的所有空闲块,并接受为即将到来的进程分配内存块的请求。之后,指针开始为该进程搜索最大的第一个空闲块,并将该内存块分配给即将到来的进程。在这种情况下,将创建两个分区,一个分区用于孔,一个分区将存储过程。

使用“最适合算法”的优势在于,它为即将到来的进程分配最快的内存,因为它为新进程分配了最大的“最适合算法”。

使用First Fit算法的缺点是浪费内存,这将导致其他进程的内存不足。

示例

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

以下程序中使用的方法如下-

  • 输入数组中的块和过程

  • 将所有内存块设置为空闲

  • 检查(进程的大小)是否<=(内存块的大小),然后将进程分配给内存块

  • 否则,继续遍历其他块,直到(进程的大小)<=(存储块的大小)不成立。

算法

Start
Step 1->  declare function to calculate the best fit memory block
   void First_Fit(int block_size[], int total_blocks, int process_size[], int total_process)
   Declare int allocation[total_process]
   Call function memset(allocation, -1, sizeof(allocation))
   Loop For i = 0 and i < total_process and i++
      Loop for j = 0 and j < total_blocks and j++
         IF block_size[j] >= process_size[i]
            Set allocation[i] = j
            Set block_size[j] -= process_size[i]
         End
      End
   End
   Loop For i = 0 and i < total_process and i++
      IF allocation[i] != -1
         Set allocation[i] + 1
      End
      Else
         Print Not Allocated
      End
   End
Step 2-> In main()   Declare an array for blocks as int block_size[] = {300, 50, 200, 350, 70}
   Declare an array for processes int process_size[] = {200, 47, 212, 426, 10}
   Calculate total blocks int total_blocks = sizeof(block_size) / sizeof(block_size[0]
   Calculate total processes int total_process = sizeof(process_size) / sizeof(process_size[0])
   Call First_Fit(block_size, total_blocks, process_size, total_process)
Stop

示例

#include<bits/stdc++.h>
using namespace std;
//分配内存的功能  
//根据首次拟合算法
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循环将选择eact进程并为其分配第一个fit块
   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