多程序基礎概念

2021-09-24 16:42:05 字數 2054 閱讀 2439

多程序基礎知識

併發與並行

並行:表示兩個執行緒同時做事情。

併發:表示一會做這個事情,一會做另乙個事情,存在著排程。單核 cpu 不可能存在並行(微觀上)。

臨界區臨界區用來表示一種公共資源或者說是共享資料,可以被多個執行緒使用。但是每一次,只能有乙個執行緒使用它,一旦臨界區資源被占用,其他執行緒要想使用這個資源,就必須等待。

阻塞與非阻塞

阻塞和非阻塞通常用來形容多執行緒間的相互影響。比如乙個執行緒占用了臨界區資源,那麼其它所有需要這個資源的執行緒就必須在這個臨界區中進行等待,等待會導致執行緒掛起。這種情況就是阻塞。

此時,如果占用資源的執行緒一直不願意釋放資源,那麼其它所有阻塞在這個臨界區上的執行緒都不能工作。阻塞是指執行緒在作業系統層面被掛起。阻塞一般效能不好,需大約8萬個時鐘週期來做排程。

非阻塞則允許多個執行緒同時進入臨界區。

死鎖死鎖是程序死鎖的簡稱,是指多個程序迴圈等待他方占有的資源而無限的僵持下去的局面。

活鎖假設有兩個執行緒1、2,它們都需要資源 a/b,假設1號執行緒占有了 a 資源,2號執行緒占有了 b 資源;由於兩個執行緒都需要同時擁有這兩個資源才可以工作,為了避免死鎖,1號執行緒釋放了 a 資源占有鎖,2號執行緒釋放了 b 資源占有鎖;此時 ab 空閒,兩個執行緒又同時搶鎖,再次出現上述情況,此時發生了活鎖。

簡單模擬,電梯遇到人,乙個進的乙個出的,對面占路,兩個人同時往乙個方向讓路,來回重複,還是堵著路。

如果線上應用遇到了活鎖問題,恭喜你中獎了,這類問題比較難排查。

飢餓飢餓是指某乙個或者多個執行緒因為種種原因無法獲得所需要的資源,導致一直無法執行。

建立狀態

當用 new 操作符建立乙個新的執行緒物件時,該執行緒處於建立狀態。

處於建立狀態的執行緒只是乙個空的執行緒物件,系統不為它分配資源。

可執行狀態

執行執行緒的 start() 方法將為執行緒分配必須的系統資源,安排其執行,並呼叫執行緒體——run()方法,這樣就使得該執行緒處於可執行狀態(runnable)。

這一狀態並不是執行中狀態(running),因為執行緒也許實際上並未真正執行。

不可執行狀態

當發生下列事件時,處於執行狀態的執行緒會轉入到不可執行狀態:

呼叫了 sleep() 方法;

執行緒呼叫 wait() 方法等待特定條件的滿足;

執行緒輸入/輸出阻塞;

返回可執行狀態;

處於睡眠狀態的執行緒在指定的時間過去後;

如果執行緒在等待某一條件,另乙個物件必須通過 notify() 或 notifyall() 方法通知等待執行緒條件的改變;

如果執行緒是因為輸入輸出阻塞,等待輸入輸出完成。

執行緒的優先順序

執行緒優先順序及設定

執行緒的優先順序是為了在多執行緒環境中便於系統對執行緒的排程,優先順序高的執行緒將優先執行。乙個執行緒的優先順序設定遵從以下原則:

執行緒建立時,子繼承父的優先順序;

執行緒建立後,可通過呼叫 setpriority() 方法改變優先順序;

執行緒的優先順序是1-10之間的正整數。

執行緒的排程策略

執行緒排程器選擇優先順序最高的執行緒執行。但是,如果發生以下情況,就會終止執行緒的執行:

執行緒體中呼叫了 yield() 方法,讓出了對 cpu 的占用權

執行緒體中呼叫了 sleep() 方法,使執行緒進入睡眠狀態

執行緒由於 i/o 操作而受阻塞

另乙個更高優先順序的執行緒出現

在支援時間片的系統中,該執行緒的時間片用完。

單執行緒建立方式

單執行緒建立方式比較簡單,一般只有兩種方式:繼承 thread 類和實現 runnable 介面;這兩種方式比較常用就不在 demo 了,但是對於新手需要注意的問題有:

不管是繼承 thread 類還是實現 runable 介面,業務邏輯是寫在 run 方法裡面,執行緒啟動的時候是執行 start() 方法;

開啟新的執行緒,不影響主線程的**執行順序也不會阻塞主線程的執行;

新的執行緒和主線程的**執行順序是不能夠保證先後的;

對於多執行緒程式,從微觀上來講某一時刻只有乙個執行緒在工作,多執行緒目的是讓 cpu 忙起來;

通過檢視 thread 的原始碼可以看到,thread 類是實現了 runnable 介面的,所以這兩種本質上來講是乙個;

程序與多程序概念

程序 process 是計算機中程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統機結構基礎。狹義定義 程序是正在執行的程式的例項。在同一時間,同一作業系統中有兩個或兩個以上的程式處於執行狀態。php 提供了程序控制的擴充套件 pcntl。pcntl 實現了unix ...

python基礎 多程序

程序執行緒的區別在程序,執行緒,協程的區別 linux或者unix有fork 函式,但是不支援win系統。multiprocessing模組是跨平台版本的多程序模組。支援win系統,用法如下 from multiprocessing import process importos 子程序要執行的 d...

python基礎 多程序

程序執行緒的區別在程序,執行緒,協程的區別 linux或者unix有fork 函式,但是不支援win系統。multiprocessing模組是跨平台版本的多程序模組。支援win系統,用法如下 from multiprocessing import process importos 子程序要執行的 d...