2013-05-20 25 views
6

我已經開始看c編程,雖然我不是一個完整的初學者(我有java和web開發的知識),但有很多東西我不明白。是所有的程序代碼加載到內存的文本代碼段段

我的問題是關於程序何時首次加載到內存中。我無法理解這裏實際發生的事情。

當程序啓動時,所有程序代碼是否加載到內存中,或者只是需要加載?

在這之後,這段代碼\指令集是否被換入和退出物理磁盤,因爲進程獲得CPU時間或程序運行時加載的代碼是否保留在內存中?

如果兩個進程可以共享同一組指令,這是否意味着每個進程在其虛擬內存空間中都有一個獨立的代碼段?

對不起,如果我的問題是基本的或措辭不佳,但我只是在上週和週末閱讀後纔開始看這個問題,我的問題比答案要多得多!

+0

不錯的問題! –

回答

4

是所有的程序代碼加載到內存中的程序 推出或僅需要什麼在加載時?

大多數現代操作系統的將加載「按需」,因此應用程序(main)的起點將由OS加載,那麼OS剛剛揭開序幕那裏。當應用程序跳轉到一段不在內存中的代碼時,它會加載那一點。

在此之後這段代碼\指令集和縮小的過程中獲得CPU時間,或物理磁盤的 而程序運行並加載到內存中的代碼 逗留被換?

如果操作系統決定了一些內存需要的時候可能拋出一些代碼,並重新加載它後,當它需要它[如果以往任何時候再次需要 - 如果它是初始化的一些部分,它可能永遠不會再被擊中]。

如果兩個進程可以共享同一組指令,這是否意味着每個進程在其虛擬內存空間中都有一個獨立的代碼段?

當然可以在同一應用程序的多個副本之間共享代碼。同樣,特定操作系統是否執行此操作取決於操作系統。當然,Linux在兩個(不相關的)進程之間共享來自同一應用程序的代碼副本[顯然,分支進程按定義共享代碼]。我相信Windows也可以。

共享庫(分別爲Linux/Unix和Windows的「.so」和「.dll」文件)也用於在進程之間共享代碼 - 相同的共享庫用於許多不同的應用程序。

數據空間對於每個應用程序當然是分開的,並且共享庫也將在每個進程共享該庫時獲得它們自己的數據段。

+0

Mats謝謝你的回答,它涵蓋了我需要知道的一切,不幸的是(通常情況下)它給我留下了更多相關的問題!如果一個方法的指令被加載,並且這個方法可以在程序的生命期中被多次調用,它會停留在內存中嗎?而我的另一個問題是關於生成圖形顯示的代碼?我會假設這個代碼將不得不在程序的整個生命週期中被加載,或者我認爲這是不正確的? – berimbolo

+0

只要內存不足以滿足操作系統「需要」其他內存的內存,它就會保留在內存中。我不明白爲什麼「生成圖形顯示的代碼」與其他任何代碼有什麼不同 - 它是代碼,就像執行數學運算的代碼一樣,在表中搜索或計算某個整數中的數目。 [顯然,實際在屏幕上繪製的驅動程序的代碼是內核模塊或系統驅動程序,它們通常不是「可交換的」 - 並且這些通常不是「需求加載」,而是一次加載完畢,並且在典型情況下不能卸載]。 –

+0

我應該補充一點,操作系統通常會以某種方式跟蹤「這個內存被使用多久」。因此,一些未被使用的代碼(或數據)很可能會比最近運行的代碼(或數據)「被踢出去」。 –