什麼是程式?什麼是進程?他們之間的區別是什麼?
本篇文章詳細講解以下問題:什麼是程式?什麼是進程?他們之間的區別是什麼?
靈魂拷問:程式與進程的區別?
程式是包含一系列資訊的文件,描述如何在運行時創建一個進程,如我們寫的源程式碼文件,編譯好的可執行文件 .out
文件等。所以在作業系統角度,程式是創建進程的描述。程式文件可以包含以下描述資訊:
- 二進位格式標識 :每個程式都有用於描述可執行文件格式的資訊。
Linux
內核通過該資訊來處理和解釋文件中的其他資訊。如ELF
可執行文件。 - 機器語言指令:機器語言程式對程式進行編碼,得到指令,然後
CPU
去執行該指令。 - 程式入口地址:用於表示程式開始時的起始指令位置,
CPU
從該位置開始執行。 - 數據:程式文件中包含的變數初值和程式使用的字面常量值。
- 符號表與重定位表:描述程式中函數與變數的位置及名稱。可以用於調試和運行時的符號解析(動態鏈接)。
- 共享庫和動態鏈接資訊:程式中的一些欄位,用於程式運行時所需的共享庫以及載入共享庫的動態連接器的路徑名。
- 其他資訊:用於描述創建進程的其他資訊。
那什麼是進程呢?進程是正在運行的程式實例。在系統角度,程式僅佔用磁碟空間,不佔用記憶體等其他資源,而進程是佔用記憶體和CPU
資源。更加官方的來說,進程是具有一定程式功能的關於某個數據集合的一次運行活動。它是作業系統執行的基本單元,在傳統作業系統中,進程既是基本的分配單元,也是基本的執行單元。
再進一步來說,進程是內核定義的一個抽象實體(數據結構),並為該實體分配用於執行程式的各項系統資源。在我們寫好源程式碼文件,通過 gcc
編譯得到可執行文件,即程式。通過 ./file
執行,系統會創建一個新的進程,為執行該程式分配必須的系統資源(記憶體,CPU等)。
對於內核來說,進程則是由用戶記憶體空間和內核數據結構組成。其中,用戶記憶體空間存放程式程式碼及使用的變數,內核數據結構是用於維護進程的狀態資訊(如進程ID,虛擬記憶體表,打開的文件描述符,訊號傳遞與處理的相關資訊,進程資源使用及限制等資訊),即進程式控制制塊。
總的來說,程式是存儲在硬碟的可執行文件,其用來描述創建進程的相關資訊。而進程是運行的程式,其包含兩個部分:處於用戶空間的程式程式碼及變數與處於內核空間的進程狀態資訊(進程式控制制塊)。
一鍵三連是對我最大的鼓勵與支援。歡迎關注編程小鎮,每天漲一點新姿勢😄。