linux核心 5 核心程序排程與程序切換

2021-09-25 16:46:39 字數 1952 閱讀 6505

一、程序排程:

程序被建立到了鍊錶中,如何再進行進一步的呼叫和排程?

程序排程:void schedule(void) 程序排程函式、switch_to(next); 程序切換函式;

(一)、void schedule(void) 程序排程函式

1、看一下**呼叫了schedule函式,在system_call中尋找也證明了,程序排程也是一種系統呼叫的方式;

2、143-152行分析:alarm是我們自己設定的,比如我希望這個程序在jiffies=1000時候執行,就將alarm設定為1000就可以了。如何該程序為可中斷睡眠狀態,則如果該程序有非遮蔽訊號出現就講程序的狀態設定為就緒狀態。

3、程序狀態:

執行狀態 可以被執行 就緒狀態 程序切換只有在執行狀態才行

可中斷睡眠狀態 可以被訊號中斷 使其變成running

不可中斷睡眠狀態 只能被wakeup所喚醒變為running

暫停狀態 收到sigstop sigtstp sigttin

僵死狀態 程序停止執行了,但是父程序還沒有將其清空 waitpid

4、時間片的比較與優先順序時間片輪轉演算法重分配

1)、counter的最大值若不為0表示當前程序鍊錶中還有一些程序的時間片沒有用完 ,如果為0的話,所有的程序的時間片都已經用完了

(二)、switch_to(next) 程序切換函式,把程序切換為當前執行程序

1、將需要切換的程序賦值給當前程序指標

2、進行程序的上下文切換

3、上下文: 程式執行是 cpu的特殊暫存器 通用暫存器 (tss)等資訊+當前堆疊中的資訊

(三)、void sleep_on (struct task_struct **p)

當某個程序想要訪問cpu的資源的時候,碰巧cpu資源被占用,那麼就會呼叫sleepon 函式,把程序休眠。排程函式結束後喚醒。

1、205行:如果當前程序為0號程序時,就進行列印,返回;

2、核心中的這兩個函式主要用於訪問資源時的同步操作。高速緩衝區的訪問就是其中的乙個例子:如果兩個程序都要訪問同乙個緩衝塊,那麼其中的乙個程序就必然睡眠等待,直到該緩衝塊被釋放才可訪問;

3、tmp變數是程序私有的,tmp變數在棧中分配,所以指標每次都指向最新加入的等待程序中;

4、喚醒流程:當等待佇列中的某乙個程序被喚醒後,tmp指標就指向棧中的前乙個元素,等待上乙個被喚醒程序結束之後,返回到tmp處喚醒,如此迴圈,直到tmp=null;

5、這個過程就像多公尺諾骨牌一樣,乙個程序恢復所有程序都恢復,而這個引線就是區域性指標tmp。至於恢復後的程序是否能夠再次請求到request資源就不再管了,如果還是請求不到,那繼續sleep_on就行了。

Linux核心 程序排程

搶占式多工 由排程程式來決定什麼時間停止乙個程序的執行 程序的時間片 分配給每個可執行程序的處理器時間段 o 1 排程程式 反轉樓梯最後期限排程演算法 完全公平排程演算法 i o消耗型和處理器消耗型程序 i o消耗型程序 大部分時間用來提交i o請求或等待i o請求 處理器消耗型程序 把時間大部分用...

linux核心之程序排程(一)

等待佇列 sleep相關函式將程序的狀態設定為非執行態,在下一次排程來時,將在schedule函式中將本程序從執行佇列中移除。sleep函式將程序加入等待佇列,然後呼叫schedule函式選擇並重新開始另乙個程式的執行。當呼叫wake up類函式將程序喚醒時,wake up類函式將程序加入執行佇列中...

linux核心程序排程系列之排程概述

多工作業系統分為非搶占式多工和搶占式多工。linux採用的是搶占式多工的模式,這就意味著程序對cpu的占用時間是由作業系統決定的,跟具體的說,由作業系統的程序排程程式所決定的,這個章節就介紹關於程序的排程策略。一 排程策略 1 其實程序的排程策略和程序的型別有關 第一種分配方法 cpu消耗型和i o...