Khi chương trình của bạn đọc địa chỉ 0x400000, đó gần như chắc chắn không phải vị trí thật trên thanh RAM. Đó là một địa chỉ ảo, và giữa nó với ô nhớ vật lý có một lớp phiên dịch âm thầm chạy ở mỗi lần truy cập — bộ quản lý bộ nhớ của CPU dịch địa chỉ ảo sang địa chỉ vật lý ngay trong lúc chạy, hàng tỉ lần mỗi giây, nhanh đến mức không ai để ý nó tồn tại. Lớp trung gian tưởng như thừa thãi này lại là nền móng cho gần như mọi tính chất tốt đẹp mà bạn coi là hiển nhiên ở một hệ điều hành hiện đại.
Lợi ích của lớp trung gian

Cách ly. Tiến trình A đơn giản không có cách nào chạm vào bộ nhớ của tiến trình B, vì bảng ánh xạ của A không hề chứa lối tới đó — không phải bị cấm, mà là không tồn tại đường đi. Đây là lý do một chương trình lỗi chỉ làm hỏng chính nó chứ không kéo cả máy sập, và là hàng phòng thủ đầu tiên chống lại một tiến trình độc hại đọc trộm dữ liệu của tiến trình khác.
Liên tục giả. Chương trình nhìn thấy một dải bộ nhớ liền mạch, đẹp đẽ, đánh số từ 0 — dù thực tế các mảnh của nó nằm rải rác khắp RAM, xen kẽ với mảnh của hàng chục chương trình khác. Lớp ánh xạ khâu những mảnh rời đó lại thành một ảo giác liên tục, giải phóng lập trình viên khỏi việc phải biết bộ nhớ thật đang phân mảnh ra sao.
Chia sẻ thông minh. Khi mười tiến trình cùng dùng một thư viện chung, mã của thư viện đó chỉ cần nằm một bản duy nhất trong RAM; bảng ánh xạ của cả mười tiến trình đều trỏ tới cùng vùng vật lý đó. Đây là một khoản tiết kiệm khổng lồ mà bạn không bao giờ nhìn thấy — và cũng là lý do các con số bộ nhớ trong công cụ theo dõi hay gây hiểu lầm, như sẽ nói ở cuối.
Trang, lỗi trang và tráo đổi
Bộ nhớ không được ánh xạ từng byte một — quá tốn kém — mà theo từng khối gọi là trang, thường 4KB. Và điểm tinh tế nhất: hệ điều hành không nạp sẵn mọi trang một chương trình khai báo. Nó chờ đến khi chương trình thật sự chạm vào một trang mới nạp trang đó — một chiến lược lười biếng nhưng cực kỳ hiệu quả, vì phần lớn chương trình không bao giờ dùng hết bộ nhớ chúng xin.

Khi chương trình chạm vào một trang chưa được nạp, CPU sinh ra một lỗi trang và trao quyền điều khiển cho nhân. Nhân đi tìm dữ liệu cần thiết — có thể là đọc từ một tệp trên ổ đĩa, có thể là cấp một trang trống — nạp nó vào RAM, cập nhật bảng ánh xạ, rồi trả quyền cho chương trình chạy tiếp như thể chưa có gì gián đoạn. Từ góc nhìn của chương trình, nó chỉ đọc một ô nhớ; toàn bộ vở kịch nạp trang diễn ra sau tấm màn.
Cơ chế này giải thích một trong những hiện tượng khó chịu nhất mà ai cũng từng gặp: vì sao máy hết RAM thì chậm đến khủng khiếp. Khi RAM đầy, hệ điều hành buộc phải đẩy bớt các trang ít dùng ra ổ đĩa để lấy chỗ — gọi là tráo đổi. Sau đó, mỗi lần chương trình chạm vào một trang đã bị đẩy đi, nó phải chờ đọc lại từ ổ đĩa, chậm hơn RAM tới hàng nghìn lần. Máy không chậm vì thiếu sức tính — CPU thường vẫn còn rảnh rỗi — mà vì nó đang dành phần lớn thời gian đứng chờ ổ đĩa lôi các trang qua lại. Đây là lý do thêm RAM thường chữa được một máy ì ạch hiệu quả hơn nhiều so với đổi CPU nhanh hơn.
Các con số trong top có ý nghĩa gì
Hiểu bộ nhớ ảo giúp đọc đúng những con số mà công cụ theo dõi hiển thị — thứ gây hiểu lầm cho rất nhiều người:
- VIRT — tổng không gian ảo mà tiến trình đã đăng ký. Con số này thường rất lớn và phần lớn vô nghĩa, vì nó gồm cả những vùng chương trình xin nhưng chưa bao giờ chạm tới. Một VIRT khổng lồ hầu như không nói lên điều gì về mức tiêu thụ thật.
- RES — phần thật sự đang nằm trong RAM vật lý ngay lúc này. Đây mới là con số đáng nhìn khi hỏi "tiến trình này đang ăn bao nhiêu bộ nhớ".
- SHR — phần trong RES đang được chia sẻ với các tiến trình khác, chủ yếu là mã của các thư viện chung.
Có một cái bẫy số học đáng nhớ: nếu bạn cộng cột RES của mọi tiến trình lại, tổng thường lớn hơn dung lượng RAM thật của máy — điều nghe vô lý cho tới khi bạn nhớ ra vì sao. Phần bộ nhớ dùng chung bị đếm vào RES của từng tiến trình cùng dùng nó, nên nó bị cộng nhiều lần. Máy không hề có nhiều RAM hơn nó có; chỉ là cùng một vùng vật lý xuất hiện trong sổ sách của nhiều tiến trình — đúng như thiết kế chia sẻ thông minh ở phần đầu. Biết điều này giúp bạn khỏi hoảng khi thấy các con số cộng lại "vượt" RAM, và khỏi tin nhầm rằng máy đang quá tải trong khi thực ra nó đang tiết kiệm rất khéo.
Thảo luận