โจทย์
กำหนด n โปรเซสและ m ขนาดบล็อกหน่วยความจำ งานคือหาบล็อกหน่วยความจำที่เหมาะสมที่สุดสำหรับโปรเซสที่สอดคล้องกันโดยใช้อัลกอริทึม First Fit memory management
First Fit Memory Management Algorithm คืออะไร?
มีอัลกอริทึมการแบ่งพื้นที่หน่วยความจำหลายตัวที่ระบบปฏิบัติการใช้เพื่อจัดสรรบล็อกหน่วยความจำให้โปรเซส เช่น -
- First Fit Algorithm
- Next Fit Algorithm
- Best Fit Algorithm
- Worst Fit Algorithm
- Quick Fit Algorithm
First Fit Algorithm เป็นเทคนิคที่ง่ายที่สุดในการจัดสรรบล็อกหน่วยความจำให้โปรเซส ในอัลกอริทึมนี้ ตัวชี้จะติดตามบล็อกว่าทั้งหมดในหน่วยความจำ และรับคำขอจัดสรรบล็อกหน่วยความจำให้โปรเซสที่จะมา หลังจากนั้นตัวชี้เริ่มค้นหาบล็อกว่าที่ใหญ่ที่สุดที่พบก่อนสำหรับโปรเซสและจัดสรรบล็อกหน่วยความจำนั้นให้โปรเซสที่จะมา ในนี้มีการสร้างสอง partition หนึ่งสำหรับ hole และอีกหนึ่งจะเก็บโปรเซส
ข้อดี ของการใช้ First Fit Algorithm คือการจัดสรรหน่วยความจำให้โปรเซสที่มาถึงเร็วที่สุด เนื่องจากจัดสรร first fit algorithm ที่ใหญ่ที่สุดให้โปรเซสใหม่
ข้อเสีย ของการใช้ 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
แนวทางที่ใช้ในโปรแกรมต่อไปนี้
- รับบล็อกและโปรเซสในอาเรย์
- ตั้งค่าบล็อกหน่วยความจำทั้งหมดเป็นว่าง
- ตรวจสอบถ้า (ขนาดโปรเซส) <= (ขนาดบล็อกหน่วยความจำ) แล้วจัดสรรโปรเซสให้บล็อกหน่วยความจำ
- มิฉะนั้น วนลูปตรวจสอบบล็อกอื่นๆ จนกว่า (ขนาดโปรเซส) <= (ขนาดบล็อกหน่วยความจำ) จะเป็นจริง
อัลกอริทึม
เริ่ม
ขั้นตอน 1 → ประกาศฟังก์ชันคำนวณ best fit memory block
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 i = 0 ถึง total_process และ i++
วนลูป for j = 0 ถึง total_blocks และ j++
ถ้า block_size[j] >= process_size[i]
ตั้งค่า allocation[i] = j
ตั้งค่า block_size[j] -= process_size[i]
จบถ้า
จบวน
จบวน
วนลูป For i = 0 ถึง total_process และ i++
ถ้า allocation[i] != -1
ตั้งค่า allocation[i] + 1
จบถ้า
มิฉะนั้น
พิมพ์ Not Allocated
จบมิฉะนั้น
จบวน
ขั้นตอน 2 → ใน 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 processes int total_process = sizeof(process_size) / sizeof(process_size[0])
เรียก First_Fit(block_size, total_blocks, process_size, total_process)
หยุด
ตัวอย่างโค้ด C++
#include<bits/stdc++.h>
using namespace std;
// ฟังก์ชันจัดสรรหน่วยความจำให้บล็อกตาม 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));
// ลูปนี้จะเลือกแต่ละโปรเซสและจัดสรร first fit block ให้
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