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

成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

問答專欄Q & A COLUMN

Linux系統(tǒng)中,C語言程序?qū)儆谶M(jìn)程嗎?進(jìn)程和程序之間是什么關(guān)系?

tigerZHtigerZH 回答0 收藏1
收藏問題

1條回答

Travis

Travis

回答于2022-06-27 17:25

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

進(jìn)程

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

事實(shí)上,進(jìn)程是 Linux 操作系統(tǒng)抽象概念的最基本的一種,Linux 最基礎(chǔ)最重要的工作之一就是管理系統(tǒng)中繁雜的各種進(jìn)程。

上面提到的“執(zhí)行線程”通常被簡稱為“線程”,它被進(jìn)程包含,同一個(gè)進(jìn)程可能有多個(gè)線程,每個(gè)線程都有自己獨(dú)立的程序計(jì)數(shù)器、進(jìn)程棧以及相關(guān)的進(jìn)程寄存器。雖說 Linux 內(nèi)核管理的是進(jìn)程,但其實(shí)最小的調(diào)度單位是線程。

早期傳統(tǒng)的 Unix 系統(tǒng)中,一個(gè)進(jìn)程只能包含一個(gè)線程,所以當(dāng)時(shí)進(jìn)程調(diào)度和線程調(diào)度其實(shí)結(jié)果是一致的。

線程

如今的操作系統(tǒng)中,進(jìn)程包含多個(gè)線程是非常常見的。Linux 與一些其他操作系統(tǒng)不同,它對(duì)進(jìn)程和線程并不明確區(qū)分,對(duì)于 Linux 來說,線程不過是一種比較特殊的進(jìn)程而已。

包括 Linux,現(xiàn)代操作系統(tǒng)一般都會(huì)為進(jìn)程提供兩種虛擬機(jī)制:虛擬處理器和虛擬內(nèi)存。讀者應(yīng)注意“虛擬”一詞,多個(gè)進(jìn)程可能共同使用一個(gè) CPU 和內(nèi)存,但是“虛擬機(jī)制”會(huì)讓進(jìn)程活在楚門的世界一樣,自以為自己獨(dú)占 CPU 和全部內(nèi)存。

應(yīng)注意,線程之間可以共享虛擬內(nèi)存,但是它們?nèi)匀粨碛懈髯缘奶摂M CPU。

到這里,讀者應(yīng)該明白了,編譯器生成的C語言程序本身并不是進(jìn)程。進(jìn)程實(shí)際上是處于運(yùn)行期的程序,與相關(guān)資源的總和。

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

進(jìn)程的產(chǎn)生與消亡

可能有讀者認(rèn)為,直接執(zhí)行一個(gè)程序不就產(chǎn)生新進(jìn)程了嗎?這樣說沒有錯(cuò),但是不夠本質(zhì)。在 Linux 操作系統(tǒng)中,通過 fork() 系統(tǒng)調(diào)用可以復(fù)制現(xiàn)有進(jìn)程,并產(chǎn)生新進(jìn)程。調(diào)用 fork() 的進(jìn)程一般被稱作“父進(jìn)程”,而 fork() 產(chǎn)生的新進(jìn)程則被稱作“子進(jìn)程”。

fork() 調(diào)用結(jié)束時(shí),會(huì)從 Linux 內(nèi)核返回兩次:一次返回到父進(jìn)程,父進(jìn)程恢復(fù)運(yùn)行。一次返回到子進(jìn)程,子進(jìn)程開始執(zhí)行,在這之后,父子進(jìn)程的進(jìn)程資源彼此隔離,不再共享。

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

Linux 操作界面的 shell 終端其實(shí)也是一個(gè)進(jìn)程,通過 shell 輸入的執(zhí)行新程序命令(如 ./a.out )產(chǎn)生的新進(jìn)程其實(shí)都是對(duì)應(yīng) shell 終端的子進(jìn)程。

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

“僵尸進(jìn)程”很難殺死,但是留著“僵尸進(jìn)程”又會(huì)白白浪費(fèi)系統(tǒng)資源。

評(píng)論0 贊同0
  •  加載中...

最新活動(dòng)

您已邀請(qǐng)0人回答 查看邀請(qǐng)

我的邀請(qǐng)列表

  • 擅長該話題
  • 回答過該話題
  • 我關(guān)注的人
向幫助了您的網(wǎng)友說句感謝的話吧!
付費(fèi)偷看金額在0.1-10元之間
<