Computer >> Máy Tính >  >> Lập trình >> C ++

Chương trình C ++ cho thuật toán First Fit trong Quản lý bộ nhớ

Được đưa ra với số quy trình n và kích thước m của khối bộ nhớ và nhiệm vụ là tìm khối bộ nhớ phù hợp nhất cho quy trình tương ứng bằng cách sử dụng thuật toán quản lý bộ nhớ phù hợp đầu tiên.

Thuật toán quản lý bộ nhớ First Fit là gì?

Có nhiều thuật toán phân vùng bộ nhớ có sẵn được hệ điều hành sử dụng để phân bổ các khối bộ nhớ cho các quá trình như -

  • Thuật toán First Fit
  • Thuật toán Fit tiếp theo
  • Thuật toán phù hợp nhất
  • Thuật toán phù hợp tồi tệ nhất
  • Thuật toán Quick Fit

Thuật toán First Fit là kỹ thuật đơn giản nhất để phân bổ khối bộ nhớ cho tất cả các quá trình. Trong thuật toán này, con trỏ theo dõi tất cả các khối trống trong bộ nhớ và chấp nhận yêu cầu cấp phát khối bộ nhớ cho tiến trình sắp tới. Sau khi con trỏ đó bắt đầu tìm kiếm khối trống đầu tiên lớn nhất cho tiến trình và cấp phát khối bộ nhớ đó cho tiến trình sắp tới. Trong đó, hai phân vùng được tạo ra, một phân vùng dành cho lỗ hổng và phân vùng sẽ lưu trữ các quy trình.

Lợi thế sử dụng Thuật toán First Fit là cấp phát bộ nhớ nhanh nhất cho các quy trình sắp tới vì nó phân bổ thuật toán phù hợp đầu tiên lớn nhất cho các quy trình mới.

Bất lợi khi sử dụng Thuật toán First Fit là sự lãng phí bộ nhớ sẽ dẫn đến việc thiếu bộ nhớ cho các quá trình khác.

Ví dụ

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

Phương pháp tiếp cận được sử dụng trong chương trình sau như sau -

  • Nhập các khối và các quy trình trong một mảng
  • Đặt tất cả các khối bộ nhớ thành trống
  • Kiểm tra xem (kích thước của một quy trình) <=(kích thước của một khối bộ nhớ) sau đó cấp phát quy trình cho một khối bộ nhớ
  • Khác tiếp tục duyệt qua các khối khác cho đến khi (kích thước của một quy trình) <=(kích thước của một khối bộ nhớ) không đúng.

Thuật toán

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

Ví dụ

#include<bits/stdc++.h>
using namespace std;
// Function to allocate memory to  
// blocks as per First fit algorithm
void First_Fit(int block_size[], int total_blocks, int process_size[], int total_process) {
   int allocation[total_process];
   memset(allocation, -1, sizeof(allocation));
   //this for loop wll pick eact process and allocate a first fit block to it
   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() {
   //create array to store block sizes
   int block_size[] = {300, 50, 200, 350, 70};  
    //create array to store process sizes
   int process_size[] = {200, 47, 212, 426, 10};
    //variable total_blocks that contain total number of blocks
   int total_blocks = sizeof(block_size) / sizeof(block_size[0]);
    //variable total_process that contain total number of blocks
   int total_process = sizeof(process_size) / sizeof(process_size[0]);
    //calling the function First_fit
   First_Fit(block_size, total_blocks, process_size, total_process);
   return 0 ;
}

Đầu ra

Process No.    Process Size   Block no.  
1                  200            1  
2                  47             1          
3                  212            4  
4                  426         Not Allocated  
5                  10            1