No.1
執行流
這里先說一說執行流,有助于線程的理解。
程序計數器中的下一條指令地址組成的軌跡稱為程序的執行流。執行流是邏輯上獨立的指令區域,是人為給處理器安排的處理單元。指令指導處理器的執行方向,從處理器的角度看,執行的指令形成一條路徑,稱為執行流。執行流可大可小,可以是整個程序文件,也可以是一個函數。
一個代碼段想要突然去執行另外一個代碼段的指令,比如call指令或者因中斷去執行中斷處理程序,只要先將調用前或中斷前的上下文環境保存好就可以在iret或中斷返回后繼續執行原代碼段的指令。所以說當我們為任何一段指令提供它所需要的上下文環境,那么這段指令就可以在獨立的上CPU運行,也就是說這段指令成為了一個單獨的執行流。這里說的上下文環境指的是指令所使用的寄存器映像、棧、內存等資源。可以獨立在CPU上運行的代碼段,哪怕被中斷也可以返回繼續執行,因為它所需要的資源得到了維護。
在任務調度器的眼里,執行流是調度單元,即處理器上運行的每個任務都是調度器分配的執行流。換句話說,實現任務調度,就是換不同的執行流在CPU上運行。我們要說的線程就是一個執行流。進程和線程有很多相似的地方,當一個進程中只有一個線程時,我們稱之為單線程進程,它比線程就只多了處理的資源。我們可以認為線程和進程都是由執行流實現的。
No.2
線程
回想創建線程的過程,我們先聲明并定義一個函數作為線程的處理函數,該函數的返回值為void*參數也是void*,然后調用pthread_create()函數創建線程??梢岳斫鉃榫€程就是去執行一個函數,但線程和普通的函數的區別在于線程擁有獨立的上下文環境成為了獨立的執行流,也就成為了獨立的調度單元,可以獨立在CPU上運行。在一般的函數調用中,函數隨著程序的執行流被順便執行。給每個執行流分配的時間是有限的,一個普通函數要等到該它運行的時候才可以在CPU上運行,前面有再多的函數它都要等著,還沒有到它運行的時候可能該執行流就被換下CPU了。而線程則因為成了單獨的執行流,可以獨自享用分配的CPU時間,這才是線程真正優勢的地方。
只有理解了線程的優勢,在使用線程的時候才能恰到好處,現在再回想自己寫的多線程程序是否真的需要使用多線程。將要處理的單獨一類事件放在一個執行流等待就好了,沒有必要寫成多線程,在調度器調度的時候反而會花費額外的時間。
線程是一套機制,給一段代碼塊構建它依賴的上下文環境,從而讓代碼塊稱為單獨的執行流,也就成為了調度器的調度單元可以直接在CPU運行。
線程中調用的函數讓所運行的函數以調度單元的身份獨立運行在CPU上,當函數運行時,可以讓程序中多個函數(執行流)以偽并行的方式運行,為程序提速。
No.3
線程與進程
進程是運行中的程序。對于處理器來說,進程是執行流的集合,至少包含一個執行流,執行流之間相互獨立,但它們共享進程的所有資源。
在Linux早期版本(Linux 0.11),其中并沒有操作系統書籍說到的有關線程的代碼,比如thread_info結構體和創建線程的函數。那時CPU調度的單元是進程,進程就是各個執行流(調度單元),這里想說明的是進程和線程都是概念上的。在線程出現之前依然能夠實現并發處理,線程在進程的基礎上實現了二次并發,目的是提高效率。進程與線程的區別,一個是上面所說的進程中可以有多個線程。第二個就是線程沒有自己的資源,沒有自己的地址空間,必須要依附于進程的地址空間中才可以運行。
No.4
進程線程的狀態
上面說了進程和線程是概念上的,真正實現時都是人為創造的代碼塊,因此執行流的狀態也是人為劃分的。比如因為有的線程在讀寫磁盤時需要等待,那么就需要該線程為阻塞狀態,當線程可以上CPU運行時該線程就叫就緒態,在CPU運行時就稱為運行態。在有其他需求的時候可能還會由別的狀態出現,只要合理就可以,說明狀態都是因為某種需求而出現的,然后當狀態滿足后就說明線程符合了某些條件,比如線程由阻塞態變為就緒態說明現在線程可能正在等待的資源已經等到了可以上CPU運行了。
No.5
程序控制塊PCB
PCB(Process Control Block)是進程的身份證,記錄了與進程相關的所有信息,比如進程狀態、PID、優先級等。每個進程都有自己的一個PCB。所有PCB放到一張表格中維護,就是進程表,調度器根據這張表選擇上處理器運行的進程。PCB的內容取決于操作系統功能的復雜程度。PCB可以確定處理器要執行的任務,記錄程序運行時所需要的數據資源、給任務分配的時間大小、上下文信息的存儲地址、進程狀態、進程地址空間等信息。
-
線程
+關注
關注
0文章
507瀏覽量
20071 -
進程
+關注
關注
0文章
206瀏覽量
14211
發布評論請先 登錄
深入淺出解析低功耗藍牙協議棧

進程、線程、協程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!
請問如何在Python中實現多線程與多進程的協作?
深入解析Linux程序與進程

一文掌握基礎電路,嵌入式開發深入淺出

淺聊深入淺出RISC-V調試
CPU線程和程序線程的區別
深入探討Linux的進程調度器

評論