No.1
執(zhí)行流
這里先說一說執(zhí)行流,有助于線程的理解。
程序計數(shù)器中的下一條指令地址組成的軌跡稱為程序的執(zhí)行流。執(zhí)行流是邏輯上獨(dú)立的指令區(qū)域,是人為給處理器安排的處理單元。指令指導(dǎo)處理器的執(zhí)行方向,從處理器的角度看,執(zhí)行的指令形成一條路徑,稱為執(zhí)行流。執(zhí)行流可大可小,可以是整個程序文件,也可以是一個函數(shù)。
一個代碼段想要突然去執(zhí)行另外一個代碼段的指令,比如call指令或者因中斷去執(zhí)行中斷處理程序,只要先將調(diào)用前或中斷前的上下文環(huán)境保存好就可以在iret或中斷返回后繼續(xù)執(zhí)行原代碼段的指令。所以說當(dāng)我們?yōu)槿魏我欢沃噶钐峁┧枰纳舷挛沫h(huán)境,那么這段指令就可以在獨(dú)立的上CPU運(yùn)行,也就是說這段指令成為了一個單獨(dú)的執(zhí)行流。這里說的上下文環(huán)境指的是指令所使用的寄存器映像、棧、內(nèi)存等資源。可以獨(dú)立在CPU上運(yùn)行的代碼段,哪怕被中斷也可以返回繼續(xù)執(zhí)行,因?yàn)樗枰馁Y源得到了維護(hù)。
在任務(wù)調(diào)度器的眼里,執(zhí)行流是調(diào)度單元,即處理器上運(yùn)行的每個任務(wù)都是調(diào)度器分配的執(zhí)行流。換句話說,實(shí)現(xiàn)任務(wù)調(diào)度,就是換不同的執(zhí)行流在CPU上運(yùn)行。我們要說的線程就是一個執(zhí)行流。進(jìn)程和線程有很多相似的地方,當(dāng)一個進(jìn)程中只有一個線程時,我們稱之為單線程進(jìn)程,它比線程就只多了處理的資源。我們可以認(rèn)為線程和進(jìn)程都是由執(zhí)行流實(shí)現(xiàn)的。
No.2
線程
回想創(chuàng)建線程的過程,我們先聲明并定義一個函數(shù)作為線程的處理函數(shù),該函數(shù)的返回值為void*參數(shù)也是void*,然后調(diào)用pthread_create()函數(shù)創(chuàng)建線程。可以理解為線程就是去執(zhí)行一個函數(shù),但線程和普通的函數(shù)的區(qū)別在于線程擁有獨(dú)立的上下文環(huán)境成為了獨(dú)立的執(zhí)行流,也就成為了獨(dú)立的調(diào)度單元,可以獨(dú)立在CPU上運(yùn)行。在一般的函數(shù)調(diào)用中,函數(shù)隨著程序的執(zhí)行流被順便執(zhí)行。給每個執(zhí)行流分配的時間是有限的,一個普通函數(shù)要等到該它運(yùn)行的時候才可以在CPU上運(yùn)行,前面有再多的函數(shù)它都要等著,還沒有到它運(yùn)行的時候可能該執(zhí)行流就被換下CPU了。而線程則因?yàn)槌闪藛为?dú)的執(zhí)行流,可以獨(dú)自享用分配的CPU時間,這才是線程真正優(yōu)勢的地方。
只有理解了線程的優(yōu)勢,在使用線程的時候才能恰到好處,現(xiàn)在再回想自己寫的多線程程序是否真的需要使用多線程。將要處理的單獨(dú)一類事件放在一個執(zhí)行流等待就好了,沒有必要寫成多線程,在調(diào)度器調(diào)度的時候反而會花費(fèi)額外的時間。
線程是一套機(jī)制,給一段代碼塊構(gòu)建它依賴的上下文環(huán)境,從而讓代碼塊稱為單獨(dú)的執(zhí)行流,也就成為了調(diào)度器的調(diào)度單元可以直接在CPU運(yùn)行。
線程中調(diào)用的函數(shù)讓所運(yùn)行的函數(shù)以調(diào)度單元的身份獨(dú)立運(yùn)行在CPU上,當(dāng)函數(shù)運(yùn)行時,可以讓程序中多個函數(shù)(執(zhí)行流)以偽并行的方式運(yùn)行,為程序提速。
No.3
線程與進(jìn)程
進(jìn)程是運(yùn)行中的程序。對于處理器來說,進(jìn)程是執(zhí)行流的集合,至少包含一個執(zhí)行流,執(zhí)行流之間相互獨(dú)立,但它們共享進(jìn)程的所有資源。
在Linux早期版本(Linux 0.11),其中并沒有操作系統(tǒng)書籍說到的有關(guān)線程的代碼,比如thread_info結(jié)構(gòu)體和創(chuàng)建線程的函數(shù)。那時CPU調(diào)度的單元是進(jìn)程,進(jìn)程就是各個執(zhí)行流(調(diào)度單元),這里想說明的是進(jìn)程和線程都是概念上的。在線程出現(xiàn)之前依然能夠?qū)崿F(xiàn)并發(fā)處理,線程在進(jìn)程的基礎(chǔ)上實(shí)現(xiàn)了二次并發(fā),目的是提高效率。進(jìn)程與線程的區(qū)別,一個是上面所說的進(jìn)程中可以有多個線程。第二個就是線程沒有自己的資源,沒有自己的地址空間,必須要依附于進(jìn)程的地址空間中才可以運(yùn)行。
No.4
進(jìn)程線程的狀態(tài)
上面說了進(jìn)程和線程是概念上的,真正實(shí)現(xiàn)時都是人為創(chuàng)造的代碼塊,因此執(zhí)行流的狀態(tài)也是人為劃分的。比如因?yàn)橛械木€程在讀寫磁盤時需要等待,那么就需要該線程為阻塞狀態(tài),當(dāng)線程可以上CPU運(yùn)行時該線程就叫就緒態(tài),在CPU運(yùn)行時就稱為運(yùn)行態(tài)。在有其他需求的時候可能還會由別的狀態(tài)出現(xiàn),只要合理就可以,說明狀態(tài)都是因?yàn)槟撤N需求而出現(xiàn)的,然后當(dāng)狀態(tài)滿足后就說明線程符合了某些條件,比如線程由阻塞態(tài)變?yōu)榫途w態(tài)說明現(xiàn)在線程可能正在等待的資源已經(jīng)等到了可以上CPU運(yùn)行了。
No.5
程序控制塊PCB
PCB(Process Control Block)是進(jìn)程的身份證,記錄了與進(jìn)程相關(guān)的所有信息,比如進(jìn)程狀態(tài)、PID、優(yōu)先級等。每個進(jìn)程都有自己的一個PCB。所有PCB放到一張表格中維護(hù),就是進(jìn)程表,調(diào)度器根據(jù)這張表選擇上處理器運(yùn)行的進(jìn)程。PCB的內(nèi)容取決于操作系統(tǒng)功能的復(fù)雜程度。PCB可以確定處理器要執(zhí)行的任務(wù),記錄程序運(yùn)行時所需要的數(shù)據(jù)資源、給任務(wù)分配的時間大小、上下文信息的存儲地址、進(jìn)程狀態(tài)、進(jìn)程地址空間等信息。
-
線程
+關(guān)注
關(guān)注
0文章
507瀏覽量
19787 -
進(jìn)程
+關(guān)注
關(guān)注
0文章
204瀏覽量
14016
發(fā)布評論請先 登錄
相關(guān)推薦
深入解析Linux程序與進(jìn)程

一文掌握基礎(chǔ)電路,嵌入式開發(fā)深入淺出

淺聊深入淺出RISC-V調(diào)試
socket 多線程編程實(shí)現(xiàn)方法
一文搞懂Linux進(jìn)程的睡眠和喚醒
Python中多線程和多進(jìn)程的區(qū)別

CPU線程和程序線程的區(qū)別
深入淺出系列之代碼可讀性
深入淺出談TDR阻抗測試

深入淺出帶你搞懂-MOSFET柵極電阻

怎么理解負(fù)頻率呢?射頻人眼中的負(fù)頻率

嵌入式系統(tǒng)中的線程、進(jìn)程與任務(wù)概念與區(qū)別

評論