python併發程式設計之多執行緒理論部分
一、什麼是執行緒
在傳統作業系統中,每個程式有一個地址空間,而且預設就有一個控制執行緒。
執行緒就是一條流水線工作的過程,一條流水線必須屬於一個車間,一個車間的工作過程是一個程式。
車間負責把資源整合到一起,是一個資源單位,而一個車間內至少有一個流水線流水線的工作需要電源,電源就相當於cpu。
所以,程式只是用來把資源集中到一起(程式只是一個資源單位,或者說資源集合),而執行緒才是cpu上的執行單位。
多執行緒(即多個控制執行緒)的概念是,在一個程式中存在多個控制執行緒,多個控制執行緒共享該程式的地址空間,相當於一個車間內有多條流水線,都共用一個車間的資源。
例如,北京地鐵與上海地鐵是不同的程式,而北京地鐵裡的13號線是一個執行緒,北京地鐵所有的線路共享北京地鐵所有的資源,比如所有的乘客可以被所有線路拉。
二、執行緒的建立開銷小
1、建立程式的開銷要遠大於執行緒?
如果我們的軟體是一個工廠,該工廠有多條流水線,流水線工作需要電源,電源只有一個即cpu(單核cpu)
一個車間就是一個程式,一個車間至少一條流水線(一個程式至少一個執行緒)
建立一個程式,就是建立一個車間(申請空間,在該空間內建至少一條流水線)
而建執行緒,就只是在一個車間內造一條流水線,無需申請空間,所以建立開銷小
2、程式之間是競爭關係,執行緒之間是協作關係?
車間直接是競爭/搶電源的關係,競爭(不同的程式直接是競爭關係,是不同的程式設計師寫的程式執行的,迅雷搶佔其他程式的網速,360把其他程式當做病毒殺死)
一個車間的不同流水線式協同工作的關係(同一個程式的執行緒之間是合作關係,是同一個程式寫的程式內開啟動,迅雷內的執行緒是合作關係)
三、執行緒與程式的區別
後續補充
四、為何要用多執行緒
多執行緒指的是,在一個程式中開啟多個執行緒,簡單的講:如果多個任務共用一塊地址空間,那麼必須在一個程式內開啟多個執行緒。詳細的講分為4點:
1.多執行緒共享一個程式的地址空間
2.執行緒比程式更輕量級,執行緒比程式更容易建立可撤銷,在許多作業系統中,建立一個執行緒比建立一個程式要快10-100倍,在有大量執行緒需要動態和快速修改時,這一特性很有用
3.若多個執行緒都是cpu密集型的,那麼並不能獲得效能上的增強,但是如果存在大量的計算和大量的I/O處理,擁有多個執行緒允許這些活動彼此重疊執行,從而會加快程式執行的速度。
4.在多cpu系統中,為了最大限度的利用多核,可以開啟多個執行緒,比開程式開銷要小的多。(這一條並不適用於python)
五、多執行緒的應用舉例
開啟一個字處理軟體程式,該程式辦不止一件事情,比如監聽鍵盤輸入,處理文字,定時自動將文字儲存到硬碟。
這三個任務操作的都是同一塊資料,因而不能用多程式。
只能在一個程式裡併發地開啟三個執行緒,如果是單執行緒,那就只能是,鍵盤輸入時,不能處理文字和自動儲存,自動儲存時又不能輸入和處理文字。
六、經典的執行緒模型(瞭解)
七、POSIX執行緒(瞭解)
八、在使用者空間實現的執行緒(瞭解)
執行緒的實現可以分為兩類:使用者級執行緒(User-Level Thread)和核心級執行緒(Kernel-Level Thread),後者又稱為核心支援的執行緒或輕量級程式。
在多執行緒作業系統中,各個系統的實現方式並不相同,在有的系統中實現了使用者級執行緒,有的系統中實現了核心級執行緒。
使用者級執行緒核心的切換由使用者態程式自己控制核心切換,不需要核心干涉,少了進出核心態的消耗,但不能很好的利用多核Cpu,目前Linux pthread大體是這麼做的。
九、在核心空間實現的執行緒(瞭解)
核心級執行緒:切換由核心控制,當執行緒進行切換的時候,由使用者態轉化為核心態。切換完畢要從核心態返回使用者態;
這樣可以很好的利用smp,即利用多核cpu。windows執行緒就是這樣的。
十、使用者級與核心級執行緒的對比(瞭解)
1、以下是使用者級執行緒和核心級執行緒的區別:
核心級執行緒是OS核心可感知的,而使用者級執行緒是OS核心不可感知的。
使用者級執行緒的建立、撤消和排程不需要OS核心的支援,是在語言這一級處理的;而核心支援執行緒的建立、撤消和排程都需OS核心提供支援,而且與程式的建立、撤消和排程大體是相同的。
使用者級執行緒執行系統呼叫指令時將導致其所屬程式被中斷,而核心支援執行緒執行系統呼叫指令時,只導致該執行緒被中斷。
在只有使用者級執行緒的系統內,CPU排程還是以程式為單位,處於執行狀態的程式中的多個執行緒,由使用者程式控制執行緒的輪換執行;在有核心支援執行緒的系統內,CPU排程則以執行緒為單位,由OS的執行緒排程程式負責執行緒的排程。
使用者級執行緒的程式實體是執行在使用者態下的程式,而核心支援執行緒的程式實體則是可以執行在任何狀態下的程式。
2、核心執行緒的優缺點
優點:當有多個處理機時,一個程式的多個執行緒可以同時執行。
缺點:由核心進行排程。
3、使用者程式的優缺點
優點:執行緒的排程不需要核心直接參與,控制簡單。
可以在不支援執行緒的作業系統中實現。
建立和銷燬執行緒、執行緒切換代價等執行緒管理的代價比核心執行緒少得多。
允許每個程式定製自己的排程演算法,執行緒管理比較靈活。
執行緒能夠利用的表空間和堆疊空間比核心級執行緒多。
同一程式中只能同時有一個執行緒在執行,如果有一個執行緒使用了系統呼叫而阻塞,那麼整個程式都會被掛起。另外,頁面失效也會產生同樣的問題。
缺點:資源排程按照程式進行,多個處理機下,同一個程式中的執行緒只能在同一個處理機下分時複用
十一、混合實現(瞭解)
使用者級與核心級的多路複用,核心同一排程核心執行緒,每個核心執行緒對應n個使用者執行緒
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/964/viewspace-2809830/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 42、併發程式設計之多執行緒理論篇程式設計執行緒
- 併發程式設計之多執行緒執行緒安全程式設計執行緒
- 併發程式設計之多執行緒基礎程式設計執行緒
- 43、併發程式設計之多執行緒實操篇程式設計執行緒
- 併發程式設計之:執行緒程式設計執行緒
- Java基礎之多執行緒程式設計Java執行緒程式設計
- JavaSE高階程式設計之多執行緒Java程式設計執行緒
- Python併發程式設計系列之多程式(multiprocessing)Python程式設計
- python之多執行緒Python執行緒
- 多執行緒程式設計相關理論執行緒程式設計
- 從執行緒到併發程式設計執行緒程式設計
- 併發程式設計與執行緒安全程式設計執行緒
- Java併發程式設計:Java執行緒Java程式設計執行緒
- java併發程式設計——執行緒池Java程式設計執行緒
- java併發程式設計——執行緒同步Java程式設計執行緒
- Liunx C 程式設計之多執行緒與Socket程式設計執行緒
- Java面試之多執行緒&併發篇Java面試執行緒
- Java併發程式設計之執行緒安全、執行緒通訊Java程式設計執行緒
- java併發程式設計 | 執行緒詳解Java程式設計執行緒
- Java併發程式設計-執行緒基礎Java程式設計執行緒
- 多執行緒併發程式設計“鎖”事執行緒程式設計
- Java併發程式設計:執行緒池ThreadPoolExecutorJava程式設計執行緒thread
- 併發程式設計——如何終止執行緒程式設計執行緒
- 併發程式設計之:執行緒池(一)程式設計執行緒
- Java面試之多執行緒&併發篇(2)Java面試執行緒
- Java面試之多執行緒&併發篇(5)Java面試執行緒
- Java面試之多執行緒&併發篇(3)Java面試執行緒
- Java面試之多執行緒&併發篇(4)Java面試執行緒
- Java面試之多執行緒&併發篇(6)Java面試執行緒
- Java面試之多執行緒&併發篇(8)Java面試執行緒
- Java面試之多執行緒&併發篇(9)Java面試執行緒
- Java面試之多執行緒&併發篇(7)Java面試執行緒
- 併發程式設計 —— 談談執行緒中斷程式設計執行緒
- Java 併發程式設計 | 執行緒池詳解Java程式設計執行緒
- java併發程式設計:執行緒池的使用Java程式設計執行緒
- 併發程式設計之:深入解析執行緒池程式設計執行緒
- python之多執行緒(學習)Python執行緒
- Java併發程式設計之執行緒篇之執行緒中斷(三)Java程式設計執行緒