進程與線程的概念、區別及各自通信方式

進程與線程的概念

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

進程與線程的區別

  • 一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程。線程依賴於進程而存在。
  • 進程在執行過程中擁有獨立的內存單元,而多個線程共享進程的內存。(資源分配給進程,同一進程的所有線程共享該進程的所有資源。同一進程中的多個線程共享代碼段(代碼和常量),數據段(全局變量和靜態變量),擴展段(堆存儲)。但是每個線程擁有自己的棧段,棧段又叫運行時段,用來存放所有局部變量和臨時變量。)
  • 進程是資源分配的最小單位,線程是CPU調度的最小單位;
  • 系統開銷: 由於在創建或撤消進程時,系統都要爲之分配或回收資源,如內存空間、I/O設備等。因此,操作系統所付出的開銷將顯著地大於在創建或撤消線程時的開銷。類似地,在進行進程切換時,涉及到整個當前進程CPU環境的保存以及新被調度運行的進程的CPU環境的設置。而線程切換隻須保存和設置少量寄存器的內容,並不涉及存儲器管理方面的操作。可見,進程切換的開銷也遠大於線程切換的開銷。
  • 通信:由於同一進程中的多個線程具有相同的地址空間,致使它們之間的同步和通信的實現,也變得比較容易。進程間通信IPC,線程間可以直接讀寫進程數據段(如全局變量)來進行通信——需要進程同步和互斥手段的輔助,以保證數據的一致性。在有的系統中,線程的切換、同步和通信都無須操作系統內核的干預
  • 進程編程調試簡單可靠性高,但是創建銷燬開銷大;線程正相反,開銷小,切換速度快,但是編程調試相對複雜。
  • 進程間不會相互影響 ;線程一個線程掛掉將導致整個進程掛掉
  • 進程適應於多核、多機分佈;線程適用於多核

進程間通信的方式

進程間通信主要包括管道、系統IPC(包括消息隊列、信號量、信號、共享內存等)、以及套接字socket。

管道:

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

普通管道PIPE:

  • 它是半雙工的(即數據只能在一個方向上流動),具有固定的讀端和寫端
  • 它只能用於具有親緣關係的進程之間的通信(也是父子進程或者兄弟進程之間)
  • 它可以看成是一種特殊的文件,對於它的讀寫也可以使用普通的read、write等函數。但是它不是普通的文件,並不屬於其他任何文件系統,並且只存在於內存中。

命名管道FIFO:

  • FIFO可以在無關的進程之間交換數據
  • FIFO有路徑名與之相關聯,它以一種特殊設備文件形式存在於文件系統中。

系統IPC:

消息隊列

消息隊列,是消息的鏈接表,存放在內核中。一個消息隊列由一個標識符(即隊列ID)來標記。 (消息隊列克服了信號傳遞信息少,管道只能承載無格式字節流以及緩衝區大小受限等特點)具有寫權限得進程可以按照一定得規則向消息隊列中添加新信息;對消息隊列有讀權限得進程則可以從消息隊列中讀取信息;
特點:

  • 消息隊列是面向記錄的,其中的消息具有特定的格式以及特定的優先級。
  • 消息隊列獨立於發送與接收進程。進程終止時,消息隊列及其內容並不會被刪除。
  • 消息隊列可以實現消息的隨機查詢,消息不一定要以先進先出的次序讀取,也可以按消息的類型讀取。

信號量semaphore

信號量(semaphore)與已經介紹過的 IPC 結構不同,它是一個計數器,可以用來控制多個進程對共享資源的訪問。信號量用於實現進程間的互斥與同步,而不是用於存儲進程間通信數據。
特點:

  • 信號量用於進程間同步,若要在進程間傳遞數據需要結合共享內存。
  • 信號量基於操作系統的 PV 操作,程序對信號量的操作都是原子操作。
  • 每次對信號量的 PV 操作不僅限於對信號量值加 1 或減 1,而且可以加減任意正整數。
  • 支持信號量組。

信號signal

信號是一種比較複雜的通信方式,用於通知接收進程某個事件已經發生。

共享內存(Shared Memory)

它使得多個進程可以訪問同一塊內存空間,不同進程可以及時看到對方進程中對共享內存中數據得更新。這種方式需要依靠某種同步操作,如互斥鎖和信號量等
特點:

  • 共享內存是最快的一種IPC,因爲進程是直接對內存進行存取
  • 因爲多個進程可以同時操作,所以需要進行同步
  • 信號量+共享內存通常結合在一起使用,信號量用來同步對共享內存的訪問

套接字SOCKET:

socket也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同主機之間的進程通信。

線程間通信的方式

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