python併發程式設計之多執行緒理論部分
一 什麼是執行緒
在傳統作業系統中,每個程序有一個地址空間,而且預設就有一個控制執行緒
執行緒顧名思義,就是一條流水線工作的過程,一條流水線必須屬於一個車間,一個車間的工作過程是一個程序
車間負責把資源整合到一起,是一個資源單位,而一個車間內至少有一個流水線
流水線的工作需要電源,電源就相當於cpu
所以,程序只是用來把資源集中到一起(程序只是一個資源單位,或者說資源集合),而執行緒才是cpu上的執行單位。
多執行緒(即多個控制執行緒)的概念是,在一個程序中存在多個控制執行緒,多個控制執行緒共享該程序的地址空間,相當於一個車間內有多條流水線,都共用一個車間的資源。
例如,北京地鐵與上海地鐵是不同的程序,而北京地鐵裡的13號線是一個執行緒,北京地鐵所有的線路共享北京地鐵所有的資源,比如所有的乘客可以被所有線路拉。
二 執行緒的建立開銷小
建立程序的開銷要遠大於執行緒?
如果我們的軟體是一個工廠,該工廠有多條流水線,流水線工作需要電源,電源只有一個即cpu(單核cpu)
一個車間就是一個程序,一個車間至少一條流水線(一個程序至少一個執行緒)
建立一個程序,就是建立一個車間(申請空間,在該空間內建至少一條流水線)
而建執行緒,就只是在一個車間內造一條流水線,無需申請空間,所以建立開銷小
程序之間是競爭關係,執行緒之間是協作關係?
車間直接是競爭/搶電源的關係,競爭(不同的程序直接是競爭關係,是不同的程式設計師寫的程式執行的,迅雷搶佔其他程序的網速,360把其他程序當做病毒乾死)
一個車間的不同流水線式協同工作的關係(同一個程序的執行緒之間是合作關係,是同一個程式寫的程式內開啟動,迅雷內的執行緒是合作關係,不會自己幹自己)
三 執行緒與程序的區別
- Threads share the address space of the process that created it; processes have their own address space.
- Threads have direct access to the data segment of its process; processes have their own copy of the data segment of the parent process.
- Threads can directly communicate with other threads of its process; processes must use interprocess communication to communicate with sibling processes.
- New threads are easily created; new processes require duplication of the parent process.
- Threads can exercise considerable control over threads of the same process; processes can only exercise control over child processes.
- Changes to the main thread (cancellation, priority change, etc.) may affect the behavior of the other threads of the process; changes to the parent process does not affect child processes.
四 為何要用多執行緒
多執行緒指的是,在一個程序中開啟多個執行緒,簡單的講:如果多個任務共用一塊地址空間,那麼必須在一個程序內開啟多個執行緒。詳細的講分為4點:
1. 多執行緒共享一個程序的地址空間
2. 執行緒比程序更輕量級,執行緒比程序更容易建立可撤銷,在許多作業系統中,建立一個執行緒比建立一個程序要快10-100倍,在有大量執行緒需要動態和快速修改時,這一特性很有用
3. 若多個執行緒都是cpu密集型的,那麼並不能獲得性能上的增強,但是如果存在大量的計算和大量的I/O處理,擁有多個執行緒允許這些活動彼此重疊執行,從而會加快程式執行的速度。
4. 在多cpu系統中,為了最大限度的利用多核,可以開啟多個執行緒,比開程序開銷要小的多。(這一條並不適用於python)
五 多執行緒的應用舉例
開啟一個字處理軟體程序,該程序肯定需要辦不止一件事情,比如監聽鍵盤輸入,處理文字,定時自動將文字儲存到硬碟,這三個任務操作的都是同一塊資料,因而不能用多程序。只能在一個程序裡併發地開啟三個執行緒,如果是單執行緒,那就只能是,鍵盤輸入時,不能處理文字和自動儲存,自動儲存時又不能輸入和處理文字。
六 經典的執行緒模型(瞭解)
多個執行緒共享同一個程序的地址空間中的資源,是對一臺計算機上多個程序的模擬,有時也稱執行緒為輕量級的程序
而對一臺計算機上多個程序,則共享實體記憶體、磁碟、印表機等其他物理資源。
多執行緒的執行也多程序的執行類似,是cpu在多個執行緒之間的快速切換。
不同的程序之間是充滿敵意的,彼此是搶佔、競爭cpu的關係,如果迅雷會和QQ搶資源。而同一個程序是由一個程式設計師的程式建立,所以同一程序內的執行緒是合作關係,一個執行緒可以訪問另外一個執行緒的記憶體地址,大家都是共享的,一個執行緒乾死了另外一個執行緒的記憶體,那純屬程式設計師腦子有問題。
類似於程序,每個執行緒也有自己的堆疊
不同於程序,執行緒庫無法利用時鐘中斷強制執行緒讓出CPU,可以呼叫thread_yield執行執行緒自動放棄cpu,讓另外一個執行緒執行。
執行緒通常是有益的,但是帶來了不小程式設計難度,執行緒的問題是:
1. 父程序有多個執行緒,那麼開啟的子執行緒是否需要同樣多的執行緒
如果是,那麼附近中某個執行緒被阻塞,那麼copy到子程序後,copy版的執行緒也要被阻塞嗎,想一想nginx的多執行緒模式接收使用者連線。
2. 在同一個程序中,如果一個執行緒關閉了問題,而另外一個執行緒正準備往該檔案內寫內容呢?
如果一個執行緒注意到沒有記憶體了,並開始分配更多的記憶體,在工作一半時,發生執行緒切換,新的執行緒也發現記憶體不夠用了,又開始分配更多的記憶體,這樣記憶體就被分配了多次,這些問題都是多執行緒程式設計的典型問題,需要仔細思考和設計。
七 POSIX執行緒(瞭解)
為了實現可移植的執行緒程式,IEEE在IEEE標準1003.1c中定義了執行緒標準,它定義的執行緒包叫Pthread。大部分UNIX系統都支援該標準,簡單介紹如下
八 在使用者空間實現的執行緒(瞭解)
執行緒的實現可以分為兩類:使用者級執行緒(User-Level Thread)和核心線執行緒(Kernel-Level Thread),後者又稱為核心支援的執行緒或輕量級程序。在多執行緒作業系統中,各個系統的實現方式並不相同,在有的系統中實現了使用者級執行緒,有的系統中實現了核心級執行緒。
使用者級執行緒核心的切換由使用者態程式自己控制核心切換,不需要核心干涉,少了進出核心態的消耗,但不能很好的利用多核Cpu,目前Linux pthread大體是這麼做的。
在使用者空間模擬作業系統對程序的排程,來呼叫一個程序中的執行緒,每個程序中都會有一個執行時系統,用來排程執行緒。此時當該程序獲取cpu時,程序內再排程出一個執行緒去執行,同一時刻只有一個執行緒執行。
九 在核心空間實現的執行緒(瞭解)
核心級執行緒:切換由核心控制,當執行緒進行切換的時候,由使用者態轉化為核心態。切換完畢要從核心態返回使用者態;可以很好的利用smp,即利用多核cpu。windows執行緒就是這樣的。
十 使用者級與核心級執行緒的對比(瞭解)
一: 以下是使用者級執行緒和核心級執行緒的區別:
- 核心支援執行緒是OS核心可感知的,而使用者級執行緒是OS核心不可感知的。
- 使用者級執行緒的建立、撤消和排程不需要OS核心的支援,是在語言(如Java)這一級處理的;而核心支援執行緒的建立、撤消和排程都需OS核心提供支援,而且與程序的建立、撤消和排程大體是相同的。
- 使用者級執行緒執行系統呼叫指令時將導致其所屬程序被中斷,而核心支援執行緒執行系統呼叫指令時,只導致該執行緒被中斷。
- 在只有使用者級執行緒的系統內,CPU排程還是以程序為單位,處於執行狀態的程序中的多個執行緒,由使用者程式控制執行緒的輪換執行;在有核心支援執行緒的系統內,CPU排程則以執行緒為單位,由OS的執行緒排程程式負責執行緒的排程。
- 使用者級執行緒的程式實體是執行在使用者態下的程式,而核心支援執行緒的程式實體則是可以執行在任何狀態下的程式。
二: 核心執行緒的優缺點
優點:
- 當有多個處理機時,一個程序的多個執行緒可以同時執行。
缺點:
- 由核心進行排程。
三: 使用者程序的優缺點
優點:
- 執行緒的排程不需要核心直接參與,控制簡單。
- 可以在不支援執行緒的作業系統中實現。
- 建立和銷燬執行緒、執行緒切換代價等執行緒管理的代價比核心執行緒少得多。
- 允許每個程序定製自己的排程演算法,執行緒管理比較靈活。
- 執行緒能夠利用的表空間和堆疊空間比核心級執行緒多。
- 同一程序中只能同時有一個執行緒在執行,如果有一個執行緒使用了系統呼叫而阻塞,那麼整個程序都會被掛起。另外,頁面失效也會產生同樣的問題。
缺點:
- 資源排程按照程序進行,多個處理機下,同一個程序中的執行緒只能在同一個處理機下分時複用
十一 混合實現(瞭解)
使用者級與核心級的多路複用,核心同一排程核心執行緒,每個核心執行緒對應n個使用者執行緒
十二 執行緒小故事
相關推薦
python併發程式設計之多執行緒理論部分
一 什麼是執行緒 在傳統作業系統中,每個程序有一個地址空間,而且預設就有一個控制執行緒 執行緒顧名思義,就是一條流水線工作的過程,一條流水線必須屬於一個車間,一個車間的工作過程是一個程序 車間負責把資源整合到一起,是一個資源單位,而一個車間內至少有一個流水線 流水線
Python併發程式設計之多執行緒使用
目錄 一 開啟執行緒的兩種方式 二 在一個程序下開啟多個執行緒與在一個程序下開啟多個子程序的區別 三 練習 四 執行緒相關的其他方法 五 守護執行緒 六 Python GIL(Global Interpreter Lock) 七 同步鎖 八 死鎖現象
Python學習【第24篇】:死鎖,遞迴鎖,訊號量,Event事件,執行緒Queue python併發程式設計之多執行緒2------------死鎖與遞迴鎖,訊號量等
python併發程式設計之多執行緒2------------死鎖與遞迴鎖,訊號量等 一、死鎖現象與遞迴鎖 程序也是有死鎖的 所謂死鎖: 是指兩個或兩個以上
Python學習【第23篇】:利用threading模組開執行緒 python併發程式設計之多執行緒1
python併發程式設計之多執行緒1 一多執行緒的概念介紹 threading模組介紹 threading模組和multiprocessing模組在使用層
42、併發程式設計之多執行緒理論篇
### 一 什麼是執行緒 在傳統作業系統中,每個程序有一個地址空間,而且預設就有一個控制執行緒 執行緒顧名思義,就是一條流水線工作的過程,一條流水線必須屬於一個車間,一個車間的工作過程是一個程序 車間負責把資源整合到一起,是一個資源單位,而一個車間內至少有一個流水線 流水線的工作需要電源,電源就相當於
併發程式設計之多執行緒執行緒安全
什麼是執行緒安全? 為什麼有執行緒安全問題? 當多個執行緒同時共享,同一個全域性變數或靜態變數,做寫的操作時,可能會發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。 案例: 需求現在有100張火車票,有兩個視窗同時搶火車票,請使用多執行緒模擬搶票效果。 p
併發程式設計之多執行緒基礎
執行緒與程序區別 每個正在系統上執行的程式都是一個程序。每個程序包含一到多個執行緒。執行緒是一組指令的集合,或者是程式的特殊段,它可以在程式裡獨立執行。也可以把它理解為程式碼執行的上下文。所以執行緒基本上是輕量級的程序,它負責在單個程式裡執行多工。通常由作業系統負責多個執行緒的排程和執行。
併發程式設計之多執行緒基礎-Thread和Runnable的區別及聯絡(二)
上篇文章講述了建立執行緒的常用方式 本篇主要分析一下Thread和Runnable兩種方式建立執行緒的區別及聯絡 聯絡: ▶Thread類實現了Runable介面。 ▶都需要重寫裡面Run方法。 區別: ▶Thread方式不支援多繼承,Runnable方式支援多個實現 ▶Runnable更容易實
併發程式設計之多執行緒基礎-執行緒五種狀態(三)
原文地址:https://www.cnblogs.com/wangyichuan/p/5990821.html 執行緒從建立、執行到結束總是處於下面五個狀態之一:新建狀態、就緒狀態、執行狀態、阻塞狀態及死亡狀態。 1.新建狀態(New): 當用new操作符建立一個執行緒時,
併發程式設計之多執行緒
一、什麼是執行緒 在傳統作業系統中,每個程序有一個地址空間,而且預設就有一個控制執行緒 執行緒顧名思義,就是一條流水線工作的過程,一條流水線必須屬於一個車間,一個車間的工作過程是一個程序 車間負責把資源整合到一起,是一個資源單位,而一個車間內至少有一個流水線 流水線的工作需要電源,電源就相當於cpu 所以,
Python網路程式設計之多執行緒
多執行緒 多執行緒舉例: import threading from time import sleep,ctime def sing(): for i in range(3): print("正在唱歌...%d"%i)
43、併發程式設計之多執行緒實操篇
### 一 threading模組介紹 multiprocessing模組完全模仿了threading模組的介面,二者在使用層面,有很大的相似性,因而不再詳細介紹 [官網連結:https://docs.python.org/3/library/threading.html?highlight=thread
python併發程式設計之多程序、多執行緒、非同步和協程
一、多執行緒 多執行緒就是允許一個程序記憶體在多個控制權,以便讓多個函式同時處於啟用狀態,從而讓多個函式的操作同時執行。即使是單CPU的計算機,也可以通過不停地在不同執行緒的指令間切換,從而造成多執行緒同時執行的效果。 多執行緒相當於一個併發(concunrr
python併發程式設計之多程序理論部分
一 什麼是程序 程序:正在進行的一個過程或者說一個任務。而負責執行任務則是cpu。 舉例(單核+多道,實現多個程序的併發執行): egon在一個時間段內有很多工要做:python備課的任務,寫書的任務,交女朋友的任務,王者榮耀上分的任務, 但egon同一時刻只能做一
java併發程式設計一一多執行緒之間通訊(一)
1.多執行緒之間如何實現通訊 多執行緒之間通訊,其實就是多個執行緒在操作同一個資源,但是操作的動作不同。 1.1什麼是多執行緒之間通訊? 需求:第一個執行緒寫入(input)使用者,另一個執行緒讀取(out)使用者。實現讀一個,寫一個操作。 1.2多執行緒之間通訊需求?
java併發程式設計一一多執行緒執行緒安全(四)
##1.java重排序 ###1.1資料依賴性 如果兩個操作訪問同一個變數時,且這兩個操作匯中有一個為寫操作,此時這兩個操作之間就 存在資料依賴性。資料依賴分下列三種類型。 名稱 程式碼示例 說明
java併發程式設計一一多執行緒執行緒安全(三)
1.多執行緒的三大特性 1.1什麼是原子性 即一個操作或多個操作要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行。 一個很經典的例子就是銀行賬戶轉賬問題: 比如從賬戶A向賬戶B轉1000元,那麼必然包括2個操作:從賬戶A減去1000元,往賬戶B加上1000元。這2
java併發程式設計一一多執行緒執行緒安全(二)
1.多執行緒死鎖 1.1什麼是多執行緒死鎖? 同步中巢狀同步,導致鎖無法釋放 程式碼示例: class Thread009 implements Runnable { private int trainCount = 100; private Object
java併發程式設計一一多執行緒執行緒安全(一)
1.什麼是執行緒安全? 1.1為什麼有執行緒安全問題? 當多個執行緒同時共享同一個全域性變臉或靜態變數,做寫的操作時,可能會發生資料衝突的問題, 也就是執行緒安全的問題。但是做讀操作是不會發生資料衝突問題。 舉例:現在有100張火車票,有兩個視窗同時搶火車票,用多執行緒模擬搶
java併發程式設計一一多執行緒基礎快速入門
1.執行緒與程序的區別 每個正在系統上執行的程式都是一個程序。每個程序包含一到多個執行緒。執行緒是一組指令的集合,或者是程式的特殊段,他可以在程式裡獨立執行。也可以把它理解為程式碼執行的上下文。 所以執行緒基本是輕量級的程序,它負責在單個程式裡執行任務。通常有作業系統負責多個執行緒