1. 程式人生 > >任務,任務的切換,(TCB)

任務,任務的切換,(TCB)

task

程序有

任務的五種狀態:休眠的狀態,就緒的狀態,執行的狀態,中斷的狀態,掛起的狀態。

程序阻塞,狀態切換,cpu時間分片給task。把process狀態由running側換為掛起,先把running的task在cpu中的資料複製出來儲存到任務佇列中,等待狀態切換為running的時候使用

 

1、使用者級執行緒

把整個執行緒實現部分放在使用者空間中,核心對執行緒一無所知,核心看到的就是一個單執行緒程序。只有一個使用者棧

核心級程序

 

任務也可以稱作為程序,是一個簡單的程式,該程式認為CPU完全屬於自己,實時的應用的程式的設計的時候分割成了許多的任務,每一個任務都對應應用的某一部分。每一個任務都被賦予一定的優先順序,有自己的暫存器個棧空間。每一個任務都是一個無限的迴圈,每一個任務都處在5中狀態下,這五種狀態下是休眠,就緒的執行,掛起的狀態和中斷的狀態。休眠的狀態就是相當於任務在記憶體中,但是沒有被呼叫,就緒的狀態意味著該任務已經準備好了,可以進行執行,該優先順序比正在執行的優先順序低,相當於還在排隊。,掛起的狀態,是等待的事件,這個任務一直在等待一個東西,能讓它執行起來的東西,中斷狀態就是被一箇中程式中斷了唄。

任務的五種狀態:休眠的狀態,就緒的狀態,執行的狀態,中斷的狀態,掛起的狀態。

這五種的任務的切換,執行的狀態,只有從就緒的狀態的任務來的,中斷態的任務只有執行的任務才可可能轉變成中斷的任務。,掛起的狀態的也只有執行的任務可以轉變成。

具體的任務的狀態的切換的:

當一個任務的就緒的時候,那麼它就會在就緒表裡面,有所體現,那麼就緒表這麼體現這個任務是就緒的,而且當有好幾個任務一起就緒的時候,這時候cpu應該是怎麼樣的選擇進行哪一個任務的。

在任務本身就有自己的優先順序,而在就緒表裡面,如果這個任務就緒那麼就會在就緒表對應其任務優先順序的位置將其置1(具體的是一種演算法,我的理解,就是一個查表的演算法,用空間的代價,換取了時間的),一個優先順序最多對應一個任務。對於cpu會選擇cpu就緒表裡面就緒的任務中優先順序最高的任務,每隔一段時間,cpu就會檢查就緒表裡面的就緒的任務是否有優先順序高於現在執行的任務的,如果有的話,那麼就會執行優先順序高的就緒的程式。儲存正在執行的任務。(可剝奪的核心)。

一個單核的cpu,真實的狀態的就是一個時間只能執行一個任務,那麼在執行任務的時候,

 

因為真的在執行任務的時候, 一個任務佔據了cpu的資源(暫存器),對於一個就緒的任務,其實就是萬事具備的時候,就欠cpu 的概念,那麼真的在任務的轉換的時候,怎麼做到,前一個任務的狀態被記錄先來,然後去執行現在要執行的任務的呢,著裡面有一個結構體

TCB,(中文的全稱:任務控制部件,英文的全拼;task control blocks),主要有任務的優先順序,任務的棧空間的地址,以及任務棧的空間的大小,以及用來記錄現在執行的任務的pc(程式計數器,當程式執行到的地方)的值。

,當要發生任務的切換的時候,cpu裡面的堆疊的值拷到任務控制塊裡面指標所指的空間,真是的操作的時候,是計算的cpu的堆疊的大小,然後在sp指標的最開始的時候,就記錄這個堆疊的大小,然後將cpu堆疊裡面(記錄的是cpu的暫存器值),值一起復制(cpu的堆疊進行的是出棧的操作)TCB裡面的sp指標的所指的空間裡面去,pc是自動的儲存到堆疊空間裡面的,當儲存當前的任務的TCB裡面的各種的資料,那麼將要執行任務,驚醒進行相反的順序的,將原來的任務的堆疊裡面的資料(入棧到cpu的堆疊)(只有cpu的堆疊具有出棧和進棧的操作)。其實就是在任務的切換的時候,就是不同的任務交換著cpu的使用權,但是由於cpu的資源的有限,而進行上次的任務的資料的保護。然後再講下任務的資料的匯入。

如果能夠理解TCB,那麼PCB,ECB,就是一個叫做程序控制塊,事件控制塊,原理應該都差不多。

當沒有一個任務執行的時候,那麼由一個優先順序最低的空閒任務霸佔著cpu,這樣的其實cpu的利用率,通過這個空閒任務的執行的時間來計算。
--------------------- 

出處:https://blog.csdn.net/hello_world6/article/details/52491813