ด้วยจำนวนกระบวนการ n รายการและขนาดของบล็อกหน่วยความจำ m และภารกิจคือการค้นหาบล็อกหน่วยความจำที่เหมาะสมที่สุดสำหรับกระบวนการที่เกี่ยวข้องโดยใช้อัลกอริธึมการจัดการหน่วยความจำที่พอดีอันดับแรก
อัลกอริธึมการจัดการหน่วยความจำ First Fit คืออะไร
มีอัลกอริธึมการแบ่งหน่วยความจำหลายแบบที่ระบบปฏิบัติการใช้เพื่อจัดสรรบล็อกหน่วยความจำให้กับกระบวนการต่างๆ เช่น -
- First Fit Algorithm
- Next Fit Algorithm
- อัลกอริธึมที่พอดีที่สุด
- อัลกอริทึมที่แย่ที่สุด
- Quick Fit Algorithm
First Fit Algorithm เป็นเทคนิคที่ง่ายที่สุดในการจัดสรรบล็อกหน่วยความจำให้กับกระบวนการทั้งหมด ในอัลกอริธึมนี้ ตัวชี้จะติดตามบล็อคว่างทั้งหมดในหน่วยความจำและยอมรับคำขอในการจัดสรรบล็อกหน่วยความจำให้กับกระบวนการที่จะมาถึง หลังจากที่ตัวชี้นั้นเริ่มค้นหาบล็อกว่างแรกที่ใหญ่ที่สุดสำหรับกระบวนการและจัดสรรบล็อกหน่วยความจำนั้นให้กับกระบวนการที่จะมาถึง ในส่วนนี้ จะมีการสร้างพาร์ติชั่นสองพาร์ติชั่น พาร์ติชั่นหนึ่งสำหรับรู และพาร์ติชั่นหนึ่งสำหรับจัดเก็บกระบวนการ
ข้อได้เปรียบ ของการใช้ First Fit Algorithm คือการจัดสรรหน่วยความจำที่เร็วที่สุดให้กับกระบวนการที่กำลังมาถึง เนื่องจากจะจัดสรรอัลกอริทึม First Fit ที่ใหญ่ที่สุดให้กับกระบวนการใหม่
ข้อเสีย ของการใช้ First Fit Algorithm คือการสูญเสียความจำซึ่งจะนำไปสู่การขาดหน่วยความจำสำหรับกระบวนการอื่นๆ
ตัวอย่าง
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; // 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 ; }
ผลลัพธ์
Process No. Process Size Block no. 1 200 1 2 47 1 3 212 4 4 426 Not Allocated 5 10 1