什么是线程?与进程又有什么区别,为什么要使用它,等对线程进行详细介绍
一.什么是線程
- 在傳統(tǒng)操作系統(tǒng)中,每個進程有一個地址空間,而且默認就有一個控制線程
- 進程: 劃分空間,加載資源,靜態(tài)的,資源單位
- 線程: 執(zhí)行代碼,執(zhí)行能力,動態(tài)的,執(zhí)行單位
- 進程只是用來把資源集中到一起(進程只是一個資源單位,或者說資源集合),而線程才是cpu上的執(zhí)行單位
- 線程是依賴于進程,一個進程可以包含多個線程,但是一定有一個主線程.線程才是CPU執(zhí)行的最小單元
- 多進程: 同一時刻開啟多個進程并發(fā)/并行的執(zhí)行
- 多線程: 同一時刻開啟多個線程并發(fā)/并行的執(zhí)行
二.線程與進程的區(qū)別
- 線程共享創(chuàng)建它的進程的地址空間; 進程有自己的地址空間
- 線程可以直接訪問其進程的數(shù)據(jù)段(同進程內(nèi)數(shù)據(jù)共享); 進程有自己的父進程數(shù)據(jù)段副本(數(shù)據(jù)隔離)
- 線程可以直接與其進程的其他線程通信;進程必須使用進程間通信與兄弟進程通信
- 新線程很容易創(chuàng)建(創(chuàng)建的開銷很少,速度很快);新進程需要父進程的重復(fù)(需要開辟空間,復(fù)制資源,開銷比開啟線程多10-100倍)
- 線程可以對同一進程的線程進行相當(dāng)大的控制; 進程只能對子進程進行控制
- 對主線程的更改(取消、優(yōu)先級更改等)可能會影響進程的其他線程的行為; 對父進程的更改不會影響子進程.
三. 為什么要使用多線程
多線程指的是,在一個進程中開啟多個線程,簡單的講: 如果多個任務(wù)共用一塊地址空間,那么必須在一個進程內(nèi)開啟多個線程.詳細的講分為4點:
- 多線程共享一個進程的地址空間
- 線程比進程更輕量級,線程比進程更容易創(chuàng)建和撤銷,在許多操作系統(tǒng)中,創(chuàng)建一個線程比創(chuàng)建一個進程要快10-100倍,在有大量線程需要動態(tài)和快速修改時,這一特性很有用
- 若多個線程都是cpu密集型的,那么并不能獲得性能上的增強,但是如果存在大量的計算和大量的I/O處理,擁有多個線程允許這些活動彼此重疊運行,從而會加快程序執(zhí)行的速度.
- 在多cpu系統(tǒng)中,為了最大限度的利用多核,可以開啟多個線程,比開進程開銷要小的多.(這一條并不適用于python)
四.多線程的應(yīng)用
例如:
開啟一個文字處理軟件進程,該進程肯定需要辦不止一件事情,比如監(jiān)聽鍵盤輸入,處理文字,定時自動將文字保存到硬盤,這三個任務(wù)操作的都是同一塊數(shù)據(jù),因而不能用多進程.只能在一個進程里并發(fā)地開啟三個線程,如果是單線程,那就只能是: 鍵盤輸入時,不能處理文字和自動保存,自動保存時又不能輸入和處理文字.所以要使用多線程
五. 經(jīng)典的線程模型
- 多個線程共享同一個進程的地址空間中的資源,是對一臺計算機上多個進程的模擬,有時也稱線程為輕量級的進程
- 而對一臺計算機上多個進程,則共享物理內(nèi)存、磁盤、打印機等其他物理資源
- 多線程的運行也與多進程的運行類似,是cpu在多個線程之間的快速切換
- 不同的進程之間是充滿敵意的,彼此是搶占,競爭cpu的關(guān)系,如迅雷會和QQ搶資源.而同一個進程內(nèi)的線程是合作關(guān)系,一個線程可以訪問另外一個線程的內(nèi)存地址
- 類似于進程,每個線程也有自己的堆棧
- 不同于進程,線程庫無法利用時鐘中斷強制線程讓出CPU,可以調(diào)用thread_yield使運行線程自動放棄cpu,讓另外一個線程運行
- 線程通常是有益的,但是帶來了不小程序設(shè)計難度,線程的問題是:
1父進程有多個線程,那么開啟的子線程是否需要同樣多的線程
2在同一個進程中,如果一個線程關(guān)閉了文件,而另外一個線程正準備往該文件內(nèi)寫內(nèi)容呢
六. PO SIX線程
為了實現(xiàn)可移植的線程程序,IEEE在IEEE標(biāo)準1003.1c中定義了線程標(biāo)準,它定義的線程包叫Pthread.大部分UNIX系統(tǒng)都支持該標(biāo)準,簡單介紹如下
| Pthread_create | 創(chuàng)建一個新線程 |
| Pthread_exit | 結(jié)束調(diào)用的線程 |
| Pthread_join | 等待一個特定的線程退出 |
| Pthread_yield | 釋放CPU來運行另外一個線程 |
| Pthread_attr_init | 創(chuàng)建并初始化一個線程的屬性結(jié)構(gòu) |
| Pthread_attr_destroy | 刪除一個線程的屬性結(jié)構(gòu) |
七. 在用戶空間實現(xiàn)的線程
線程的實現(xiàn)可以分為兩類: 用戶級線程(User-Level Thread)和內(nèi)核級線程(Kernel-Level Thread),后者又稱為內(nèi)核支持的線程或輕量級進程.在多線程操作系統(tǒng)中,各個系統(tǒng)的實現(xiàn)方式并不相同,在有的系統(tǒng)中實現(xiàn)了用戶級線程,有的系統(tǒng)中實現(xiàn)了內(nèi)核級線程.用戶級線程內(nèi)核的切換由用戶態(tài)程序自己控制內(nèi)核切換,不需要內(nèi)核干涉,少了進出內(nèi)核態(tài)的消耗,但不能很好的利用多核Cpu,目前Linux Pthread大體是這么做的.
在用戶空間模擬操作系統(tǒng)對進程的調(diào)度,來調(diào)用一個進程中的線程,每個進程中都會有一個運行時系統(tǒng),用來調(diào)度線程.此時當(dāng)該進程獲取cpu時,進程內(nèi)再調(diào)度出一個線程去執(zhí)行,同一時刻只有一個線程執(zhí)行.
八. 在內(nèi)核空間實現(xiàn)的線程
內(nèi)核級線程: 切換由內(nèi)核控制,當(dāng)線程進行切換的時候,由用戶態(tài)轉(zhuǎn)化為內(nèi)核態(tài).切換完畢要從內(nèi)核態(tài)返回用戶態(tài); 可以很好的利用smp,即利用多核cpu.windows線程就是這樣的
九. 用戶級與內(nèi)核級線程的對比
區(qū)別:
- 內(nèi)核級線程是OS內(nèi)核可感知的,而用戶級線程是OS內(nèi)核不可感知的
- 用戶級線程的創(chuàng)建、撤消和調(diào)度不需要OS內(nèi)核的支持,是在語言(如Java)這一級處理的; 而內(nèi)核級線程的創(chuàng)建、撤消和調(diào)度都需OS內(nèi)核提供支持,而且與進程的創(chuàng)建、撤消和調(diào)度大體是相同的
- 用戶級線程執(zhí)行系統(tǒng)調(diào)用指令時將導(dǎo)致其所屬進程被中斷,而內(nèi)核級線程執(zhí)行系統(tǒng)調(diào)用指令時,只導(dǎo)致該線程被中斷
- 在只有用戶級線程的系統(tǒng)內(nèi),CPU調(diào)度還是以進程為單位,處于運行狀態(tài)的進程中的多個線程,由用戶程序控制線程的輪換運行; 在有內(nèi)核級線程的系統(tǒng)內(nèi),CPU調(diào)度則以線程為單位,由OS的線程調(diào)度程序負責(zé)線程的調(diào)度
- 用戶級線程的程序?qū)嶓w是運行在用戶態(tài)下的程序,而內(nèi)核級線程的程序?qū)嶓w則是可以運行在任何狀態(tài)下的程序
內(nèi)核線程的優(yōu)缺點:
- 優(yōu)點: 當(dāng)有多個處理機時,一個進程的多個線程可以同時執(zhí)行
- 缺點: 由內(nèi)核進行調(diào)度
用戶線程的優(yōu)缺點:
優(yōu)點:
- 線程的調(diào)度不需要內(nèi)核直接參與,控制簡單
- 可以在不支持線程的操作系統(tǒng)中實現(xiàn)
- 創(chuàng)建和銷毀線程、線程切換代價等線程管理的代價比內(nèi)核線程少得多
- 允許每個進程定制自己的調(diào)度算法,線程管理比較靈活
- 線程能夠利用的表空間和堆棧空間比內(nèi)核級線程多
缺點:
- 資源調(diào)度按照進程進行,多個處理機下,同一個進程中的線程只能在同一個處理機下分時復(fù)用
混合實現(xiàn)
- 用戶級與內(nèi)核級的多路復(fù)用,內(nèi)核統(tǒng)一調(diào)度內(nèi)核線程,每個內(nèi)核線程對應(yīng)n個用戶線程
結(jié)尾給大家推薦一個非常好的學(xué)習(xí)教程,希望對你學(xué)習(xí)Python有幫助!
Python基礎(chǔ)入門教程推薦:更多Python視頻教程-關(guān)注B站:Python學(xué)習(xí)者
https://www.bilibili.com/video/BV1LL4y1h7ny?share_source=copy_web
Python爬蟲案例教程推薦:更多Python視頻教程-關(guān)注B站:Python學(xué)習(xí)者
https://www.bilibili.com/video/BV1QZ4y1N7YA?share_source=copy_web
總結(jié)
以上是生活随笔為你收集整理的什么是线程?与进程又有什么区别,为什么要使用它,等对线程进行详细介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用四种方法Python求出两个有序数组中
- 下一篇: Django中提供了6种缓存方式,你会几