程序 執行緒 鎖的概念

2021-08-26 05:48:22 字數 2582 閱讀 5797

程序狀態的轉換:程序在執行期間,不斷地從一種狀態轉換到另一種狀態,它可以多次處於就緒狀態和執行狀態,也可以多次處於阻塞狀態。

程序表:為實現程序模型,每個程序占用乙個程序表項,該程序表項包含了程序狀態的重要資訊,包括程式計數器、堆疊指標、記憶體分配狀況、所開啟檔案的狀態、帳號和排程資訊等。

為什麼多執行緒?

4.1 鎖機制

通過鎖機制,能夠保證在多核多執行緒環境中,在某乙個時間點上,只能有乙個執行緒進入臨界區**,從而保證臨界區中運算元據的一致性。

所謂的鎖,可以理解為記憶體中的乙個整型數,擁有兩種狀態:空閒狀態和上鎖狀態。加鎖時,判斷鎖是否空閒,如果空閒,修改為上鎖狀態,返回成功。如果已經上鎖,則返回失敗。解鎖時,則把鎖狀態修改為空閒狀態。

4.2 死鎖的概念

死鎖是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。死鎖的原因包括系統資源不足、程序執行推進順序不合適、資源分配不當等。

比如兩隻羊過獨木橋。程序比作羊,資源比作橋。若兩隻羊互不相讓,爭著過橋,就產生死鎖。

4.3 死鎖的必要條件

產生死鎖的四個必要條件:

4.4 解決死鎖的四個方式

4.5 例項

多執行緒開發過程中,任何乙個執行緒都可對變數進行修改,如果關鍵**部分沒有進行加鎖,那麼因此而產生bug,可能是我們不能理解的。比如我們定義了乙個共享變數 balance,初始值為 0,並且啟動兩個執行緒,先存後取,理論上結果應該為 0。但是,由於執行緒的排程是由作業系統決定的,當 t1、t2 交替執行時,只要迴圈次數足夠多,balance 的結果就不一定是 0 了。

import time, threading

balance =

0# 假定這是你的銀行存款:

# 先存後取,結果應該為0

defchange_it

(n):

global balance

balance = balance + n

balance = balance - n

defrun_thread

(n):

for i in

range

(100000):

change_it(n)

t1 = threading.thread(target=run_thread, args=(5

,))t2 = threading.thread(target=run_thread, args=(8

,))t1.start(

)t2.start(

)t1.join(

)t2.join(

)print

(balance)

# 26

另外,針對加鎖的**,我們也要考慮鎖的開銷,盡可能只對關鍵**進行加鎖。寫**之前,可以先大概構思好,如何實現,考慮好資料結構等的應用,然後再去coding。

import time, threading

balance =

0lock = threading.lock(

)def

change_it

(n):

global balance

balance = balance + n

balance = balance - n

defrun_thread

(n):

for i in

range

(100000):

# 先要獲取鎖:

lock.acquire(

)try

:# 放心地改吧:

change_it(n)

finally

:# 改完了一定要釋放鎖:

lock.release(

)t1 = threading.thread(target=run_thread, args=(5

,))t2 = threading.thread(target=run_thread, args=(8

,))t1.start(

)t2.start(

)t1.join(

)t2.join(

)print

(balance)

# 0

python 的執行緒雖然是真正的執行緒,但直譯器執行**時,有乙個 gil 鎖(global interpreter lock),任何 python 執行緒執行前,必須先獲得 gil 鎖。每執行 100 條位元組碼,直譯器就自動釋放 gil 鎖,讓別的執行緒有機會執行。這個 gil 全域性鎖實際上把所有執行緒的執行**都給上了鎖。所以,多執行緒在 python 中只能交替執行,即使 100 個執行緒跑在 100 核 cpu 上,也只能用到 1 個核。

gil 是 python 直譯器設計的歷史遺留問題,通常我們用的直譯器是官方實現的 cpython,要真正利用多核,除非重寫乙個不帶 gil 的直譯器。所以,在 python 如果一定要通過多執行緒利用多核,那只能通過 c 擴充套件來實現。因而,多執行緒的併發在 python 中就是乙個美夢,如果想真正實現多核任務,還是通過多程序來實現吧。

篇幅有限,本文不再針對程序(執行緒)之間的通訊進行介紹,有興趣的可以直接去這兒

python執行緒鎖 守護執行緒,程序鎖 守護程序

1 守護程序 1.1 什麼是守護程序?1 守護程序會在主程序 執行結束的情況下,立即結束。2 守護程序本身其實就是乙個子程序。3 主程序在其 結束後已經執行完畢 守護程序在此時就被 然後主程序會一直等非守護的子程序都執行完畢後 子程序的資源才會結束。1.2 為什麼要用守護程序?1 守護程序本身就是乙...

程序與執行緒的概念

程序 process 和執行緒 thread 是作業系統的基本概念,但是它們比較抽象,不容易掌握。最近,我讀到一篇材料,發現有乙個很好的模擬,可以把它們解釋地清晰易懂。1.計算機的核心是cpu,它承擔了所有的計算任務。它就像一座工廠,時刻在執行。2.假定工廠的電力有限,一次只能供給乙個車間使用。也就...

程序和執行緒的概念

什麼是程式?什麼是程序?程式和程序有什麼關係?程式是計算機儲存系統中的資料檔案 程序的概念 廣義概念 程式關於某個資料集合一次執行活動 狹義概念 程式被載入到記憶體中執行後得到的程序 程式和程序的區別 程式是硬碟中靜態的檔案 儲存系統中的一段二進位制二進位制表示 程序是記憶體中動態的執行實體 資料段...