程序的執行過程(進程)知識點!領走不謝~

程序的執行過程(進程)知識點!領走不謝~

1. 程序間的聊天

我們這些執行 程序都安安靜靜地躺在 硬盤的某個角落中,滿心期待地等待被主人使用,被操作系統裝載,然後進入內存工作,確切地說:被 CPU阿甘執行。進入內存是我們的使命,如果只是在硬盤上待著,那我們就是一堆二進制的代碼而已,除了佔用硬盤的空間,沒有什麼作用。

但是主人似乎特別鍾情於其中的幾個程序,像什麼瀏覽器、 QQ、Word、 播放器, 80%以上的時間都耗在他們上面執行。像我這樣的小工具calculator,默默無聞也無人問津, 除了躺在硬盤裡睡大覺,就是和同一目錄下的helloworld聊天。helloworld也很悲催,自從主人把它創建出來,只運行過一次,在屏幕上輸出一個 hello world !以後就再也沒人搭理了。可是我更悲催, 連一次運行的機會都沒有,我曾經好奇地問helloworld ,在內存中執行到底是什麼感覺,這個糊塗蛋竟然說:“木有感覺,代碼很快就運行完了,我這個程序就退出了”。我又去找同一目錄下的game老兄, 他多次進入內存運行,見多識廣。

“我自己是一名從事了10年的老程序員,辭職目前在做講師,今年年初我花了一個月整理了一份最適合2019年學習Java自學乾貨,從最基礎的到深入的都有整理,送給每一位編程小夥伴,這裡是小白聚集地,歡迎初學和進階中的小夥伴。"文末有領取方式~

沒想到game憤憤然地說: “我告訴你啊,你要想進入內存執行,必須得通過操作系統來裝載,但是操作系統他就是個大騙子!”。

calculator問“為什麼啊?”。 game老兄回答說:

• “第一,他和CPU阿甘狼狽為奸,營造了一個假象,讓我們以為每個程序都可以使用3GB的巨大內存空間,但實際上那只是

虛擬的!我們使用的內存實際上少得可憐!”

• “第二,他不是把你這個程序一下子全部裝入物理內存,而是把你大卸八塊,用他的術語講,叫做頁面(page) ,然後分頁按需

裝入內存, 注意,他不是連續裝入的,有時候先裝入這一塊,有時候先裝入那一塊, 最後你都不知道自己身體的各個部位在內存

的什麼地方,絕對是痛不欲生。 ”

• “第三,你以為在運行時獨佔CPU,別做夢了,操作系統通過分配時間片的方式,讓我們這些程序,不,準確的來講是 進程來輪

轉執行,再加上一點進程調度的算法, 時不時地把你踢出CPU。由於各個進程切換得非常快,給人類形成了一個假象,好像各個

程序在同時執行一樣。你說他是不是個大騙子? ”

程序的執行過程(進程)知識點!領走不謝~

2. 程序裝載

偉大的一天終於來臨了。主人在命令行窗口敲入了 calculator,正在磁盤睡大覺的我立刻被裝載器(loader)喚醒,他說他是操作系統派來的, 要幫我到內存去執行。我滿心歡喜,等待裝載器把我裝入內存,可是等了半天,什麼也沒有發生, 我不由得問他:哥們,難道不是讓我進入內存運行嗎?裝載器說: “急什麼,看你那沒見過世面的樣子,不知道我正在

為你在系統登記信息和創建虛擬地址空間嗎? ”。果然如此 !要給我建立一個虛擬的空間了 ,好吧,既來之則安之。“你是不是忙著把我的代碼和數據都複製到這個虛擬地址空間中來啊?” 我故意問道。“真夠無知的,這是虛擬地址空間,不是實際內存,怎麼可能放代碼和數據?” 這個裝載器脾氣很大。我以為這個裝載器至少會把我的代碼裝載到物理內存,然後在虛擬內存和物理內存直接建立映射。於是耐心等待。但是這個裝載器卻並沒有這麼做, 實際上他除了讀取我的一些Header信息之外,根本沒有把我的數據Copy到物理內存去,他到底要做什麼?我質問道:“你不把我的代碼裝載到物理內存中,我怎麼運行? ”他說: “放心吧,我已經用一個數據結構 (頁表)把你的代碼/數據在硬盤的位置已經記錄下來了,等到真正運行的時候會被裝載的。” 說著他甩給我一張圖: “看到了頁表了嗎,綠色的表示已經裝入內存, 黃色的表示還在磁盤上, 初始狀態下,全是黃色的,就像你一樣。”這個大脾氣的裝載器把活幹完了 ,大大咧咧地從我的代碼中找到了程序的入口點地址(假設是0x080480c0),他說等到進 進程執行的時候就從這裡開始,讀取第一條指令。

程序的執行過程(進程)知識點!領走不謝~

3. 程序運行

我意識到自己雖然還躺在硬盤裡, 但是 操作系統老大已經為我建立了一個 進程了,這個進程有一套自己的虛擬地址、一個

進程控制塊、頁表等“高級”的數據結構,可以準備運行了。果然, 不久以後, 操作系統調度了我這個進程來運行,就從裝載器返回的程序入口點0x080480c0開始。老大命令CPU阿甘去0x080480c0處取出指令來執行, 但這是一個虛擬地址,必須轉化成物理地址才行。於是阿甘就去查看頁表,試圖把它變成物理內存的地址, 可是這個頁表指向的是硬盤中的地址, CPU阿甘立刻報告:“老大,這是個新傢伙,它的代碼還在硬盤上呢!”“好的,馬上啟動缺頁異常處理程序! ” 看來老大已經司空見慣了。缺頁異常處理程序開始執行, 根據頁表中的地址又在硬盤中找到了我, 我配合著讓他把代碼取走。人生的第一次, 我的代碼終於被讀入了內存當中,當然,阿甘也得把頁表給修改一下,這樣才能反映已經數據已經進入內存了。現在可以讀取虛擬地址0x080480c0處的內容了, 通過頁表的翻譯,定位到了物理內存的地址,取出了指令,終於可以執行了 !隨著指令的執行,越來越多的數據和代碼被裝載到物理內存,果然如game所言,我被大卸八塊安插到物理內存的不同位置去了。但是game老兄說的也不對,那其實並不是我,只是我的一個化身而已。 這個化身是一個正在運行的進程,CPU阿甘不停地讀數據、寫數據。 時間片到了,就把這個進程給掛起,過一會兒再運行。最後,進程結束,內存中的數據會被清理、覆蓋,但是我還是我,玩好無損地躺在硬盤上。經歷了這一次的運行,我算是明白了,操作系統確實是個大騙子,但是他其實也很不容易,資源很有限,內存就那麼大,CPU阿甘只有一個,程序又那麼多,為了讓更多的程序運行,更有效地利用內存和CPU, 也只能施展一點騙術了。

程序的執行過程(進程)知識點!領走不謝~

獲取方式:關注小編的頭條號並在後臺私信我:“學習”,即可免費獲取。


分享到:


相關文章: