本章主要介紹程式執行過程中作業系統、cpu都幹了什麼
程式在執行前,只是在硬碟上待著,此時就是一堆二進位制**而已,沒有任何作用。
程式只有進入了記憶體才能執行,但是要進入記憶體,則需要服從作業系統的排程。
乙個程式在執行的時候可能需要很大的空間,比如3g,但是作業系統不可能為每個程式都分配那麼大,因為同時加載入記憶體的程式可能很多。
所以作業系統想了個辦法,它和cpu一起「欺騙」了程式,它可以把硬碟的部分空間當作記憶體展示給程式,這就是虛擬記憶體技術,這種欺騙手段能實現的原因在於,程式的區域性性原理,也就是程式不會同時執行所有的**。
虛擬記憶體是一種記憶體管理技術,使得應用程式認為它擁有連續的可用的記憶體。
實際上可能並不是這樣,它通常是被分隔成多個物理記憶體碎片,還有可能暫時儲存在外部磁碟儲存器上,
這種做法最核心的問題就在於排程。我們可以把程式切分成若干塊,也就是頁面,然後分頁裝入記憶體中。這樣,之後暫時用不到的頁面就可以置換到硬碟上呢。
在程式執行之前,作業系統會進行程式的裝載,也就是建立乙個程序結構,它會有自己的一套虛擬位址、頁表等結構。
但是裝載器不會把**裝載到物理記憶體中,而是用乙個頁表把**在硬碟上的位置記錄下來,只有在真正執行的時候才會載入到記憶體裡面。
最後,裝載器會找到程式的入口位址,執行的時候,從入口位址開始讀第一條指令。
作業系統進行程序的排程,當輪到這個程序來的時候,才從裝載器返回的入口點開始執行。
cpu從程式入口處取出指令,但是這是乙個虛擬位址,需要轉換為實體地址。那麼怎麼轉換呢?cpu會去檢視頁表,可以這個頁表現在還指向的是硬碟中的位址,所以cpu會執行缺頁中斷處理程式
最後cpu會從硬碟裡面把**加載入記憶體,之後cpu當然得把頁表修改一下,這樣才能反映資料已經進入記憶體呢。
隨著程式的執行,越來越多的資料和**被載入到物理記憶體,而且這些載入到記憶體中的頁不是連續的,他會安插在記憶體的不同位置去。
值得注意的是,在記憶體中的只是程序的乙個例項而已,可以相當於程式的乙個化身。
cpu會不斷的讀資料、寫資料,時間片到了,就把程序掛起來,也就是說程序其實不是獨佔cpu的,只是因為程序切換得非常快,從人類的角度來看,以為程式在同時執行一樣。
最後程序執行結束,記憶體中的資料會清理,覆蓋。
作業系統為什麼要那麼麻煩的搞出什麼記憶體對映、虛擬記憶體來,還不是因為資源有限,記憶體就那麼大,程式又那麼多,為了讓更多的程式執行起來,有效的利用記憶體和cpu,只能使用這種方法了。
本文由作業系統是個大**?改編過來的
計算機組成原理指令與程式在主機上執行過程
程式執行過程 取指令 pc 存放當前預執行指令的位址,具有計數功能 pc 1 pc 分析指令 ir 存放當前預執行的指令 執行指令 cu mdr 儲存器資料暫存器 取指令 pc將指令位址給mar mar將指令位址給儲存體 在控制器控制下,將儲存體中的取數指令取出並儲存到mdr 取出的mdr中的指令儲...
計算機基礎(二) 程式執行
1 源程式如.c cpp 2 經過預處理器,得到被修改後的源程式.i 預處理器可以刪除注釋 包含其他檔案以及執行巨集 巨集macro是一段重複文字的簡短描寫 替代。3 經過編譯器,得到彙編文字.s 4 經過彙編器,得到可重定位目標程式,二進位制檔案.o 5 經過鏈結器,如printf.o加入,得到可...
計算機原理
關於 深入理解計算機系統 老趙的這一番話,深深的觸動了我,確實,這本書用怎麼說呢,並不是深入,而是涉及的知識比較廣,但又都是廣大程式猿不得不知道的知識,下面我們就來慢慢品嚐這本書吧。工作之餘,學習學習,總是好的。言歸正傳,接下來,享讀 computer systems a programmer s ...