<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Linux 進程總結(jié)

          共 1763字,需瀏覽 4分鐘

           ·

          2020-04-15 23:25


          點擊上方“杰哥的IT之旅”,選擇“”公眾號重磅干貨,第一時間送達

          作 者:For_zwb
          鏈 接:

          https://blog.csdn.net/weixin_42250655/article/details/81567643

          進程

          進程,是計算機中的程序關(guān)于某數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。它的執(zhí)行需要系統(tǒng)分配資源創(chuàng)建實體之后,才能進行。舉個例子:我們所寫的程序,在運行的時候它也是一個進程。

          進程和程序的區(qū)別:

          程序相當于是一個文件,是有序代碼的集合,是靜態(tài)的存儲在硬盤中。而進程是運行中的程序,系統(tǒng)會為變量分配相應(yīng)的內(nèi)存和初始化它們的值,還有一些資源如:堆、棧等當程序運行完進程也就結(jié)束了,但程序還是保存在硬盤中沒有消失。

          進程的特性

          • 并發(fā)性:可以與其它進程在宏觀上同時向前推進。

          • 動態(tài)性:進程是執(zhí)行中的程序,動態(tài)產(chǎn)生、動態(tài)消亡、動態(tài)變化。

          • 獨立性:進程是系統(tǒng)資源分配的基本單位。

          • 交往性:與其它進程可以進行交互。

          • 異步性:不統(tǒng)一推進。

          • 結(jié)構(gòu)性:每個進程有一個控制塊PCB。

          • 并行性:只有在多CPU多處理器的計算機上,進程才能并行執(zhí)行。

          一個進程中如何創(chuàng)建多個進程

          創(chuàng)建進程有兩種方式:一種是操作系統(tǒng)創(chuàng)建,另一種是父進程創(chuàng)建。父進程創(chuàng)建的進程(通常稱為子進程),它們和父進程存在隸屬關(guān)系。子進程又可以創(chuàng)建進程,這樣形成一個進程家族。子進程可以繼承其父進程幾乎所有的資源。

          8cc9e0daf0aa112bdc8a912fbcd83b7d.webp

          孤兒進程

          孤兒字面意思就是沒有父母的孩子,那孤兒進程的意思就是沒有父進程的進程。這種情況是怎么發(fā)生的呢?就是父進程先于子進程結(jié)束,這時子進程被init進程收養(yǎng),init的進程號為1。

          僵尸進程

          當一個子進程終止時,如果它的父進程還在運行,內(nèi)核會為這個終止的子進程保留一定量的信息。父進程可以根據(jù)這些信息知道子進程的情況。直到父進程對其進行了善后處理,子進程才會完全終止。在這期間,父進程沒有回收子進程并釋放子進程占用的資源,這個子進程會成為僵尸進程,它仍然占用一定資源。

          進程終止

          • 從main函數(shù)返回 return()。

          • 調(diào)用 exit()。

          • 調(diào)用 _exit()或 _Exit()。

          • 最后一個線程從其啟動例程返回。

          • 最后一個線程調(diào)用 pthread_exit()。

          • 調(diào)用 abort()它產(chǎn)生 SIGABRT 信號。

          • 收到一個信號并終止。

          • 最后一個線程對取消請求作出相應(yīng)。

          進程組

          每個進程都屬于某個進程組。進程組是一個或多個進程的集合。通常它們與同一作業(yè)相關(guān)聯(lián),可以接收來自同一終端的各種信號。每個進程組有一個唯一的進程組ID。每個進程組都有一個組長進程,進程ID等于進程組ID的進程就是組長進程。

          f6cb357f8940aa200f5b384d22946cfd.webp

          會話

          會話(session)是一個或多個進程組的集合。

          競態(tài)條件

          當多個進程都企圖對共享數(shù)據(jù)進行某種處理時,而最后的結(jié)果又取決于進程運行的順序時,我們認為發(fā)生了競態(tài)條件(race condition)。如果fork之后的某種邏輯顯式或隱式地依賴于在fork之后是父進程先運行還是子進程先運行,那么fork函數(shù)就會是競爭條件活躍的滋生地。通常,我們都是不可以預(yù)估子進程和父進程哪個先運行。因為進程的運行順序完全取決于內(nèi)核的調(diào)度算法和系統(tǒng)的負載。

          我們可以調(diào)用wait或者waitpid函數(shù)來讓父進程等待子進程運行完之后在運行,這樣父進程就會被阻塞住,直到子進程運行完畢之后才能運行,其實這樣做的效率就比較低,我們fork就是希望多進程并發(fā)的執(zhí)行,如果采用此方法,則fork也就失去了很大的意義。

          為了避免競爭條件和不采用wait或waitpid方法,我們可以在多進程之間采用發(fā)送和接收信號的處理方法來避免競態(tài)條件。或者各種進程間的通信方式(IPC)也可以使用。


          本公眾號全部博文已整理成一個目錄,請在公眾號后臺回復(fù)「m」獲取!推薦閱讀:

          Redis 使用的 10 個小技巧!
          支付寶的架構(gòu)到底有多牛逼?
          一文看懂:網(wǎng)址,URL,域名,IP地址,DNS,域名解析
          如何解決代碼中 if…else 過多的問題?
          面試資源、公共API、多樣化學(xué)習路徑,這10個GitHub庫開發(fā)者必看!
          Windows支持直接訪問Linux子系統(tǒng)文件:你的下一臺Linux何必是Linux

          關(guān)注微信公眾號『杰哥的IT之旅』,后臺回復(fù)“1024”查看更多內(nèi)容,回復(fù)“微信”添加我微信。


          好文和朋友一起看~
          瀏覽 50
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操逼视频欧美国产 | 影音av资源 | 91首页| 天天噜天天射天天日 | 一级黄色片网 |