2012-10-03 85 views
1

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

這是否擦除所有操作系統上的內存分配過程相同(winXP,Win7,Linux,Mac)?

據我所知,頁表具有映射該進程的虛擬地址和內存中的實際物理地址。

謝謝。

回答

4

操作系統回收進程資源的方式(通常會)因操作系統而異。在Windows的方面,NT衍生的操作系統的行爲相似,所以win XP和win7應該沒什麼區別。請注意,在這種情況下詢問'內存'是過分簡化的,因爲存在不同類型的內存。例如,典型的Windows應用程序將具有堆棧內存,堆內存(有時爲多堆),指令/靜態內存以及可能的共享內存。這些內存中的大部分完全由進程擁有,Windows將在進程終止時收回(甚至異常終止)。

但是,共享內存可以(並且經常)擁有多個所有者;它綁定到一個Windows handle(一個內核級對象,可能會被多個進程引用)。手柄有一個引用計數,並且如果引用計數爲零,則關聯的資源將被回收。這意味着共享內存可以超過引用它的進程。另外,一個進程可能會「泄漏」一個句柄,並且該句柄永遠不會被回收。程序員有責任確保這些手柄正確關閉並不泄漏;異常終止的可能性使這種責任變得複雜。

在附註中,當Windows'回收'內存時,它僅僅意味着內存可用於未來分配給其他進程等。實際的1和0通常會坐在那裏,直到操作系統分配內存內存的新所有者主動覆蓋它。因此,「回收」並不意味着記憶立即清零或類似的東西;在這個問題上清理內存是無效的,而且往往是不必要的。如果您出於安全考慮而提出問題,則不應依賴操作系統;在進程將其釋放回操作系統之前,您需要自己清理內存。

如果您想了解更多關於現代Windows操作系統如何處理內存的知識,並且不介意進行一些挖掘操作,MSDN上的Windows API文檔有關於該主題的大量信息,但它有點分散。好的地方可能是Windows Handles,以及加載/卸載庫/進程調用。 Application Programming for Windows (Richter)可能有這方面的一些體面的信息,如果我沒記錯,但我現在沒有副本現在檢查。

希望有人對Linux內部有更多的瞭解,可以解決這個問題。這是操作系統特定的東西,所以可能會有差異。值得注意的是,NT之前的Windows(例如Windows 95,98等)具有完全不同的進程內存模型。這些差異使得操作系統在異常終止的情況下難以回收內存;一些用戶在運行不穩定的應用程序時發現需要頻繁地重新啓動操作系統,以便清理累積的內存泄漏。

+1

在我看來,我回想起Windows在空閒時間進行內存閒置的「空閒進程」。但總的來說你是對的。 –

+0

@BrianWhite我相信你是對的。我還記得有關類似的東西,但幾年前,也可能是在Windows 2000環境下閱讀的?我不知道他們是否繼續在以後的版本中這樣做。可悲的是,我沒有太多的運氣搜索它。任何人有任何參考鏈接? – WeirdlyCheezy

+0

我想知道他們是否仍然如此。我認爲Windows有一個調用來獲取zero'd內存,這就是爲什麼在系統閒置的時候這樣做會很有用。當然,這樣做會消除CPU的數據緩存,因此會在響應請求時嘗試低延遲的進程導致性能下降。 –

1

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

還有OOM殺手可以踢入極低的內存情況,我知道在嵌入式Android世界的東西已經發生了這個但我沒有真的保持在它之上LWN.net可能有一些覆蓋面。

+0

這是一個很好的閱讀,謝謝你的鏈接。一個問題:文章似乎暗示共享內存對於給定進程的地址空間是「全部或全部」(參見mm_struct上的項目符號)。這是準確還是我誤讀了文章?如果是這樣的話,這將是與Windows API世界相比的主要區別(可以請求多個句柄到多個共享內存塊)。 – WeirdlyCheezy

+0

我不確定我是否明白你在問什麼,但共享內存是爲IPC設計的,因此其他進程當然可以訪問它。例如,請參閱shmat的手冊頁,它是System V共享內存IPC的一部分,並將指定的內存段連接到進程地址空間。 http://linux.die.net/man/2/shmat MMAP還有映射共享選項,它也廣泛用於訪問共享內存。我希望澄清事情。 – Matt

+0

我的問題是由於錯誤地解析了這篇引文「如果沒有其他進程正在使用這個地址空間(換句話說,如果它沒有被共享)」。出於某種原因,我認爲整個地址空間要麼共享,要麼不共享(而不是共享段)。我覺得這很令人驚訝。從另一個環節來看,很明顯,事實並非如此,在解析該句時,我只是做出了一個不幸的選擇。感謝您的澄清! – WeirdlyCheezy