Bộ nhớ ảo là gì?


27

Tôi đã kiểm tra lại các ghi chú của mình cho 'Bộ nhớ ảo' và định nghĩa trong sách giáo khoa của tôi là:

Quá trình phân bổ một phần lưu trữ thứ cấp để hoạt động như một phần của bộ nhớ chính

Như Wikipedia nói:

Bộ nhớ ảo là một kỹ thuật hệ thống máy tính mang đến cho chương trình ứng dụng ấn tượng rằng nó có bộ nhớ làm việc liền kề (một không gian địa chỉ)

và (Wikipedia cũng nói)

Lưu ý rằng "bộ nhớ ảo" không chỉ là "sử dụng không gian đĩa để mở rộng kích thước bộ nhớ vật lý"

Bất cứ ai có thể cung cấp bất kỳ làm rõ như là chính xác?


Tôi tin rằng ghi chú từ Wikipedia liên quan đến một số bằng cấp về những gì được sử dụng trong điều khoản tiếp giáp nhau.
JB King

Câu hỏi này có thể sẽ có câu trả lời tốt hơn về SO.
Thuyền trưởng Segfault

2
Đừng nhầm lẫn bộ nhớ ảo với cách sử dụng. Câu đầu tiên của Wikipedia là định nghĩa nó là gì. Cuốn sách của bạn đang nói về cách nó thường được sử dụng. Khi mọi người nói về "trang", họ sẽ nói về việc triển khai bộ nhớ ảo cụ thể.
Tony Lee

2
Sách giáo khoa của bạn chỉ đơn giản là sai. Có nhiều máy có bộ nhớ ảo và không có bộ nhớ thứ cấp nào cả. Tương tự, đã từng có nhiều máy có thể sử dụng bộ nhớ thứ cấp như một phần của bộ nhớ chính nhưng không hỗ trợ bộ nhớ ảo. "Bộ nhớ ảo" là thứ không phải là bộ nhớ mà được truy cập như bộ nhớ. Sách giáo khoa của bạn đang xác định hoán đổi hoặc phân trang.
David Schwartz

1
Sách giáo khoa định nghĩa nó hoàn toàn không chính xác, lưu trữ thứ cấp không phải là một phần của định nghĩa. Và ngay cả tuyên bố của Wikipedia về "nhiều hơn không gian đĩa" là sai lệch, bởi vì nó hoàn toàn không liên quan đến đĩa - câu nói đó nghe có vẻ như là "mở rộng bộ nhớ vào đĩa" cộng với một thứ khác.
Kelvin

Câu trả lời:


41
Note that "virtual memory" is more than just "using disk space to extend physical memory size"

Bộ nhớ ảo là một lớp trừu tượng được cung cấp cho mỗi quá trình. Máy tính có 2GB RAM vật lý, có địa chỉ từ 0 đến 2G. Một quá trình có thể thấy một không gian địa chỉ là 4GB, mà nó hoàn toàn thuộc về chính nó. Ánh xạ từ địa chỉ ảo đến địa chỉ vật lý được xử lý bởi một đơn vị quản lý bộ nhớ, được quản lý bởi hệ điều hành. Thông thường, điều này được thực hiện trong "trang" 4KB.

Điều này cung cấp một số tính năng:

  1. Một tiến trình không thể thấy bộ nhớ trong các tiến trình khác (trừ khi HĐH muốn nó!)
  2. Bộ nhớ tại một địa chỉ ảo nhất định có thể không được đặt tại cùng một địa chỉ vật lý
  3. Bộ nhớ tại một địa chỉ ảo có thể được "phân trang" ra đĩa và sau đó "phân trang" khi nó được truy cập lại.

Sách giáo khoa của bạn định nghĩa bộ nhớ ảo (không chính xác) chỉ là # 3.

Ngay cả khi không có bất kỳ sự hoán đổi nào, bạn đặc biệt cần lưu ý đến bộ nhớ ảo nếu bạn viết trình điều khiển thiết bị cho một thiết bị có DMA (truy cập bộ nhớ trực tiếp). Mã trình điều khiển của bạn chạy trên CPU, có nghĩa là truy cập bộ nhớ của nó thông qua MMU (ảo). Thiết bị có thể không đi qua MMU, vì vậy nó nhìn thấy các địa chỉ vật lý thô. Vì vậy, là một nhà văn trình điều khiển, bạn cần phải đảm bảo:

  1. Bất kỳ địa chỉ bộ nhớ thô nào bạn chuyển đến phần cứng đều là vật lý, không phải ảo.
  2. Bất kỳ khối lớn (trang đa) của bộ nhớ bạn gửi là chất tiếp giáp. Một mảng 8K có thể gần như liền kề (thông qua MMU) nhưng hai trang riêng biệt. Nếu bạn yêu cầu thiết bị ghi 8K dữ liệu vào địa chỉ vật lý tương ứng với điểm bắt đầu của mảng đó, nó sẽ ghi 4K đầu tiên mà bạn mong đợi, nhưng 4K thứ hai sẽ làm hỏng bộ nhớ ở đâu đó. :-(

4

Tôi sẽ cố gắng bắt đầu từ từ, và sau đó kết hợp tất cả lại với bạn. Nó giống như thế này:

Bộ nhớ ảo, như thường được sử dụng, đề cập đến "phân trang". Như tên cho thấy, phân trang giống như một notepad của con người.

Khi bạn thực hiện các khoản tiền đơn giản hoặc tìm hiểu thông tin đơn giản, bạn sẽ làm tất cả trong đầu: bạn chỉ cần tải lên tất cả thông tin, xử lý và nhận câu trả lời. Điều này giống như một máy tính tải các tệp từ ổ cứng - nó tải các chương trình hoặc hình ảnh hoặc thông tin khác mà nó cần để hoạt động vào "bộ nhớ thực" (hoặc "bộ nhớ vật lý") và hoạt động trên chúng bằng "bộ não" ( bộ xử lý của nó).

Tuy nhiên, khi bạn đang học thông tin phức tạp hoặc làm việc với các khoản tiền phức tạp, bạn có thể không thể phù hợp với tất cả những điều đó trong đầu. Bạn bối rối, bắt đầu chậm lại, không thể giữ tất cả trong đó cùng một lúc và phải quên một cái gì đó để ghi nhớ một cái gì đó khác.

Giải pháp của con người là sử dụng notepad. Chúng tôi ghi lại trên các trang tất cả những điều chúng tôi không thể nhớ cùng một lúc, nhưng hãy tham khảo chúng trong khi thực hiện các khoản tiền. Chúng tôi có thể không nhớ được một danh sách lớn các số liệu bán hàng trong tháng, nhưng chúng tôi có thể xem các trang, lấy thông tin một chút và xử lý từng bit. Điều này giống như máy tính "phân trang" bộ nhớ của nó - viết các trang chứa đầy thông tin và đưa nó vào "bộ nhớ ảo" để tham khảo sau đó và nhận ra nó cần một trang và tải lại trang đó từ bộ nhớ ảo vào bộ nhớ thực. Trên linux và unix, nơi lưu trữ các trang này theo nghĩa đen được gọi là "pagefile" và các trang dữ liệu trong bộ nhớ được gọi là "trang" theo nghĩa đen. Các hệ thống khác nhau có tên khác nhau cho những điều này, nhưng khái niệm chung là giống nhau nhiều.

Vì vậy, thực sự, phân trang là rất đơn giản. Tất cả các trang thông tin không vừa với bộ nhớ, vì vậy một số trang được đưa vào đĩa và được tải lại sau.

Bây giờ, điều phức tạp hơn là, các hệ thống hiện đại có tính năng ánh xạ bộ nhớ và bảo vệ bộ nhớ, thường được xử lý bởi cùng một hệ thống phần cứng trong máy tính: đơn vị quản lý bộ nhớ hoặc MMU.

Trong một máy tính đa nhiệm (hiện đại), có thể chạy nhiều chương trình cùng một lúc và có tính năng bảo vệ bộ nhớ, mỗi chương trình thường được tách biệt khỏi các chương trình khác chạy trên cùng một hệ thống. Theo cách này, một chương trình không thể thay đổi chương trình khác chỉ bằng cách truy cập vào bộ nhớ của nó - MMU tách biệt về mặt vật lý một không gian địa chỉ của chương trình với các chương trình khác. Nói cách khác, các chương trình của người dùng không thấy các chương trình khác của người dùng hoặc thậm chí các chương trình khác. Họ không thấy "bộ nhớ thực" - họ thấy "bộ nhớ ảo" của chính họ.

Bây giờ, khái niệm cách ly bộ nhớ này và khái niệm pagefile là hai thứ khác nhau về mặt khái niệm, có lẽ là lý do khiến bạn bối rối. Tuy nhiên, điều quan trọng là cả hai đều hoạt động bằng cách sử dụng MMU - đơn vị quản lý bộ nhớ, phân chia bộ nhớ thành các trang và ánh xạ các trang vào một không gian địa chỉ ảo.

Vì vậy, khi một chương trình yêu cầu bộ nhớ ở một "địa chỉ bộ nhớ" nhất định, điều thực sự xảy ra là các trang bộ nhớ cho chương trình đó và các địa chỉ tương ứng của chúng ("không gian địa chỉ" của chương trình được tìm kiếm và trang tương ứng với khối bộ nhớ đó được tìm thấy. Trang đó có thể được tải ở đâu đó trong bộ nhớ thực, trong trường hợp đó chương trình được cấp quyền truy cập, hoặc, nó có thể được phân trang ra đĩa. Nếu nó được phân trang ra, thì nó sẽ gây ra "lỗi trang" - đĩa được truy cập và trang được tải vào bộ nhớ. Vì vậy, chương trình hoạt động ngay cả khi không có đủ bộ nhớ, nhưng nó chạy TUYỆT VỜI, nếu nó phải sử dụng đĩa cho việc truy cập bộ nhớ rất nhanh.

Bây giờ, nếu không có đủ dung lượng để tải trang đó vào bộ nhớ, thì bạn có vấn đề. Trong trường hợp đó, một số trang KHÁC đã có trong bộ nhớ phải được "hoán đổi" sang đĩa, vì vậy trang của chương trình đầu tiên có thể được tải. Hoặc, chúng có thể là các trang trong cùng một chương trình. Đôi khi bạn thấy điều này trong các chương trình đồ họa, trên các hệ thống được tải nặng, khi một phần của hình ảnh được tải chậm và được vẽ nhanh, thì phần tiếp theo được tải chậm như nhau và được vẽ nhanh, và khi bạn quay lại làm việc với phần đầu tiên một phần, nó chậm LẠI. Đó là bởi vì họ đang được tải vào để làm việc, sau đó đổi chỗ một lần nữa, vì vậy một cái gì đó khác có thể được làm việc. Rõ ràng, đây là một cách làm việc rất chậm, và những gì bạn thực sự cần là bộ nhớ THỰC SỰ nhiều hơn.


Tôi không đồng ý 100% với câu trả lời này. Nếu "bộ nhớ ảo" được gọi là phân trang, thì một hệ thống không có trang (giả sử, một hệ thống không có tệp hoán đổi hoặc trang được kích hoạt) không thể hỗ trợ bộ nhớ ảo. Nhưng đó rõ ràng là điên rồ.
David Schwartz

@DavidSchwartz - Ban đầu tôi có phản ứng tương tự như của bạn, nhưng khi đọc câu trả lời chi tiết hơn, tôi không nghĩ nó quá tệ. Hãy xem Wikipedia / bộ nhớ ảo / Paged cho biết "Gần như tất cả các cài đặt bộ nhớ ảo chia một không gian địa chỉ ảo thành các trang, các khối địa chỉ bộ nhớ ảo liền kề". Nghĩa là, "phân trang", theo nghĩa rộng, không yêu cầu tệp trang , nhưng đề cập đến việc ánh xạ các địa chỉ ảo thành địa chỉ vật lý.
ToolmakerSteve

1
Hmm, mặt khác, Lee nói "Tất cả các trang thông tin không phù hợp với bộ nhớ, vì vậy một số trang được đưa vào đĩa và được tải lại sau.", Vì vậy David đã đúng: câu trả lời này bỏ lỡ sự thật cần thiết rằng phân trangkhông chỉ là về phân trang vào đĩa . Về mặt tích cực, Lee tiếp tục đề cập đến những lợi ích khác của bộ nhớ ảo (cách ly bộ nhớ). Nếu câu trả lời này được sắp xếp lại để không làm rối tung "các trang ánh xạ của bộ nhớ ảo" với "phân trang vào đĩa", nó sẽ hữu ích hơn.
ToolmakerSteve

@ToolmakerSteve Vấn đề là đây là một quan niệm sai lầm rất phổ biến và bất cứ điều gì củng cố quan niệm sai lầm đó là, IMO, là một điều xấu. Điều này đặc biệt tệ ở đây khi câu trả lời này đang cố gắng giải thích các khái niệm rất cơ bản trong một vấn đề rất đơn giản - điều quan trọng nhất là không đặt nền tảng dựa trên một quan niệm sai lầm phổ biến!
David Schwartz

@DavidSchwartz - Tôi đồng ý. Bạn nói đúng, anh ta không định nghĩa "bộ nhớ ảo", anh ta đang định nghĩa "cách một tệp trang hoạt động". Lúc đầu, tôi đã nghĩ rằng vấn đề chỉ là Lee thất bại trong việc phân biệt giữa "paging = ánh xạ các trang bộ nhớ từ ảo sang vật lý" so với "tệp trang = ánh xạ trang sang đĩa", nhưng sau khi đọc lại, anh ấy thực sự chỉ nói chuyện về ánh xạ vào đĩa. (Như chúng ta có thể thấy, từ trích dẫn trong sách giáo khoa, từ tất cả các câu trả lời khác ngoại trừ của Thuyền trưởng và từ một tìm kiếm trên google, việc kết hợp hai khái niệm này rất phổ biến. Tôi chắc chắn rằng mình đã phạm tội.)
ToolmakerSteve

0

Tôi biết rằng đã quá muộn .... nhưng nghĩ rằng nó vẫn hữu ích.

  • Tất cả đều đúng dựa trên các quan điểm khác nhau.
  • Bộ nhớ ảo là một kỹ thuật quản lý bộ nhớ trong khi bộ nhớ trao đổi là khu vực trên ổ đĩa. Bộ nhớ hoán đổi thường được gọi là không gian trao đổi. Không gian hoán đổi đề cập đến phần bộ nhớ ảo được dành làm vị trí lưu trữ tạm thời. Không gian hoán đổi được sử dụng khi RAM khả dụng không thể đáp ứng yêu cầu của bộ nhớ hệ thống
  • Bạn có thể tham khảo liên kết dưới đây để biết thêm chi tiết

-2

Chà nếu chúng ta hiểu từ ảo tôi nghĩ chúng ta có thể hiểu nó liên quan đến bộ nhớ như thế nào.

"Ảo" như được định nghĩa trên Dictionary.com: "tạm thời được mô phỏng hoặc mở rộng bằng phần mềm máy tính: một đĩa ảo trong RAM; bộ nhớ ảo trên đĩa cứng."

Trong trường hợp Bộ nhớ ảo, hệ thống đang mô phỏng bộ nhớ hệ thống bằng cách sử dụng tài nguyên bộ nhớ chậm hơn (tức là ổ cứng, ổ ngón tay cái, v.v.) Khi cần thêm bộ nhớ, hệ thống sẽ trao đổi dữ liệu trong bộ nhớ hệ thống không cần thiết cho cứng ổ đĩa hoặc tài nguyên bạn đã thiết lập. Điều này giải phóng bộ nhớ hệ thống để ứng dụng của bạn có thể tiếp tục công việc mà nó đang làm.

Việc hoán đổi là một quá trình liên tục và do đó, nếu bạn nâng cấp bộ nhớ của mình, bạn sẽ thấy sự cải thiện hiệu suất vì hệ thống không nên yêu cầu đổi sang bộ nhớ chậm hơn khi tắt.


-2

Bộ nhớ ảo là một tính năng của hệ điều hành (HĐH) cho phép máy tính bù cho sự thiếu hụt bộ nhớ vật lý bằng cách tạm thời chuyển các trang dữ liệu từ bộ nhớ truy cập ngẫu nhiên (RAM) sang lưu trữ đĩa.

Có nghĩa là nó giống như một tấm gương hoặc bộ nhớ mẫu được sử dụng trong máy ảo hoặc hộp ảo để thử hệ điều hành mà không cần định dạng máy tính.


Không, đó là phân trang.
David Schwartz

-4

Bộ nhớ ảo là một khối ổ cứng của bạn mà hệ thống sử dụng làm tệp hoán trang ngoài RAM vật lý.

Nó trở nên khó khăn và đôi khi chậm, vì Windows KHÔNG phân mảnh phần này trong ổ cứng của bạn.

2 mẹo hay nhất tôi có thể cung cấp: 1) Virt Mem nên được đặt cả tối thiểu và tối đa khoảng 1,5 lần Bộ nhớ vật lý của bạn. ví dụ RAM 2GB = 3070 MB Virt. 2) Khi chống phân mảnh, hãy tắt tệp hoán trang của bạn. Chống phân mảnh 2x và đặt lại về số ban đầu. Điều này cung cấp một lát ổ đĩa sạch và sẽ tăng tốc độ của tệp hoán trang.


1
Điều đó không hoàn toàn đúng - các nhà quản lý bộ nhớ hiện đại ảo hóa TẤT CẢ bộ nhớ hệ thống. Đây là những gì cho phép phân tách quá trình - mỗi quá trình chỉ có thể chạm vào bộ nhớ của chính nó. Trình quản lý bộ nhớ chịu trách nhiệm ánh xạ các trang ảo này vào bộ lưu trữ thực và tùy chọn vào một đĩa cố định.
Anthony Giorgio

1
"Windows KHÔNG chống phân mảnh phần này trong ổ cứng của bạn." chỉ cần nuke pagefile.sys, khởi động lại, chống phân mảnh đĩa và kích hoạt lại phân trang, voilá, một pagefile mới và dễ sử dụng! tuy nhiên, PageDefrag của Sysiternals thực hiện công việc tốt hơn vì nó cũng sẽ đặt tệp trang vào đầu ổ đĩa / phân vùng để có hiệu suất tốt hơn.

1
Nếu câu trả lời này là chính xác, thì một hệ thống Windows không có tệp trang được định cấu hình không thể cung cấp bất kỳ hỗ trợ bộ nhớ ảo nào. Nhưng điều này rõ ràng là sai. Ví dụ, một hệ thống như vậy vẫn có thể ánh xạ các tệp vào không gian địa chỉ xử lý vượt quá RAM vật lý, đây là một ví dụ về bộ nhớ ảo.
David Schwartz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.