Khi nào hoán đổi được chuyển trở lại bộ nhớ vật lý?


8

Khi nào hoán đổi được chuyển trở lại bộ nhớ vật lý trong Linux? Có phải nó chỉ theo yêu cầu, tức là. khi nào cần? Hoặc là trao đổi từ từ được chuyển vào bộ nhớ vật lý khi máy tính không tải cao?

Câu trả lời:


7

Theo yêu cầu. Trên thực tế, Linux sẽ từ từ chuyển bộ nhớ vật lý sang trao đổi khi không hoạt động (xem: "swappiness").


Cảm ơn. Một câu trả lời ngắn gọn súc tích. Tôi thích điều đó (mặc dù tôi đánh giá cao nỗ lực của mọi người khác đưa vào câu trả lời của họ)!
Ztyx

Câu trả lời này là sai. Câu hỏi là khi bộ nhớ được phân trang, không phân trang. Điều này ngược lại. Trên một lỗi trang, kernel sẽ tải lại trang từ đĩa / trao đổi. Vì vậy, chủ yếu là theo yêu cầu. Bạn có thể truy cập tất cả bộ nhớ ảo của một quá trình để kích hoạt lỗi trang. Kết quả là các trang sẽ được sao chép trở lại RAM.
dùng228505

7

Trong quá trình hoạt động thông thường, dữ liệu từ trao đổi được tải vào bộ nhớ theo yêu cầu, như đã trả lời khác, nhưng có một trường hợp nữa xảy ra: đó là khi không gian trao đổi bị vô hiệu hóa, miễn là có đủ bộ nhớ vật lý để tải toàn bộ nội dung trao đổi.

Cứ làm đi:

swapoff -a

Càng và tất cả dữ liệu trao đổi của bạn sẽ 'trở lại' vào bộ nhớ. Tác dụng phụ là bộ đệm / bộ đệm có thể bị xóa.

Đôi khi có thể cần phải thực hiện swapoff -a ; swapon -a, ví dụ như sau một quá trình rò rỉ bộ nhớ bị lỗi, trước khi bị hỏng, đã thực hiện các quy trình quan trọng hơn - để đảm bảo mọi quá trình đang chạy trong hệ thống được tải vào bộ nhớ và sẽ không chờ trao đổi một vài phút.


Oh, bạn học được điều gì đó tốt mỗi ngày! Btw, sẽ không thể không có bộ nhớ vật lý? Có rủi ro liên quan đến việc gọi trao đổi?
Ztyx

Nó sẽ thất bại nếu không có đủ bộ nhớ vật lý. Đó vẫn là một rủi ro swapoffsẽ không thất bại, nhưng hệ thống sẽ hết bộ nhớ ngay sau đó swapoffvà OOM sẽ giết quá trình ngẫu nhiên (trong trường hợp xấu nhất là lớp vỏ sắp gọi swaponhoặc swaponlệnh). Trong thực tế, điều này rất khó xảy ra - rất nhiều bộ nhớ được sử dụng bởi bộ nhớ cache trước khi swapoffđược gọi vì vậy nó phải đủ RAM cho cả hai lệnh để chạy.
Jacek Konieczny

7

Như những người khác đã chỉ ra, các trang sẽ chỉ được sao chép trở lại vào RAM khi cần thiết (theo yêu cầu) thay vì chiếm RAM có thể tốt hơn để có sẵn cho bộ đệm / bộ đệm.

Việc các trang được sao chép trở lại vào RAM, không bị di chuyển, rất quan trọng và có thể dẫn đến nhầm lẫn nếu bạn không biết về nó. Trang sẽ không bị hủy khỏi trao đổi trừ khi không còn cần thiết nữa (tức là trang đã được giải phóng hoàn toàn), được thay đổi trong RAM (vì vậy bản sao trong trao đổi không còn chính xác nữa) hoặc trao đổi đang ở mức thấp (và bật khối -disk là cần thiết để trao đổi một số trang khác). Bằng cách này, nếu trang cần phải được tráo đổi một lần nữa trong tương lai thì không cần ghi đĩa vì nhân biết rằng đã có một bản sao tốt trên đĩa - điều này có thể giảm đáng kể việc "đập" khi RAM có sẵn trở nên cực kỳ thấp nhưng không gian trao đổi cũng không nghẽn.

Bạn có thể thấy có bao nhiêu trang hiện tại trong cả RAM và trao đổi từ cat /proc/meminfo- SwapCacheddòng là lượng dữ liệu trong các trang hiện có cả RAM và trên đĩa. Nếu bạn nghĩ rằng hoán đổi hiện tại của bạn sử dụng nó cao hơn bạn mong đợi, hãy kiểm tra giá trị SwapCached vì điều này có thể giải thích sự khác biệt.


Đã có các cuộc thảo luận xung quanh các vấn đề tương tự trước đây. Tuy nhiên, không phải câu hỏi cụ thể này. Xem thêm serverfault.com/questions/100448/ , giao dịch với SwapCached.
Ztyx

Tôi thậm chí không nhớ đã viết câu trả lời đó ... Tôi có thể chỉ cần liên kết với (hoặc sao chép + dán) thay vì gõ ở trên ...
David Spillett

0

Điều này thường được ràng buộc với phần cứng bạn đang sử dụng. Trên hầu hết các phần cứng (bao gồm cả intel), MMU kiểm soát toàn bộ quá trình.

Khi một chương trình phân bổ bộ nhớ, nó sẽ yêu cầu nó tới MMU và lấy lại một địa chỉ ảo. Đổi lại, MMU sẽ đăng ký trang đó là "đang sử dụng" trong bản đồ không gian địa chỉ toàn cầu.

Khi chương trình thực sự truy cập vào không gian bộ nhớ đó, MMU sẽ tra cứu trang vào bản đồ địa chỉ. Nếu trang đó nằm trong bộ nhớ "trực tiếp", nó sẽ gửi lại một con trỏ "trực tiếp" cho HĐH sẽ xử lý bộ nhớ đọc / ghi thay cho chương trình. Nếu bộ nhớ hiện không được phân bổ, thì nó sẽ gây ra lỗi trang. Sau đó, ngoại lệ bộ xử lý này bị HĐH bắt giữ, sau đó chịu trách nhiệm tìm ra dữ liệu nằm trong tệp hoán đổi, tải nó vào bộ nhớ vật lý và đưa trang trở lại MMU để quá trình ban đầu có thể tiếp tục.

Điều này có nghĩa là, trừ khi trang bộ nhớ được truy cập, nó sẽ không bao giờ quay lại bộ nhớ "trực tiếp" khi được đưa vào trao đổi. Đó là lý do tại sao thường có API hệ điều hành cho phép các chương trình chỉ định rằng một khối bộ nhớ cụ thể KHÔNG được hoán đổi vào đĩa và nên được giữ trong bộ nhớ (tôi không biết về Linux, nhưng trong Windows, đó là chức năng VirtualLock) .


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.