天天看點

程序與線程程序基本概念線程基本概念兩者的差別程序間的通信線程間的通信

文章目錄

  • 程序基本概念
  • 線程基本概念
  • 兩者的差別
  • 程序間的通信
  • 線程間的通信

程序基本概念

程序是對運作時程式的封裝,是系統進行資源排程和配置設定的基本機關,實作作業系統的并發。

線程基本概念

  • 線程是程序的子任務,是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:通過通知操作的方式來保持多線程同步,還可以友善的實作多線程優先級的比較操作

繼續閱讀