1. 程式人生 > 資訊 >徐起:realme GT Neo 系列累計使用者超 200 萬,Neo3 將升級為“潮玩電競旗艦”

徐起:realme GT Neo 系列累計使用者超 200 萬,Neo3 將升級為“潮玩電競旗艦”

程序和執行緒的區別

程式只是一組指令的有序集合,它本身沒有任何執行的含義,它只是一個靜態的實體。而程序則不同,它是程式在某個資料集上的執行。程序是一個動態的實體,它有自己的生命週期。它因建立而產生,因排程而執行,因等待資源或事件而被處於等待狀態,因完成任務而被撤消。反映了一個程式在一定的資料集上執行的全部動態過程。

程序:是併發執行的程式在執行過程中分配和管理資源的基本單位,是一個動態概念,競爭計算機系統資源的基本單位。

執行緒:是程序的一個執行單元,是程序內科排程實體。比程序更小的獨立執行的基本單位。執行緒也被稱為輕量級程序。

一個程式至少一個程序,一個程序至少一個執行緒。

為什麼會有執行緒?

  每個程序都有自己的地址空間,即程序空間,在網路或多使用者換機下,一個伺服器通常需要接收大量不確定數量使用者的併發請求,為每一個請求都建立一個程序顯然行不通(系統開銷大響應使用者請求效率低),因此作業系統中執行緒概念被引進。

  • 執行緒的執行過程是線性的,儘管中間會發生中斷或者暫停,但是程序所擁有的資源只為改線狀執行過程服務,一旦發生執行緒切換,這些資源需要被保護起來。
  • 程序分為單執行緒程序和多執行緒程序,單執行緒程序巨集觀來看也是線性執行過程,微觀上只有單一的執行過程。多執行緒程序巨集觀是線性的,微觀上多個執行操作。

執行緒的改變只代表CPU的執行過程的改變,而沒有發生程序所擁有的資源的變化。 

程序執行緒的區別:

  • 地址空間:同一程序的執行緒共享本程序的地址空間,而程序之間則是獨立的地址空間。
  • 資源擁有:同一程序內的執行緒共享本程序的資源如記憶體、I/O、cpu等,但是程序之間的資源是獨立的。

     一個程序崩潰後,在保護模式下不會對其他程序產生影響,但是一個執行緒崩潰整個程序都死掉。所以多程序要比多執行緒健壯。

     程序切換時,消耗的資源大,效率高。所以涉及到頻繁的切換時,使用執行緒要好於程序。同樣如果要求同時進行並且又要共享某些變數的併發操作,只能用執行緒不能用程序

  • 執行過程:每個獨立的程序程有一個程式執行的入口、順序執行序列和程式入口。但是執行緒不能獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。
  • 執行緒是處理器排程的基本單位,但是程序不是。
  • 兩者均可併發執行。

優缺點:

  執行緒執行開銷小,但是不利於資源的管理和保護。執行緒適合在SMP機器(雙CPU系統)上執行。

  程序執行開銷大,但是能夠很好的進行資源管理和保護。程序可以跨機器前移。

何時使用多程序,何時使用多執行緒?

對資源的管理和保護要求高,不限制開銷和效率時,使用多程序。

要求效率高,頻繁切換時,資源的保護管理要求不是很高時,使用多執行緒。

 

程序間通訊

多程序:

首先,先來講一下fork之後,發生了什麼事情。

由fork建立的新程序被稱為子程序(child process)。該函式被呼叫一次,但返回兩次。兩次返回的區別是子程序的返回值是0,而父程序的返回值則是新程序(子程序)的程序 id。將子程序id返回給父程序的理由是:因為一個程序的子程序可以多於一個,沒有一個函式使一個程序可以獲得其所有子程序的程序id。對子程序來說,之所以fork返回0給它,是因為它隨時可以呼叫getpid()來獲取自己的pid;也可以呼叫getppid()來獲取父程序的id。(程序id 0總是由交換程序使用,所以一個子程序的程序id不可能為0 )。

fork之後,作業系統會複製一個與父程序完全相同的子程序,雖說是父子關係,但是在作業系統看來,他們更像兄弟關係,這2個程序共享程式碼空間,但是資料空間是互相獨立的,子程序資料空間中的內容是父程序的完整拷貝,指令指標也完全相同,子程序擁有父程序當前執行到的位置兩程序的程式計數器pc值相同,也就是說,子程序是從fork返回處開始執行的),但有一點不同,如果fork成功,子程序中fork的返回值是0,父程序中fork的返回值是子程序的程序號,如果fork不成功,父程序會返回錯誤。
可以這樣想象,2個程序一直同時執行,而且步調一致,在fork之後,他們分別作不同的工作,也就是分岔了。這也是fork為什麼叫fork的原因

至於那一個最先執行,可能與作業系統(排程演算法)有關,而且這個問題在實際應用中並不重要,如果需要父子程序協同,可以通過原語的辦法解決。


 

常見的通訊方式:

1. 管道pipe:管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。
2. 命名管道FIFO:有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。
4. 訊息佇列MessageQueue:訊息佇列是由訊息的連結串列,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。
5. 共享儲存SharedMemory:共享記憶體就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由一個程序建立,但多個程序都可以訪問。共享記憶體是最快的 IPC 方式,它是針對其他程序間通訊方式執行效率低而專門設計的。它往往與其他通訊機制,如訊號兩,配合使用,來實現程序間的同步和通訊。
6. 訊號量Semaphore:訊號量是一個計數器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。因此,主要作為程序間以及同一程序內不同執行緒之間的同步手段。
7. 套接字Socket:套解口也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同及其間的程序通訊。
8. 訊號 ( sinal ) : 訊號是一種比較複雜的通訊方式,用於通知接收程序某個事件已經發生。