2009-07-07 17 views
5

Khi trình quản lý tác vụ của tôi (trên cùng, ps, taskmgr.exe hoặc Trình tìm kiếm) nói rằng một quá trình đang sử dụng XXX KB bộ nhớ, chính xác là gì và nó được cập nhật?Hệ điều hành biết bộ nhớ ứng dụng của tôi đang sử dụng bao nhiêu? (Và tại sao nó không thu gom rác?)

Về phân bổ bộ nhớ, ứng dụng được viết bằng C++ "xuất hiện" khác với hệ điều hành từ một ứng dụng chạy dưới dạng máy ảo (mã được quản lý như .NET hoặc Java)?

Và cuối cùng, nếu bộ nhớ rất trong suốt - tại sao bộ sưu tập rác không phải là chức năng của hoặc do dịch vụ cung cấp bởi hệ điều hành?


Khi nó quay ra, những gì tôi đã thực sự quan tâm đến việc chào bán là TẠI SAO hệ điều hành không thể làm được thu gom rác thải và không gian bộ nhớ defrag - mà tôi xem như là một bước trên "đơn giản là" phân bổ không gian địa chỉ để các quy trình.

Những câu trả lời này giúp ích rất nhiều! Cảm ơn!

+0

Câu trả lời cho đến nay rất tuyệt vời - dẫn đến câu hỏi tiếp theo: hệ điều hành có tồn tại cung cấp môi trường "được quản lý", hoàn chỉnh với thu gom rác không? :) –

+0

Sắp xếp, có các nền tảng "Java" dựa trên blackberry cũng như một số hệ thống nhúng khác. Nhưng không có bất kỳ hệ điều hành lớp máy tính để bàn nào cung cấp GC chung mà không có sự hợp tác ứng dụng rõ ràng. –

+0

Tôi nhớ đọc về một dự án nghiên cứu microsoft cho một hệ điều hành quản lý, mà tôi giả định sẽ là một trong đó cung cấp bộ sưu tập rác, tôi sẽ xem nếu tôi có thể tìm thấy tài liệu tham khảo ... – Martin

Trả lời

4

Đây là một chủ đề lớn mà tôi không thể hy vọng trả lời đầy đủ trong một câu trả lời duy nhất ở đây. Tôi khuyên bạn nên chọn một bản sao của Windows Internals, đó là một tài nguyên vô giá. Eric Lippert đã có một bài đăng blog gần đây là một mô tả tốt về cách bạn có thể xem bộ nhớ được phân bổ bởi hệ điều hành.

Bộ nhớ mà quá trình đang sử dụng về cơ bản chỉ là address space được dành riêng bởi hệ điều hành có thể được hỗ trợ bởi bộ nhớ vật lý, tệp trang hoặc tệp. Điều này là giống nhau cho dù đó là một ứng dụng được quản lý hoặc một ứng dụng gốc. Khi quá trình thoát, hệ điều hành sẽ xóa bộ nhớ mà nó đã cấp cho nó - không gian địa chỉ ảo đơn giản bị xóa và tệp trang hoặc các bộ nhớ vật lý được miễn phí cho các quy trình khác để sử dụng. Đây là tất cả các hệ điều hành thực sự duy trì - ánh xạ của không gian địa chỉ cho một số tài nguyên vật lý. Các ánh xạ có thể thay đổi khi các quá trình đòi hỏi nhiều bộ nhớ hơn hoặc không hoạt động - nội dung bộ nhớ vật lý có thể được chuyển sang đĩa và ngược lại bởi hệ điều hành để đáp ứng nhu cầu. Một quá trình được sử dụng theo những công cụ này có thể thực sự là một trong nhiều thứ - nó có thể là tổng không gian địa chỉ được phân bổ, tổng bộ nhớ được phân bổ (tệp trang + bộ nhớ vật lý) hoặc bộ nhớ. ký ức. Trình quản lý tác vụ có một cột riêng cho từng khả năng này.

Hệ điều hành không thể thực hiện thu gom rác vì nó không có thông tin gì về bộ nhớ thực sự chứa - nó chỉ thấy các trang được cấp phát bộ nhớ, nó không thấy các đối tượng có thể hoặc không được tham chiếu.

Trong khi hệ điều hành xử lý phân bổ ở cấp địa chỉ ảo, trong chính quá trình đó, có các trình quản lý bộ nhớ khác thực hiện các khối có kích cỡ trang lớn này và chia chúng thành thứ gì đó hữu ích cho ứng dụng sử dụng. Windows sẽ trả về bộ nhớ được cấp phát trong ranh giới 64k, nhưng sau đó trình quản lý heap chia nhỏ nó thành các phần nhỏ hơn để sử dụng theo từng phân bổ riêng lẻ được thực hiện bởi chương trình qua new. Trong các ứng dụng .Net, CLR sẽ đưa các đối tượng mới ra khỏi đống rác thu thập được và khi đống đó đạt đến giới hạn của nó, sẽ thực hiện thu gom rác.

+0

Các liên kết tốt! Cảm ơn bạn đã giải thích về cách công việc được phân chia giữa các nhà quản lý hệ điều hành và bộ nhớ. Tôi không bao giờ thực sự học một khóa học hệ điều hành ở trường đại học, nhưng tôi nhớ malloc và tìm thấy kích thước "đúng" để yêu cầu các thói quen FFT của tôi. –

2

Tôi không thể nói với câu hỏi của bạn về sự khác biệt về cách bộ nhớ xuất hiện trong C++ so với máy ảo, v.v. Nhưng tôi có thể nói rằng các ứng dụng thường được cấp một dải bộ nhớ nhất định để sử dụng khi khởi tạo. Sau đó, nếu ứng dụng yêu cầu nhiều hơn, nó sẽ yêu cầu nó từ hệ điều hành, và hệ điều hành sẽ (nói chung) cấp nó. Có nhiều triển khai thực hiện điều này - trong một số hệ điều hành, bộ nhớ của các ứng dụng khác được chuyển đi để cung cấp cho bạn khối tiếp giáp lớn hơn, và trong các ứng dụng khác, ứng dụng của bạn có nhiều bộ nhớ khác nhau.Thậm chí có thể có một số xử lý bộ nhớ ảo có liên quan. Tất cả của nó lên đến một thực hiện trừu tượng. Trong mọi trường hợp, bộ nhớ vẫn được coi là tiếp giáp từ bên trong chương trình của bạn - hệ điều hành sẽ xử lý ít nhất là ít nhất.

Liên quan đến thu gom rác, hệ điều hành biết số giới hạn bộ nhớ của bạn, nhưng không phải nội dung bên trong. Hơn nữa, ngay cả khi nó đã nhìn vào bộ nhớ được sử dụng bởi ứng dụng của bạn, nó sẽ không có ý tưởng những gì khối được sử dụng bởi các biến ngoài phạm vi và như vậy mà GC đang tìm kiếm.

2

Sự khác biệt chính là quản lý ứng dụng. Microsoft phân biệt điều này là Managed và Unmanaged. Khi các đối tượng được cấp phát trong bộ nhớ, chúng được lưu trữ tại một địa chỉ cụ thể. Điều này đúng cho cả các ứng dụng được quản lý và không được quản lý. Trong thế giới được quản lý, "địa chỉ" được bao bọc trong một đối tượng xử lý hoặc "tham chiếu".

Khi bộ nhớ là rác do máy ảo thu thập, nó có thể tạm dừng ứng dụng, di chuyển các đối tượng xung quanh trong bộ nhớ và cập nhật tất cả "tham chiếu" để trỏ đến vị trí mới của chúng trong bộ nhớ.

Trong ứng dụng kiểu Win32, con trỏ là con trỏ. Không có cách nào để hệ điều hành biết nếu đó là một đối tượng, một khối dữ liệu tùy ý, một giá trị 32-bit cũ, v.v. Vì vậy, nó không thể đưa ra bất kỳ suy luận nào về con trỏ giữa các đối tượng, vì vậy nó không thể di chuyển chúng xung quanh trong bộ nhớ hoặc cập nhật con trỏ giữa các đối tượng.

Vì cách tham chiếu được xử lý, hệ điều hành không thể tiếp quản quy trình GC và thay vào đó, nó được để lại cho máy ảo để quản lý bộ nhớ được ứng dụng sử dụng. Vì lý do đó, các ứng dụng VM xuất hiện giống hệt với hệ điều hành. Họ chỉ đơn giản yêu cầu các khối bộ nhớ để sử dụng và hệ điều hành cung cấp cho họ. Khi VM thực hiện GC và biên dịch, bộ nhớ của nó có thể giải phóng bộ nhớ cho hệ điều hành để sử dụng bởi một ứng dụng khác.

+0

Bạn đọc được suy nghĩ của tôi! Tôi không thể hiểu làm thế nào một máy ảo có thể quản lý bộ nhớ cho nhiều ứng dụng, nhưng hệ điều hành không thể. –

+0

Tại sao bỏ phiếu xuống? Có điều gì không chính xác về bài đăng không? –

+0

Tôi ghét khi mọi người bỏ phiếu và không để lại lý do. Đó sẽ là một yêu cầu. –

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