一、記憶體管理
1、核心
使用alloc_pages申請物理頁幀
使用kmalloc申請專用/通用記憶體塊、vmalloc申請物理不連續,邏輯相連記憶體
使用kmap建立高階位址對映
外碎片:空閒記憶體零散分布,無法滿足大記憶體需求(夥伴系統解決)
內碎片:申請一塊記憶體真正使用的只有小部分(slab,通用記憶體塊解決)
2、使用者程序
1)申請記憶體
使用malloc動態分配,分配的記憶體並不是立即調入,而是擁有該記憶體的訪問權,等到真正訪問時,引發缺頁異常調入
malloc為glibc庫函式,實際使用brk/mmap系統呼叫
申請記憶體<128k時,呼叫brk,簡單移動堆指標
>128時呼叫mmap進行記憶體對映 邊界值可通過mallopt進行設定
free一段記憶體並不是馬上還給os,通過malloc依次分配a、b、c三塊記憶體,free a,堆指標無法收縮,保留a供下次呼叫malloc時使用;free b c(b+c 超過 128k)此時才收縮堆指標,將c這段記憶體還給os
2)訪問記憶體
cpu引用乙個虛擬位址,tlb命中,直接得到實體地址
未命中,通過cr3暫存器存放全域性目錄位址,一層層索引+偏移得到實體地址
將實體地址傳送給快取記憶體,快取命中直接得到對應資料,未命中則繼續訪問下級快取或直接訪問記憶體
3、核心與使用者空間的資料傳遞
通過暫存器
核心不會直接引用使用者記憶體,通過get_user/put_user、copy_from_user/copy_to_user等巨集進行拷貝
二、程序排程
1、核心棧與程序描述符
根據sp快速獲取到程序描述符
2、排程規則
總的來說實時程序就是大爺,優先順序高的一直執行,同優先順序的再根據fifo(先到先得)、roundrobin(輪轉)的規則
沒有就緒實時程序才輪到普通程序,普通程序目前採用cfs排程演算法
3、排程框架
1)主排程器 主動讓出cpu
2)週期排程器 時間中斷更新統計資訊,設定是否需要排程的標誌,中斷返回時根據標誌呼叫主排程器
4、虛擬執行時間
將程序優先順序轉換成權重,相鄰優先順序間的比重相差10%
延遲排程週期,預設20ms,在這個時間段內所有就緒程序至少執行一次
a程序執行1ms(-1優先順序),b程序執行1ms(1優先順序),a的vruntime為0.9,b的vruntime為1.1
cfs_rq還有乙個min_vruntime,是這個佇列執行的乙個基準。表示這個佇列之前執行的程序中,執行一次花得最長的時間
紅黑樹的key值是每個排程實體的vruntime減去min_vruntime
程序排程偽**:
def schedule():
'主排程器框架'
while true:
preempt_disable() # '排程開始前先關核心搶占,避免丟失程序資訊'
__schedule()
preempt_enable()
if(not need_resched()):
break
def __schedule():
next = pick_next()
if(next != curr):
switch_mm() # 切換虛擬記憶體、重新整理tlb、快取失效
switch_to() # 儲存當前核心棧、暫存器資訊,恢復即將執行程序的狀態
def pick_next():
if curr.sched_class == cfs and cfs_rq.nrunning == rq.nrunning:
# 呼叫cfs的pick_next
return cfs_pick_next()
else:
# 遍歷所有排程器
for sched_class in (rt_clss, cfs_class, idle_class):
p = sched_class.pick_next()
if p:
return p
def cfs_pick_next():
p = min(curr, first, second) # first紅黑樹最左,second左邊第二
p = min(p, last, next) # 最近一次喚醒成功、失敗的程序
同乙個程序中的執行緒間切換,少了switch_mm
不會造成頁目錄切換,快取失效,切換代價相對較小
switch_to之後已經切換到其他程序了,a 切換到 b 再由 c切換回a時,用兩個引數a不知道上乙個程序是誰,但需要可能a需要替c收屍,所以 switch_to有三個引數prev、next、last
Linux程序管理與排程
核心版本 架構作者 github csdn 2016 07 21 linux 4.6 x86 arm gatieme linuxdevicedrivers linux程序管理與排程 專案描述 kernelinkernel 乙個執行在linux上的小巧核心,修改了linux kernel的start ...
程序管理 程序排程
一 概念 1 處理機管理是作業系統的主要功能之一。處理機管理的實現策略決定了作業系統的型別,其演算法好壞直接影響整個系統的效能 2 程序排程 通過某種規則或演算法從就緒 等待 程序佇列中選出乙個程序投入執行 3 排程是乙個基本的作業系統功能。cpu排程是作業系統設計的核心問題 二 cpu排程程式 1...
Android的記憶體,程序排程管理 (二)
在執行乙個程式時,按一下房子鍵就可以退到桌面,一般來說按一下退出鍵也可以退到桌面,這兩者有什麼區別呢?其實是有區別的,你應該根據自己的需要靈活選擇 按房子鍵,看起來似乎是退出了,但是其實這個軟體並沒有被關閉,而是轉為了 後台程式 指一般的軟體,不討論特別種類的軟體 按退出鍵,看起來也是退出沒錯,但這...