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


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

運行前

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

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

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

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

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

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

image.png

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

image.png

image.png

裝載

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

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

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

運行

下載程序雖然還在硬盤里面,但是操作系統已經建立了一個進程,它有一套自己的虛擬地址、頁表等高級數據結構。

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

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

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

image.png

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

image.png

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

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

最后進程運行結束,內存中的數據會清理,覆蓋。
image.png

操作系統為什么要這么做

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

參考

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM