블록 크기와 프로세스 크기를 포함하는 두 개의 배열이 제공됩니다. 작업은 메모리 관리에서 Best Fit 알고리즘에 따라 결과를 인쇄하는 것입니다.
최적 맞춤 알고리즘이란 무엇입니까?
Best Fit은 메모리 관리 알고리즘입니다. 요청 프로세스의 요구 사항을 충족하는 가장 작은 여유 파티션 할당을 처리합니다. 이 알고리즘에서 우리는 전체 메모리 블록을 찾고 프로세스에 가장 작고 가장 적합한 블록을 확인한 다음 적절한 프로세스를 수행하는 데 사용할 수 있는 인접 블록을 찾습니다.
따라서 블록 크기와 프로세스 크기를 가져와서 프로세스의 출력과 프로세스에 할당할 블록을 반환합니다.
예시
Input: bsize[] = {100, 500, 200, 300, 400} psize[] = {112, 518, 110, 526} Output: Process No. Process Size Block no. 1 112 3 2 518 Not Allocated 3 110 4 4 526 Not Allocated
위의 문제를 해결하기 위해 접근 방식을 사용할 것입니다 -
- 프로세스 광고 블록 크기를 입력합니다.
- 처음에는 모든 메모리 블록을 여유 공간으로 설정합니다.
- 각 프로세스를 취하여 블록에 할당할 수 있는 최소 블록 크기를 구하면 전체 블록 중 프로세스 크기보다 큰 최소 블록을 의미합니다.
- 발견되면 현재 프로세스에 할당하고 그렇지 않으면 해당 프로세스를 종료하고 추가 프로세스를 확인합니다.
알고리즘
Start Step 1-> In function void bestfit(int bsize[], int m, int psize[], int n) Declare int alloc[n] Call function memset(alloc, -1, sizeof(alloc)) Loop For i=0 and i<n and i++ Declare and Initialize bestIdx = -1 Loop For j=0 and j<m and j++ If bsize[j] >= psize[i] then, If bestIdx == -1 then, Set bestIdx = j Else If bsize[bestIdx] > bsize[j] then, Set bestIdx = j If bestIdx != -1 then, Set alloc[i] = bestIdx Set bsize[bestIdx] -= psize[i] Loop For i = 0 and i < n and i++ Print i+1, psize[i] If alloc[i] != -1 Print alloc[i] + 1 Else Print "Not Allocated" Print newline Step 2->In function int main() Declare and initialize bsize[] = {100, 500, 200, 300, 400} Declare and initialize psize[] = {112, 518, 110, 526} Set m = sizeof(bsize)/sizeof(bsize[0]) Set n = sizeof(psize)/sizeof(psize[0]) Call function bestfit(bsize, m, psize, n) Stop
예시
#include <iostream> #include <memory> using namespace std; // To allocate the memory to blocks as per Best fit // algorithm void bestfit(int bsize[], int m, int psize[], int n) { // To store block id of the block allocated to a // process int alloc[n]; // Initially no block is assigned to any process memset(alloc, -1, sizeof(alloc)); // pick each process and find suitable blocks // according to its size ad assign to it for (int i=0; i<n; i++) { // Find the best fit block for current process int bestIdx = -1; for (int j=0; j<m; j++) { if (bsize[j] >= psize[i]) { if (bestIdx == -1) bestIdx = j; else if (bsize[bestIdx] > bsize[j]) bestIdx = j; } } // If we could find a block for current process if (bestIdx != -1) { // allocate block j to p[i] process alloc[i] = bestIdx; // Reduce available memory in this block. bsize[bestIdx] -= psize[i]; } } cout << "\nProcess No.\tProcess Size\tBlock no.\n"; for (int i = 0; i < n; i++) { cout << " " << i+1 << "\t\t\t\t" << psize[i] << "\t\t\t\t"; if (alloc[i] != -1) cout << alloc[i] + 1; else cout << "Not Allocated"; cout << endl; } } // Driver code int main() { int bsize[] = {100, 500, 200, 300, 400}; int psize[] = {112, 518, 110, 526}; int m = sizeof(bsize)/sizeof(bsize[0]); int n = sizeof(psize)/sizeof(psize[0]); bestfit(bsize, m, psize, n); return 0 ; }
출력
Process No. Process Size Block no. 1 112 3 2 518 Not Allocated 3 110 4 4 526 Not Allocated