一、程序排程:
程序被建立到了鍊錶中,如何再進行進一步的呼叫和排程?
程序排程: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...