文章目錄
- 程序基本概念
- 線程基本概念
- 兩者的差別
- 程序間的通信
- 線程間的通信
程序基本概念
程序是對運作時程式的封裝,是系統進行資源排程和配置設定的基本機關,實作作業系統的并發。
線程基本概念
- 線程是程序的子任務,是cpu排程和配置設定的基本機關,用于保證程式的實時性,實作程序内的并發;
- 線程是作業系統的可識别的最小執行和排程的機關。
- 每個線程都獨立占用一個虛拟處理器:獨立的寄存器組,指令計數器和處理器狀态。
- 每個線程完成不同的任務,但是共享同一位址空間(也就是同樣的動态記憶體,映射檔案,目标代碼等等),打開的檔案隊列和其他核心資源
兩者的差別
\ | 程序 | 線程 |
兩者的聯系 | 一個程序可以有多個線程,但至少有一個線程 | 線程依賴程序存在,一個線程隻能屬于一個程序 |
記憶體空間 | 擁有獨立的記憶體空間 | 多個線程共享該程序的所有資源,共享代碼段(代碼和常量),資料段(全局變量和靜态變量),擴充段(堆存儲)。但是每個線程擁有自己的棧段(運作時段,用來存放所有局部變量和臨時變量) |
與系統關系 | 是資源配置設定的最小機關 | 是cpu排程的最小機關 |
系統開銷 | 由于在建立或撤銷程序時,系統都會為之配置設定和回收資源,是以作業系統為程序所付出的開銷遠大于線程,類似地,在進行程序切換時,涉及到整個目前程序CPU環境的儲存以及新被排程運作的程序的CPU環境的設定。 | 而線程切換隻須儲存和設定少量寄存器的内容,并不涉及存儲器管理方面的操作。可見,程序切換的開銷也遠大于線程切換的開銷。 |
通信 | 程序間通信比較複雜 | 同一程序的線程由于共享代碼段和資料段,是以通信比較容易。 |
程式設計調試難度 | 程式設計調試簡單可靠性高,但是建立銷毀開銷大 | 線程正相反,開銷小,切換速度快,但是程式設計調試相對複雜。 |
穩定性 | 一個程序崩潰,不會對其他程序産生影響; | 而一個線程崩潰,會讓同一程序内的其他線程也死掉。 |
程序間的通信
通信方式 | 概述 | 特點 |
1,管道 | 管道主要包括無名管道和命名管道 | 管道可用于具有親緣關系的父子程序間的通信 |
1.1 普通管道PIPE | 它是半雙工的(即資料隻能在一個方向上流動),具有固定的讀端和寫端 | 1. 它隻能用于具有親緣關系的程序之間的通信(也是父子程序或者兄弟程序之間)2.它可以看成是一種特殊的檔案,對于它的讀寫也可以使用普通的read、write等函數。但是它不是普通的檔案,并不屬于其他任何檔案系統,并且隻存在于記憶體中。 |
1.2 命名管道FIFO | FIFO可以在無關的程序之間交換資料 | FIFO有路徑名與之相關聯,它以一種特殊裝置檔案形式存在于檔案系統中。 |
系統IPC | 包括消息隊列、信号量、信号、共享記憶體 |
消息隊列 | 是消息的連結表,存放在核心中。一個消息隊列由一個辨別符(即隊列ID)來标記。 (消息隊列克服了信号傳遞資訊少,管道隻能承載無格式位元組流以及緩沖區大小受限等特點)具有寫權限得程序可以按照一定得規則向消息隊列中添加新資訊;對消息隊列有讀權限得程序則可以從消息隊列中讀取資訊; | 1)消息隊列是面向記錄的,其中的消息具有特定的格式以及特定的優先級。2)消息隊列獨立于發送與接收程序。程序終止時,消息隊列及其内容并不會被删除。3)消息隊列可以實作消息的随機查詢,消息不一定要以先進先出的次序讀取,也可以按消息的類型讀取。 |
信号量 | 它是一個計數器,可以用來控制多個程序對共享資源的通路。信号量用于實作程序間的互斥與同步,而不是用于存儲程序間通信資料。 | 1)信号量用于程序間同步,若要在程序間傳遞資料需要結合共享記憶體。2)信号量基于作業系統的 PV 操作,程式對信号量的操作都是原子操作。3)每次對信号量的 PV 操作不僅限于對信号量值加 1 或減 1,而且可以加減任意正整數。4)支援信号量組。 |
信号 | 比較複雜 | 用于通知接收程序某個事件已經發生。 |
共享記憶體 | 它使得多個程序可以通路同一塊記憶體空間,不同程序可以及時看到對方程序中對共享記憶體中資料得更新。這種方式需要依靠某種同步操作,如互斥鎖和信号量等 | (1)共享記憶體是最快的一種IPC,因為程序是直接對記憶體進行存取 (2)因為多個程序可以同時操作,是以需要進行同步(3)信号量+共享記憶體通常結合在一起使用,信号量用來同步對共享記憶體的通路 |
套接字socket | socket也是一種程序間通信機制,與其他通信機制不同的是,它可用于不同主機之間的程序通信。 |
線程間的通信
- 臨界區:通過多線程的串行化來通路公共資源或一段代碼,速度快,适合控制資料通路;
- 互斥量Synchronized/Lock:采用互斥對象機制,隻有擁有互斥對象的線程才有通路公共資源的權限。因為互斥對象隻有一個,是以可以保證公共資源不會被多個線程同時通路
- 信号量Semphare:為控制具有有限數量的使用者資源而設計的,它允許多個線程在同一時刻去通路同一個資源,但一般需要限制同一時刻通路此資源的最大線程數目。
- 事件(信号),Wait/Notify:通過通知操作的方式來保持多線程同步,還可以友善的實作多線程優先級的比較操作