筆記總結 | 線程、進程的概念和區別、進程間通信、線程間通信

請你說一下進程與線程的概念,以及爲什麼要有進程線程,其中有什麼區別,他們各自又是怎麼同步的。

01 基本概念:

  • 進程是對運行時程序的封裝,是系統進行資源分配和獨立運行的的基本單位,實現了操作系統的併發;
  • 一個程序加載到內存後就變爲進程。進程是程序的一次執行過程。
  • 進程 = 數據 + 程序 + 執行
  • 線程可以理解爲進程中執行的一段程序片段。
  • 線程是進程的子任務,是CPU調度和分派的基本單位,用於保證程序的實時性,實現進程內部的併發;
  • 線程是操作系統可識別的最小執行和調度單位。每個線程都獨自佔用一個虛擬處理器:獨自的寄存器組,指令計數器和處理器狀態。每個線程完成不同的任務,但是共享同一地址空間(也就是同樣的動態內存,映射文件,目標代碼等等),打開的文件隊列和其他內核資源。
  • 同一進程中的兩段代碼不能夠同時執行,除非引入線程

02 區別:

  1. 一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程。線程依賴於進程而存在。
  2. 進程在執行過程中擁有獨立的內存單元,而多個線程共享進程的內存。(資源分配給進程,同一進程的所有線程共享該進程的所有資源。同一進程中的多個線程共享代碼段(代碼和常量),數據段(全局變量和靜態變量),擴展段(堆存儲)。但是每個線程擁有自己的棧段,棧段又叫運行時段,用來存放所有局部變量和臨時變量。)
  3. 進程是資源分配的最小單位,線程是CPU調度的最小單位;
  4. 系統開銷: 由於在創建或撤消進程時,系統都要爲之分配或回收資源,如內存空間、IO設備等。因此,操作系統所付出的開銷將顯著地大於在創建或撤消線程時的開銷。類似地,在進行進程切換時,涉及到整個當前進程CPU環境的保存以及新被調度運行的進程的CPU環境的設置。 而線程切換隻須保存和設置少量寄存器的內容,並不涉及存儲器管理方面的操作。可見,進程切換的開銷也遠大於線程切換的開銷。
  • 進程切換需要分兩步:切換頁目錄、刷新TLB以使用新的地址空間;切換內核棧和硬件上下文(寄存器);
  • 而同一進程的線程間邏輯地址空間是一樣的,不需要切換頁目錄、刷新TLB。
  1. 通信:由於同一進程中的多個線程具有相同的地址空間,致使它們之間的同步和通信的實現,也變得比較容易。進程間通信IPC,線程間可以直接讀寫進程數據段(如全局變量) 來進行通信——需要進程同步和互斥手段的輔助,以保證數據的一致性。在有的系統中,線程的切換、同步和通信都無須操作系統內核的干預
  2. 進程編程調試簡單可靠性高,但是創建銷燬開銷大;線程正相反,開銷小,切換速度快,但是編程調試相對複雜。
  3. 進程適應於多核、多機分佈;線程適用於多核。
  4. 一個進程崩潰,不會對其他進程產生影響;而一個線程崩潰,會讓同一進程內的其他線程也死掉。
請問線程需要保存哪些上下文,SP、PC、EAX這些寄存器是幹嘛用的
  • 線程在切換的過程中需要保存當前線程Id、線程狀態、堆棧、寄存器狀態等信息。其中寄存器主要包括SP PC EAX等寄存器,其主要功能如下:
  • SP: 堆棧指針,指向當前棧的棧頂地址
  • PC: 程序計數器,存儲下一條將要執行的指令
  • EAX: 累加寄存器,用於加法乘法的缺省寄存器

03 進程間通信的方式:

  • 進程之間的交互稱爲進程間通信Inter-Process CommunicationIPC)。
  • 進程間通信主要包括管道、系統IPC(包括消息隊列、信號量、信號、共享內存等)、以及套接字socket
爲什麼要通信?
  • 父進程在創建子進程後,通常需要監督子進程的狀態,以便於子進程沒有完成給定的任務時,可以再創建一個子進程來繼續。這就需要父子進程間通信。
1.管道:

管道主要包括無名管道和命名管道:管道可用於具有親緣關係的父子進程間的通信,有名管道除了具有管道所具有的功能外,它還允許無親緣關係進程間的通信。

1.1 普通管道PIPE:
  1. 它是半雙工的(即數據只能在一個方向上流動),具有固定的讀端和寫端
  2. 它只能用於具有親緣關係的進程之間的通信(也是父子進程或者兄弟進程之間)
  3. 它可以看成是一種特殊的文件,對於它的讀寫也可以使用普通的read、write等函數。但是它不是普通的文件,並不屬於其他任何文件系統,並且只存在於內存中。
1.2 命名管道FIFO:先進先出
  1. FIFO可以在無關的進程之間交換數據。
  2. FIFO有路徑名與之相關聯,它以一種特殊設備文件形式存在於文件系統中。
2. 系統IPC:
2.1 消息隊列
  • 消息隊列,是消息的鏈接表,存放在內核中。一個消息隊列由一個標識符(即隊列ID)來標記。 (消息隊列克服了信號傳遞信息少,管道只能承載無格式字節流以及緩衝區大小受限等特點)具有寫權限得進程可以按照一定得規則向消息隊列中添加新信息;對消息隊列有讀權限得進程則可以從消息隊列中讀取信息;

特點:

  1. 消息隊列是面向記錄的,其中的消息具有特定的格式以及特定的優先級。
  2. 消息隊列獨立於發送與接收進程。進程終止時,消息隊列及其內容並不會被刪除。
  3. 消息隊列可以實現消息的隨機查詢,消息不一定要以先進先出的次序讀取,也可以按消息的類型讀取。
2.2 信號量 semaphore
  • 信號量(semaphore) 與已經介紹過的 IPC 結構不同,它是一個計數器,可以用來控制多個進程對共享資源的訪問
  • 信號量用於實現進程間的互斥與同步,而不是用於存儲進程間通信數據。

特點:

  1. 信號量用於進程間同步,若要在進程間傳遞數據需要結合共享內存。
  2. 信號量基於操作系統的 PV 操作,程序對信號量的操作都是原子操作。
  3. 每次對信號量的 PV 操作不僅限於對信號量值+1 或 -1,而且可以加減任意正整數。
    4)支持信號量組。
2.3 信號signal
  • 信號是一種比較複雜的通信方式,用於通知接收進程某個事件已經發生。
2.4 共享內存(Shared Memory)
  • 它使得多個進程可以訪問同一塊內存空間,不同進程可以及時看到對方進程中對共享內存中數據得更新。這種方式需要依靠某種同步操作,如互斥鎖和信號量等

特點:

  1. 共享內存是最快的一種IPC,因爲進程是直接對內存進行存取。
  2. 因爲多個進程可以同時操作,所以需要進行同步。
  3. 信號量+共享內存通常結合在一起使用,信號量用來同步對共享內存的訪問。
3. 套接字SOCKET:
  • socket也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同主機之間的進程通信。

04 線程間通信的方式:

  • 臨界區:通過多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數據訪問;
  • 互斥量Synchronized/Lock:採用互斥對象機制,只有擁有互斥對象的線程纔有訪問公共資源的權限。因爲互斥對象只有一個,所以可以保證公共資源不會被多個線程同時訪問。
  • 信號量Semphare:爲控制具有有限數量的用戶資源而設計的,它允許多個線程在同一時刻去訪問同一個資源,但一般需要限制同一時刻訪問此資源的最大線程數目。
  • 事件(信號),Wait/Notify:通過通知操作的方式來保持多線程同步,還可以方便的實現多線程優先級的比較操作

請你說一下多進程和多線程的使用場景

  • 多線程模型主要優勢爲線程間切換代價較小,因此適用於I/O密集型的工作場景,因此I/O密集型的工作場景經常會由於I/O阻塞導致頻繁的切換線程。同時,多線程模型也適用於單機多核分佈式場景。
  • 多進程模型的優勢是CPU。則多進程模型,適用於CPU密集型。同時,多進程模型也適用於多機分佈式場景中,易於多機擴展。

有了進程,爲什麼還要有線程?

線程產生的原因:

  • 進程可以使多個程序能併發執行,以提高資源的利用率和系統的吞吐量;但是其具有一些缺點:
  • 進程在同一時間只能幹一件事。
  • 進程在執行的過程中如果阻塞,整個進程就會掛起,即使進程中有些工作不依賴於等待的資源,仍然不會執行。

因此,操作系統引入了比進程粒度更小的線程,作爲併發執行的基本單位,從而減少程序在併發執行時所付出的時空開銷,提高併發性。和進程相比,線程的優勢如下:

  • 從資源上來講,線程是一種非常"節儉"的多任務操作方式。在linux系統下,啓動一個新的進程必須分配給它獨立的地址空間,建立衆多的數據表來維護它的代碼段、堆棧段和數據段,這是一種"昂貴"的多任務工作方式。
  • 從切換效率上來講,運行於一個進程中的多個線程,它們之間使用相同的地址空間,而且線程間彼此切換所需時間也遠遠小於進程間切換所需要的時間。據統計,一個進程的開銷大約是一個線程開銷的30倍左右。
  • 從通信機制上來講,線程間方便的通信機制。對不同進程來說,它們具有獨立的數據空間,要進行數據的傳遞只能通過進程間通信的方式進行,這種方式不僅費時,而且很不方便。線程則不然,由於同一進城下的線程之間貢獻數據空間,所以一個線程的數據可以直接爲其他線程所用,這不僅快捷,而且方便。

除以上優點外,多線程程序作爲一種多任務、併發的工作方式,還有如下優點:
1、使多CPU系統更加有效。操作系統會保證當線程數不大於CPU數目時,不同的線程運行於不同的CPU上。
2、改善程序結構。一個既長又複雜的進程可以考慮分爲多個線程,成爲幾個獨立或半獨立的運行部分,這樣的程序纔會利於理解和修改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章