python并发编程之多线程理论部分
閱讀目錄
- 一 什么是線程
- 二 線程的創建開銷小
- 三 線程與進程的區別
- 四 為何要用多線程
- 五 多線程的應用舉例
- 六 經典的線程模型(了解)
- 七 POSIX線程(了解)
- 八 在用戶空間實現的線程(了解)
- 九 在內核空間實現的線程(了解)
- 十 用戶級與內核級線程的對比(了解)
- 十一 混合實現(了解)
一 什么是線程
在傳統操作系統中,每個進程有一個地址空間,而且默認就有一個控制線程
線程顧名思義,就是一條流水線工作的過程,一條流水線必須屬于一個車間,一個車間的工作過程是一個進程
? ? ? 車間負責把資源整合到一起,是一個資源單位,而一個車間內至少有一個流水線
? ? ? 流水線的工作需要電源,電源就相當于cpu
所以,進程只是用來把資源集中到一起(進程只是一個資源單位,或者說資源集合),而線程才是cpu上的執行單位。
?
多線程(即多個控制線程)的概念是,在一個進程中存在多個控制線程,多個控制線程共享該進程的地址空間,相當于一個車間內有多條流水線,都共用一個車間的資源。
? ? ? 例如,北京地鐵與上海地鐵是不同的進程,而北京地鐵里的13號線是一個線程,北京地鐵所有的線路共享北京地鐵所有的資源,比如所有的乘客可以被所有線路拉。
二 線程的創建開銷小
創建進程的開銷要遠大于線程?
如果我們的軟件是一個工廠,該工廠有多條流水線,流水線工作需要電源,電源只有一個即cpu(單核cpu)
一個車間就是一個進程,一個車間至少一條流水線(一個進程至少一個線程)
創建一個進程,就是創建一個車間(申請空間,在該空間內建至少一條流水線)
而建線程,就只是在一個車間內造一條流水線,無需申請空間,所以創建開銷小
?
進程之間是競爭關系,線程之間是協作關系?
車間直接是競爭/搶電源的關系,競爭(不同的進程直接是競爭關系,是不同的程序員寫的程序運行的,迅雷搶占其他進程的網速,360把其他進程當做病毒干死)
一個車間的不同流水線式協同工作的關系(同一個進程的線程之間是合作關系,是同一個程序寫的程序內開啟動,迅雷內的線程是合作關系,不會自己干自己)
三 線程與進程的區別
四 為何要用多線程
多線程指的是,在一個進程中開啟多個線程,簡單的講:如果多個任務共用一塊地址空間,那么必須在一個進程內開啟多個線程。詳細的講分為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線程就是這樣的。
十 用戶級與內核級線程的對比(了解)
? ??一:?以下是用戶級線程和內核級線程的區別:
? ? 二: 內核線程的優缺點
優點:
缺點:
? ? 三: 用戶進程的優缺點
優點:
缺點:
十一 混合實現(了解)
用戶級與內核級的多路復用,內核同一調度內核線程,每個內核線程對應n個用戶線程
轉載于:https://www.cnblogs.com/zhanglin123/p/9269221.html
總結
以上是生活随笔為你收集整理的python并发编程之多线程理论部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【LNOI2014】【BZOJ3626】
- 下一篇: 读书笔记-沙漠里的细水微光