Đã lâu rồi tôi mới học được thứ này, nhưng rồi đây.
Khi một hệ điều hành khởi chạy một tiến trình, nó sẽ gán các trang đó từ bảng bộ nhớ ảo. Hệ điều hành chịu trách nhiệm duy trì bản đồ từ bảng bộ nhớ ảo sang bộ nhớ thực hoặc đến không gian trao đổi trên đĩa. Khi một tiến trình bị giết, HĐH sẽ không ngừng cung cấp cho chu kỳ CPU. Nó thực hiện một vài mục dọn dẹp, một trong số đó là đánh dấu tất cả các trang bộ nhớ của nó là miễn phí. Điều này cho phép chúng được sử dụng lại bởi các ứng dụng khác. HĐH có thể cũng sẽ dọn sạch mọi tài nguyên xử lý mà quá trình có, tự động đóng các tệp, kết nối mạng, đường ống xử lý, v.v. Quá trình này hoàn toàn nằm dưới sự kiểm soát của HĐH và các bước này sẽ được thực hiện cho dù quá trình có chết như thế nào.
Hãy nhớ tất cả những điều này áp dụng cho các quy trình hệ điều hành. Nếu bạn có một số loại máy ảo và nó đang chạy nhiều quy trình ảo cùng một lúc, thì VM có trách nhiệm quyết định cách phân bổ và phân bổ cho chúng. Tuy nhiên, từ HĐH, nó vẫn giống như một quá trình. Vì vậy, trong trường hợp này, nếu bạn có một VM chạy nhiều tiến trình và bạn giết một trong số chúng trong VM, thì có lẽ bạn sẽ không lấy lại được bộ nhớ trong HĐH máy chủ. Nhưng bạn sẽ lấy lại được trong VM. Tuy nhiên, nếu bạn giết VM trong hệ điều hành, thì HĐH sẽ giết VM (gián tiếp giết chết các tiến trình của VM) và lấy lại tất cả bộ nhớ (sẽ không cần phải đi qua trình thu gom rác, miễn phí () , xóa, hoặc bất cứ điều gì khác).
Đầu cơ cao:
Nếu .NET chạy như một máy ảo có nhiều ứng dụng .NET trên cùng một VM, thì .NET có thể giữ bộ nhớ chưa phải là GCd, cho đến khi nó chạy GC và Windows sẽ nghĩ rằng .NET là sử dụng nhiều hơn nó thực sự là. (Và nếu MS thực sự lắt léo, Windows có thể nói .NET với GC trong các tình huống bộ nhớ chặt chẽ, nhưng hầu như không có lý do gì vì đó là không gian trao đổi đĩa dành cho.)
Nếu .NET hoạt động theo cách đó, thì HĐH vẫn sẽ coi đó là một quá trình cho các mục đích của HĐH, chịu trách nhiệm quyết định nên giữ gì và vứt bỏ cái gì, và thông thường không phải là vấn đề của Windows để nói về một quy trình mà nó cần để bắt đầu giải phóng bộ nhớ. Tại thời điểm đó, có thể hình dung rằng MS sẽ xây dựng một API đặc biệt chỉ dành cho .NET để các quy trình .NET trông giống như các quy trình của Windows, ngoại trừ chúng không phải là lý do tại sao mọi người có thể nghĩ rằng bộ nhớ quy trình không bị xử lý. Nó là, thực sự; chỉ là bạn đang nhìn sai quy trình.
Tôi không biết đủ về .NET để nói rằng nó thực sự hoạt động theo cách đó; Java VM chắc chắn không.
Kết thúc đầu cơ.
EDIT: Liên quan đến việc giết chết một quá trình có hại cho quản lý bộ nhớ, điều đó đòi hỏi nhiều quá trình phân bổ ra khỏi cùng một nhóm (tức là chúng giống như các luồng hơn các tiến trình thực) và để bộ nhớ không được giải phóng sau quá trình bị giết Điều đó gần như sẽ đòi hỏi một hệ thống đa nhiệm hợp tác, bởi vì bộ nhớ ảo và đa nhiệm ưu tiên, theo hiểu biết của tôi, thường được triển khai cùng nhau (VM giúp có thể cách ly các tiến trình với nhau và giữ cho chúng không dậm chân vào bộ nhớ của nhau). Có bộ nhớ ảo khiến việc dọn dẹp sau một quá trình ở cấp độ hệ điều hành trở nên tầm thường; bạn chỉ cần di chuyển tất cả các trang từ nhóm quy trình sang nhóm miễn phí.