<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>

                # 進程 在人類剛發明計算機的時候,只能同時處理一件事情。我們通常說程序的設計來自于現實的人類世界,這個進程同樣也是。 ![](https://img.kancloud.cn/43/87/4387b18254baf9712ff8a882df0608aa_860x169.png) <center>圖:1.3-1</center> 圖1.3-1是早期計算機的多程序執行流程,我們可以看到在一個CPU的生命周期里面,多個程序是順序執行的。后面的程序什么時候執行取決于前面的程序什么之后執行完。如果當前執行的程序進行IO時,CPU也只能等待,CPU的使用率極低。如果當前執行的程序占用CPU時間很長,其他程序得不到CPU的執行權,只能卡著不動。 ![](https://img.kancloud.cn/da/13/da13c84ef9f1907c6c0e0c5a68c7a996_847x166.png) <center>圖:1.3-2</center> 基于上面說的單進程有很多的缺點,所以出現了多道程序技術,使得程序可以并發執行。從上圖可以看出來多道程序設計把CPU分成了時間片,可以在單CPU的情況下實現并發。CPU以人無法感知的速度在不停切換執行不同的程序,這樣讓我們看起來像是多個程序同時在執行。 ![](https://img.kancloud.cn/df/36/df36b047c71539023e755e918eb06bbe_830x564.png) <center>圖:1.3-3</center> 從圖1.3-3我們可以看到了每個進程有自己獨立的內存、地址空間、數據棧等等,每個進程都跟其他進程互不干擾,這就是為什么有些人在寫代碼都時候,說定義了一個全局的屬性,但是一個進程改變了,另一個進程讀取卻沒有變化,這就是原因,每個進程有自己的獨立堆棧,內存資源等。 ### 進程狀態 ![](https://img.kancloud.cn/98/ba/98ba8053452a3fdfefe2ed912a1542b5_876x661.png) <center>圖:1.3-4</center> 在圖1.3-4里面可以看到進程有不同的狀態,當進程在不同狀態進程處于就緒態的時候就是等待操作系統進行調度。前面我們提到過進程的切換,CPU不斷的切換到不同的進程來執行,當CPU調度別的進程當前執行的進程怎么辦呢?下次再調度會這個進程的之后怎么知道代碼執行到哪里,都有什么數據呢?其實當CPU調度別的進程的時候,會保存當前執行進程的信息、狀態,這種操作叫做上下文切換。一個進程從運行態轉到休眠狀態的時候,進程的現場會保存到該進程的內核棧,當這進程再次進入就運行狀態的時候,CPU從這個進程的PCB內核棧讀取這個現場信息恢復進程。 ![](https://img.kancloud.cn/95/31/95315dd46ef25ea87c629faeb7c50bd0_1179x344.png) <center>圖:1.3-5</center> 多道程序設計把CPU執行的時間分割成了很小的時間片,由操作系統在不同狀態的進程進行調度。但是在一個核心CPU一次只能處理一件事情,只是因為每次切換的時間太快了,讓我們認為是一起執行的。 ### 上下文切換 ![](https://img.kancloud.cn/3e/ac/3eaca68fccdd72874762fddf04c70ec3_743x311.png) <center>圖:1.3-6</center> 當一個進程遇到阻塞的之后CPU就會切換到另一個進程執行,避免在在進程阻塞的時候浪費CPU資源。 > 進程不是越多越好,進程過多在上下文切換過程中浪費大量的CPU可執行時間 > 并發與并行的區別:并發是某一個時間段做多少事情,并行是同一時刻同時做多件事情 ### 孤兒進程 前面說過了,計算機模擬的是人類世界,那么這個孤兒進程跟我們人類世界一樣,沒有父母沒有監護人的為孤兒。孤兒進程產生的原因是父進程終止執行了,但是子進程依然在執行的子進程就被叫做孤兒進程。 ### 僵尸進程 僵尸進程產生的原因是因為子進程終止之后父進程沒有對其進行回收,子進程的進程描述符依然保留在系統當中,所以產生了僵尸進程,僵尸進程對于操作系統是有資源浪費的。所以務必避免出現僵尸進程,解決辦法可以在父進程調用wait或者waitpid解決。 ### 守護進程 在Linux操作系統里面我們想要實現關閉終端之后還可以運行,我們通常采用 * nohup * setsid * 命令后面加 & 這幾種方式,我們想想在前面說過的孤兒進程好像就可以是現在這樣的功能。我們只要父進程退出執行,子進程還是依然會執行的。這就是我們通過故意產生孤兒進程來實現守護進程的功能。
                  <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>

                              哎呀哎呀视频在线观看