Linux進(jìn)程總結(jié)


點(diǎn)擊「閱讀原文」查看良許原創(chuàng)精品視頻。
來自:小組17級(jí)成員--朱文博
鏈接:https://blog.csdn.net/weixin_42250655/article/details/81567643
進(jìn)程
進(jìn)程,是計(jì)算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。它的執(zhí)行需要系統(tǒng)分配資源創(chuàng)建實(shí)體之后,才能進(jìn)行。舉個(gè)例子:我們所寫的程序,在運(yùn)行的時(shí)候它也是一個(gè)進(jìn)程。
進(jìn)程和程序的區(qū)別:程序相當(dāng)于是一個(gè)文件,是有序代碼的集合,是靜態(tài)的存儲(chǔ)在硬盤中。而進(jìn)程是運(yùn)行中的程序,系統(tǒng)會(huì)為變量分配相應(yīng)的內(nèi)存和初始化它們的值,還有一些資源如:堆、棧等當(dāng)程序運(yùn)行完進(jìn)程也就結(jié)束了,但程序還是保存在硬盤中沒有消失。
進(jìn)程的特性
①并發(fā)性:可以與其它進(jìn)程在宏觀上同時(shí)向前推進(jìn)。
②動(dòng)態(tài)性:進(jìn)程是執(zhí)行中的程序,動(dòng)態(tài)產(chǎn)生、動(dòng)態(tài)消亡、動(dòng)態(tài)變化。
③獨(dú)立性:進(jìn)程是系統(tǒng)資源分配的基本單位。
④交往性:與其它進(jìn)程可以進(jìn)行交互。
⑤異步性:不統(tǒng)一推進(jìn)。
⑥結(jié)構(gòu)性:每個(gè)進(jìn)程有一個(gè)控制塊PCB。
⑦并行性:只有在多CPU多處理器的計(jì)算機(jī)上,進(jìn)程才能并行執(zhí)行。
?
并發(fā)性和并行性的區(qū)別:
并發(fā)性是在宏觀上的同時(shí)向前推進(jìn),CPU使用時(shí)間輪轉(zhuǎn)機(jī)制對(duì)進(jìn)程進(jìn)行調(diào)度,可能一個(gè)進(jìn)程占用CPU短短10ms就切換去執(zhí)行另一個(gè)進(jìn)程了,而我們的肉眼是不可能看到這種細(xì)微的變化,所以我們在宏觀概念上認(rèn)為它是同時(shí)推進(jìn)的,這就是并發(fā)性。(一定是在宏觀上)
并行性就是真正意義上的一起推進(jìn),就是多個(gè)進(jìn)程在同一時(shí)間被一起執(zhí)行。但是上面也提到過,想要支持進(jìn)程并行,必須是多CPU的計(jì)算機(jī)。
一個(gè)進(jìn)程中如何創(chuàng)建多個(gè)進(jìn)程
創(chuàng)建進(jìn)程有兩種方式:一種是操作系統(tǒng)創(chuàng)建,另一種是父進(jìn)程創(chuàng)建。父進(jìn)程創(chuàng)建的進(jìn)程(通常稱為子進(jìn)程),它們和父進(jìn)程存在隸屬關(guān)系。子進(jìn)程又可以創(chuàng)建進(jìn)程,這樣形成一個(gè)進(jìn)程家族。子進(jìn)程可以繼承其父進(jìn)程幾乎所有的資源。

孤兒進(jìn)程
孤兒字面意思就是沒有父母的孩子,那孤兒進(jìn)程的意思就是沒有父進(jìn)程的進(jìn)程。這種情況是怎么發(fā)生的呢?就是父進(jìn)程先于子進(jìn)程結(jié)束,這時(shí)子進(jìn)程被init進(jìn)程收養(yǎng),init的進(jìn)程號(hào)為1。
僵尸進(jìn)程
當(dāng)一個(gè)子進(jìn)程終止時(shí),如果它的父進(jìn)程還在運(yùn)行,內(nèi)核會(huì)為這個(gè)終止的子進(jìn)程保留一定量的信息。父進(jìn)程可以根據(jù)這些信息知道子進(jìn)程的情況。直到父進(jìn)程對(duì)其進(jìn)行了善后處理,子進(jìn)程才會(huì)完全終止。在這期間,父進(jìn)程沒有回收子進(jìn)程并釋放子進(jìn)程占用的資源,這個(gè)子進(jìn)程會(huì)成為僵尸進(jìn)程,它仍然占用一定資源。
進(jìn)程終止
①從main函數(shù)返回 return()。
②調(diào)用 exit()。
③調(diào)用 _exit()或 _Exit()。
④最后一個(gè)線程從其啟動(dòng)例程返回。
⑤最后一個(gè)線程調(diào)用 pthread_exit()。
⑥調(diào)用 abort()它產(chǎn)生 SIGABRT 信號(hào)。
⑦收到一個(gè)信號(hào)并終止。
⑧最后一個(gè)線程對(duì)取消請求作出相應(yīng)。
進(jìn)程組
每個(gè)進(jìn)程都屬于某個(gè)進(jìn)程組。進(jìn)程組是一個(gè)或多個(gè)進(jìn)程的集合。通常它們與同一作業(yè)相關(guān)聯(lián),可以接收來自同一終端的各種信號(hào)。每個(gè)進(jìn)程組有一個(gè)唯一的進(jìn)程組ID。每個(gè)進(jìn)程組都有一個(gè)組長進(jìn)程,進(jìn)程ID等于進(jìn)程組ID的進(jìn)程就是組長進(jìn)程。

會(huì)話
會(huì)話(session)是一個(gè)或多個(gè)進(jìn)程組的集合。
競態(tài)條件
當(dāng)多個(gè)進(jìn)程都企圖對(duì)共享數(shù)據(jù)進(jìn)行某種處理時(shí),而最后的結(jié)果又取決于進(jìn)程運(yùn)行的順序時(shí),我們認(rèn)為發(fā)生了競態(tài)條件(race condition)。如果fork之后的某種邏輯顯式或隱式地依賴于在fork之后是父進(jìn)程先運(yùn)行還是子進(jìn)程先運(yùn)行,那么fork函數(shù)就會(huì)是競爭條件活躍的滋生地。通常,我們都是不可以預(yù)估子進(jìn)程和父進(jìn)程哪個(gè)先運(yùn)行。因?yàn)檫M(jìn)程的運(yùn)行順序完全取決于內(nèi)核的調(diào)度算法和系統(tǒng)的負(fù)載。
我們可以調(diào)用wait或者waitpid函數(shù)來讓父進(jìn)程等待子進(jìn)程運(yùn)行完之后在運(yùn)行,這樣父進(jìn)程就會(huì)被阻塞住,直到子進(jìn)程運(yùn)行完畢之后才能運(yùn)行,其實(shí)這樣做的效率就比較低,我們fork就是希望多進(jìn)程并發(fā)的執(zhí)行,如果采用此方法,則fork也就失去了很大的意義。
為了避免競爭條件和不采用wait或waitpid方法,我們可以在多進(jìn)程之間采用發(fā)送和接收信號(hào)的處理方法來避免競態(tài)條件?;蛘吒鞣N進(jìn)程間的通信方式(IPC)也可以使用。
良許個(gè)人微信
添加良許個(gè)人微信即送3套程序員必讀資料
→ 精選技術(shù)資料共享
→ 高手如云交流社群
推薦閱讀:
每個(gè)用戶都應(yīng)該知道的 Ubuntu 鍵盤快捷鍵
5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹莓派,等等。在公眾號(hào)內(nèi)回復(fù)「1024」,即可免費(fèi)獲?。?!
