【操作系統】之進程管理

来源:http://www.cnblogs.com/libra-yong/archive/2017/06/11/6979975.html
-Advertisement-
Play Games

定義 進程的典型定義:進程是程式的一次動態執行 進程在傳統OS中的定義: 進程是進程實體的運行過程,是系統進行資源分配和調度的獨立單位. 一般情況下,我們所說的進程實體(也叫進程映像)簡稱進程,進程實體包括程式段,數據段和進程式控制制塊(PCB). PCB 創建進程的實質就是創建PCB,撤銷進程實質也是 ...


定義

進程的典型定義:進程是程式的一次動態執行

進程在傳統OS中的定義進程是進程實體的運行過程,是系統進行資源分配和調度的獨立單位.

一般情況下,我們所說的進程實體(也叫進程映像)簡稱進程,進程實體包括程式段,數據段和進程式控制制塊(PCB).

PCB

創建進程的實質就是創建PCB,撤銷進程實質也是撤銷PCB.

PCB作用:作為獨立運行的基本標誌, 實現間斷性運行方式, 提供進程管理需要的信息,提供進程調度需要的信息, 與其他進程通信

PCB包含的信息

1.進程標識符:外部標識符,內部標識符

2.處理機狀態:通用寄存器, 指令計數器, 程式狀態字, 用戶棧指針

3.進程調度信息:進程狀態, 進程優先順序, 進程調度的其他信息, 事件

4.進程式控制制信息:程式和數據地址, 進程同步和通信機制, 資源清單,鏈接指針

進程式控制制塊的組織方式:線性方式, 鏈接方式, 索引方式

線性方式:所有的PCB都組織在一張線性表中

鏈接方式:具有相同狀態的PCB通過PCB中的鏈接字鏈接成一個隊列.

 

索引方式:系統根據進程狀態建立幾張索引表.

 

進程的特征

動態性:有創建而產生,由調度而執行,由撤銷而消亡.程式只是一組有序指令的集合

併發性:多個進程實體在記憶體中,且在一段時間內同時運行.程式沒有建立PCB所以不能併發執行,只能順序執行

獨立性:進程是一個能獨立運行,獨立獲得資源和獨立就收調度的進本單位.

非同步性:進程按各自獨立的, 不可預知的速度運行.

進程的狀態與轉換

三個基本狀態:

就緒狀態:只要獲得cpu就可以立即執行

執行狀態:已獲得cpu正在執行

阻塞狀態:因發生某些事件(I/O請求等)放棄cpu而暫停執行.

 

 

引入掛起

原因:終端用戶的需要, 父進程請求, 負荷調節, 操作系統的需要

狀態轉換:

 

 

進程式控制制

引起創建進程的事件:用戶登錄, 作業調度, 提供服務, 應用請求

創建進程

1.申請空白PCB

2.為新進程分配所需資源

3.初始化進程式控制制塊PCB

4.新進程插入就緒隊列

引起進程終止的事件:正常結束, 異常結束(越界錯, 保護錯, 非法指令, 運行超時等), 外界干預

終止進程

1.找到該進程的PCB

2.終止進程及其子孫進程

3.回收該進程所占資源

4.移出進程所在隊列

引起進程阻塞和喚醒的事件:向系統請求共用資源失敗, 等待某種操作的完成, 新數據尚未到達, 等待新任務的到達.

阻塞進程

1.停止執行進程(失去cpu)

2.改變進程狀態

3.插入阻塞隊列

喚醒進程:

1.移除阻塞隊列

2.檢查並改變進程狀態

3.插入就緒隊列

掛起進程:

1.改變進程轉態

2.賦值進程PCB到指定記憶體

3.若掛起進程正在執行則重新調度

激活進程:

1.將進程從外存調入記憶體

2.檢查並改變進程狀態

 

 

進程同步

併發進程在執行次序上的協調,以達到有效的資源共用和相互合作,使程式執行有可再現性

進程間可能存在的制約關係:間接制約(併發進程互斥的訪問臨界資源), 直接制約(進程需相互合作執行)

臨界資源:一次只允許一個進程訪問

臨界區:進程中訪問臨界資源的代碼稱為臨界區

進入區:檢查臨界資源是否正被訪問的代碼

退出去:檢查臨界資源是否訪問完畢的代碼

 

實現臨界區互斥的基本方法

軟體方法:信號量,管程(遵循原則:空閑讓進, 忙則等待, 有限等待, 讓權等待)

硬體方法:關閉中斷,硬體指令(TS, Swap)

信號量機制

整型信號量

wait(S){
    while(S<=0);
    S--;
}
signal(S){
    S++;
}

 

記錄型信號量

typedef struct{
    int value; 
    struct process_control_block *list;
}semaphore;

wait(semaphore *S){
    S->value--;
    if(S->value<0)block(S->list);
}

signal(semapohre *S){
    S->value++;
    if(S->value<=0)wakeup(S->list);
}

 

AND型信號量

一次性全部分配

Swait(S1, S2, …, Sn)

    if Si≥1 and … and Sn≥1 then

        for i∶ =1 to n do

        Si∶=Si-1;

        endfor

    else

     place the process in the waiting queue associated with the first Si found   with Si<1, and set the program count of this process to the beginning of Swait operation

    endif

Ssignal(S1, S2, …, Sn)

  for i∶ = 1 to n do

      Si=Si+1;

      Remove all the process waiting in the queue associated with Si into the ready queue.

  endfor;

 

信號量集

S:信號量, d:需求值, t:下限值, t>=d

Swait(S1, t1, d1, …, Sn, tn, dn)

    if Si≥t1 and … and Sn≥tn then

      for i∶=1 to n do

        Si∶=Si-di;

     endfor

   else

     Place the executing process in the waiting queue of the first Si with Si<ti and set its program counter to the beginning of the Swait Operation. 

   endif
signal(S1, d1, …, Sn, dn)
for i∶=1 to n do  Si ∶=Si+di;     Remove all the process waiting in the queue associated with Si into the ready queue endfor;

 

經典的進程同步問題

由進程同步而引起的一些經典的進程同步問題(生產者消費者問題, 哲學家進餐問題, 讀寫問題)可以在我的另一篇文章中查看.

 

管程

管程 (英語:Monitors,也稱為監視器) 是一種程式結構,結構內的多個子程式(對象或模塊)形成的多個工作線程互斥訪問共用資源。這些共用資源一般是硬體設備或一群變數.

代表共用資源的數據結構以及由對該共用數據結構實施操作的一組過程所組成的資源管理程式共同構成了一個操作系統的資源管理模塊,我們稱之為管程.

由定義, 管程由四部分組成:

1.管程的名稱;

2.局部於管程內部的共用數據結構說明;

3.對該數據結構進行操作的一組過程;

4.對局部於管程內部的共用數據設置初始值的語句

(維基百科)一個管程包含:

多個彼此可以交互並共用資源的線程

多個與資源使用有關的變數

一個互斥鎖

一個用來避免競態條件的不變數

管程特性:

1.模塊化, 管程是一個基本程式單位,可以單獨編譯

2.抽象數據類型, 管程中不僅有數據, 還有對數據的操作

3.信息掩蔽, 管程中的數據結構只能被管程的過程訪問, 這些過程也是在管程內部定義的, 共管程外的進程調用, 而管程中的數據結構及過程(函數)的具體實現外部不可見.

管程與進程的對比:

1.管程定義的是公共數據結構, 進程定義的是私有數據結構PCB

2.管程對數據結構進行同步和初始化, 進程則對數據結構進行順序程式執行

3.管程用於解決共用資源互斥, 進程用於實現系統的併發性

4.管程是被動工作, 進程是主動工作

條件變數

管程的條件變數:條件變數是在管程內部的數據結構,且只有在管程內才能被訪問,它對管程內所有過程是全局的,只能通過x.wait(),x.signal()兩個操作訪問.

x.wait():正在調用的管程因x條件需要被阻塞或掛起, 則調用x.wait()將自己插入到x條件的等待隊列上, 並釋放管程, 知道x條件變化.

xsignal():正在調用管程的進程發現x發生了變化, 則調用x.siganl(), 重新啟動一個因x條件而阻塞或掛起的進程, 如果存在多個這樣的進程, 則選擇其中的一個, 如果沒有則繼續執行原進程, 而不產生任何結果.

 

 

線程-調度和分派的基本單位

由來:

自古以來熊和魚掌不可兼得, 同樣對於進程來講, 作為調度和分派的基本單位同時又擁有資源這會加重系統開銷. 那麼能否將它們分開呢? 對於擁有資源的單位, 並不頻繁的進行上下文切換, 於是線程便誕生了.進程作為擁有資源的單位, 線程作為獨立調度和分派的單位. 一個進程可擁有多個線程. 在多線程中, 可將每個線程稱為一個任務. 巨集觀上, 進程也是任務.

線程, 有時被稱為輕量級進程(Lightweight Process, LWP), 是程式執行流的最小單元.相對的, 傳統的進程叫做重型進程.

 

線程與進程的比較

調度的基本單位:傳統OS, 進程是獨立調度和分派的基本單位, 占有資源獨立運行, 但是在引入線程的OS, 線程是調度的基本單位, 可以獨立運行的, 此時進程已不是可以獨立運行的實體.

併發性:一個進程中擁有多個線程, 稱為多線程. 這多個線程可以併發運行.不同進程間的線程也可併發運行.

擁有資源:進程是系統中擁有資源的基本單位, 線程只有一點必不可少的, 能保證獨立運行的資源, 這大大減少了系統的開銷.

獨立性:每個進程擁有一個獨立的地址空間和資源, 除了共用全局變數以外不允許其他進程訪問.同一進程中的線程除了只擁有自身必須的少量資源, 它們共用進程的記憶體地址空間和資源

系統開銷:進程因為擁有資源, 每次調度進程時必定要對其分配回收, 系統開銷大.線程只占有極少的資源, 其系統開銷遠低於進程.

 

線程的三個基本轉態

就緒狀態: 只要活得cpu就可執行

執行狀態: 活得cpu正在執行

阻塞狀體: 線程因某種原因受阻而暫停執行

 

線程式控制制塊TCB

系統為每個進程配置了一個進程式控制制塊PCB用於管理進程.同樣, 也有一個線程式控制制塊TCP用戶控制和管理線程.它包括:

1.線程標識符: 線程ID

2.寄存器:程式計數器, 狀態寄存器, 通用寄存器

3.線程運行狀態

4.優先順序: 線程的優先順序

5.線程專有存儲區

6.信號屏蔽

7.堆棧指針

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如有錯誤希望各位大佬批評指正,郵件請發:[email protected] ...
  • 下麵來說說如何用不用消息隊列來進行進程間的通信,消息隊列與命名管道有很多相似之處。有關命名管道的更多內容可以參閱我的另一篇文章:Linux進程間通信——使用命名管道 一、什麼是消息隊列 消息隊列提供了一種從一個進程向另一個進程發送一個數據塊的方法。 每個數據塊都被認為含有一個類型,接收進程可以獨立地 ...
  • 配置vim配置 編輯配置文件 配置如下 主要配置為自動換行,設置行號,設置tab鍵為4個空格,同時將tab鍵自動轉換成空格 ...
  • 參考資料: Nginx中文文檔: http://www.nginx.cn/nginxchscommandline Nginx的啟動、停止、平滑重啟、信號控制和平滑升級:http://zachary-guo.iteye.com/blog/1358312 命令行參數: 常用命令: -c filename ...
  • 官網安裝教程鏈接:https://docs.openstack.org/developer/devstack/ 我在ubuntu14.04 LTS 桌面版/伺服器版都安裝DevStack成功後,在這裡記錄下安裝過程。 介紹下安裝環境: VMware Workstation Pro 12 ubuntu ...
  • 1. 安裝完整的vim# apt-get install vim-gnome 2. 安裝ctags,ctags用於支持taglist,必需!# apt-get install ctags 3. 安裝taglist#apt-get install vim-scripts#apt-get install ...
  • 家裡電腦是Win10的,原來可以在公司通過遠程桌面訪問,最近自動升級了一次補丁後,遠程可以連接,但是輸入正確的用戶密碼後總提示憑據錯誤 (Win10是被訪問的一方,修改的也是被訪問的機器) 修複方式為 命令:gpedit.msc 打開“本地組策略編輯器” Windows設置->安全設置->本地策略- ...
  • Linux系統IO中write原型為 ssize_t write(int filedes, const void * buff, size_t nbytes) ; 當調用write寫數據的時候,調用完成後write直接返回,但是磁碟是個慢速設備,操作系統會將數據保存在內核中的緩衝區中,並負責非同步地將 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...