Skip to main content

Command Palette

Search for a command to run...

Quản lý bộ nhớ

Updated
5 min read

1. Địa chỉ vật lý và địa chỉ logic

Địa chỉ vật lý là địa chỉ thực trên RAM, là địa chỉ mà CPU cuối cùng sử dụng để truy cập bộ nhớ, thông qua khối quản lý bộ nhớ (MMU).

Địa chỉ logic là địa chỉ được gán cho các lệnh và dữ liệu khi chương trình chạy. CPU nhìn thấy và sử dụng các địa chỉ logic này để trỏ đến các phần khác nhau của lệnh và dữ liệu. Vùng không gian địa chỉ này gọi là không gian nhớ logic.

Như chúng ta đã biết mỗi tiến trình có không gian địa chỉ riêng như code/text, data, bss, heap, stack. Những địa chỉ này nằm trên không gian nhớ logic.

Khi chương trình chạy, địa chỉ logic cần được biến đổi thành địa chỉ vật lý nhờ một module phần cứng gọi là khối quản lý bộ nhớ (Memory Management Unit - MMU).

Như vậy để dễ quản lý và lập trình, địa chỉ logic là liên tục nhưng khi ánh xạ sang địa chỉ vật lý các địa chỉ này có thể là các địa chỉ rải rác và không liền mạch.

2. Phân trang (paging)

Bộ nhớ vật lý được chia thành các khối nhỏ có kích thước cố định bằng nhau gọi là khung trang (page frame). Trên hệ điều hành windows, thông thường mỗi khung trang có kích thước 4KB.

Để xem kích thước này trên windows chúng ta có thể xem qua phần mềm RamMap, ở tab Physical Pages.

Đơn vị nhỏ nhất của bộ nhớ RAM là 1 byte. 4KB (0x1000) là kích thước một trang (page) / khung trang (page frame).

Không gian địa chỉ logic của tiến trình cũng được chia thành những khối có địa chỉ liền nhau gọi là trang (page) có kích thước bằng với kích thước của khung trang.

Mỗi tiến trình sẽ được cấp phát các khung trang trong bộ nhớ vật lý (RAM) để chứa các trang nhớ của mình. Địa chỉ của các khung trang này có thể nằm rải rác không liên tục trong RAM.

Vì mỗi tiến trình được cấp phát nhiều khung có kích thước nhỏ nằm rải rác trên bộ nhớ vật lý, nhờ vậy giảm đáng kể tình trạng phân mảnh ở trong RAM.

3. Ánh xạ địa chỉ

Để ánh xạ địa chỉ logic thành địa chỉ vật lý, mỗi tiến trình có một bảng gọi là bảng trang (page table), mỗi ô của bảng tương ứng với một trang và chứa số hiệu của khung trang trong bộ nhớ vật lý.

Ở ví dụ trên tiến trình A được cấp phát 2 trang ảo là 0 và 1. Được ánh xạ qua page table tương ứng tới 2 khung trang A0 và A1 trong bộ nhớ vật lý.

Tiến trình B được cấp phát 3 trang ảo là 0, 1 và 2. Được ánh xạ qua page table tương ứng tới 3 khung trang B0, B1 và B2 trong bộ nhớ vật lý.

Địa chỉ vật lý được CPU truy cập sẽ được tính theo công thức

Page Frame Number là chỉ số của khung trang trong bộ nhớ vật lý.

Khi phần mềm đưa cho CPU một địa chỉ ảo, cách CPU tìm ra địa chỉ vật lý được diễn ra như sau.

Đầu tiên CPU sẽ căn cứ vào địa chỉ này để tính ra địa chỉ này tương ứng với số hiệu trang ảo (Virtual Page Number) là bao nhiêu và tính từ đầu trang ảo thì Offset là bao nhiêu.

CPU tra bảng trang để tìm ra số hiệu khung trang vật lý (Page Frame Number - PFN) tương ứng.

Sau khi có hai thông số này, CPU sử dụng công thức trên để tra ra địa chỉ vật lý.

Trên thực tế để tăng tốc quá trình truy cập địa chỉ, CPU sử dụng bộ nhớ cache TLB là bộ nhớ cache phần cứng dùng để lưu ánh xạ từ Virtual Page Number sang Page Frame Number. CPU sẽ tra TLB trước, nếu TLB miss mới truy cập page table trong RAM để lấy PFN.

Sau khi có địa chỉ vật lý, CPU tiếp tục truy cập cache dữ liệu L1/L2/L3 trước khi truy cập xuống RAM.

4. Lỗi trang (Page Fault) và Demand Paging

Lỗi trang (Page Fault) là một sự kiện xảy ra khi CPU không thể hoàn tất việc ánh xạ từ địa chỉ ảo sang địa chỉ vật lý do chưa có khung trang vật lý hợp lệ trong RAM, hoặc do vi phạm quyền truy cập bộ nhớ.

Page Fault xảy ra khi

  • CPU truy cập một địa chỉ ảo

  • Trang tương ứng chưa có trong RAM, hoặc

  • Trang tồn tại nhưng không được phép truy cập (vi phạm quyền read/write/execute)

  • Bảng trang (page table) không có ánh xạ hợp lệ cho trang đó

Demand Paging là một chính sách quản lý bộ nhớ mà hệ điều hành triển khai dựa trên cơ chế Page Fault.
Theo chính sách này, hệ điều hành không nạp toàn bộ chương trình vào RAM ngay từ đầu nhằm tránh lãng phí bộ nhớ, thay vào đó, các trang ảo chỉ được nạp vào RAM khi chương trình thực sự truy cập đến chúng.

Khi chương trình truy cập một trang lần đầu tiên, do trang đó chưa được cấp khung trang vật lý, nên Page Fault xảy ra. Lúc này, hệ điều hành sẽ:

  • Cấp phát một Page Frame vật lý mới, hoặc

  • Đọc nội dung trang từ disk (pagefile hoặc file backing) vào RAM

Sau đó, hệ điều hành cập nhật bảng trang và cho phép CPU thực thi lại lệnh gây ra Page Fault.

Việc sử dụng cơ chế Demand Paging giúp tránh lãng phí bộ nhớ vật lý, đồng thời cho phép hệ điều hành chạy song song nhiều chương trình hơn trên cùng một hệ thống.

Cơ chế Demand Paging và Page Fault được ứng dụng trực tiếp trong các API ánh xạ bộ nhớ như mmap (trên Linux/Unix) hoặc memory-mapped file trên Windows.

Cơ chế này cho phép giải quyết các bài toán xử lý file dữ liệu lớn trong khi vẫn tiết kiệm RAM, nhờ chỉ nạp vào bộ nhớ những phần dữ liệu thực sự được truy cập. Chủ đề này sẽ được trình bày chi tiết hơn trong một bài viết riêng về lập trình ánh xạ bộ nhớ.

The End.

More from this blog

U40 Học Code - Lập trình & Hệ điều hành

11 posts