2012-03-18 34 views
6

Có mối quan hệ nào giữa kích thước tệp DLL trong bộ nhớ và kích thước trên đĩa cứng không?Kích thước tệp DLL trong bộ nhớ và kích thước trên đĩa cứng

Điều này là do tôi đang sử dụng phần mở rộng Trình quản lý tác vụ (MS) và tôi có thể vào EXE trong danh sách và nhấn chuột phải -> Mô-đun, sau đó tôi có thể thấy tất cả các tệp DLL mà EXE đang sử dụng. Nó có một cột Độ dài, nhưng nó có tính bằng byte không? Và giá trị (Length) của DLL có vẻ khác với kích thước (DLL) trên đĩa cứng. Tại sao?

+1

Nếu dll thực hiện phân bổ động, bạn có đang cố gắng bao gồm không? –

+0

Bạn có thể đưa ra một ví dụ không? Cột "chiều dài" có nhỏ hơn kích thước tệp không? Lớn hơn? Làm tròn lên tới bội số tiếp theo của 4K? Mối quan hệ giữa hai con số là gì? –

+0

@Andre: cung cấp cho bạn một ví dụ, MSVCR80 là 632565 byte trên đĩa trên TMExtention, nó hiển thị 634880. Ngoài ra TAExtention cho thấy hai bản sao của MSVCP71.dll với độ dài khác nhau. Một là 503808 số khác là 352256 trong khi trên đĩa nó thực sự là 503808 (giống như một được liệt kê trong TMExtention). – Gob00st

Trả lời

5

Có mối quan hệ nhưng không hoàn toàn trực tiếp hoặc đơn giản.

Khi tệp DLL của bạn lần đầu tiên được sử dụng, nó sẽ được ánh xạ tới bộ nhớ. Điều đó không tải nó vào bộ nhớ, chỉ cần phân bổ một số không gian địa chỉ trong quá trình của bạn, nơi nó có thể/có thể được nạp khi/nếu cần thiết. Sau đó, các trang riêng lẻ của DLL được tải vào bộ nhớ thông qua phân trang theo yêu cầu - tức là khi bạn tham khảo một số không gian địa chỉ đã được cấp phát, mã (hoặc dữ liệu) được ánh xạ tới/những địa chỉ đó sẽ được tải nếu nó chưa có trong bộ nhớ.

Bây giờ, ánh xạ địa chỉ chiếm một không gian nhỏ (một trang 4K cho mỗi megabyte không gian địa chỉ được ánh xạ). Tất nhiên, khi bạn tải một số dữ liệu vào bộ nhớ, nó cũng sử dụng hết bộ nhớ. Tuy nhiên, lưu ý rằng nếu hầu hết các trang của bạn có thể/sẽ được chia sẻ giữa các quá trình, vì vậy nếu DLL của bạn được sử dụng bởi 5 quy trình khác nhau cùng một lúc, nó sẽ được ánh xạ 5 lần (tức là, một lần cho mỗi quá trình sử dụng nó). nhưng vẫn chỉ có một bản sao vật lý trong bộ nhớ (ít nhất là bình thường).

Giữa những điều đó, có thể hơi khó khăn ngay cả khi bạn xác định chính xác ý nghĩa của việc tiêu thụ bộ nhớ của một DLL cụ thể.

+0

trong bộ nhớ == trong RAM. –

+0

@HansPassant: "trong bộ nhớ == trong bộ nhớ truy cập ngẫu nhiên"? Bạn đang cố làm rõ điều gì? –

+0

"trong bộ nhớ" là một thuật ngữ khá mơ hồ. "Trong RAM" là một giải thích, "trong bộ nhớ ảo/không gian địa chỉ" khác. Vấn đề ở đây là Jerry tương phản với hai. – MSalters

0

Tất cả phụ thuộc vào những gì bạn gọi là "bộ nhớ" và tiện ích TaskManager của bạn hiển thị chính xác như thế nào.

Mỗi mô-đun thực thi (Exe/Dll) là ánh xạ vào không gian địa chỉ. Kích thước của ánh xạ này bằng với kích thước của nó. Và, tôi đoán, đây là những gì "phần mở rộng" của bạn hiển thị cho bạn.

0

Dấu chân bộ nhớ thường lớn hơn kích thước đĩa vì khi được ánh xạ vào bộ nhớ, nó được căn chỉnh theo trang. Kích thước trang chuẩn là 4KB và 8KB vì vậy nếu dll của bạn là 1KB mã, mã vẫn sẽ sử dụng 4KB trong bộ nhớ.

+0

Không hoàn toàn đúng, ổ đĩa cứng cũng có các sector khoảng 4KB, nó ít rõ ràng hơn. – Thomas

+0

@Thomas: Tôi cho rằng OP đang nói về kích thước tệp thực, không phải là "kích thước được sử dụng trên đĩa". –

+0

@ AndréCaron không có sự khác biệt. Đó là khái niệm tương tự cho cả bộ nhớ và đĩa, cả hai đều phân bổ dữ liệu trong các trang/lĩnh vực. Vì vậy, "kích thước tệp thực" sẽ tương đương với "bộ nhớ được sử dụng mà không tính đến các trang tài khoản", điều này không hữu ích lắm. – Thomas

1

Đừng nghĩ về tệp .dll hoặc tệp .exe làm nội dung được sao chép vào bộ nhớ được thực thi.

Hãy coi đó là bộ hướng dẫn cho trình tải. Chắc chắn nó chứa văn bản chương trình và dữ liệu tĩnh. Quan trọng hơn, nó chứa tất cả thông tin cho phép văn bản đó được di dời và có tất cả các tham chiếu không hài lòng của nó được nối và xuất các tham chiếu mà các mô-đun khác có thể cần.

Sau đó, nếu có biểu tượng và thông tin số dòng để gỡ lỗi, đó vẫn là văn bản nhiều hơn.

Vì vậy, nói chung bạn sẽ mong đợi nó lớn hơn hình ảnh bộ nhớ.

2

Có hai phần mà đi vào chơi trong việc xác định kích thước của một dll trong bộ nhớ:

  1. Như mọi người khác chỉ ra, bộ nhớ get dll của ánh xạ, điều này dẫn đến trang con kích thước của họ liên kết (trên của lý do các địa chỉ tải ưa thích từ trở lại trong ngày phải được căn chỉnh trang).nói chung, liên kết trang là 4Kb cho các hệ thống 32 bit, 8Kb cho các hệ thống 64 bit (để có cái nhìn sâu sắc hơn về điều này trên các cửa sổ, hãy xem this).
  2. Dll có chứa một phân đoạn cho dữ liệu chưa được khởi tạo, trên đĩa phân đoạn này được nén, thường là kích thước cơ sở, khi dll được nạp và khởi tạo, khoảng trống cho phân đoạn .bss được phân bổ, tăng kích thước của nó. Nói chung điều này một nhỏ và sẽ được bỏ qua bởi sự liên kết trang, nhưng nếu một dll chứa bộ đệm tĩnh lớn, điều này có thể bóng kích thước ảo hóa của nó.
+0

Điểm số 2 rất thú vị. Tôi muốn biết nhiều hơn; Bạn có một tài liệu tham khảo để đọc về điều này? –

+1

@ AndréCaron: trình biên dịch/triển khai hơi cụ thể, vì vậy tốt nhất tôi có thể cung cấp là liên kết wikipedia: http://en.wikipedia.org/wiki/.bss – Necrolis

Các vấn đề liên quan