操作系統線程和進程 學習筆記

並行和併發

並行:一個時刻裏多個任務在執行
併發:一個時間段裏多個任務在執行

什麼是進程

進程:一個具有獨立功能的程序在一個數據集合上的一次動態執行過程

進程的組成

  1. 程序的代碼
  2. 程序處理的數據
  3. 程序計數器的值,指示下一條將運行的指令
  4. 一組通用的寄存器的當前值,堆,棧
  5. 一組系統資源(如打開的文件/網絡資源/磁盤IO資源)
    總之,進程包含了正在運行的一個程序的所有狀態信息

進程與程序的聯繫

  1. 程序是產生線程的基礎
  2. 程序每次運行構成不同的進程
  3. 進程是程序功能的體現
  4. 通過多次執行,一個程序可以對於多個進程,一個進程可以包括多個程序(調度程序)

進程和程序的區別

  1. 進程是動態的,程序是靜態的;程序是有序代碼的集合;進程是程序的執行,進程還有核心態/用戶態
  2. 進程是暫時的,程序是永久的;進程是一個程序運行的狀態過程;程序可以長久保持
  3. 進程和程序組成不同;進程包括了程序、數據、和進程控制塊(即進程狀態信息)

進程的特點

  1. 動態性:可動態創建、結束進程
  2. 併發性:進程可獨立調度和佔用處理機運行:併發並行
  3. 獨立性:不同進程的工作不影響
  4. 制約性:因訪問共享數據/資源或進程同步而產生制約

描述進程的數據結構:進程控制塊(PCB)

操作系統爲每一個進程都維護了一個PCB,用來保存與該進程有關的狀態信息

  1. PCB是進程的唯一標記
  2. 進程的創建:爲該進程生成一個PCB
  3. 進程的終止:回收它的PCB
  4. 進程的組織管理:通過對PCB的組織管理來實現

PCB含有的三大信息

  1. 進程標識信息:如本進程的標識,本進程的產生者標識(父進程標識),用戶標識
  2. 處理機(CPU)狀態信息保存區:保存進程的運行現場信息
    · 用戶可見的寄存器:用戶程序可以使用的數據,地址寄存器
    · 控制和狀態寄存器:如程序計數器(PC),程序狀態字(PSW)
    · 棧指針:過程調用/系統調用/中斷處理和返回時需要用到它
  3. 進程控制信息
    · 調度和狀態信息,用於操作系統調度進程並佔用處理機使用
    · 進程間的通信信息,爲支持進程間的與通信相關的各種標識,信號,信件等,這些信息存在接收方的進程控制塊中
    · 存儲管理信息,包含指向本進程映射存儲空間的數據結構
    · 進程所用資源,說明有進程打開,使用的系統資源,如打開的文件等
    · 有關數據結構連接信息,進程可以連接到一個進程隊列中,或連接到相關的其他進程的PCB

PCB的組織方式

鏈表:同一狀態的進程其PID成一鏈表,多個狀態對應多個不同鏈表(各狀態的進程形成不同的鏈表:數據鏈表,阻塞鏈表)
索引表:同一狀態的進程歸入一個index表(由index指向PCB),多個狀態對應不同的index表(各狀態的進行形成不同的索引表:就緒索引表,阻塞索引表)

進程狀態

  1. 進程生命週期管理
    · 進程創建:引起進程創建的三個主要事件(系統初始化時、用戶請求創建一個新進程、正在運行的進程執行了創建進程的系統調用)
    · 進程運行:內核選擇一個就緒的進程,讓它佔用處理機並執行
    · 進程等待:在以下情況下,進程等待(就緒):請求並等待系統服務,無法馬上完成;啓動某種操作,無法馬上完成;需要的數據還沒有到。注:進程只能自己阻塞自己,因爲只有進程本身才能知道何時需要等待某種事件的發生,當進程的時間片用完是進入就緒狀態,而不是阻塞狀態
    · 進程喚醒 :喚醒進程的原因:被阻塞進行需要的資源可被滿足;被阻塞的進程等待的事件到達;將該進程的PCB插入到就緒隊列。注:進程只能被其他進程或操作系統喚醒
    · 進程結束:進程結束的幾種情況。正常退出(自願的),錯誤退出(自願的),致命錯誤(強制性的),被其他進程殺死(強制性的)

進程狀態變化模型

進程的三種基本狀態:
進程在生命結束前處於且僅處於三種基本狀態之一不同系統設置的進程狀態數目不同。
運行狀態:當一個進程在處理機上運行時
就緒狀態:一個進程獲得了除處理機之外的一切資源,一旦得到處理機就可執行
等待狀態(阻塞狀態):一個進程等待某一事件而暫停運行時。如等待某資源、等待輸入/輸出完成

進程掛起

進程在掛起狀態時,意味着進程沒有佔用內存空間,處於掛起狀態的進程映射映射在磁盤上

  1. 阻塞掛起狀態:進程在外存並等待某事件的出現
  2. 就緒掛起狀態:進程在外存、但只要進入內存,即可運行

狀態隊列

  1. 由操作系統來維護一組隊列,用來表示系統當中所有進程的當前狀態
  2. 不同狀態分別用不同的隊列來表示(就緒隊列、各種類型的阻塞隊列,分優先級)
  3. 每個進程的PCB都根據它的狀態加入到相應的隊列當中,當一個進程狀態發送改變時,它的PCB從一個狀態隊列中脫離出來,加入到另外一個隊列

進程和線程對比

  1. 進程是對運行時程序的封裝,是系統調度資源的分配的基本單位
  2. 線程是進程的子任務,cpu調度和分配的基本單位,實現進程內的併發
  3. 一個進程可以包含多個線程,線程依賴進程存在,並共享進程內存

什麼是線程安全

如何保證線程安全

  1. 互斥量(鎖),通過互斥機制防止多個線程同時訪問公共資源
  2. 信號量(Semphare),控制同一時刻多個線程訪問同一個資源的線程數
  3. 事件(信號):通過通知的方式保持多個線程同步

進程間通信方式

  1. 管道/匿名管道/有名管道(pipe)
  2. 信號(Singal):比如用戶使用ctrl+c產生SIGINT程序停止信號
  3. 消息隊列(Message)
  4. 共享內存
  5. 信號量
  6. 套接字(socket):最常用的方式,web應用都是這種方式

死鎖發生的四個必要條件:

(1) 互斥條件(選項D):一個資源每次只能被一個進程使用。
(2) 請求與保持條件(選項C):一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件(選項B):進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環等待條件(選項A):若干進程之間形成一種頭尾相接的循環等待資源關係。
只要發生死鎖,上述四個條件一定滿足,只要有一個條件不滿足,就不會發生死鎖
因此,要避免死鎖,只要破壞上述四個條件之一,主要有以下方法:
靜態分配資源:破壞條件(2)和(4)
按序分配資源:破壞條件(4)
剝奪是分配:破壞條件(3)
而互斥地使用資源是多進程能正確工作的前提,是必須保證滿足的,不能破壞,否則就會出現問題如讀寫不一致

發佈了16 篇原創文章 · 獲贊 6 · 訪問量 2628
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章