理解操做系統之進程和線程

在操做系統中,設定了進程和線程的概念去描述程序併發執行邏輯。本文屬於研究進程和線程的入門級文章。 主要從如下五個方面介紹進程以及線程的相關概念。html

  • 進程和線程的定義
  • 操做系統中對進程和線程的描述
  • 進程的多層調度
  • 進程/線程之間的同步機制
  • 進程/線程之間的通訊機制
  • 如何避免進程和線程之間的死鎖

一丶進程和線程的定義

  • 進程: 進程是操做系統中定義擁有資源和調度基本單位
  • 線程: 線程是操做系統中調度的基本單位,線程不能擁有資源,能夠當作輕量級的線程。

二丶操做系統中對進程和線程的描述

1. 進程和線程實體描述 進程和線程均是OS中的運行實體,都是調度和分派的基本單位。算法

  • OS定義了PCB(Proccess control block,進程控制塊)描述進程實體
  • OS定義TCP(Thread control block,線程控制塊)描述線程實體 OS在建立進程/線程的時候必須建立對應的PCB以及TCP。PCB和TCP中存儲的內容高低類似,本文僅描述PCB的具體內容,TCP的相關的內容可類比。 PCB的主要內容: (1)進程標識符,主要用於操做系統以及用戶定位不一樣的進程,是進程的惟一標識 (2)處理機狀態,在發生進程切換時保存當前處理器寄存器相關信息。處理機狀態信息也用於進程調度時恢復現場信息。 (3)進程調度信息,主要保存服務進程調度的相同統計值。好比當前進程狀態,進程優先級,已執行CPU時間,已等待CPU時間等信息,進程阻塞緣由等信息內容。 (4)進程控制信息:主要保存進程執行相關的信息,好比:(1)程序和數據的內存地址(2) 同步和通訊機制(3)進程和線程運行所須要的資源清單

2. 進程和線程的狀態描述 安全

進程狀態

  • 建立狀態: 進程剛建立的時候的狀態,此時操做系統剛給線程分配完PCB等空間
  • 就緒狀態: 進程建立完畢後,獲取了除CPU外,須要的全部資源
  • 執行狀態: 處於就緒狀態的進程獲取了CPU時間片後切換至執行狀態。當進程所獲時間片消耗完畢後,將切換至就緒狀態等待下一次時間片分配。
  • 阻塞狀態: 處於執行狀態的進程,發生了某種使進程暫停執行的事件,放棄CPU的執行時間,進入阻塞狀態。好比競爭臨界資源,等待IO等事件。位於阻塞狀態的進程,獲取到等待資源後,將進入就緒狀態等待CPU分配時間片。
  • **銷燬狀態:**進程完成執行邏輯後,進入銷燬狀態,回收內存以及分配的資源。

三丶進程的多層調度

從硬盤上的可執行文件搖身轉爲內存中的執行進程涉及到以下兩層調度 (1)做業調度: 做業調度是將硬盤上執行文件調度到內存中成爲進程的過程,經歷過該調度的進程處於就緒狀態等待分配CPU資源。當有多個做業請求調度時,有許多經典算法能夠採用網絡

  • 先來先服務算法: 按照做業請求調度的前後順序執行調度
  • 優先級調度算法:每一個做業均存在優先級,按照做業的的優先級進行調度
  • 短做業有限算法:有限調度執行時間比較短的做業。

(2)進程調度: 進程調度是指在就緒隊列中排隊的就緒進程獲取CPU時間片資源的過程。進程調度算法是須要介紹的重點,從較大的方向上分,其主要包括兩類:併發

  1. 基於優先權調度的算法,該調度算法主要區分如下四種概念操作系統

    • 靜態優先權調度:靜態優先權是指,該進程所分配的優先權在運行的過程當中是不可變化的,從始至終就是初始化的大小。
    • 動態優先權調度:進程調度的優先權能夠依據運行時的狀況動態改變。好比提升排隊時間過長的進程優先權。這樣能避免飢餓進程。
    • 搶佔式調度:當前執行進程的優先權若小於排隊進程進程的優先權,當前執行進程將讓出CPU時間,退出執行。
    • 非搶佔式調度:當前進程一旦獲取了CPU執行時間後,便不會由於優先權的緣由讓出CPU時間。除非主動結束執行或者碰見異常狀況。
  2. 基於時間片輪轉調度算法 基於時間片的調度算法將就緒進程排列成一個隊列,爲隊列中每一個就緒進程分配指定的時間片資源。若在規定的時間片內進程未執行完畢,那麼該進程將再次加入隊列的尾部等待下一次時間片資源分配。上述只是基於時間片的調度算法的通常思想,在實際工業場景下過於粗糙。下面介紹一種較爲經常使用的多級反饋隊列調度算法具備更大的實用價值計算機網絡

  • 多級反饋調度算法:
    image.png
  1. 從圖中可知,該算法擁有N個用於調度的就緒隊列。當進程剛進入就緒狀態時時,首先進入1級就緒隊列等待CPU分配時間片資源。若未在當前時間片資源內執行完畢,那麼進入2級就緒隊列。後續調度過程以此類推。
  2. 只有1級就緒隊列中沒有任何進程時,2級就緒隊列中的進程才能調度之CPU。
  3. 從高級就緒隊列中調度到CPU時,會獲取更多的時間片資源。TN>T3>T2>T1.

多級反饋調度算法,其優越性通常體如今以下三點:線程

  1. 適用於較短的交互型任務。交互型任務通常只須要較短的執行時間能在1級隊列中完成,須要極低的響應延遲
  2. 在多級調度的過程當中,短做業最多在1-2個時間片輪轉中能夠調度完成。週轉時間任然較短
  3. 長做業,能夠輪轉到高級就緒隊列中,這樣或許更多CPU執行時間。不至於由於短做業過程,長做業分配不到CPU資源而致使飢餓。

四丶進程/線程之間同步機制

進程與進程之間的同步,線程和線程之間的同步基本一致。本文以線程和線程之間的同步爲例子介紹同步概念。cdn

  • 線程同步的概念: 線程之間並非孤立的執行,而是有序協做的向前推動執行。htm

  • 經典的進程同步問題:

    1. 消費者與生產者問題 消費者線程和生產者線程同時訪問一個總大小爲N的臨界資源池。當資源池中資源數目爲N時,生產者線程不能往其中添加數據,此時臨界資源池記爲滿狀態。當資源池中資源數目爲0時,消費者線程不能從資源池中拿去數據,此時臨界資源池記爲空狀態。在這樣一個場景下,須要實現三個點: - 消費者線程和生產者線程臨界資源池的訪問是互斥的。 - 臨界資源池在滿狀態時,生產者線程放入數據操做必須阻塞,等待資源池非滿狀態時才能繼續放入 - 臨界資源池空狀態時,消費者線程取數據的操做必須阻塞,等待資源池非空狀態時才能繼續取出。 解決方法:互斥鎖以及條件變量

    2. 哲學家就餐問題

    哲學家就餐
    從上圖可知,五個哲學家們圍坐在一個圓桌上,每一個哲學家左右兩側都放了一隻筷子。當哲學家們想要就就餐時,會試圖拿起離本身最近的筷子。一隻一隻這樣拿筷子。當哲學家拿齊一雙筷子後,就開始就餐。就餐完畢後將全部筷子放回原處,開始思考哲學。 那麼爲何要構造出這樣一個關於哲學家就餐的場景呢? 主要是構建出一個由於線程同步不當而形成死鎖的場景,假若哲學家門同時拿起來本身左側的筷子後,當哲學再次試圖去拿右側筷子時,全部哲學家都沒法獲取就餐機會,陷入僵局。這也是進程同步中的死鎖問題。上述哲學家問題中死鎖狀況存在下述解決方案 (1) 至多隻能容許最多四個哲學家同時去拿同一側的筷子 (2) 哲學家同時拿起兩隻筷子,而不一隻只拿。 能夠看出上述解決方法,都是經過設置限制條件,避免死鎖狀況發生。

    3. 讀者-寫者問題 對於一個文件,存在多個線程同時讀取以及多個線程同時寫入。在這種條件下要求對文件的訪問不能混亂。那麼要求讀線程和寫線程必須知足以下要求:

    • 讀線程和寫線程之間對文件的訪問是互斥的
    • 寫線程之間對文件的訪問是互斥的
    • 讀線程之間對文件的訪問不須要互斥 解決方法: 讀寫鎖

五丶如何避免進程/線程之間的死鎖

本節從線程的角度來介紹死鎖。線程死鎖是線程同步不當致使的問題。本節將從線程死鎖緣由,線程死鎖的必要條件,以及規避線程死鎖的三個方面來分析。 1. 線程死鎖產生的緣由 以哲學家就餐問題,來研究線程死鎖緣由

  • 競爭共享資源:哲學家所須要的筷子就是共享資源。假若哲學家們存在一雙私有的筷子那麼變不存在死鎖問題。
  • 進程間推動順序不合理: 競爭共享資源並不一會致使死鎖。在哲學家就餐問題中,若是可以避免同時拿起同一側筷子這種運行順序。那麼不會發生死鎖。儘管進程之間存在共享資源競爭,可是隻要推動順序合理便能避免死鎖。

2. 線程死鎖產生的必要條件 死鎖發生具備四個必備條件,當可以同時知足這四個條件時,便有可能發生死鎖。

  • 互斥條件,線程對資源的獲取具備排他性,在獲取資源的同時獨佔資源,不容許其餘線程訪問共享資源
  • 請求和保持條件,線程在獲取某個資源以後,若再次申請或許新的資源但被阻塞時,並不釋放已佔有的資源
  • 不剝奪條件,線程獲取資源以後,不會由於其餘線程競爭而放棄資源。只能等到使用完畢或者主動釋放
  • 環路條件,當線程之間發生死鎖的時候,必然存在一個線程->資源之間的環形鏈路。好比線程P1等到線程P2佔用的某個資源,線程P2等待線程P1佔用的謀和資源

3. 避免死鎖的方法

  • 預防死鎖:經過破壞死鎖產生的必要條件,在預防死鎖的發生
  • 避免死鎖:在對線程分配資源的時候,計算該次資源分配以後線程是否處於安全狀態。處於安全狀態則分配資源,不然並不分配資源。避免死鎖具備表明性的算法即是銀行家算法。這是一種很是經典的預防死鎖的方法
  • 檢測和接觸死鎖:該種方法在進程競爭資源的時候,並不任何預防或者避免死鎖的方法。它僅僅提供對死鎖的發現機制,在產生死鎖以後,經過殺死死鎖線程達到接觸死鎖的目的。

六丶進程/線程之間通訊機制

進程/線程之間的同步實際上是一種通訊機制,可是同步機制只是一種小規模的數據通訊。此處介紹的通訊機制是應對較大規模的數據傳輸。此處以進程之間的通訊機制爲例介紹

  • 共享存儲系統 共享存儲系統比較容易理解,就是多個進程擁有共同存儲空間,經過修改/讀取同一塊區域達到通訊目的。
  • 消息傳遞系統 消息傳遞系統是指進程之間經過格式化數據報文交換信息,最容易理解的即是計算機網絡數據報文交換。位於不一樣計算機上應用的通訊也是進程通訊的一種場景
  • 管道通訊 所謂"管道"是指用於鏈接一個讀進程和一個寫進程以實現他們之間的通訊的一個文件。向管道(共享文件)輸入的發送進程,以字符流的形式輸入大量數據到管道中,從管道接收輸出的接收進程,將讀取大量數據。
相關文章
相關標籤/搜索