行程類型
  1. SCHED_FIFO
    一個先進先出的的即時行程,當排程器把 CPU 指派給該行程時,會把他當前位址的行程描述器收到 runqueue 串列,如果沒有其他優先權更高的即時行程是可執行的,則此行程會使用 CPU 直到他釋放為止,即使有其他行程擁有相同的優先權。

  2. SCHED_RR
    一個循環 (round robin) 即時行程,當排程器把 CPU 指派給該行程時,會把行程描述器放在 runqueue 的尾端,使得擁有相同優先權的 SCHED_RR 即時行程都能公平分配到 CPU 時間。

  3. SCHED_OTHER
    一個普通行程 (conventional process)。

行程的執行
  1. 每個普通行程都具有靜態優先權 (static priority),排程器會應用此值,跟系統其他普通行程的值做比較,核心是以 100 (最高優先權)到 139 (最低)數字來表示普通行程的靜態優先權,數字遞增,優先權遞減。
  2. 每個即時行程都配有一個即時優先權 (real-time priority) ,其值介於1(最高優先權)到99(最低優先權)之間。
  3. 基本上,靜態優先權可決定行程的基本時間配額(base time quantum) ,也就是當行程把先前的時間配額用完時,指派給該行程的時間配額期間。靜態優先愈高,基本時間配額就愈長,靜態優先權較高的行程也和優先權較低的要行程相比,通常會獲得較長的 CPU 時段。
  4. 為了避免行程餓死,當一行程用完其時間配額時,就會被時間配額尚未用盡的較低優先權行程給替換掉。
  5. 用戶可透過 nice() 和 setpriority() 系統呼叫,來改變其所擁有的行程的靜態優先權。
  6. 用戶可用 sched_setparam() 和 sched_setscheduler() 系統呼叫來修改行程的即時優先權。
  7. nice() 和 setpriority() 系統呼叫應用到循環及時行程上,不會改變即時優先權,而是改變基本時間配額期間。事實上,循環及時行程的基本時間配額取決於行程的靜態優先權。
只有當下列事件之一發生時,即時行程才會被另一個行程替換
  1. 行程遭到另一個擁有更高級時優先權的行程的先佔。
  2. 行程執行了一個會遭到阻擋的運算,因此進入休眠 (TASK_INTERRUPYIBLE 或 TASK_UNINTERRUPTIBLE 狀態)。
  3. 行程被終止(處在 TASK_STOPPED 或 TASK_TRACED 狀態) ,或者被消滅(處在 EXIT_ZOMBIE 或 EXIT_DEAD 狀態)。
  4. 行程調用 sched_yield() 系統呼叫,自願把CPU交出去。
  5. 行程屬於循環及時行程(SCHED_RR) ,而且已用盡其時間配額。
行程狀態
  1. 活躍行程(active process)
    此類可執行行程尚未用盡其時間配額,因此可以執行。

  2. 屆滿行程(expired process)
    此類可執行行程已用盡其時間配額,因此直到所有活躍行程都屆滿之前,禁止執行。

  3. 一個活躍的批次行程若用盡其時間配額,就一定會變成屆滿行程,一個活躍的互動式行程若用盡其時間配額,通常會持續保持活躍的狀態,排程器會再補充時間配額給該行程,將之移入活躍行程那組,然而,如果存在最久的屆滿行程已經等了很長一段時間,或者如果有個屆滿行程的靜態優先權比該互動式行程的值還高,則排程器會把那個用盡時間配額的互動式行程一入屆滿行程那組,因此,活躍行程那組將成空,而屆滿行程將有機會執行。

part 2: http://jyhshin.pixnet.net/blog/post/27783005

創作者介紹

邱小新の工作筆記

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()