簡體   English   中英

操作系統何時清除進程的內存

[英]when does an operating system wipes out memory of a process

當某個操作系統決定擦除分配給該進程的內存(數據,代碼等)時,該進程在某些OS上成功終止或異常終止; 在出口還是想要將內存分配給新進程?

在所有操作系統(winXP,Win7,linux,Mac)上,這種清除內存分配過程是否相同?

我了解,頁表具有該進程的虛擬地址與內存中實際物理地址的映射。

謝謝。

操作系統如何回收進程資源(通常)會因操作系統而異。 在Windows方面,NT派生的OS的行為類似,因此win XP和win7之間應該沒有什么區別。 請注意,在這種情況下詢問“內存”是一種過分的簡化,因為存在不同類型的內存。 例如,典型的Windows應用程序將具有堆棧內存,堆內存(有時為多個堆),指令/靜態內存,以及共享內存。 此內存的大部分由進程完全擁有,Windows將在進程終止(甚至異常終止)時回收它。

但是,共享內存可以(並且經常)具有多個所有者; 它與Windows句柄 (一個可以從多個進程引用的內核級對象)綁定在一起。 句柄具有參考計數,如果參考計數變為零,則回收關聯的資源。 這意味着共享內存可以超過引用它的進程。 同樣,進程可能會“泄漏”一個句柄,並且永不回收該句柄。 程序員有責任確保正確關閉這些手柄並且不會泄漏。 異常終止的可能性使這一責任復雜化。

附帶說明一下,當Windows“回收”內存時,它僅表示內存可用於將來分配給其他進程等。在操作系統分配內存新所有者之前,實際的1和0通常會放在那兒。的內存會主動覆蓋它。 因此,“回收”並不意味着內存立即被清零或類似的東西。 在這種情況下,清理內存效率很低並且通常是不必要的。 如果出於安全方面的考慮而提出要求,則不應該依賴操作系統。 您需要先清理內存,然后將進程釋放回操作系統。

如果您想了解有關現代Windows操作系統如何處理內存的更多信息,並且不介意進行任何挖掘,則MSDN上的Windows API文檔中有很多有關此主題的信息,但有點分散。 Windows Handles和加載/卸載庫/進程調用可能是一個不錯的起點。 如果我沒記錯的話,Windows應用程序編程(Richter)可能對此有一些不錯的信息,但是我現在沒有手頭可以檢查。

希望有人對Linux內部有更深入的了解可以解決這個問題。 這是特定於操作系統的內容,因此可能會有差異。 可能值得注意的是,NT之前的Windows(例如Windows 95、98等)具有完全不同的進程內存模型。 這些差異往往會導致OS在異常終止的情況下更難回收內存。 一些用戶發現如果他們運行的是不穩定的應用程序,則需要經常重新啟動OS,以清除累積的內存泄漏。

在Linux中,通常在進程終止時釋放資源。 您可以在此處閱讀有關Linux如何處理進程終止的信息: http : //www.informit.com/articles/article.aspx? p=370047& seqNum=4

還有一個OOM殺手,它可以在極端的低內存情況下啟動,我知道在嵌入式Android世界中,這種情況一直在發生,但是我還沒有真正掌握到它,LWN.net可能涵蓋了一些內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM