一、tast_struct結構
它是一個數據結構,可以說,它代表了一個進程。它有很多字段,大體有一下幾種:
標識號:進程標識、用戶標識、組標識。
狀態: Linux的進程的四種基本狀態
調度信息:優先級、時間片等
進程鏈信息:父進程、子進程的指針
文件信息:打開文件、虛擬文件系統
上下文信息:進程的運行環境
二、I386體系的任務管理和調度
I386體系從硬件上支持任務間的切換。為此目的,增設了一種新段:任務狀態段(TSS),首先它和數據段、代碼段一樣也是一種段,其次它記錄了任務的狀態信息。
與其它段一樣,也有描述它的結構:TSS描述符表,它記錄了一個TSS的信息,同時還有一個TR寄存器,它指向當前任務的TSS.任務切換的時候,cpu會將原寄存器的內容寫出到相應的TSS,同時將新TSS的內容填到寄存器中,這樣就實現了任務的切換。
三、Linux進程切換
Linux任務切換是通過switch_to這個宏實現的,它利用長跳指令,當長跳指令的操作數是TSS描述符的時候,就會引起CPU的任務的切換,此時,cpu將所有寄存器的狀態保存到當前任務寄存器TR所指向的TSS段(當前任務的任務狀態段)中,然後利用長跳指令的操作數(TSS描述符)找到新任務的TSS段,並將其中的內容填寫到各個寄存器中,最後,將新任務的TSS選擇符更新到TR中。這樣系統就正式開始運行新切換的任務了。上面提到的task_struct中的tss成員就是記錄TSS段內容的