Làm thế nào là bộ nhớ ảo thực sự làm tăng không gian bộ nhớ?


70

Tôi hiểu rằng bộ nhớ ảo đánh lừa chương trình bằng cách hiển thị nhiều bộ nhớ hơn thực tế có sẵn.

Nhưng cuối cùng nó phải ánh xạ địa chỉ logic đến địa chỉ thực tế. Bây giờ làm thế nào là tăng bộ nhớ?


12
Đó là khái niệm cũ. Động lực ban đầu cho bộ nhớ ảo là một hình thức quản lý bộ nhớ để cung cấp một không gian địa chỉ lớn hơn bộ nhớ vật lý. Nhưng đó là khi bộ nhớ có mật độ thấp và rất đắt. Ngày nay, lý do chính để sử dụng bộ nhớ ảo là để bảo mật quá trình.
mùn cưa

2
"Bây giờ làm thế nào để tăng bộ nhớ?". Nó không. Ứng dụng không nhận biết bộ nhớ vật lý của hệ thống, nó chỉ nhận biết bộ nhớ ảo, đó là lý do khi một ứng dụng phàn nàn về việc không có đủ bộ nhớ, nó nói về bộ nhớ ảo và không phải bộ nhớ vật lý
Ramhound

2
Hãy nhớ rằng hệ thống bộ nhớ ảo là khá thông minh. Nếu n quy trình có cùng trang chỉ đọc, tất cả n quy trình có thể sử dụng cùng một trang của bộ nhớ vật lý.
Eric Lippert

65
Đừng nghĩ bộ nhớ ảo là đánh lừa bất cứ điều gì. Bộ nhớ là khả năng trừu tượng để lưu trữ và truy xuất dữ liệu . Bộ nhớ ảo cung cấp một triển khai cho sự trừu tượng đó. Rằng một phần của sự trừu tượng hóa đó được hỗ trợ bởi RAM và một số được hỗ trợ bởi đĩa là một chi tiết thực hiện của sự trừu tượng hóa.
Eric Lippert

4
@HagenvonEitzen Không chắc bộ nhớ "luôn luôn" trên đĩa như thế nào ... ngoài các trang được đọc từ đĩa, trừ khi một trang bị tráo đổi nội dung của nó có thể không bao giờ nằm trên đĩa và điều này đặc biệt đúng đối với các trang được ghim trong bộ nhớ, ví dụ do quan trọng đối với chức năng kernel.
Michael

Câu trả lời:


116

Nó không tăng bộ nhớ vật lý chút nào. Mục đích của nó là một cái gì đó khác hoàn toàn. Những gì nó có thể làm là cung cấp các cửa hàng sao lưu khác cho phép các chương trình sử dụng nhiều bộ nhớ hơn là khả dụng.

Bộ nhớ ảo được sử dụng để phân tách và cô lập các quá trình với nhau và cũng cho phép truy cập bộ nhớ được chuyển hướng đến các vị trí thay thế.

Bộ nhớ ảo cho phép hệ thống cung cấp cho mọi tiến trình không gian bộ nhớ riêng được phân lập từ các tiến trình khác. Với các chương trình hoạt động hiệu quả trong không gian riêng, nó cung cấp cho họ quyền truy cập đầy đủ vào toàn bộ không gian địa chỉ thay vì phải làm việc xung quanh các chương trình khác có thể cần sử dụng các địa chỉ "tương tự". Điều này có tác dụng phụ là tăng độ tin cậy và bảo mật vì các quy trình không thể dễ dàng can thiệp lẫn nhau.

Không gian bộ nhớ ảo của một ứng dụng được xây dựng khi cần thiết. Một ứng dụng có vẻ như nằm trong một khối bộ nhớ liền kề duy nhất nhưng thực sự có thể bị phân tán hoàn toàn trên bộ nhớ vật lý.

Bộ nhớ ảo cũng cho phép truy cập bộ nhớ bị kẹt và chuyển hướng cho phép chúng ta sử dụng các tính năng như một tệp hoán đổi. Điều này có nghĩa là chúng ta có thể đẩy các phần của bộ nhớ gần đây đã được sử dụng ra đĩa và thiết lập một con trỏ có nội dung "khối bộ nhớ này nằm trong tệp x tại vị trí y" và sau đó chúng ta có thể giải phóng bộ nhớ vật lý khu vực để sử dụng bởi một ứng dụng khác. Khi một ứng dụng cần bộ nhớ đó, nó có thể được đọc lại từ đĩa, được đặt tại một số vị trí của RAM vật lý (có khả năng khác với vị trí trước đó) và được ánh xạ trở lại vào cùng một vị trí của bộ nhớ ảo như trước đây.

Cũng giống như cách sử dụng tệp trang, bộ nhớ ảo cũng có thể cho phép hệ điều hành thực hiện việc tải thư viện chia sẻ một cách hiệu quả cho một chương trình. Khi chương trình chính báo cho hệ điều hành rằng nó muốn sử dụng một thư viện cụ thể thì hệ điều hành có thể tiết kiệm thời gian bằng cách kiểm tra các yêu cầu cho thư viện, phân bổ không gian trong vùng bộ nhớ ảo cho ứng dụng, nhưng thay vì tải toàn bộ thư viện trong đó có thể trì hoãn tải các trang của thư viện từ đĩa cho đến khi chúng thực sự cần thiết. Theo cách này, các phần duy nhất của thư viện được tải vào RAM là các phần thực sự được chương trình sử dụng, các phần không bao giờ được sử dụng sẽ không bao giờ được tải và vì vậy đừng lãng phí RAM.

Sử dụng các kỹ thuật này, chúng tôi cải thiện tính ổn định của hệ thống và cho phép nhiều quy trình hơn chạy trong một không gian hạn chế mà không ảnh hưởng quá mức đến nhau. Nó không "tăng bộ nhớ", mà thay vào đó cho phép chúng ta sử dụng hiệu quả hơn những gì chúng ta có.

Các tập tin hoán đổi được kích hoạt bởi các hệ thống bộ nhớ ảo, nhưng trong quá khứ đã nhầm lẫn như bộ nhớ ảo.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Sathyajith Bhat

21

Lời giải thích của giáo dân

Hệ thống sẽ phải ánh xạ từng địa chỉ ảo thành địa chỉ vật lý khi bộ nhớ đó được sử dụng, nhưng không phải tất cả bộ nhớ đều được sử dụng cùng một lúc . Ví dụ: giả sử bạn có 20 tab trong trình duyệt của mình, mỗi tab chiếm 1GB bộ nhớ. Trong hệ điều hành không có hỗ trợ bộ nhớ ảo, bạn sẽ cần 20GB RAM để hoạt động. Mẹo nhỏ là, bạn không duyệt tất cả 20 tab cùng một lúc, do đó, HĐH có bộ nhớ ảo sẽ cho phép bạn sử dụng trình duyệt của mình như thế chỉ với một vài GB RAM, hoán đổi các tab không hoạt động sang đĩa.

Các khía cạnh phức tạp hơn

Bộ nhớ ảo không được sử dụng riêng cho việc hoán đổi. Mục đích chính của nó thực sự là để tránh sự phân mảnh RAM, một vấn đề lớn đối với các hệ thống không có quản lý bộ nhớ ảo: bạn có thể có 1GB RAM miễn phí, nhưng nếu nó có dung lượng 10MB, một ứng dụng yêu cầu 100 MB sẽ không thể hoạt động .

Theo thời gian, bộ nhớ ảo thậm chí còn sử dụng nhiều hơn, đáng chú ý là truy cập tệp ngẫu nhiên: nhiều ứng dụng như cơ sở dữ liệu sẽ trở nên chậm chạp nếu chúng buộc phải đọc tệp tuần tự và hoạt động nhanh hơn nhiều nếu HĐH cho phép chúng giả vờ toàn bộ tệp nằm trong (ảo ) bộ nhớ và tối ưu hóa IO đĩa và bộ nhớ đệm dựa trên các mẫu truy cập.


9
thật đáng buồn khi chúng ta sống trong một thế giới nơi mỗi tab trình duyệt cần 1GB bộ nhớ
tbodt

9
@tbodt Mình trách người Ai Cập cổ đại. Giá như họ biết họ đang làm gì bằng cách thuần hóa những con mèo phiền phức đó!
Dmitry Grigoryev

@tbodt Đó là một chút cường điệu quá. Trình duyệt của tôi với 8 tab mở chỉ mất 500 MB bộ nhớ.
Random832

2
@ Random832 Chắc chắn đó là một sự cường điệu, mặc dù tôi không chắc chắn về ranh giới giữa cường điệu và là bằng chứng trong tương lai. PC đầu tiên của tôi có 32 MB RAM và tôi có thể dễ dàng mở 8 tab trong Opera mà không cần trao đổi. Bây giờ phải mất 500MB, vì vậy trong 20 năm nữa, nó cũng có thể đạt tới 8GB.
Dmitry Grigoryev

5

Bộ nhớ ảo không làm tăng bộ nhớ, theo nghĩa thực sự là thêm nhiều phần cứng bộ nhớ chính. Nhưng nó có thể tăng phạm vi địa chỉ có thể sử dụng . Vì vậy, người ta có thể có một chương trình đang chạy bao gồm phân đoạn mã và phân đoạn dữ liệu (stack & heap) và cả hai đều có thể chiếm một dải địa chỉ ảo lớn hơn phạm vi địa chỉ vật lý được cung cấp bởi không gian lưu trữ thực của máy móc. Thủ thuật là chỉ một phần nhỏ trong số các địa chỉ ảo đó được hỗ trợ bởi bộ nhớ chính vật lý bất cứ lúc nào [nhưng cuối cùng mọi thứ đều được hỗ trợ bởi bộ lưu trữ đĩa] . Điều này hoạt động vì các hiện tượng của địa phương tham chiếu: Tại bất kỳ thời điểm nào, chỉ có các hướng dẫn trong một hoặc nhiều phần tiếp giáp nhỏ của phân đoạn chương trình được thực thi và chỉ có dữ liệu trong một hoặc nhiều phần liền kề nhỏ của phân đoạn dữ liệu được thực hiện theo [tất nhiên hành vi thực sự phức tạp hơn , nhưng nó thực hiện theo mô hình này trong một phần lớn thời gian]


4

Tôi hiểu rằng bộ nhớ ảo đánh lừa chương trình bằng cách hiển thị nhiều bộ nhớ hơn thực tế có sẵn.

Động lực ban đầu cho bộ nhớ ảo là một hình thức quản lý bộ nhớ để cung cấp một không gian địa chỉ lớn hơn bộ nhớ vật lý.
Phần mềm có thể sử dụng không gian địa chỉ đầy đủ của CPU (ví dụ: 2 ^ 32 không gian địa chỉ) trong khi bộ nhớ vật lý được cài đặt thực tế chỉ là một phần của số đó.
Các chương trình lớn có thể di động giữa các máy tính sử dụng bộ nhớ ảo mà không áp đặt các yêu cầu bộ nhớ lớn (đã cài đặt).
Việc sử dụng bộ nhớ ảo này đã trở lại vào thời của máy tính máy tính lớn và bộ nhớ lõi ferrite (vốn có mật độ vật lý thấp và đắt tiền).

Nhưng cuối cùng nó phải ánh xạ địa chỉ logic đến địa chỉ thực tế. Bây giờ làm thế nào là tăng bộ nhớ?

Bộ nhớ ảo đã phát triển từ chỉ một kỹ thuật để cung cấp thêm không gian địa chỉ cho chương trình.
Bộ nhớ ảo là một thành phần quan trọng trong việc cung cấp bảo mật cho từng quy trình trong các hệ điều hành hiện đại, do đó một quy trình không thể can thiệp vào quy trình khác, cũng như không bị xâm phạm bởi quy trình khác.
Nhưng đa xử (đừng nhầm lẫn với đa tiến ORS ) với bộ nhớ ảo vẫn cung cấp bộ nhớ rõ ràng hơn đối với hệ thống hơn bộ nhớ vật lý.

Mỗi quá trình được tạo ra được cung cấp không gian địa chỉ ảo riêng, tức là bộ nhớ ảo của chính nó.
Lượng bộ nhớ vật lý thực sự được sử dụng (và được ánh xạ tới bộ nhớ ảo) cho mỗi quy trình là động. Thông thường chỉ có bộ nhớ ảo chứa mã (còn gọi là văn bản) và các trang / phân đoạn dữ liệu để thực hiện quá trình được ánh xạ tới bộ nhớ vật lý (còn gọi là bộ nhớ trong bộ nhớ).

Mã không quan trọng (vì hiện tại nó không được thực thi) và dữ liệu (vì nó không được tham chiếu / xử lý) không phải là bộ nhớ cư trú mọi lúc. Mã và / hoặc các trang / phân đoạn dữ liệu có thể được "tráo đổi" sang cửa hàng sao lưu (ví dụ: trao đổi không gian hoặc tệp trang trên ổ cứng hoặc SSD) và sau đó "hoán đổi (trở lại) trong" khi cần (còn gọi là "theo yêu cầu" ).

Bộ nhớ ảo tạo điều kiện cho việc sử dụng hiệu quả bộ nhớ vật lý hữu hạn giữa nhiều tiến trình, mỗi tiến trình có không gian địa chỉ ảo được bảo vệ riêng. Tổng của các bộ nhớ ảo này thường sẽ lớn hơn bộ nhớ vật lý đã cài đặt.
"Bộ nhớ tăng" bây giờ là từ phối cảnh hệ thống, và không chỉ là phối cảnh chương trình.


3

Bộ nhớ ảo làm tăng lượng dữ liệu mà một chương trình có thể xử lý. Từ quan điểm phần mềm, chúng tôi (nói chung) không quan tâm nơi dữ liệu được lưu trữ. Nó có thể được lưu trữ trong bộ nhớ DRAM vật lý, nó có thể được lưu trữ trên ổ đĩa flash được cắm vào máy hoặc thậm chí có thể được lưu trữ trên một đĩa quay. Điều mà phần mềm quan tâm là, khi nó yêu cầu truy cập dữ liệu đó, nó đã thành công.

Trong thực tế, chúng tôi cũng muốn các chương trình chạy nhanh. Để xem xét tốc độ , chúng tôi quan tâm dữ liệu ở đâu. Chúng tôi muốn dữ liệu chúng tôi đang truy cập thường xuyên nhất sẽ được lưu trữ trong phần cứng cho phép truy cập nhanh nhất. Chương trình của chúng ta sẽ thích để chạy hoàn toàn ra khỏi DRAM. Tuy nhiên, chúng ta thường không có đủ DRAM để làm điều này. Bộ nhớ ảo là một giải pháp.

Với bộ nhớ ảo, hệ điều hành "trang" ra dữ liệu không được sử dụng trong một thời gian, lưu trữ nó trên đĩa cứng. Điều này vẫn có thể truy cập, chỉ cần chậm. Nếu chương trình yêu cầu dữ liệu trên đĩa cứng, hệ điều hành phải dành thời gian để đọc dữ liệu khỏi đĩa và chuyển nó trở lại vào DRAM.

Về lý thuyết, nó chỉ có thể đọc dữ liệu trực tiếp từ đĩa. Tuy nhiên, có những lý do nó không được thực hiện theo cách đó. Các chương trình không muốn phải nhận thức được tất cả các biến chứng này. Chúng ta có thể và thực hiện viết phần mềm đưa dữ liệu vào đĩa một cách thông minh (nó được gọi là bộ nhớ đệm). Tuy nhiên, nó cần rất nhiều công việc phụ. Nhanh nhất chúng ta có thể làm điều đó trong mã là:

if data is not in memory
    read data from disk into memory
operate on data

Một người đọc sắc sảo sẽ nhận thấy rằng, ngay cả khi dữ liệu nằm trong bộ nhớ, chúng ta phải có một điều kiện để kiểm tra xem nó có ở đó không. Điều này chậm hơn nhiều so với chỉ hoạt động trong bộ nhớ trực tiếp!

Bộ nhớ ảo giải quyết vấn đề này bằng cách kiểm tra phần cứng trên CPU. CPU đang ở một vị trí để thực hiện thao tác bộ nhớ ảo này cực kỳ nhanh chóng vì nó có thể dành phần cứng cho nó. Bất kỳ nỗ lực nào để làm điều này trong phần mềm một mình phải sử dụng các phần mục đích chung của CPU, vốn chậm hơn các bóng bán dẫn chuyên dụng.

Điều này dẫn đến lý do tại sao chúng ta luôn đưa dữ liệu trở lại vào bộ nhớ thay vì chỉ đọc nó từ đĩa và để nó ở đó. Chúng tôi chia bộ nhớ thành "các trang", mỗi trang được đánh dấu là hiện tại hoặc không có trong bộ nhớ. Hệ điều hành duy trì bảng này ở định dạng thuận tiện cho CPU sử dụng trực tiếp. Bất cứ khi nào một chương trình truy cập dữ liệu có mặt, phần cứng trên CPU sẽ cho phép họ truy cập trực tiếp vào dữ liệu trong DRAM. Khi không có dữ liệu, "lỗi trang" được phát ra, yêu cầu hệ điều hành tải trang đó ra khỏi đĩa vào một số trang vật lý của bộ nhớ và cập nhật bảng để trỏ CPU vào trang vật lý mới này.

Chìa khóa cho toàn bộ vấn đề này là giảm thiểu việc sử dụng nó. Trong thực tế, chúng tôi thấy rằng các hệ điều hành rất tốt trong việc chọn dữ liệu nào cần lưu trong bộ nhớ và dữ liệu nào được đưa ra đĩa, do đó, phần lớn các truy cập bộ nhớ xảy ra mà không gây ra lỗi trang.


2

Nó làm như vậy bằng cách làm cho các mục bản đồ tạm thời.

Khi một chương trình truy cập một địa chỉ logic, CPU sẽ tìm trong bản đồ một địa chỉ vật lý tương ứng. Nếu nó được tìm thấy, truy cập bộ nhớ tiến hành như mong đợi; nếu không tìm thấy thì địa chỉ vật lý phải được phân bổ và nội dung được tải từ một số bộ lưu trữ khác - "không gian hoán đổi". Nếu mọi địa chỉ vật lý đã được phân bổ cho một số địa chỉ logic, thì một số địa chỉ logic phải được "tráo đổi" (nội dung của chúng được lưu lại vào không gian trao đổi) để cung cấp địa chỉ vật lý.

Bộ nhớ được phân bổ tối đa là kích thước của không gian trao đổi, có thể lớn hơn nhiều so với bộ nhớ đã cài đặt. Có thể hữu ích khi nghĩ về không gian hoán đổi là bộ nhớ "thực" và RAM là bộ đệm tốc độ cao cho không gian trao đổi.

(Đây là một mô tả kỹ lưỡng, nó nhằm trả lời câu hỏi ngay lập tức mà không đi vào chi tiết có liên quan nhưng không cần thiết.)


1

Khái niệm cơ bản dựa trên thực tế là CPU hiện đại có thể quản lý các bảng dịch theo dõi "phạm vi địa chỉ nào có một quy trình nhất định được phân bổ để sử dụng và địa chỉ vật lý nào (nghĩ A00..Axx trên bus bộ nhớ), NẾU BẤT K , hiện đang được sử dụng để thực sự lưu trữ dữ liệu. "NẾU BẤT K" "vì" không có gì cả "là trạng thái có thể chấp nhận được: Trong trường hợp này, một điều kiện lỗi (cái gọi là" lỗi trang ") sẽ được đưa ra ở cấp độ phần cứng - và lỗi này sẽ kích hoạt trình xử lý cấp hệ điều hành, ví dụ có thể tải nội dung bộ nhớ đã được ghi vào tệp hoán đổi trở lại bất kỳ vị trí miễn phí nào trong bộ nhớ vật lý (trong trường hợp đọc) hoặc tìm vị trí thực tế để đặt nội dung (vào trường hợp viết), cập nhật bảng dịch đã nói ở trên,và chỉ có tay điều khiển trở lại quá trình cố gắng truy cập vào bộ nhớ đó .. và đó sẽ không phải là điều khôn ngoan hơn cho những gì đã xảy ra.


1

Bộ nhớ ảo:

1) cho phép một không gian địa chỉ ảo lớn được ánh xạ tới một lượng bộ nhớ vật lý nhỏ hơn, với phần "bị tráo đổi" dư thừa sang đĩa, hoặc SSD, hoặc tiềm năng cho NVRAM và các thiết bị khác.

2) cho phép không gian địa chỉ ảo lớn hơn (ví dụ 64 bit) được ánh xạ tới không gian địa chỉ vật lý nhỏ hơn (ví dụ 32 hoặc 64 bit)

3) cho phép không gian địa chỉ ảo nhỏ hơn (ví dụ 32 bit) được ánh xạ tới không gian địa chỉ vật lý lớn hơn (ví dụ 40 bit) và do đó cho phép các ứng dụng cũ tận dụng DRAM vật lý nhiều hơn.

4) cho phép bộ nhớ vật lý mà chúng ta phân mảnh và không liền kề trong không gian địa chỉ vật lý được hiển thị liền kề trong không gian địa chỉ ảo.

5) cho phép các tiến trình được cung cấp không gian địa chỉ ảo của riêng chúng và do đó được cách ly với nhau.

6) cho phép các địa chỉ ảo khác nhau xảy ra để chia sẻ cùng một giá trị dữ liệu để phân bổ một trang vật lý.

Điều này có thể xảy ra trong một tiến trình hoặc HĐH duy nhất - hầu hết các HĐH dẫn xuất BSD UNIX đều có một trang số 0 chỉ đọc, có thể được ánh xạ vào bất kỳ trang ảo nào chứa không, điển hình là COW (Sao chép trên ghi - chỉ đọc số không, ghi bị kẹt và trang không được chia sẻ và có thể viết được).

Nó có thể xảy ra giữa các tiến trình - ví dụ UNIX fork () tạo ra các tiến trình con chia sẻ gần như tất cả bộ nhớ ảo theo cách COW.

Nó có thể xảy ra giữa các hệ điều hành - ví dụ: Hệ điều hành khách trên máy chủ ảo có thể có các trang bị trùng lặp, chia sẻ COW, v.v. (Một số cuộc tấn công bảo mật gần đây đã lợi dụng điều này.)

7) bộ nhớ ảo có thể cho phép các phần của không gian địa chỉ ảo được ánh xạ tới các tệp hoặc vào bộ nhớ được ánh xạ trên các bộ xử lý khác, cho dù trong cùng hệ thống đa bộ xử lý hoặc trên Internet.

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.