程序:一組指令的有效集合。它是靜態的,不具有任何的運行意義。程序最終轉換為二進制文件。
進程:程序的執行就是進程。可以把它看成獨立的程序,在內存中有其對應的代碼空間和數據空間。一個進程所擁有的數據和代碼只屬于自己。進程是資源分配的基本單位,也是調度運行的基本單位。
進程和程序并不是一一對應的關系,相同的程序運行在不同的數據集上就是不同的進程。
進程還具有并發性和交往性,而程序卻是封閉的。
這節中有幾個重要的問題,我舉個例子給大家看吧~
第一例:
這段代碼是說什么的呢?顯然,它輸出了函數、初始化的變量,未初始化的變量,堆區,棧區的地址,那么,這些地址有什么規律呢?
可以看的出來,它的地址是依次從低地址到高地址。
然而,還有一類特殊的函數---主函數,它的地址是如何分布的呢?
地址為:
顯然,,帶有命令行參數的主函數的地址比前面比較的棧區的地址還要大。
所以就有了如圖的地址空間:(如果地址空間中的數都是連續的,則我們稱之為線性地址空間)
第二例:
父進程和子進程:
運行結果為:
在這里,我們會不會很奇怪一個問題呢?這里將if和else里邊的內容都執行了。然而在我們經常編寫的代碼中,if和else是不能同時執行的。進程卻在這里做到了。
fork():是創建子進程。這里的getpid()是獲取到子進程的pid,getppid()是獲取到父進程的pid(即這里的2677);
我們發現,父進程和子進程指向的是同一塊內存,那么我們也應該想到他們的指向也應該是一樣的,(這只是我們的推測哦),,看個例子我們就知道了。
eg:
結果是什么呢?
看到那個200和100了嗎?它們的值竟然不一樣。
說明它們并不是同一個指向,那么為什么地址一樣呢?這里就引出了我們的虛擬地址。
虛擬地址空間:在一個帶有虛擬存儲器的系統中,cpu從一個有N=2的n次方個地址的地址空間中生成虛擬地址。
如圖所示:
在這里,虛擬地址空間通過頁表和MMU(存儲器管理單元)映射到物理地址中,它們的物理地址是不相等的,所以最后得到的值也不相等。
今天的內容先說到這里嘍。~~~
歡迎來訪,多多提議哦。