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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                進程控制的主要功能是對系統中的所有進程實施有效的管理,它具有創建新進程、撤銷已有進程、實現進程狀態轉換等功能。在操作系統中,一般把進程控制用的程序段稱為原語,原語的特點是執行期間不允許中斷,它是一個不可分割的基本單位。 ###進程的創建 允許一個進程創建另一個進程。此時創建者稱為父進程,被創建的進程稱為子進程。子進程可以繼承父進程所擁有的資源。當子進程被撤銷時,應將其從父進程那里獲得的資源歸還給父進程。此外,在撤銷父進程時,也必須同時撤銷其所有的子進程。 在操作系統中,終端用戶登錄系統、作業調度、系統提供服務、用戶程序的應用請求等都會引起進程的創建。操作系統創建一個新進程的過程如下(創建原語): 1. 為新進程分配一個唯一的進程標識號,并申請一個空白的PCB(PCB是有限的)。若PCB申請失敗則創建失敗。 2. 為進程分配資源,為新進程的程序和數據、以及用戶棧分配必要的內存空間(在PCB 中體現)。注意:這里如果資源不足(比如內存空間),并不是創建失敗,而是處于”等待狀態“,或稱為“阻塞狀態”,等待的是內存這個資源。 3. 初始化PCB,主要包括初始化標志信息、初始化處理機狀態信息和初始化處理機控制信息,以及設置進程的優先級等。 4. 如果進程就緒隊列能夠接納新進程,就將新進程插入到就緒隊列,等待被調度運行。 ###進程的終止 引起進程終止的事件主要有:正常結束,表示進程的任務已經完成和準備退出運行。異常結束是指進程在運行時,發生了某種異常事件,使程序無法繼續運行,如存儲區越界、保護錯、非法指令、特權指令錯、I/O故障等。外界干預是指進程應外界的請求而終止運行,如操作員或操作系統干預、父進程請求和父進程終止。 操作系統終止進程的過程如下(撤銷原語): 1. 根據被終止進程的標識符,檢索PCB,從中讀出該進程的狀態。 2. 若被終止進程處于執行狀態,立即終止該進程的執行,將處理機資源分配給其他進程。 3. 若該進程還有子進程,則應將其所有子進程終止。 4. 將該進程所擁有的全部資源,或歸還給其父進程或歸還給操作系統。 5. 將該PCB從所在隊列(鏈表)中刪除。 ###進程的阻塞和喚醒 正在執行的進程,由于期待的某些事件未發生,如請求系統資源失敗、等待某種操作的完成、新數據尚未到達或無新工作做等,則由系統自動執行阻塞原語(Block),使自己由運行狀態變為阻塞狀態。可見,進程的阻塞是進程自身的一種主動行為,也因此只有處于運行態的進程(獲得CPU),才可能將其轉為阻塞狀態。 阻塞原語的執行過程是: 1. 找到將要被阻塞進程的標識號對應的PCB。 2. 若該進程為運行狀態,則保護其現場,將其狀態轉為阻塞狀態,停止運行。 3. 把該PCB插入到相應事件的等待隊列中去。 當被阻塞進程所期待的事件出現時,如它所啟動的I/O操作已完成或其所期待的數據已到達,則由有關進程(比如,提供數據的進程)調用喚醒原語(Wakeup),將等待該事件的進程喚醒。 喚醒原語的執行過程是: 在該事件的等待隊列中找到相應進程的PCB。 將其從等待隊列中移出,并置其狀態為就緒狀態。 把該PCB插入就緒隊列中,等待調度程序調度。 需要注意的是,Block原語和Wakeup原語是一對作用剛好相反的原語,必須成對使用。 Block原語是由被阻塞進程自我調用實現的,而Wakeup原語則是由一個與被喚醒進程相合作或被其他相關的進程調用實現的。 ###進程切換 對于通常的進程,其創建、撤銷以及要求由系統設備完成的I/O操作都是利用系統調用而進入內核,再由內核中相應處理程序予以完成的。進程切換同樣是在內核的支持下實現的,因此可以說,任何進程都是在操作系統內核的支持下運行的,是與內核緊密相關的。 進程切換是指處理機從一個進程的運行轉到另一個進程上運行,這個過程中,進程的運行環境產生了實質性的變化。 進程切換的過程如下: 1. 保存處理機上下文,包括程序計數器和其他寄存器。 2. 更新PCB信息。 3. 把進程的PCB移入相應的隊列,如就緒、在某事件阻塞等隊列。 4. 選擇另一個進程執行,并更新其PCB。 5. 更新內存管理的數據結構。 6. 恢復處理機上下文。 > 注意,進程切換與處理機模式切換是不同的,模式切換時,處理機邏輯上可能還在同一進程中運行。如果進程因中斷或異常進入到核心態運行,執行完后又回到用戶態剛被中斷的程序運行,則操作系統只需恢復進程進入內核時所保存的CPU現場,無需改變當前進程的環境信息。但若要切換進程,當前運行進程改變了,則當前進程的環境信息也需要改變。
                  <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>

                              哎呀哎呀视频在线观看