Linux 程序排程

2022-09-07 20:48:14 字數 2709 閱讀 1332

執行緒狀態(context)

程式計數器(program counter),它表示當前執行緒執行指令的位置。

儲存變數的暫存器。

程式的stack。通常來說每個執行緒都有屬於自己的stack,stack記錄了函式呼叫的記錄,並反映了當前執行緒的執行點。

xv6的執行緒切換

執行緒切換函式

xv6在這部分設計的非常巧妙,

其使用swtch(&p->context, &mycpu()->context)彙編函式,實現了兩個函式sched scheduler的跳轉,

達成了程序context以及排程器context的切換

swtch函式(彙編函式)

swtch函式(避開switch關鍵字)會儲存使用者程序p1對應核心執行緒的暫存器至context物件。所以有兩類暫存器:使用者暫存器存在trapframe中,核心執行緒的暫存器存在context中。

實際上,swtch函式並不是直接從乙個核心執行緒切換到另乙個核心執行緒。xv6中,乙個cpu上執行的核心執行緒可以直接切換到的是這個cpu對應的排程器執行緒。所以如果我們執行在cpu0,swtch函式會恢復之前為cpu0的排程器執行緒儲存的暫存器和stack pointer,之後就在排程器執行緒的context下執行schedulder函式中。

schedulder函式

schedulder函式由排程器執行緒執行。在schedulder函式中會做一些清理工作,例如將程序p1設定成runable狀態。之後再通過程序表單找到下乙個runable程序。假設找到的下乙個程序是p2(雖然也有可能找到的還是p1),schedulder函式會再次呼叫swtch函式,完成下面步驟:

先儲存自己的暫存器到排程器執行緒的context物件

找到程序p2之前儲存的context,恢復其中的暫存器

因為程序p2在進入runable狀態之前,如剛剛介紹的程序p1一樣,必然也呼叫了swtch函式。所以之前的swtch函式會被恢復,並返回到程序p2所在的系統呼叫或者中斷處理程式中(注,因為p2程序之前呼叫swtch函式必然在系統呼叫或者中斷處理程式中)。

不論是系統呼叫也好中斷處理程式也好,在從使用者空間進入到核心空間時會儲存使用者暫存器到trapframe物件。所以當核心程式執行完成之後,trapframe中的使用者暫存器會被恢復。

最後使用者程序p2就恢復執行了。

sched函式

sched函式由使用者執行緒呼叫,切換到排程器執行緒。其與schedulder函式互為協程的關係,也將呼叫swtch函式。根據執行緒切換機制,sched呼叫swtch函式後,cpu的下一條指令處於schedulder函式的swtch函式後,原因是swtch函式儲存了ra(返回位址)暫存器,因此sched呼叫swtch函式後,當前ra變成了排程器執行緒的ra,即上一次排程器執行緒呼叫schedulder函式時儲存的ra值,故接下來執行schedulder函式swtch呼叫後的**。同理,schedulder函式呼叫swtch函式後,cpu將轉移到sched函式。

void

sched(void)

// per-cpu process scheduler.

// each cpu calls scheduler() after setting itself up.

// scheduler never returns. it loops, doing:

// - choose a process to run.

// - swtch to start running that process.

// - eventually that process transfers control

// via swtch back to the scheduler.

//void

scheduler(void)

release(&p->lock);

}}}

# context switch

## void swtch(struct context *old, struct context *new);

# # s**e current registers in old. load from new.

.globl swtch

swtch:

sd ra, 0(a0)

sd sp, 8(a0)

sd s0, 16(a0)

sd s1, 24(a0)

sd s2, 32(a0)

sd s3, 40(a0)

sd s4, 48(a0)

sd s5, 56(a0)

sd s6, 64(a0)

sd s7, 72(a0)

sd s8, 80(a0)

sd s9, 88(a0)

sd s10, 96(a0)

sd s11, 104(a0)

ld ra, 0(a1)

ld sp, 8(a1)

ld s0, 16(a1)

ld s1, 24(a1)

ld s2, 32(a1)

ld s3, 40(a1)

ld s4, 48(a1)

ld s5, 56(a1)

ld s6, 64(a1)

ld s7, 72(a1)

ld s8, 80(a1)

ld s9, 88(a1)

ld s10, 96(a1)

ld s11, 104(a1)

ret

linux程序排程

排程 從就緒的程序選出最適合的乙個來執行。知識點 1 排程策略 2 排程時機 3 排程步驟 排程策略 sched normal sched other 普通的分時程序 sched fifo 先入先出的實時程序 sched rr 時間片輪轉的實時程序 sched batch 批處理程序 sched i...

linux程序排程

搶占就是程序排程,使用者程序搶占發生在以下情況 1 從系統呼叫返回使用者空間的時候 2 從中斷處理程式返回使用者空間時。在時鐘中斷中會呼叫scheduler tick 函式,該函式在程序時間片用完的時候會設定need resched標誌,當從時鐘中斷或者其他中斷返回後檢查need resched,核...

linux 程序排程

linux程序優先順序 1.nice值 20 19 預設0 nice值越大,程序優先順序越低 2.實時優先順序 0 99 實時優先順序越高,程序優先順序越高 任何實時程序的優先順序都高於普通的程序,也就是說實時優先順序和nice優先順序處於互補相交的兩個範疇 linux預設的程序排程模型是時間迴圈共...