Mục từ này đã đạt chất lượng ở mức sản phẩm bước đầu của Đề án Biên soạn Bách khoa toàn thư Việt Nam giai đoạn 1
Bộ nhớ ảo

Bộ nhớ ảo (tiếng Anh virtual memory) là bộ nhớ thể hiện ra trước các chương trình chạy trên máy tính với dung lượng lớn hơn dung lượng của bộ nhớ chính. Bộ nhớ ảo thường do hệ điều hành thực hiện bằng một kỹ thuật kết hợp bộ nhớ chính và bộ nhớ phụ có tốc độ thấp hơn. Kỹ thuật này cho phép máy tính chạy được các chương trình có kích thước lớn hơn kích thước bộ nhớ chính và chạy được đồng thời nhiều chương trình.

Lịch sử phát triển[sửa]

Trong thời kỳ đầu của kỷ nguyên máy tính, bộ nhớ chính của máy tính thường nhỏ và đắt tiền. Thí dụ IBM 650 là một máy tính hàng đầu cho nghiên cứu khoa học trong khoảng cuối những năm 1950 chỉ có bộ nhớ 2000 từ (xt. từ máy tính). Vì vậy các nhà lập trình thường phải dành phần lớn thời gian và công sức làm cho chương trình càng bé càng tốt để có thể lọt được vào bộ nhớ chính. Một số giải pháp đã được sử dụng để giải quyết vấn đề này.

Kỹ thuật overlay[sửa]

Một giải pháp truyền thống cho vấn đề này là sử dụng bộ nhớ phụ, chẳng hạn đĩa (xt. ổ đĩa cứng). Người lập trình chia chương trình ra làm một số phần, gọi là overlay, mỗi overlay có thể nằm lọt trong bộ nhớ chính. Để chạy chương trình, overlay thứ nhất được đọc vào và nó sẽ chạy được một lúc. Trước khi kết thúc, nó sẽ đọc overlay tiếp theo vào và cho overlay đó chạy, việc đó cứ tiếp diễn như thế. Người lập trình phải lo chia chương trình thành các overlay, phải quy định từng overlay sẽ được giữ ở đâu trong bộ nhớ phụ, phải thu xếp để vận chuyển các overlay giữa bộ nhớ chính và bộ nhớ phụ và nói chung là phải tự mình quản lý toàn bộ quá trình overlay.

Không gian địa chỉ ảo[sửa]

Chúng ta hãy xem xét một thí dụ về một máy tính trong đó các chỉ thị có trường địa chỉ 16 bit và có bộ nhớ 4096 từ. Một chương trình chạy trên máy tính này có thể đánh địa chỉ 65536 từ bộ nhớ, từ địa chỉ 0 đến địa chỉ 65535. Số từ có thể đánh địa chỉ phụ thuộc vào số bit trong trường địa chỉ của chỉ thị và không có gì liên quan tới số từ mà bộ nhớ thực sự có. Không gian địa chỉ này thường được gọi là không gian địa chỉ ảo. Khi còn chưa phát minh ra bộ nhớ ảo, người lập trình phải phân biệt giữa các địa chỉ nhỏ hơn 4096 và các địa chỉ lớn hơn hoặc bằng 4096. Có thể coi miền thứ nhất là không gian địa chỉ khả dụng và miền thứ hai là không gian địa chỉ không khả dụng, chương trình không được phép sử dụng các địa chỉ không khả dụng.

Overlay tự động[sửa]

Kỹ thuật overlay đã được sử dụng rộng rãi trong nhiều năm, nhưng nó đòi hỏi nhiều công sức của người lập trình cho việc quản lý overlay. Năm 1961 một nhóm nhà khoa học ở Manchester, nước Anh, đã đề xuất một phương pháp thực hiện quá trình overlay một cách tự động, thậm chí không đòi hỏi người lập trình phải biết điều gì đang xảy ra. Phương pháp này được gọi là bộ nhớ ảo - virtual memory. Mục đích của việc tạo ra bộ nhớ ảo là làm cho người lập trình chỉ cần biết không gian địa chỉ ảo chứ không phải bận tâm đến kích thước của bộ nhớ vật lý (bộ nhớ khả dụng). Nói cách khác, đó là làm cho không gian địa chỉ ảo trở thành không gian địa chỉ khả dụng đối với các chương trình.

Chúng ta vẫn lấy máy tính trong đó các chỉ thị có trường địa chỉ 16 bit và có bộ nhớ 4096 từ làm thí dụ. Vào bất cứ thời điểm nào một trong 4096 từ bộ nhớ có thể được truy cập trực tiếp, nhưng chúng không nhất thiết phải tương ứng với các địa chỉ từ 0 đến 4095. Thí dụ chúng ta có thể “bảo” cho máy tính rằng từ lúc này trở đi, mỗi khi địa chỉ 4096 được truy cập thì từ 0 của bộ nhớ sẽ được sử dụng. Mỗi khi địa chỉ 4097 được truy cập thì từ 1 của bộ nhớ sẽ được sử dụng, mỗi khi địa chỉ 8191 được truy cập thì từ 4095 của bộ nhớ sẽ được sử dụng v.v. Nói cách khác, chúng ta đã định nghĩa một sự ánh xạ từ không gian địa chỉ ảo vào các địa chỉ bộ nhớ thực.

Phân trang[sửa]

Không gian địa chỉ ảo được chia thành các trang (page) có kích thước bằng nhau. Hiện nay người ta thường sử dụng kích thước trang nằm trong khoảng 512..4096. Nó luôn được chọn là số mũ của 2.

Tương tự như vậy, bộ nhớ vật lý cũng được chia thành các mảnh, mỗi mảnh có cùng kích thước với trang, để cho mỗi mảnh của bộ nhớ chính có thể chứa được vừa vặn một trang. Các mảnh của bộ nhớ chính mà các trang sẽ được đưa vào được gọi là khung trang (page frame). Trong các thiết kế thực, bộ nhớ chính của các máy tính lớn có thể có hàng chục, hàng trăm hay thậm chí hàng nghìn khung trang.

Khi một chương trình bắt đầu được thi hành, một khối có kích thước một trang (tương tự một overlay) sẽ được đọc từ bộ nhớ phụ vào một khung trang trong bộ nhớ vật lý để cho thi hành. Nếu một lệnh nào đó trong khung trang này cần truy cập đến một địa nhớ thuộc một trang khác, thì hệ điều hành sẽ truy cập bảng phân trang để xem khối chương trình ứng với trang đó đã được nạp vào bộ nhớ vật lý hay chưa. Nếu khối chương trình đã được nạp, thì cho truy cập trong bộ nhớ vật lý; nếu chưa nạp, sự kiện này được gọi là lỗi trang (page fault), thì hệ điều hành sẽ nạp khối chương trình cần đến từ bộ nhớ ngoài vào bộ nhớ vật lý, sau đó cho truy cập. Tất nhiên khi một chương trình bắt đầu được thi hành thì cũng gây ra một page fault. Thí dụ người sử dụng đánh tên chương trình từ dòng lệnh, hoặc kích đúp vào biểu tượng của ứng dụng trong môi trường hệ điều hành Windows.

Khi bộ nhớ vật lý đã đầy mà vẫn cần nạp một trang mới vào, thì nội dung trong một khung trang nào đó phải được thay thế (tức là bị ghi đè lên), nhưng trước hết nó cần được sao chép và ghi tạm lên bộ nhớ phụ để có thể được đưa trở lại vào bộ nhớ chính khi cần đến. Công việc này thường được những người sử dụng hệ điều hành Windows gọi là swapping. Mỗi khi có một trang mới được nạp vào bộ nhớ chính hoặc khi thực hiện “swapping” thì chương trình quản lý bộ nhớ ảo (thường là hệ điều hành) sẽ cập nhật bảng phân trang.

Bảng phân trang (page table) là cơ sở dữ liệu dùng để xác định trang nào ứng với khối của chương trình (gồm cả các lệnh và dữ liệu) đã được nạp vào bộ nhớ vật lý hay chưa; nếu đã nạp vào thì khối đó nằm ở khung trang nào; nếu chưa được nạp vào thì khối đó nằm ở đâu trong bộ nhớ phụ. Như vậy, chúng ta thấy để thực hiện được bộ nhớ ảo, cần:

  • Phải có bộ nhớ phụ để chứa toàn bộ chương trình, tốc độ của bộ nhớ phụ càng cao càng tốt miễn là giá của bộ nhớ phụ có thể chấp nhận được. Ngày nay bộ nhớ phụ thường là ổ đĩa cứng hoặc ổ đĩa thể rắn - SSD (solid state disk).
  • Bảng phân trang sẽ được truy cập rất thường xuyên, vì vậy bộ nhớ chứa bảng phân trang cần có tốc độ cao. Các nhà thiết kế chip vi xử lý thường hỗ trợ các hệ điều hành quản lý bộ nhớ ảo bằng việc dành sẵn một bộ nhớ chuyên dụng tốc độ cao để chứa bảng phân trang.

Một số chính sách thay thế trang:

  • LRU (Least Recently Used): thay (ghi đè) trang đã được nạp vào bộ nhớ vật lý mà ít được sử dụng nhất tính trong một khoảng thời gian nhất định cho đến thời điểm cần thay trang.
  • FIFO (First-In First-Out): thay (ghi đè) trang đã được nạp vào bộ nhớ vật lý lâu nhất.

Một số kỹ thuật áp dụng phân trang hiệu quả hơn:

  • Cấp phát trang khi có yêu cầu (demand paging): cần đến trang nào thì nạp khối chương trình (ở bộ nhớ phụ) ứng với trang đó vào bộ nhớ vật lý (bộ nhớ chính).
  • Mô hình tập làm việc (working-set model): hệ điều hành giám sát một chương trình khi thực hiện và ghi lại một tập hợp các trang hay được sử dụng nhất; lần sau nếu chương trình này lại được gọi thực hiện, thì hệ điều hành sẽ nạp luôn cả tập hợp các trang này. Việc này sẽ làm giảm tần suất lỗi trang, nhưng cũng có thể nạp một số trang không cần đến trong lần chạy chương trình này.

Tài liệu tham khảo[sửa]

  1. A. S. Tannenbaum, Structured Computer Organization, 6th Edition, Pearson, 2013. ISBN 10: 0-13-291652-5, ISBN 13: 978-0-13-291652-3.
  2. Benjamin W. Wah, Wiley Encyclopedia of Computer Science and Engineering, Publisher: Wiley-interscience, 2008. ISBN-10: 0471383937, ISBN-13: 978-0471383932.
  3. Harry Henderson, Encyclopedia of Computer Science and Technology, Revised Edition, Publisher: Facts On File, Inc, 2009. ISBN-13: 978-0-8160-6382-6.
  4. Microsoft Computer Dictionary, Fifth Edition, Microsoft Press, 2002. ISBN 0-7356-1495-4.
  5. William Stallings, Computer Organization and Architecture: Design for Performance, 9th Edition, Pearson, 2013. ISBN 10: 0-13-293633-X, ISBN 13: 978-0-13-293633-0.