{eval=Array;=+count(Array);}

国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

問答專欄Q & A COLUMN

Linux系統中,C語言程序屬于進程嗎?進程和程序之間是什么關系?

tigerZHtigerZH 回答0 收藏1
收藏問題

1條回答

Travis

Travis

回答于2022-06-27 17:25

C語言程序員編寫的代碼可以編譯為程序,程序通常存放在磁盤等存儲介質中。在 Linux 中,處于運行期的程序被稱作“進程”。

進程

雖說進程是處于運行期的程序,但是進程并不僅僅局限于可執行的C語言代碼(Linux 稱其為代碼段,text section),它還包括其他資源,例如用于存放全局變量的數據段(data section)、具有內存映射的內存地址空間、要處理的數據、掛起的信號、打開的文件,可能還會包括多個執行線程等等。

事實上,進程是 Linux 操作系統抽象概念的最基本的一種,Linux 最基礎最重要的工作之一就是管理系統中繁雜的各種進程。

上面提到的“執行線程”通常被簡稱為“線程”,它被進程包含,同一個進程可能有多個線程,每個線程都有自己獨立的程序計數器、進程棧以及相關的進程寄存器。雖說 Linux 內核管理的是進程,但其實最小的調度單位是線程。

早期傳統的 Unix 系統中,一個進程只能包含一個線程,所以當時進程調度和線程調度其實結果是一致的。

線程

如今的操作系統中,進程包含多個線程是非常常見的。Linux 與一些其他操作系統不同,它對進程和線程并不明確區分,對于 Linux 來說,線程不過是一種比較特殊的進程而已。

包括 Linux,現代操作系統一般都會為進程提供兩種虛擬機制:虛擬處理器和虛擬內存。讀者應注意“虛擬”一詞,多個進程可能共同使用一個 CPU 和內存,但是“虛擬機制”會讓進程活在楚門的世界一樣,自以為自己獨占 CPU 和全部內存。

應注意,線程之間可以共享虛擬內存,但是它們仍然擁有各自的虛擬 CPU。

到這里,讀者應該明白了,編譯器生成的C語言程序本身并不是進程。進程實際上是處于運行期的程序,與相關資源的總和。

事實上,無論是程序不同,還是執行時的數據不同,都會產生不同的進程。舉例來說,同樣一個C語言程序,是可以產生兩個不同的進程的——它們的運行資源可能是不同的。反過來也是一樣的,多個不同的進程也可以共享同一份資源,例如打開同一個文件,映射同一塊內存空間等。

進程的產生與消亡

可能有讀者認為,直接執行一個程序不就產生新進程了嗎?這樣說沒有錯,但是不夠本質。在 Linux 操作系統中,通過 fork() 系統調用可以復制現有進程,并產生新進程。調用 fork() 的進程一般被稱作“父進程”,而 fork() 產生的新進程則被稱作“子進程”。

fork() 調用結束時,會從 Linux 內核返回兩次:一次返回到父進程,父進程恢復運行。一次返回到子進程,子進程開始執行,在這之后,父子進程的進程資源彼此隔離,不再共享。

不過一般來說,如果有需求創建新的進程,一般都是為了執行不同的新的程序。這一過程通過 exec() 函數族可以方便實現,它們可以為新程序創建新的地址空間,然后加載程序執行。

Linux 操作界面的 shell 終端其實也是一個進程,通過 shell 輸入的執行新程序命令(如 ./a.out )產生的新進程其實都是對應 shell 終端的子進程。

程序既然有新生,也就會有死亡,程序運行結束后,通過 exit() 系統調用退出運行,這個函數會殺死進程,并且將其占用的資源釋放,通知其父進程“死亡信息”。父進程則可以通過 wait() 函數族接收子進程的“死亡信息”,并著手為子進程做后續的“收尸工作”,避免子進程編程“僵尸進程(zombie)”。

“僵尸進程”很難殺死,但是留著“僵尸進程”又會白白浪費系統資源。

評論0 贊同0
  •  加載中...

最新活動

您已邀請0人回答 查看邀請

我的邀請列表

  • 擅長該話題
  • 回答過該話題
  • 我關注的人
向幫助了您的網友說句感謝的話吧!
付費偷看金額在0.1-10元之間
<