<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 進程、輕量級進程和線程: 從內核觀點看,進程的目的就是擔當分配系統資源(CPU時間、內存等)的實體。 進程是資源管理的最小單位,線程是程序執行的最小單位。在操作系統設計上,從進程演化出線程,最主要的目的就是更好的支持SMP以及減小(進程/線程)上下文切換開銷。 最初的進程定義都包含程序、資源及其執行三部分,其中程序通常指代碼,資源在操作系統層面上通常包括內存資源、IO資源、信號處理等部分,而程序的執行通常理解為執行上下文,包括對CPU的占用,后來發展為線程。在線程概念出現以前,為了減小進程切換的開銷,操作系統設計者逐漸修正進程的概念,逐漸允許將進程所占有的資源從其主體剝離出來,允許某些進程共享一部分資源,例如文件、信號,數據內存,甚至代碼,這就發展出輕量進程的概念。Linux內核在2.0.x版本就已經實現了輕量進程,應用程序可以通過一個統一的clone()系統調用接口,用不同的參數指定創建輕量進程還是普通進程。 當一個進程創建時,它幾乎與父進程相同。它接受父進程地址空間的一個(邏輯)拷貝,并從進程創建系統調用的下一條指令開始執行與父進程相同的代碼。盡管父子進程可以共巷含有程序代碼的頁,但是它們各自有獨立的數據拷貝(棧和堆),因此子進程對一個內存單元的修改對父進程是不可見的。 Linux使用輕量級進程,對多線程應用程序提供更好的支持。兩個輕量級進程基本上可以共享一些資源,諸如地址空間、打開的文件等等。只要其中一個修改共享資源,另一個就立即查看這種修改。 在Linux中,一個線程組基本上就是實現了多線程應用的一組輕量級進程。 ### 進程描述符: 為了管理進程,內核必須對每個進程所做的事情進行清楚的描述。例如:內核必須知道進程的優先級,它是正在CPU上運行還是因為某些事件而被阻塞,給它分配了什么樣的地址空間,允許它訪問哪個文件等等,這正是進程描述符的作用。 ### 進程狀態: 可運行狀態:進程要么在CPU上執行,要么準備執行。 可中斷的等待狀態:進程被掛起,直到某個條件變為真。 不可中斷的等待狀態:與可中斷等待狀態類似,但有一個例外:把信號傳遞到睡眠進程不能改變它的狀態。 暫停狀態:進程的執行被暫停。 跟蹤狀態:進程的執行已由Debugger程序暫停。當一個進程被另一個進程監控時,任何信號都可以把個進程置于跟蹤狀態。 僵死狀態:進程的執行被終止,但父進程還沒有發布wait4()或waitpid()系統調用來返回有關死忘進程的信息。在發布wait()類系統調用前,內核不能丟棄包含在死進程描述符中的數據,因此父進程可能還需要它。 僵死撤消狀態:最終狀態,由于父進程剛發出wait4()或waitpid()系統調用,因而進程由系統刪除。為了防止其他執行線程在同一個進程上也執行wait()類系統調用,而把進程的狀態由僵死狀態改為僵死撤消狀態。 ### 標識一個進程: 內核對進程的大部分引用都是通過進程描述符指針進行的。 類Unix操作系統允許用戶使用一個叫做進程標識符(PID)的數來標識進程,PID存放在進程描述符的pid字段中,PID被順序編號,新創建進程的PID通常是前一個進程的PID加1。不過,PID的值有一個上限,當內核使用的PID達到這個上限值的時候必須開始循環使用已閑置的小PID號。缺省情況下,最大的PID號是32767。 由于循環使用PID號,內核必須通過管理一個pidmap_array位圖來表示當前已分配的PID號和閑置的PID號。因為一個頁框包含32768個位,所以32位體系結構中pidmap_array位置存放在一個單獨的頁中。 Linux把不同的PID與系統中每個進程或輕量級進程相關聯。對于線程組,一個線程組中的所有線程使用和該線程組的領頭線程相同的PID,即該組中第一個輕量級進程的PID,它被存入進程描述符的tgid字段。getpid()系統調用返回當前進程的tgid值而不是pid值。 ### 進程間的關系: 進程0和進程1是由內核創建的,進程1(init)是所有進程的祖先。 進程描述符中表示進程親屬關系的字段的描述如下表: <table cellpadding="4" cellspacing="0" width="554"><colgroup><col width="120"/><col width="416"/></colgroup><tbody><tr valign="TOP"><td width="120" style="border-top:1px solid #000000; border-bottom:1px solid #000000; border-left:1px solid #000000; border-right:none; padding-top:0.1cm; padding-bottom:0.1cm; padding-left:0.1cm; padding-right:0cm"><p>字段名</p></td><td width="416" style="border:1px solid #000000; padding:0.1cm"><p>說明</p></td></tr><tr valign="TOP"><td width="120" style="border-top:none; border-bottom:1px solid #000000; border-left:1px solid #000000; border-right:none; padding-top:0cm; padding-bottom:0.1cm; padding-left:0.1cm; padding-right:0cm"><p><span style="font-family:Liberation Serif,serif">real_parent</span></p></td><td width="416" style="border-top:none; border-bottom:1px solid #000000; border-left:1px solid #000000; border-right:1px solid #000000; padding-top:0cm; padding-bottom:0.1cm; padding-left:0.1cm; padding-right:0.1cm"><p>指向創建了<span style="font-family:Liberation Serif,serif">P</span>的進程的描述符,如果<span style="font-family:Liberation Serif,serif">P</span>的父進程不再存在,就指向進程<span style="font-family:Liberation Serif,serif">1</span>的描述符</p></td></tr><tr valign="TOP"><td width="120" style="border-top:none; border-bottom:1px solid #000000; border-left:1px solid #000000; border-right:none; padding-top:0cm; padding-bottom:0.1cm; padding-left:0.1cm; padding-right:0cm"><p><span style="font-family:Liberation Serif,serif">Parent</span></p></td><td width="416" style="border-top:none; border-bottom:1px solid #000000; border-left:1px solid #000000; border-right:1px solid #000000; padding-top:0cm; padding-bottom:0.1cm; padding-left:0.1cm; padding-right:0.1cm"><p>指向<span style="font-family:Liberation Serif,serif">P</span>的當前父進程(這種進程的子進程終止時,必須向父進程發信號)。它的值通常與<span style="font-family:Liberation Serif,serif">real_parent</span>一致,但也可以不同</p></td></tr><tr valign="TOP"><td width="120" style="border-top:none; border-bottom:1px solid #000000; border-left:1px solid #000000; border-right:none; padding-top:0cm; padding-bottom:0.1cm; padding-left:0.1cm; padding-right:0cm"><p><span style="font-family:Liberation Serif,serif">Children</span></p></td><td width="416" style="border-top:none; border-bottom:1px solid #000000; border-left:1px solid #000000; border-right:1px solid #000000; padding-top:0cm; padding-bottom:0.1cm; padding-left:0.1cm; padding-right:0.1cm"><p>鏈表的頭部,鏈表中的所有元素都是<span style="font-family:Liberation Serif,serif">P</span>創建的子進程</p></td></tr><tr valign="TOP"><td width="120" style="border-top:none; border-bottom:1px solid #000000; border-left:1px solid #000000; border-right:none; padding-top:0cm; padding-bottom:0.1cm; padding-left:0.1cm; padding-right:0cm"><p><span style="font-family:Liberation Serif,serif">Sibling</span></p></td><td width="416" style="border-top:none; border-bottom:1px solid #000000; border-left:1px solid #000000; border-right:1px solid #000000; padding-top:0cm; padding-bottom:0.1cm; padding-left:0.1cm; padding-right:0.1cm"><p>指向兄弟進程鏈表中的下一個元素或前一個元素的指針,這些兄弟進程的父進程都是<span style="font-family:Liberation Serif,serif">P</span></p></td></tr></tbody></table> 進程之間還存在其它關系:一個進程可能是一個進程組或登陸會話的領頭進程,也可能是一個線程組的領頭進程,它還可能跟蹤其他進程的執行。 ### 如何組織進程: 運行隊列鏈表把處于TASK_RUNNING狀態的所有進程組織在一起,但由于對處于暫停、僵死、死亡狀態進程的訪問比較簡單,Linux并沒有為處于TASK_RSTOPPED、EXIT_ZOMBILE或者EXIT_DEAD狀態的進程建立專門的鏈表。 對于處于TASK_INTERRUPTIBLE或TASK_UNINTERRUPTIBLE狀態的進程,根據不同的特殊事件被細分為許多類,每一類都對應某個特殊事件,引入等待隊列。 等待隊列表示一組睡眠的進程,當某一條件為真時,由內核喚醒它們。 等待隊列由雙向鏈表實現。因為等待隊列是由中斷處理程序和主要內核函數修改的,因此必須對其雙向鏈表進行保護以免對其進行同時訪問,因為同時訪問會導致不可預測的后果。同步是通過等待隊列頭中的lock自旋鎖來達到的。 如果有兩個或者多個進程在等待互斥地訪問某一資源時,由內核有選擇地喚醒,而非互斥進程總是由內核在事件發生時喚醒。 因為所有的非互斥進程總是在雙向鏈表的開始位置,而所有的互斥進程在雙向鏈表的尾部,所以內核總是先喚醒非互斥進程然后再喚醒互斥進程。一個等待隊列中同時包含互斥進程和非互斥進程的情況是非常罕見的。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看