Sử dụng ps, tôi có thể thấy kích thước, vsize (giống như VIRT hàng đầu?) Và rss (giống như RES của top?). (Một cái nữa tôi thấy ở trên cùng là SHR.)
Ai đó có thể tóm tắt cho tôi những lĩnh vực khác nhau có nghĩa là gì?
Sử dụng ps, tôi có thể thấy kích thước, vsize (giống như VIRT hàng đầu?) Và rss (giống như RES của top?). (Một cái nữa tôi thấy ở trên cùng là SHR.)
Ai đó có thể tóm tắt cho tôi những lĩnh vực khác nhau có nghĩa là gì?
Câu trả lời:
Nói ngắn gọn:
Kích thước ảo: là lượng không gian địa chỉ mà một quy trình đang quản lý. Không gian địa chỉ ảo chứa mọi thứ mà quá trình có thể truy cập thông qua các con trỏ (tham chiếu địa chỉ bộ nhớ). Ví dụ: nếu chương trình của bạn có quyền truy cập vào bộ đệm khung của thẻ video, bộ nhớ đó được ánh xạ tới không gian ảo xử lý và nhận địa chỉ được lưu trữ vào một con trỏ. Các tệp ánh xạ bộ nhớ và ánh xạ ẩn danh cũng được tính vào kích thước không gian địa chỉ ảo. Khá nhiều thứ nằm trong kích thước ảo. Nếu bạn tổng hợp kích thước của tất cả các phạm vi địa chỉ được liệt kê /proc/<pid>/maps
, nó sẽ trả về cho bạn cùng một giá trị của kích thước ảo.
Kích thước thường trú: là dung lượng bộ nhớ thuộc về quá trình đó hiện đang tồn tại trong bộ nhớ. Điều đó có nghĩa là, số lượng bộ nhớ không được trao đổi. Lưu ý rằng các phần của quy trình có thể nằm trong bộ nhớ trao đổi ngay cả khi quy trình đang chạy. Hệ điều hành sẽ kéo các vùng này khỏi trao đổi khi quá trình cố gắng truy cập nó. Điều này nên bao gồm cả đống, ngăn xếp của tất cả các luồng và ánh xạ riêng tư khác. Nếu bạn nhìn vào /proc/<pid>/maps
, các [stack]
, [heap]
và ánh xạ ẩn danh khác (những người không có đường dẫn tập tin) hoặc là hoán đổi hoặc hạch toán vào kích thước thường trú.
Kích thước được chia sẻ: là dung lượng bộ nhớ có thể thuộc về nhiều quy trình. Ví dụ: nếu bạn có bốn phiên bản của cùng một ứng dụng được tải trong bộ nhớ, bạn sẽ có bốn phiên bản của heap và ít nhất bốn ngăn xếp, một cho mỗi tiến trình (đây là bộ nhớ lưu trú), nhưng bạn sẽ chỉ có một phiên bản mã nhị phân của chương trình và các thư viện của nó. Đây là không gian chia sẻ. Không chỉ bao gồm mã nhị phân chương trình và các thư viện của nó, mà còn bao gồm các tệp bản địa hóa, dữ liệu chương trình chỉ đọc, phân đoạn bộ nhớ chia sẻ SysV và POSIX, semaphores, v.v ... Nếu bạn nhìn vào /proc/<pid>/maps
, hầu hết các ánh xạ được gắn vào thư viện và tệp chương trình chia sẻ.
Lưu ý rằng VIRT chứa sự kết hợp của RSS và SHR và sẽ luôn lớn hơn bất kỳ một trong số chúng. Có thể có các khu vực được tính là cả RSS và SHR.
Trong câu trả lời của Juliano:
Lưu ý rằng RSS + SHR <= VIRT, luôn luôn.
Đây chỉ là sai. SHR chứa tất cả bộ nhớ ảo có thể được chia sẻ với các quy trình khác và RSS chứa tất cả bộ nhớ vật lý trong RAM được sử dụng bởi quy trình.
Do đó, tất cả bộ nhớ chia sẻ hiện tại trong RAM đều được tính cả trong SHR và RSS, vì vậy SHR + RSS không có ý nghĩa gì vì nó có thể chứa số lượng trùng lặp.
Để xây dựng một quy trình với RSS + SHR> VIRT, chỉ cần mmap một tệp lớn (1GB), sau đó đọc hoàn toàn: tệp được gắn vào sẽ được tải trong RAM và VIRT, SHR và RSS mỗi tệp sẽ lớn hơn 1GB, vì vậy SHR + RSS> VIRT.