作業系統告訴子進程的“可用記憶體”

作業系統告訴子進程的“可用記憶體”

我想知道作業系統如何讓子進程知道有多少可用記憶體。

假設整台電腦內建 1GB RAM 記憶體。所以還剩下 900MB。

然後運行 10 個程式。每個程式建立 10 個子進程。問題是,這些父進程和子進程將其視為可用的總記憶體。

作為問題的第二部分,使其變得更複雜一些,假設應用程式已經運行了一段時間,現在電腦上有 500MB 可用空間(假設作業系統多使用了 100MB,應用程式多使用了 300MB,達到剩餘500MB的水平)。現在的問題是這些父進程和子進程此時將什麼視為可用記憶體。如果和以前一樣,或者不同,又是如何不同的。

提出這個問題的原因是因為我讀過虛擬記憶體其中指出:

虛擬記憶體[是]一種技術,提供“給定機器上實際可用的存儲資源的理想化抽象”,“給用戶造成了擁有非常大(主)內存的錯覺”。

所以基本上,聽起來情況 (1) 中的每個進程都會被告知「您有 1GB 可用記憶體」或「您有 900MB 可用記憶體」。我不確定它實際上會說什麼,如果它說的是全部的整台電腦或總作業系統的使用情況。

那麼對於情況 (2),它將讀取「1GB 可用」、「900MB 可用」、「600MB 可用」或「500MB 可用」。同樣的情況,不知道會說什麼。

它也可能與這些值不同。作業系統可以以某種方式估算 100 個子進程中每個進程的可用內存,或許可以平均分配。因此,如果電腦上還剩下 500MB,則表示每個進程都會被告知「您有 500 / 100 == 5MB 的可用空間」。但如果是這種情況,如果一個進程用完了 5MB,並且還剩下 495MB,想知道是否允許它開始使用它,並被告知可用的新數量。這就是為什麼我認為這不是通常的做法,而是作業系統似乎會告訴大概計算機上有什麼可用的作為一個整體(所以 1GB)。

另外,我認為它總是說“1GB”的原因是因為我不確定是否有辦法確定單個進程正在使用多少內存(或者作業系統是否知道它正在使用多少內存)。如果作業系統知道它本身使用了多少,那麼它似乎會報告 900MB。

另一個令人困惑的地方是,如果內存使用量不斷變化,並且操作系統告訴每個進程總內存是多少 - 已使用的內存,那麼如果您要嘗試訪問,則必須不斷檢查有多少內存可用更多內存。也就是說,您無法在程式啟動時快取記憶體使用情況。可能是程式閒置了幾個小時,以“計算機上”的 100MB 內存啟動,但之後再次檢查發現“哦等等,只有 5MB 可用”。出於某種原因,這似乎是不良行為,但我不確定。

任何有助於理解作業系統如何告訴子進程在不同時間點有多少可用記憶體的幫助都會有所幫助。謝謝。

答案1

作業系統不會「告訴」程式任何有關可用記憶體的資訊。

每個程式都在自己的虛擬記憶體區域中運行,在該區域中它可以存取(它所看到的)整個記憶體區域。潛在的允許的記憶體位址空間。對於 32 位元進程來說,它所謂的「內存」是整個 4GB 的可尋址內存,對於 64 位元進程來說,這個空間要大得多。進程可以從該區域分配內存,然後告訴作業系統它需要用物理內存支援該位址空間的區域,以便可以讀取和寫入,但程式(理論上)擁有與它想要。

在只有 1GB RAM 的系統上,這表示當實體記憶體已滿時,作業系統開始將資料推送到交換檔案或分割區。這是在不涉及記憶體被調出的實際進程的情況下完成的。如果進程嘗試存取調出的內存,則作業系統會停止該進程,從磁碟拉回資料並恢復該進程。

一個程式可以詢問有多少物理RAM 是空閒的,以便它們可以在內存不足的情況下限制自己,但它們不會受到操作系統人為的限制,除非它耗盡了物理RAM 和交換空間,在這種情況下,程序在嘗試時只會收到錯誤來分配記憶體。

答案2

在現代作業系統上運行的一大好處是應用程式無需知道系統中有多少 RAM 或有多少可用。事實上,大多數應用程式都對 RAM 詳細資訊、CPU 有多少核心、實體磁碟機的大小和數量、電腦是否連接到網路或 Internet 等等一無所知。這是應該的。作業系統就是為了以這種方式使用而設計的。

作業系統為應用程式提供獨立於硬體的標準虛擬化環境。應用程式不會直接存取 RAM,而是僅存取與 RAM 大小無關的虛擬位址空間。對於應用程式來說,這就是記憶體。 RAM只是一種效能最佳化(目前技術是必要的)和一個實作細節。部分應用程式程式碼和資料將位於 RAM、頁面檔案或原始檔案中。這可以根據應用程式的需求和資源可用性而改變。這些詳細資訊由作業系統管理,對於應用程式來說是不可見的,即使應用程式想知道也無法找到。

對於需要此資訊的應用程序,可以從作業系統請求硬體詳細信息,但很少有人這樣做。大多數情況下,只有系統實用程式需要此資訊。大多數應用對此的需求很少,就像普通駕駛員需要了解點火正時或燃油混合物一樣。

這一切都是為了好的。這意味著應用程式開發人員可以將時間投入到應用程式的需求上,而不必處理運行該應用程式的硬體的混亂細節。這就是作業系統的用途。這意味著專為具有 4 MB RAM 的 Windows 95 設計的正確編寫的應用程式可以在具有許多 GB RAM 的現代 Windows 10 系統上運行。並且應用程式的操作相同並且沒有意識到差異。並非所有應用程式都寫得那麼好。當然,現代系統將表現更好並為用戶提供更多功能,但應用程式對此一無所知。

這意味著作業系統設計者和開發者需要做大量的工作,但數以百萬計的用戶從中受益。

相關內容