1. 程式人生 > >【計算機原理】程序執行過程

【計算機原理】程序執行過程

進程 cnblogs div 空間 時間片 chat 內存管理 tro alt

本章主要介紹程序執行過程中操作系統、CPU都幹了什麽

運行前

程序在運行前,只是在硬盤上待著,此時就是一堆二進制代碼而已,沒有任何作用。

程序只有進入了內存才能運行,但是要進入內存,則需要服從操作系統的調度。

一個程序在運行的時候可能需要很大的空間,比如3G,但是操作系統不可能為每個程序都分配那麽大,因為同時加載入內存的程序可能很多。

所以操作系統想了個辦法,它和CPU一起“欺騙”了程序,它可以把硬盤的部分空間當作內存展示給程序,這就是虛擬內存技術,這種欺騙手段能實現的原因在於,程序的局部性原理,也就是程序不會同時運行所有的代碼。

虛擬內存是一種內存管理技術,使得應用程序認為它擁有連續的可用的內存。

實際上可能並不是這樣,它通常是被分隔成多個物理內存碎片,還有可能暫時存儲在外部磁盤存儲器上,

技術分享圖片

這種做法最核心的問題就在於調度。我們可以把程序切分成若幹塊,也就是頁面,然後分頁裝入內存中。這樣,之後暫時用不到的頁面就可以置換到硬盤上呢。

技術分享圖片

技術分享圖片

裝載

在程序運行之前,操作系統會進行程序的裝載,也就是創建一個進程結構,它會有自己的一套虛擬地址、頁表等結構。

但是裝載器不會把代碼裝載到物理內存中,而是用一個頁表把代碼在硬盤上的位置記錄下來,只有在真正運行的時候才會加載到內存裏面。

最後,裝載器會找到程序的入口地址,執行的時候,從入口地址開始讀第一條指令。

運行

下載程序雖然還在硬盤裏面,但是操作系統已經建立了一個進程

,它有一套自己的虛擬地址、頁表等高級數據結構。

操作系統進行進程的調度,當輪到這個進程來的時候,才從裝載器返回的入口點開始執行。

CPU從程序入口處取出指令,但是這是一個虛擬地址,需要轉換為物理地址。那麽怎麽轉換呢?CPU會去查看頁表,可以這個頁表現在還指向的是硬盤中的地址,所以CPU會執行缺頁中斷處理程序

最後CPU會從硬盤裏面把代碼加載入內存,之後CPU當然得把頁表修改一下,這樣才能反映數據已經進入內存呢。

技術分享圖片

隨著程序的執行,越來越多的數據和代碼被加載到物理內存,而且這些加載到內存中的不是連續的,他會安插在內存的不同位置去。

技術分享圖片

值得註意的是,在內存中的只是進程的一個實例而已,可以相當於程序的一個化身

CPU會不斷的讀數據、寫數據,時間片到了,就把進程掛起來,也就是說進程其實不是獨占CPU的,只是因為進程切換得非常快,從人類的角度來看,以為程序在同時執行一樣。

最後進程運行結束,內存中的數據會清理,覆蓋。
技術分享圖片

操作系統為什麽要這麽做

操作系統為什麽要那麽麻煩的搞出什麽內存映射、虛擬內存來,還不是因為資源有限,內存就那麽大,程序又那麽多,為了讓更多的程序運行起來,有效的利用內存和CPU,只能使用這種方法了。

參考

本文由操作系統是個大騙子?改編過來的

【計算機原理】程序執行過程