14
Giới thiệu cơ chế bộ nhớ ảo (virtual memory) Giới thiệu Nhu cầu của người dùng ngày càng tăng, dẫn tới số lượng các chương trình nằm trong RAM ngày càng nhiều, kích thước của các chương trình cũng ngày càng lớn. Tốc độ tăng trưởng về cả số lượng lẫn kích thước của các chương trình thậm chí còn nhanh hơn cả tốc độ nâng cấp RAM. Điều này đã buộc ta phải quản lý bộ nhớ sao cho hiệu quả. Các hệ thống hiện nay thường áp dụng cơ chế bộ nhớ ảo (virtual memory) để quản lý bộ nhớ. Bài học này sẽ tập trung làm rõ cơ chế bộ nhớ ảo là gì. Nội dung của bài học gồm: Vì sao cơ chế virtual memory ra đời? Mục tiêu hướng tới của cơ chế virtual memory là gì? Cơ chế virtual memory được triển khai như thế nào? Cơ chế virtual memory quản lý bộ nhớ ra sao? Ưu nhược điểm của cơ chế virtual memory là gì? Vì sao cơ chế virtual memory ra đời? Thông thường, ta sử dụng một ngôn ngữ bậc cao (như C, C++, Java,...) để lập trình. Kết quả, ta thu được các file gọi là mã nguồn (source code). Nhưng vì CPU chỉ hiểu được mã máy hay còn gọi là mã nhị phân (binary code), nên ta phải chuyển đổi mã nguồn thành mã máy. Tùy vào ngôn ngữ lập trình, phương pháp chuyển đổi có thể là biên dịch (compile) hoặc thông dịch (interpret). Hình 1. Sử dụng gcc để biên dịch mã nguồn C thành mã máy Ví dụ, ta có thể sử dụng chương trình gcc để biên dịch mã nguồn C thành mã máy (hình 1). Kết quả, ta thu được một file thực thi có định dạng ELF ( Executable and Linkable Format). Để tìm hiểu cấu tạo của file thực thi này, ta có thể sử dụng các công cụ như readelf hoặc objdump . Chẳng hạn, nếu sử dụng lệnh objdump -D -S hello , ta sẽ thấy rằng, file thực thi này là một chuỗi các byte nhị phân, được chia thành nhiều section. Mỗi byte được gắn một con số để định địa chỉ (hình 2). Tập hợp các con số này được gọi là không gian địa chỉ của chương trình hay program address space. Khái niệm không gian địa chỉ còn xuất hiện trong nhiều lĩnh vực khác, ví dụ: không gian địa chỉ để đánh số nhà (street address space), không gian để đánh biển số xe (vehicle address space), không gian địa chỉ IP (IP address space), không gian tên miền

Giới thiệu cơ chế bộ nhớ ảo (virtual memory)

  • Upload
    others

  • View
    2

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Giới thiệu cơ chế bộ nhớ ảo (virtual memory)

Giới thiệu cơ chế bộ nhớ ảo (virtual memory)

Giới thiệu

Nhu cầu của người dùng ngày càng tăng, dẫn tới số lượng các chương trình nằm trong RAM ngày càng nhiều,kích thước của các chương trình cũng ngày càng lớn. Tốc độ tăng trưởng về cả số lượng lẫn kích thước củacác chương trình thậm chí còn nhanh hơn cả tốc độ nâng cấp RAM. Điều này đã buộc ta phải quản lý bộ nhớsao cho hiệu quả.

Các hệ thống hiện nay thường áp dụng cơ chế bộ nhớ ảo (virtual memory) để quản lý bộ nhớ. Bài học này sẽtập trung làm rõ cơ chế bộ nhớ ảo là gì. Nội dung của bài học gồm:

Vì sao cơ chế virtual memory ra đời?Mục tiêu hướng tới của cơ chế virtual memory là gì?Cơ chế virtual memory được triển khai như thế nào?Cơ chế virtual memory quản lý bộ nhớ ra sao?Ưu nhược điểm của cơ chế virtual memory là gì?

Vì sao cơ chế virtual memory ra đời?

Thông thường, ta sử dụng một ngôn ngữ bậc cao (như C, C++, Java,...) để lập trình. Kết quả, ta thu được cácfile gọi là mã nguồn (source code). Nhưng vì CPU chỉ hiểu được mã máy hay còn gọi là mã nhị phân (binarycode), nên ta phải chuyển đổi mã nguồn thành mã máy. Tùy vào ngôn ngữ lập trình, phương pháp chuyển đổicó thể là biên dịch (compile) hoặc thông dịch (interpret).

Hình 1. Sử dụng gcc để biên dịch mã nguồn C thành mã máy

Ví dụ, ta có thể sử dụng chương trình gcc để biên dịch mã nguồn C thành mã máy (hình 1). Kết quả, ta thuđược một file thực thi có định dạng ELF (Executable and Linkable Format).

Để tìm hiểu cấu tạo của file thực thi này, ta có thể sử dụng các công cụ như readelf hoặc objdump. Chẳng hạn,nếu sử dụng lệnh objdump -D -S hello, ta sẽ thấy rằng, file thực thi này là một chuỗi các byte nhị phân, đượcchia thành nhiều section. Mỗi byte được gắn một con số để định địa chỉ (hình 2). Tập hợp các con số này đượcgọi là không gian địa chỉ của chương trình hay program address space. Khái niệm không gian địa chỉ còn xuấthiện trong nhiều lĩnh vực khác, ví dụ: không gian địa chỉ để đánh số nhà (street address space), không gian đểđánh biển số xe (vehicle address space), không gian địa chỉ IP (IP address space), không gian tên miền

Page 2: Giới thiệu cơ chế bộ nhớ ảo (virtual memory)

(domain name address space)…

Hình 2. Các lệnh/dữ liệu trong file thực thi của chương trình được đánh địa chỉ

File thực thi gồm một số section quan trọng sau:

Section .text: chứa các lệnh của chương trình.Section .rodata: chứa các biến chỉ đọc (ví dụ được khai báo với từ khóa const).Section .data: chứa các biến toàn cục và biến tĩnh đã được khởi tạo.Section .bss: chứa các biến toàn cục và biến tĩnh chưa được khởi tạo.

Page 3: Giới thiệu cơ chế bộ nhớ ảo (virtual memory)

Hình 3. Cấu trúc của file thực thi trên ổ cứng và bố cục của tiến trình trên RAM

Sau khi biên dịch xong, ta mới chỉ thu được một chương trình nằm trên ổ cứng. Nhưng để CPU có thể thực thichương trình, thì các lệnh và dữ liệu của chương trình đó cần được đưa vào RAM. Cụ thể, khi người dùng khởichạy chương trình, hệ điều hành sẽ tìm kiếm một vùng nhớ trống trên RAM, rồi đưa các section của chươngtrình vào vùng nhớ đó, tạo thành một tiến trình. Ngoài ra, hệ điều hành còn thiết lập thêm vùng stack segment(để chứa biến cục bộ của các hàm) và vùng heap segment (để chứa biến cấp phát động). Toàn bộ vùng nhớ

Page 4: Giới thiệu cơ chế bộ nhớ ảo (virtual memory)

của tiến trình trên RAM gọi là ảnh của tiến trình hay process image (hình 3). Từng byte trong process imagecũng được đánh địa chỉ. Tập hợp các địa chỉ này được gọi là không gian địa chỉ của tiến trình (process addressspace). Trong hệ thống sử dụng CPU 32 bit, thì không gian địa chỉ của tiến trình rộng 4GB, tức là có khoảng 4 tỉsố được dùng để đánh địa chỉ.

Câu hỏi đặt ra là: phải chăng cần đưa toàn bộ chương trình vào một vùng nhớ liên tục trên RAM? Trong một sốhệ thống, khi khởi chạy một chương trình, hệ điều hành sẽ tìm một vùng nhớ liên tục đủ lớn trên RAM, rồi đưatoàn bộ chương trình vào. Điều này giúp cho:

Các lệnh và dữ liệu luôn trong trạng thái sẵn sàng truy cập.Việc quản lý bộ nhớ trở nên đơn giản.

uCLinux là một ví dụ điển hình cho nguyên tắc nói trên. Tuy nhiên, cơ chế quản lý bộ nhớ này có những nhượcđiểm sau:

Không thực thi được các chương trình có kích thước lớn hơn RAM.Khó tìm ra vùng nhớ đủ lớn để chứa chương trình.

Do đó, cơ chế quản lý này chỉ thích hợp trong các hệ thống ít tác vụ và các tác vụ ít thay đổi trong lúc chạy.Mặt khác, ta không cần phải đưa toàn bộ chương trình vào RAM. Lý do là vì:

Thứ nhất, luồng thực thi của tiến trình hầu như chỉ chạy qua một vài đoạn mã (đoạn code), chứ ít khichạy qua tất cả các đoạn mã của chương trình. Ví dụ, trong cấu trúc rẽ nhánh if-else, đoạn mã else xử lýngoại lệ ít khi được thực thi, do đó chỉ cần đưa đoạn mã if vào RAM. Chỉ khi nào cần thực thi, đoạn mãtrong else mới được đưa vào RAM.Thứ hai, có nhiều tính năng của chương trình hiếm khi được sử dụng. Nên những đoạn mã triển khai chocác tính năng đó cũng không cần thiết phải được đưa vào RAM.Thứ ba, ngay cả khi tất cả các đoạn mã của chương trình đều cần thiết, nhưng do CPU chỉ thực thi lầnlượt các lệnh, nên các đoạn mã này cũng không được thực thi đồng thời. Tại một thời điểm, chỉ cần vàiđoạn mã trong RAM là đủ.

Trong các hệ thống đòi hỏi tính đa nhiệm cao độ (multi-task) và các tác vụ thường xuyên thay đổi, cơ chế virtualmemory sẽ được áp dụng để quản lý bộ nhớ nhằm khắc phục những vấn đề nêu trên. Mặc dù cơ chế này phứctạp hơn nhưng sẽ làm tăng hiệu quả sử dụng bộ nhớ.

Mục tiêu của cơ chế virtual memory là gì?

Ta mong đợi rằng, cơ chế virtual memory giúp ta đạt được 3 mục tiêu sau:

Không cần phải đưa toàn bộ tiến trình vào trong RAM.Vùng nhớ dành cho tiến trình trên RAM không cần liên tục.Một tiến trình không thể truy cập trái phép vào vùng nhớ của một tiến trình khác hoặc của hệ điều hành.

Cơ chế virtual memory được triển khai như thế nào?

Cơ chế virtual memory được triển khai trên cả phần cứng và phần mềm. Về mặt phần cứng, khối MMU(Memory Management Unit) được thêm vào hệ thống. Khối MMU được đặt giữa CPU và RAM, có nhiệm vụdịch địa chỉ do CPU phát ra (gọi là địa chỉ ảo hay virtual address) sang địa chỉ để truy cập RAM (gọi là địa chỉvật lý hay physical address). Trong thực tế, MMU thường được đóng gói cùng với CPU (hình 4).

Page 5: Giới thiệu cơ chế bộ nhớ ảo (virtual memory)

Hình 4. Triển khai cơ chế virtual memory trên phần cứng

Về mặt phần mềm, hệ điều hành sẽ:

chia RAM thành nhiều mảnh nhỏ, mỗi mảnh gọi là một frame. Các frame có kích thước giống nhau. Kíchthước này tùy từng hệ thống, nhưng thường là 4KB. Hệ điều hành tạo ra bảng MMT (Memory Map Table)để quản lý tất cả các frame trên RAM. Bảng MMT được lưu trên RAM.coi mỗi tiến trình có một không gian địa chỉ riêng. Không gian địa chỉ của mỗi tiến trình được chia thànhnhiều mảnh nhỏ, mỗi mảnh gọi là một page. Các page có kích thước giống nhau và giống với kích thướccủa frame. Tương ứng với mỗi tiến trình, hệ điều hành tạo ra một bảng Page Table để quản lý tất cả cácpage của một tiến trình. Các bảng Page Table cũng được lưu trên RAM.cập nhật lại thanh ghi Page Table pointer của MMU mỗi khi xảy ra context switch. Tức là, khi tiến trình Atạm dừng và tiến trình B chuẩn bị được CPU thực thi, hệ điều hành sẽ ghi địa chỉ bảng Page Table củatiến trình B vào thanh ghi Page Table pointer.

Page 6: Giới thiệu cơ chế bộ nhớ ảo (virtual memory)

Hình 5. Triển khai cơ chế virtual memory trên hệ điều hành

Để cho dễ hiểu, ta lấy ví dụ sau. Xét hệ thống có cấu hình CPU 32 bit, RAM 1GB. Giả sử, hệ thống quy địnhkích thước của page (frame) là 4KB.

Vì RAM là 1GB, nên sẽ có \({2^{18}}\) frame. Cũng có nghĩa là, bảng MMT có \({2^{18}}\) dòng. Nếu mỗidòng kích thước rộng 4 byte, thì bảng MMT có kích thước 1MB.Vì CPU 32 bit, nên kích thước tối đa của một tiến trình là 4GB. Như vậy, số page tối đa của một tiến trìnhlà \({2^{20}}\) page. Cũng có nghĩa là, bảng Page Table có \({2^{20}}\) dòng. Nếu mỗi dòng kích thướcrộng 4 byte, thì bảng Page Table có kích thước 4MB.

Cơ chế virtual memory quản lý bộ nhớ như thế nào?

Khi khởi tạo tiến trình, hệ điều hành sẽ:

tìm một số frame trống trên RAM rồi đưa một vài page của tiến trình vào đó.tạo ra bảng Page Table cho tiến trình và cập nhật lại bảng MMT.

Trước khi cho phép CPU thực thi một tiến trình, hệ điều hành sẽ ghi địa chỉ bảng Page Table của tiến trình đóvào thanh ghi Page Table pointer của MMU. Sau đó, CPU bắt đầu thực thi tiến trình.

Page 7: Giới thiệu cơ chế bộ nhớ ảo (virtual memory)

Hình 6. Cơ chế chuyển đổi địa chỉ ảo thành địa chỉ vật lý trong hệ thống 32 bit/page 4KB

Khi thực thi, mỗi khi muốn lấy 1 lệnh, CPU phát ra địa chỉ ảo của lệnh đó tới MMU. Từ địa chỉ ảo, MMU xácđịnh được lệnh đó thuộc page nào. Sau đó, MMU tra bảng Page Table để xem page đó nằm trong RAM chưa.

Nếu page đó đã nằm trong RAM, MMU sẽ xác định được frame nào chứa page, từ đó tính được địa chỉvật lý của lệnh (hình 6).Nếu page đó đang nằm trên ổ cứng, thì MMU sẽ gửi một Interrupt tới CPU. CPU thực hiện đoạn mã PageFault handler để xử lý Interrupt. Công việc chính của handler này là:

Nếu vẫn còn frame trống trên RAM, thì đưa page mới vào (hình 7).Nếu không còn frame trống nào, thì một page cũ sẽ bị đưa ra ổ cứng để nhường cho page mới. Việcchọn đưa page nào ra ổ cứng có thể dựa trên một số tiêu chí như: page đó ít được truy cập, hoặcpage đó đã nằm trong RAM quá lâu rồi,…

Page 8: Giới thiệu cơ chế bộ nhớ ảo (virtual memory)

Hình 7. Dịch địa chỉ ảo sang địa chỉ vật lý khi page cần truy cập không nằm trong RAM

Cơ chế virtual memory có những ưu nhược điểm gì?

Ưu điểm của cơ chế virtual memory là:

Vì CPU phát ra địa chỉ tách biệt với địa chỉ truy cập RAM, nênchương trình biên dịch không cần quan tâm rằng lúc chạy thì tiến trình được đặt ở đâu trong RAM.kích thước của chương trình không bị rằng buộc bởi kích thước của RAM. Do đó, kích thước củachương trình có thể lớn hơn RAM.các tiến trình không thể truy cập trái phép vào vùng nhớ của nhau và của hệ điều hành.

Vì chỉ cần mang một phần tiến trình vào RAM, nêncác tiến trình có kích thước lớn hơn RAM vẫn được thực thi một cách bình thường.tăng được số lượng tiến trình có trong RAM, từ đó giảm thời gian nghỉ của CPU, tức là nâng caohiệu quả sử dụng CPU.

Vì tiến trình không cần nằm liên tục trên RAM, nêndễ dàng tìm được không gian trên RAM cho tiến trình, giảm thời gian cấp phát bộ nhớ.frame nào của RAM cũng có thể sử dụng được, từ đó nâng cao hiệu quả sử dụng RAM.

Page 9: Giới thiệu cơ chế bộ nhớ ảo (virtual memory)

Tuy mang lại nhiều lợi ích, nhưng cơ chế này có những nhược điểm sau:

Thứ nhất, cơ chế quản lý này tuy hiệu quả nhưng phức tạp.Thứ hai, vì một số page không nằm trong RAM, nên khi cần truy cập lệnh/dữ liệu trên những page này, taphải chờ đưa những page đó vào trong RAM.Thứ ba, vì MMU phải tham chiếu bảng Page Table trên RAM, nên tốc độ truy cập lệnh/dữ liệu bị giảmxuống.Thứ tư, ta phải tốn một phần RAM để lưu bảng MMT và các bảng Page Table. Giả sử hệ thống CPU 32bit/RAM 1GB đang có 50 tiến trình. Nếu mỗi page có kích thước 4KB, thì tổng kích thước các bảng PageTable là 200MB, chiếm 20% RAM. Điều này phần nào làm mất đi tính hiệu quả sử dụng bộ nhớ của cơchế virtual memory.

Do đặc tính hoạt động của virtual memory, nên ta không thể khắc phục được hai nhược điểm đầu tiên. Đối vớihai nhược điểm sau, ta có thể giảm bớt mức độ ảnh hưởng. Ý tưởng khắc phục như sau:

Để khắc phục nhược điểm thứ ba, ta sẽ tích hợp một bảng TLB (Translation Lookside Buffers) bên trongMMU. Bảng này là bộ nhớ SRAM hoặc tập các thanh ghi, được dùng để chứa một phần bảng PageTable.Để khắc phục nhược điểm thứ tư, ta sẽ chỉ để một phần bảng Page Table trong RAM, còn lại sẽ để trên ổcứng.

Bảng TLB

Do chỉ có một số page của tiến trình thường xuyên được truy cập, nên chỉ có một số dòng của bảng Page Tablethường được tham chiếu tới. Nếu những dòng này nằm sẵn trong bảng TLB, thì sẽ giảm được số lần phải thamchiếu tới bảng Page Table. Nếu bảng TLB càng lớn, thì tham chiếu tới Page Table càng ít, nhưng giá thànhcủa MMU lại tăng lên.

Nếu thông tin của page cần truy cập đã có sẵn trong bảng TLB (TLB hit), thì địa chỉ vật lý được tạo ra ngay lậptức mà không cần tham chiếu tới Page Table (hình 8).

Page 10: Giới thiệu cơ chế bộ nhớ ảo (virtual memory)

Hình 8. Dịch địa chỉ ảo sang địa chỉ vật lý trong trường hợp TLB hit

Nếu thông tin của page cần truy cập chưa có trong bảng TLB (TLB miss), thì thông tin của page đó sẽ đượcđưa từ Page Table vào bảng TLB. Sau đó, quá trình dịch địa chỉ sẽ diễn ra (hình 9).

Page 11: Giới thiệu cơ chế bộ nhớ ảo (virtual memory)

Hình 9. Dịch địa chỉ ảo sang địa chỉ vật lý trong trường hợp TLB miss

Trong trường hợp TLB miss, nếu page cần truy cập cũng chưa nằm trên RAM, thì không những phải đưa thôngtin của page đó vào TLB, ta cũng cần phải đưa cả page đó vào trong RAM (hình 10).

Page 12: Giới thiệu cơ chế bộ nhớ ảo (virtual memory)

Hình 10. Dịch địa chỉ ảo sang địa chỉ vật lý trong trường hợp TLB miss và Page Fault

Cơ chế Multi-level page

Cũng do chỉ có một số page thường xuyên được truy cập, nên chỉ có một phần của bảng Page Table thườngđược tham chiếu tới. Do đó, ta chỉ cần để một phần của bảng Page Table trong RAM, phần còn lại để trên ổcứng, khi nào cần thì mới mang vào RAM.

Giả sử, bảng Page Table của mỗi tiến trình có kích thước 4MB. Nếu bảng này cũng được chia thành các page,mỗi page có kích thước 4KB, thì một bảng Page Table sẽ gồm 1024 page. Ứng với mỗi bảng Page Table, hệđiều hành sẽ tạo ra một bảng PDT (Page Directory Table) để quản lý 1024 page của bảng Page Table. Mỗidòng của bảng PDT được gọi là một Page Directory entry, sẽ chứa thông tin về một page của bảng PageTable, ví dụ: page đó của Page Table đang trên RAM hay trên ổ cứng, nếu trên RAM thì ở đâu, nếu trên ổ cứngthì ở đâu. Cơ chế này có tên là 2-level page.

Như vậy, ứng với mỗi tiến trình sẽ có một bảng PDT. Bảng PDT gồm 1024 dòng, mỗi dòng chứa thông tin về 1page của bảng Page Table. Mỗi page của bảng Page Table cũng gồm 1024 dòng, mỗi dòng chứa thông tin môtả 1 page của tiến trình. Ta chỉ cần lưu bảng PDT và một vài page của Page Table trong RAM là được.

Page 13: Giới thiệu cơ chế bộ nhớ ảo (virtual memory)

Hình 11. Minh họa cơ chế 2-level page

Tuy nhiên, cần lưu ý rằng, được lợi về mặt tiết kiệm RAM thì sẽ phải trả giá về mặt tốc độ truy cập. Ngay cảtrong trường hợp tốt nhất (page của Page Table cần sử dụng và page của tiến trình đều nằm trong RAM) thì tacũng phải mất 2 lần tham chiếu RAM để dịch từ địa chỉ ảo sang địa chỉ vật lý (hình 11). Còn trong trường hợpxấu nhất, nếu cả page của Page Table cần sử dụng và page của tiến trình đều nằm ngoài ổ cứng, thì ta còn tốnthêm cả thời gian để chờ đợi 2 lần xử lý Page Fault.

Kết luận

Virtual memory là một cơ chế quản lý bộ nhớ. Cơ chế này hướng tới 3 mục tiêu sau:

Không cần phải đưa toàn bộ tiến trình vào trong RAM.Vùng nhớ dành cho tiến trình trên RAM không cần liên tục.Một tiến trình không thể truy cập trái phép vào vùng nhớ của một tiến trình khác hoặc của hệ điều hành.

Trong những cơ chế quản lý bộ nhớ trước đây, địa chỉ do CPU phát ra cũng chính là địa chỉ truy cập RAM. Tuynhiên, cơ chế virtual memory đã tách biệt hoàn toàn 2 địa chỉ này. Địa chỉ do CPU phát ra được gọi là địa chỉảo (virtual address). Địa chỉ truy cập RAM được gọi là địa chỉ vật lý (physical address). Nhờ sự tách biệt này,những mục tiêu nói trên sẽ đạt được.

Tuy cải thiện được hiệu quả sử dụng bộ nhớ, nhưng cơ chế này lại khá phức tạp. Để áp dụng cơ chế quản lýbộ nhớ này, ta phải thêm phần cứng MMU vào giữa CPU và RAM. Đồng thời, hệ điều hành cần tạo thêm các

Page 14: Giới thiệu cơ chế bộ nhớ ảo (virtual memory)

bảng MMT để quản lý các frame của RAM và Page Table để quản lý các page của từng tiến trình.

Để dịch địa chỉ ảo sang địa chỉ vật lý, MMU cần tham chiếu tới Page Table trên RAM, điều này làm quá trìnhtruy cập lệnh/dữ liệu bị chậm lại. Để cải thiện tốc độ, MMU được tích hợp thêm bảng TLB để chứa một phầnbảng Page Table thường xuyên được tham chiếu.

Do phải tạo thêm bảng Page Table cho mỗi tiến trình, nên ta phải tốn một phần RAM để lưu các bảng PageTable. Để giảm thiểu lượng bộ nhớ của RAM dành cho các Page Table, cơ chế Multi-page level cũng được ápdụng. Nguyên tắc của cơ chế này là chỉ đưa một phần bảng Page Table vào RAM, phần còn lại vẫn để trên ổcứng. Khi nào cần thì mới đưa vào RAM.