Một ví dụ thực tế trong công việc liên quan đến virtual memory

Cùng Nhau Học Linux Kernel
Cùng Nhau Học Linux Kernel
24 bài viết — 32 Người theo dõi |
0
0

Theo chương trình vài ngày một topic, hôm nay topic của mình muốn chia sẻ liên quan đến virtual memory.

Hồi xưa trong dự án của mình có một requirement yêu cầu phải chia sẻ thông tin giữa 2 process với nhau. Cách đơn giản nhất là qua file nhưng qua file thì tốc độ chậm quá, nên mình nghĩ đến việc chia sẻ thông tin qua bộ nhớ thì nhanh hơn.

Các bạn có biết hồi đấy mình làm thế nào để chia sẻ bộ nhớ của 2 process với nhau không ạ. Trong process A mình malloc 1 con trỏ P, sau đó mình in địa chỉ của con trỏ P đang trỏ đến ra 1 file trên ổ cứng. Trên process B mình đọc file đó để lấy địa của con trỏ P đang trỏ đến, sau đó mình gán nó cho 1 con trỏ khác, cuối cùng mình đọc/ghi dữ liệu thông qua con trỏ đó. ??

Mọi người có thấy cách này đơn giản mà hiệu quả không ạ. Thật là easy game, mỗi tội lúc chạy thử thì thằng process B toàn crash, mặc dù mình đã check NULL trước khi truy cập vào con trỏ P. Về sau mình tìm hiểu thì hóa ra là tại cơ chế virtual memory của hệ điều hành.

Virtual memory có thể hiểu đơn giản là hệ điều hành cung cấp cho mỗi một process 1 không gian địa chỉ bộ nhớ riêng. Nó khiến cho process cảm giác như nó đang 1 mình sử dụng toàn bộ không gian bộ nhớ, trong không gian ấy có mỗi 1 mình nó tồn tại, không hề có sự hiện diện của process khác. Trong không gian bộ nhớ đó thì địa chỉ của các biến, function, instruction được đánh địa chỉ tuần tự và liền nhau. Thường các địa chỉ sẽ được bắt đầu từ 1 địa chỉ cố định, địa chỉ đó phụ thuộc vào từng OS. Vậy là giữa process A và B hoàn toàn có thể có chung 1 biến với cùng 1 địa chỉ virtual. Khi A và B tham chiếu đến biến đó, chúng tham chiếu thông qua địa chỉ virtual đó.

Tuy nhiên, hệ điều hành đính kèm vào mỗi 1 process 1 bảng gọi là bảng phân trang. Bảng đó sẽ có 2 hàng, 1 hàng là địa chỉ virtual, 1 hàng là địa chỉ vật lý. Mỗi khi process tham chiếu vào 1 địa chỉ bất kỳ, bộ MMU (thông dịch địa chỉ virtual sang physical) sẽ tự động tìm trong bảng đó để lấy ra địa chỉ vật lý tương ứng. Sau khi có được địa chỉ vật lý, MMU trả lại địa chỉ đó cho CPU, CPU dùng nó để lấy ra dữ liệu đang được lưu trên ram.

Đến đây thì mình đang hiểu ra vấn đề của mình, cùng là 1 địa chỉ nhưng ở process A đang trỏ đến 1 chỗ, trong khi ở process B lại trỏ đến 1 vị trí khác. Nguyên nhân bởi cả 2 địa chỉ đó đều là virtual address chứ không phải là physical address.

Link tham khảo cho bạn nào muốn try hard: Virtual memory

Cảm ơn mọi người đã đọc bài.

** Nếu bạn muốn viết các nội dung đặt biệt thì hãy làm theo hướng dẫn sau

Xem thêm 10 bình luận
Viết blog mới của bạn
Báo lỗi trang
Đang tải