Cấp phát bộ nhớ là một quá trình của hệ điều hành giúp gán các không gian bộ nhớ cho các tiến trình hoặc chương trình để chúng lưu dữ liệu và thực thi các instructions.
Bộ nhớ chính sẽ được chia làm hai loại:
- Bộ nhớ cấp thấp: hệ điều hành sử dụng bộ nhớ này.
- Bộ nhớ cấp cao: các tiến trình người dùng sẽ được chạy ở đây.
Có các cách cấp phát bộ nhớ sau:
- Contiguous allocation
- Non-contigous allocation
- Dynamic allocation
Contiguous Memory Allocation
Trong cách cấp phát này, hệ điều hành gán các blocks liên tục trong bộ nhớ cho các tiến trình thông qua các thuật toán sau:
- First fit: cấp phát các vùng nhớ trống được tìm thấy đầu tiên mà thỏa mãn yêu cầu.
- Best fit: tạo ra ít vùng nhớ dư nhất.
- Worst fit: tạo ra nhiều vùng nhớ dư nhất.
- Next fit: tương tự first fit nhưng tìm kiếm các vùng nhớ trống từ cuối bộ nhớ.
Info
Cấp phát theo kiểu liên tục có thể rất nhanh và hiệu quả nhưng có thể dẫn đến vấn đề phân mảnh bộ nhớ (Fragmentation).
Giả sử ta có ba vùng nhớ: R1: 512 KB, R2: 250 KB và R3: 700 KB
Cùng với các tiến trình với các nhu cầu sử dụng bộ nhớ như sau: P1: 100 KB, P2: 400 KB và P3: 200 KB
Áp dụng các cách cấp phát trên:
- First fit:
- R1 cho P1 và P2. R1 → 12 KB
- R2 cho P3. R2 → 50 KB
- R3 = 700 KB
- Best fit:
- R2 cho P1. R2 → 150 KB
- R1 cho P2. R1 → 112 KB
- R3 cho P3. R3 → 500 KB
- Worst fit:
- R3 cho P1 và P2. R3 → 200 KB
- R1 cho P3. R1 → 312 KB
- R2 = 250 KB
- Next fit:
- R3 → P1, P2 và P3. R3 → 0 KB
- R2 = 250 KB
- R1 = 512 KB.
Non-contiguos Allocation
Cấp phát bộ nhớ cho các tiến trình bằng các blocks không liên tục. Có thể thực hiện thông qua phân đoạn (Segmentation) hoặc phân trang (Paging).
Cấp phát không liên tục mặc dù linh động hơn so với cấp phát liên tục nhưng có hiệu suất không cao do cần phải thực hiện nhiều thao tác phức tạp chẳng hạn như tra cứu bảng trang hay chuyển đổi địa chỉ.
Dynamic Allocation
Cho phép các tiến trình sử dụng các hàm chẳng hạn như malloc() hay new() để xin thêm bộ nhớ trong lúc thực thi.
Khi sử dụng cách cấp phát này, chúng ta cần phải kiểm soát chặt chẽ việc sử dụng bộ nhớ. Nếu không thì có thể gây ra các vấn đề chẳng hạn như rò rỉ bộ nhớ (Memory leak), phân đoạn (Fragmentation) hay là tràn bộ nhớ đệm (Buffer overflow).