Trong lĩnh vực tin học, bộ nhớ ảo là một phương pháp quản lý bộ nhớ do phần mềm và phần cứng phối hợp thực hiện. Nó ánh xạ các địa chỉ ô nhớ của phần mềm, gọi là địa chỉ ảo, đến các địa chỉ thực trong bộ nhớ máy tính. Bộ nhớ chính được nhìn nhận như là một dải liên tục hoặc tập hợp các vùng liên tiếp. Hệ điều hành điều phối các địa chỉ ảo và phân chia giữa bộ nhớ thực và bộ nhớ ảo. Phần cứng, thường là MMU (đơn vị quản lý bộ nhớ) trong CPU, chịu trách nhiệm chuyển đổi địa chỉ ảo thành địa chỉ thực. Phần mềm trong hệ điều hành có thể tạo ra các vùng địa chỉ ảo để mở rộng khả năng lưu trữ của bộ nhớ vật lý, cung cấp cho chương trình nhiều bộ nhớ hơn so với dung lượng thực tế của máy tính. Lợi ích chính của bộ nhớ ảo là quản lý hiệu quả các vùng bộ nhớ chia sẻ, tăng cường an toàn cho các vùng nhớ và cho phép chương trình sử dụng nhiều bộ nhớ hơn so với bộ nhớ vật lý của máy tính, nhờ vào kỹ thuật phân trang.
Tính năng
Bộ nhớ ảo đơn giản hóa việc lập trình ứng dụng bằng cách ẩn sự phân mảnh bộ nhớ vật lý, đồng thời giao cho kernel hệ điều hành quản lý việc phân chia bộ nhớ (loại bỏ nhu cầu xử lý phân bố bộ nhớ của chương trình). Mỗi khi ứng dụng yêu cầu không gian bộ nhớ, bộ nhớ ảo đảm bảo việc phân phối ô nhớ không bị thay đổi và giữ nguyên địa chỉ ảo được chỉ định.
Sự ảo hóa bộ nhớ có thể coi là sự tổng hợp của khái niệm bộ nhớ ảo.
Sử dụng
Bộ nhớ ảo là một thành phần quan trọng của kiến trúc máy tính hiện đại, yêu cầu hỗ trợ phần cứng, thường là đơn vị quản lý bộ nhớ tích hợp trong CPU. Dù không cần thiết, giả lập hoặc máy ảo có thể hỗ trợ việc triển khai bộ nhớ ảo. Các hệ điều hành cũ như từ những năm 1960 và máy tính từ đầu đến giữa những năm 1980 không có chức năng bộ nhớ ảo, với một số ngoại lệ như: Atlas supervisor cho Atlas, MCP cho Burroughs B5000, Multics cho GE 645, hệ điều hành Time Sharing cho RCA Model 67 và Apple Lisa - một ví dụ hệ điều hành PC từ những năm 80 có bộ nhớ ảo. Vào những năm 1960 đến 70, bộ nhớ máy tính rất đắt đỏ. Sự xuất hiện của bộ nhớ ảo cho phép các chương trình yêu cầu bộ nhớ lớn chạy trên máy tính với bộ nhớ thực nhỏ hơn. Chi phí tiết kiệm đã thúc đẩy việc sử dụng bộ nhớ ảo trong các hệ điều hành. Khả năng sử dụng bộ nhớ ảo tăng cường bảo mật và độ tin cậy, làm cho bộ nhớ ảo ngày càng phổ biến. Hầu hết các hệ điều hành hiện đại có hỗ trợ bộ nhớ ảo đều hoạt động trong không gian địa chỉ riêng, cho phép từng chương trình truy cập bộ nhớ ảo riêng biệt. Tuy nhiên, một số hệ điều hành cũ (như OS/VS1 và OS/VS2 SVS) và một số hiện đại (như IBM) vẫn hoạt động trong một không gian địa chỉ duy nhất cho tất cả các quá trình. Các hệ thống nhúng và hệ thống yêu cầu xử lý nhanh thường không sử dụng bộ nhớ ảo do các lỗi không mong muốn trong quá trình chạy I/O, vì chúng thường sử dụng bit-banging thay vì phần cứng để tiết kiệm chi phí.
Lịch sử
Trong những năm 1940 và 1950, phần mềm lớn cần các phương pháp quản lý thiết bị lưu trữ cấp 1 và 2 như Overlaying. Bộ nhớ ảo được giới thiệu không chỉ để mở rộng bộ nhớ cấp 1 mà còn giúp lập trình viên dễ dàng hơn. Để hỗ trợ chạy đa chương (multiprogramming) và đa nhiệm (multitasking), nhiều hệ thống đầu tiên đã chia bộ nhớ để chạy nhiều chương trình mà không cần bộ nhớ ảo, chẳng hạn như PDP-10 qua các thanh ghi. Mẫu đầu tiên của bộ nhớ ảo được phát triển bởi nhà vật lý người Đức Fritz-Rudolf Güntsch tại Technische Universität Berlin vào năm 1956 trong luận án tiến sĩ của ông, mô tả một cỗ máy với 6 '100 khối' bộ nhớ và một vùng địa chỉ với 1000 '100 khối', với phần cứng tự động dịch chuyển các khối giữa bộ nhớ cấp 1 và bộ nhớ drum cấp 2. Paging được thiết lập tại Đại học Manchester để mở rộng bộ nhớ làm việc của máy tính Atlas bằng cách hợp 16 ngàn lõi bộ nhớ cấp 1 với 96 ngàn bộ nhớ drum cấp 2. Máy tính Atlas được sử dụng lần đầu vào năm 1962 nhưng đã chạy các phiên bản nguyên thủy của paging vào năm 1959. Vào năm 1961, Burroughs công bố máy tính thương mại đầu tiên với bộ nhớ ảo, B5000, với các segments (hơn paging). Trước khi bộ nhớ ảo xuất hiện trong hệ điều hành chính, đã xảy ra nhiều lỗi về địa chỉ bộ nhớ. Bộ dịch địa chỉ động (Dynamic Address Translation) rất tốn kém và khó thiết lập phần cứng, làm chậm tốc độ truy cập bộ nhớ. Vào năm 1969, cuộc tranh luận về bộ nhớ ảo phiên bản thương mại kết thúc khi đội nghiên cứu IBM của David Sayre chứng minh rằng hệ thống bộ nhớ ảo của họ hoạt động ổn định hơn các hệ thống điều khiển bằng tay khác. Phiên bản máy tính mini đầu tiên sử dụng bộ nhớ ảo mới là Norwegian NORD-1. Trong những năm 70, nhiều máy tính mini khác cũng giới thiệu bộ nhớ ảo, nổi bật nhất là dòng VAX chạy dưới hệ điều hành VMS. Bộ nhớ ảo được công bố trên kiến trúc x86 với chế độ bảo vệ của Bộ vi xử lý Intel 80286. Intel 80386 giới thiệu công nghệ paging đa lớp, cho phép hoạt động các trang lỗi. Tuy nhiên, việc tải ký tự rất tốn kém, nên các nhà thiết kế hệ điều hành đã hoàn toàn tin tưởng vào paging thay vì kết hợp giữa Paging và Segmentation.
Bộ nhớ ảo với phân trang
Bảng trang
'Bảng trang' được sử dụng để chuyển đổi địa chỉ ảo, địa chỉ mà các ứng dụng nhìn thấy, thành địa chỉ thực, nơi phần cứng thực hiện lệnh. Quá trình chuyển đổi này được điều khiển bởi một thiết bị phần cứng gọi là 'đơn vị quản lý bộ nhớ' (Memory Management Unit - MMU). Mỗi mục trong 'bảng trang' có một 'cờ' cho biết trang đó có nằm trong bộ nhớ thực hay không. Nếu có, mục trong 'bảng trang' sẽ chứa địa chỉ của bộ nhớ thực nơi trang đó lưu trữ. Khi mối liên hệ giữa một 'trang' và phần cứng được thiết lập, nếu mục trong 'bảng trang' cho thấy trang đó không nằm trong bộ nhớ thực, phần cứng sẽ gây ra một lỗi gọi là 'loại bỏ trang', dẫn đến thành phần 'giám sát trang' của hệ điều hành.
Hệ thống có thể sử dụng một 'bảng trang' cho toàn hệ thống, nhiều 'bảng trang' cho từng ứng dụng và phân vùng, hoặc một cây 'bảng trang' cho các phân vùng lớn hơn, hoặc các sự kết hợp của những phương pháp trên. Nếu chỉ có một 'bảng trang', nhiều chương trình chạy đồng thời sẽ sử dụng các phần khác nhau của địa chỉ ảo. Nếu có nhiều 'bảng trang' hoặc phân vùng trang, sẽ có nhiều địa chỉ ảo và nhiều chương trình hoạt động đồng thời với các 'bảng trang' hướng tới các địa chỉ thực khác nhau.
Giám sát trang
Đây là thành phần của hệ điều hành đảm nhận việc tạo ra và quản lý các 'bảng trang'. Khi một trang gặp lỗi từ phần cứng, hệ thống quản lý trang sẽ truy cập ổ lưu trữ phụ để lấy một trang có địa chỉ ảo giống như trang lỗi. Sau đó, hệ thống sẽ cập nhật 'bảng trang' để phản ánh vị trí vật lý của bộ nhớ ảo và yêu cầu biên dịch lại mã lệnh.
Khi bộ nhớ vật lý đã được sử dụng hết, 'hệ thống quản lý trang' phải giải phóng một trang trong bộ nhớ chính để thay thế bằng một trang khác. Bộ quản lý sử dụng các thuật toán như 'ít được sử dụng nhất' để quyết định trang nào sẽ bị loại bỏ.
Trang ghim
Hệ điều hành có các khu vực bộ nhớ được ghim, không bao giờ được chuyển đến lưu trữ thứ cấp. Những thuật ngữ khác như trang khóa, trang cố định, hay trang kết nối cũng được sử dụng. Ví dụ, cơ chế ngắt dựa vào một mảng con trỏ đến các lệnh xử lý như I/O hoàn thành và lỗi trang. Nếu các trang chứa con trỏ hoặc mã được gọi là trang, việc xử lý gián đoạn sẽ trở nên phức tạp và tốn thời gian, đặc biệt là khi gián đoạn do lỗi trang xảy ra. Do đó, một số phần của 'bảng trang' không có trang. Một số trang có thể được ghim tạm thời, trong khi các trang khác có thể được ghim lâu dài hoặc vĩnh viễn. Ví dụ, mã quản lý trang và trình điều khiển thiết bị lưu trữ thứ cấp phải được ghim vĩnh viễn, nếu không việc phân trang sẽ không hoạt động do thiếu mã cần thiết.
Các thành phần có thể được ghim theo thời gian để tránh độ trễ khi thay đổi trang. Bộ đệm dữ liệu được truy cập trực tiếp bởi thiết bị ngoại vi, sử dụng truy cập bộ nhớ trực tiếp hoặc kênh I/O, phải nằm trong các trang ghim khi các lệnh I/O được thực hiện. Bởi vì các thiết bị và 'bus' kết nối vào bộ đệm dữ liệu ở địa chỉ bộ nhớ vật lý, việc chuyển đổi không thể tạm dừng nếu xảy ra lỗi trang và sau đó phải khôi phục khi lỗi trang đã được xử lý.
Trong các hệ điều hành IBM dành cho System/370 và các hệ thống kế thừa, thuật ngữ sử dụng là 'cố định'. Các trang có thể được cố định lâu dài, tạm thời hoặc không cố định. Cấu trúc điều khiển hệ thống thường được cố định lâu dài (tính bằng giây) trong khi bộ đệm I/O thường được cố định ngắn hạn (tính bằng mili giây). Hệ điều hành thường có khu vực đặc biệt để 'sửa chữa nhanh' các bộ đệm dữ liệu cố định ngắn hạn mà không cần phải qua hướng dẫn giám sát tốn thời gian.
Trong hệ thống Multics, thuật ngữ sử dụng là 'có dây'. Các hệ điều hành như OpenVMS và Windows gọi những trang tạm thời 'không có trang' (như bộ đệm I/O) là 'bị khóa', và gọi các trang hoàn toàn không có trang là 'nonpageable'.
Hoạt động ảo-thực
Trong OS/VS1 và các hệ điều hành tương tự, một số phần của hệ thống bộ nhớ được quản lý theo chế độ 'ảo-thực', hay còn gọi là 'V = R'. Ở chế độ này, mỗi địa chỉ ảo tương ứng với cùng một địa chỉ thực. Chế độ này được sử dụng cho các cơ chế ngắt, giám sát trang và bảng trang trong hệ thống cũ, cũng như cho các chương trình sử dụng hệ thống quản lý I/O không đạt tiêu chuẩn. Ví dụ, IBM z/OS hỗ trợ ba chế độ (ảo-ảo, ảo-thực và ảo-cố định).
Thrashing
Khi xảy ra hiện tượng 'cắp' trang (Tiếng Anh: page stealing) cùng với trang trắng, vấn đề 'Thrashing' có thể xuất hiện, khiến máy tính tiêu tốn thời gian một cách không hiệu quả để chuyển trang vào và ra từ nơi lưu trữ, từ đó làm giảm hiệu suất công việc. Một bộ nhiệm vụ là tập hợp tối thiểu các trang cần thiết để thực hiện các tiến trình hiệu quả. Thrashing xảy ra khi bộ nhớ không đủ để chứa các bộ làm việc của tất cả các chương trình đang chạy. Việc thêm bộ nhớ thực là giải pháp đơn giản nhất, tuy nhiên cải thiện thiết kế ứng dụng, lập trình, và sử dụng bộ nhớ cũng có thể giúp giảm thiểu vấn đề. Một cách khác là giảm số lượng nhiệm vụ hoạt động trên hệ thống, làm giảm nhu cầu bộ nhớ thực bằng cách chuyển đổi các thiết lập hoạt động của một hoặc nhiều quy trình.
Bộ nhớ ảo phân đoạn
Một số hệ thống, như Burroughs B5500, sử dụng phân đoạn thay vì phân trang, chia địa chỉ ảo thành các đoạn có độ dài không cố định. Một địa chỉ ảo bao gồm chỉ số đoạn và phần bù (segment + offset). Intel 80286 hỗ trợ dự án tương tự nhưng ít được sử dụng. Phân đoạn và phân trang cũng có thể kết hợp bằng cách chia mỗi đoạn thành các trang; các hệ thống như Multics và IBM System/38 thường ưu tiên phân trang nhưng vẫn hỗ trợ phân đoạn và cung cấp bảo mật bộ nhớ.
Trong các bộ xử lý Intel 80386 và những phiên bản IA-32 sau này, các đoạn nằm trong một khoảng địa chỉ tuyến tính đã được phân trang. Các đoạn có thể được di chuyển vào hoặc ra khỏi khoảng đó; các trang có thể 'phân trang' vào hoặc ra khỏi bộ nhớ chính, cung cấp hai mức độ của bộ nhớ ảo; một số hệ điều hành chọn cách này thay vì chỉ sử dụng phân trang. Các giải pháp cho thiết bị x86 ảo hóa phi phần cứng kết hợp phân trang và phân đoạn vì phân trang yêu cầu hai miền bảo vệ, trong khi VMM/hệ điều hành khách/chương trình khách cần ba miền. Sự khác biệt giữa hệ thống phân trang và phân đoạn không chỉ là về cách chia bộ nhớ; phân đoạn có thể được nhìn thấy trong mô hình bộ nhớ của người dùng, tạo ra cấu trúc bộ nhớ phân tách thành nhiều không gian nhỏ hơn thay vì một khoảng không gian lớn.
Sự khác biệt này có ảnh hưởng quan trọng; phân đoạn không phải là một trang với chiều dài thay đổi hay cách để kéo dài địa chỉ. Phân đoạn có thể cung cấp mô hình bộ nhớ duy nhất, trong đó không phân biệt giữa bộ nhớ xử lý và tập tin hệ thống, bao gồm một danh sách các đoạn (tập tin) được ánh xạ vào không gian địa chỉ.
Điều này khác biệt so với các cơ chế do các hàm như mmap và MapViewOfFile của Win32 cung cấp, vì các con trỏ trong tập tin không hoạt động khi ánh xạ các tập tin vào bất kỳ vùng địa chỉ nào. Trong hệ thống Multics, một tập tin (hoặc một đoạn trong tập tin chứa nhiều đoạn) được ánh xạ vào một đoạn cụ thể trong địa chỉ, do đó các tập tin luôn được ánh xạ tại ranh giới của phân đoạn. Phần liên kết của một tập tin có thể chứa con trỏ, và việc truy cập để truyền dữ liệu từ con trỏ đến thanh ghi hoặc tạo tham chiếu gián tiếp qua con trỏ đó sẽ tạo ra một cái bẫy. Một con trỏ chưa được giải quyết chứa chỉ dẫn đến tên đoạn mà con trỏ trỏ tới và vị trí trong đoạn; bộ xử lý sẽ giải quyết cái bẫy bằng cách ánh xạ đoạn vào địa chỉ, thay đổi chỉ số phân đoạn trong con trỏ, sửa đổi thẻ trong con trỏ để không còn gây bẫy và tiếp tục thực thi các chỉ dẫn đã gây ra bẫy. Điều này loại bỏ hoàn toàn việc cần phải liên kết và hoạt động ngay cả khi các tiến trình ánh xạ đến cùng một tập tin ở các vùng khác nhau trong địa chỉ của chúng.
Hoán đổi vùng địa chỉ
Một số hệ điều hành cung cấp khả năng hoán đổi toàn bộ vùng địa chỉ, ngoài những công cụ phân trang và phân đoạn mà họ có. Khi điều này xảy ra, hệ điều hành ghi các trang và phân đoạn hiện tại trong bộ nhớ chính vào tập tin hoán đổi. Khi thực hiện việc hoán đổi vào, hệ điều hành sẽ đọc lại dữ liệu từ các tập tin hoán đổi, nhưng không tự động đọc lại các trang đã được phân trang tại thời điểm hoán đổi.
Nhiều hệ thống bộ nhớ ảo của IBM, từ OS/VS2 Release 2 đến z/OS, cho phép đánh dấu một vùng địa chỉ không thể hoán đổi; điều này giúp không phải đánh dấu trang trong vùng địa chỉ đó. Điều này có thể thực hiện trong suốt quá trình làm việc bằng cách nhập tên của chương trình chính đủ điều kiện vào bảng thuộc tính của chương trình với cờ không hoán đổi. Thêm vào đó, mã đặc quyền có thể tạm thời làm cho một vùng địa chỉ không thể hoán đổi bằng cách gọi lệnh chương trình giám sát SYSEVENT; một số thay đổi thuộc tính của vùng địa chỉ yêu cầu hệ điều hành phải hoán đổi chúng ra và lại hoán đổi vào bằng cách sử dụng SYSEVENT TRANSWAP.
- John L. Hennessy, David A. Patterson, Kiến trúc Máy tính, Phương pháp Định lượng (ISBN 1-55860-724-2)
- Bí mật Bộ nhớ ảo của Murali
Liên kết ngoài
- Quản lý bộ nhớ Linux
- Danh sách thảo luận qua email về nhân Linux Lưu trữ ngày 30 tháng 4 năm 2008 tại Wayback Machine
- Các liên kết đến hình ảnh về bộ nhớ ảo Lưu trữ ngày 29 tháng 8 năm 2006 tại Wayback Machine
- Quản lý bộ nhớ ảo trong Windows NT
Bài viết này dựa trên thông tin từ Từ điển trực tuyến miễn phí về máy tính trước ngày 1 tháng 11 năm 2008 và được chỉnh sửa theo các điều khoản 'cấp lại giấy phép' của GFDL, phiên bản 1.3 hoặc mới hơn.
Hệ điều hành
| |||||
---|---|---|---|---|---|
Chung |
| ||||
Hạt nhân |
| ||||
Quản lý tiến trình |
| ||||
Quản lý bộ nhớ và bảo vệ tài nguyên |
| ||||
Truy cập lưu trữ và hệ thống tập tin |
| ||||
Danh sách |
| ||||
Khái niệm khác |
|