Q31:進程與線程

基本概念

進程是對運行時程序的封裝,是系統進行資源調度和分配的基本單位,實現了操作系統的併發。

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

區別

  1. 一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程。線程依賴於進程而存在。

  2. 進程在執行程序中擁有獨立的內存空間,而多個線程共享進程的內存。(資源分配給進程,同一進程的所有線程共享該進程的所有資源。同一進程中的多個線程共享代碼段(代碼和常量),數據段(全局變量和靜態變量),擴展段(堆存儲)。但是每個線程擁有自己的棧段,棧段又叫運行時段,用來存放所有局部變量和臨時變量。)

  3. 進程是資源分配的最小單位,線程是CPU調度的最小單位。

  4. 系統開銷:由於在創建或撤消進程時,系統都要爲之分配或回收資源,如內存空間、I/O設備等。因此,操作系統所付出的開銷將顯著地大於在創建或撤消線程時的開銷。類似地,在進行進程切換時,涉及到整個當前進程CPU環境的保存以及新被調度運行的進程的CPU環境的設置。而線程切換隻須保存和設置少量寄存器的內容,並不涉及存儲器管理方面的操作。可見,進程切換的開銷也遠大於線程切換的開銷

  5. 通信:由於同一進程中的多個線程具有相同的地址空間,致使它們之間的同步和通信的實現,也變得比較容易。進程間通信IPC,線程間可以直接讀寫進程數據段(如全局變量)來進行通信——需要進程同步和互斥手段的輔助,以保證數據的一致性。在有的系統中,線程的切換、同步和通信都無須操作系統內核的干預。

  6. 進程編程調試簡單可靠性高,但是創建銷燬開銷大;線程正相反,開銷小,切換速度快,但是編程調試相對複雜。

  7. 進程間不會相互影響 ;線程一個線程掛掉將導致整個進程掛掉。

  8. 進程適應於多核、多機分佈;線程適用於多核。

進程間通信的方式

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

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

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

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

二、系統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)信號量+共享內存通常結合在一起使用,信號量用來同步對共享內存的訪問。

三、嵌套字SOCKET
socket也是一種進程間的通信機制,與其他通信機制不同的是,它可以用於不同主機之間的進程通信。

線程間通信的方式

一、臨界區
通過多線程的串行化來訪問公共資源或者一段代碼,速度快,適合控制數據訪問。

二、互斥量Synchronized/Lock
採用互斥對象機制,只有擁有互斥對象的線程纔有訪問公共資源的權限。因爲互斥對象只有一個,所以可以保證公共資源不會被多個線程同時訪問。

三、信號量Semphare
爲控制具有有限數量的用戶資源而設計的,它允許多個線程在同一時刻去訪問同一個資源,但一般需要限制同一時刻訪問此資源的最大線程數目。

四、事件(信號),Wait/Notify
通過通知操作的方式來保持多線程同步,還可以方便的實現多線程優先級的比較操作。

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