linux每隔多久调度y,Linux 进程调度+Linux系统一般执行过程 笔记
進(jìn)程的調(diào)度時(shí)機(jī)與進(jìn)程的切換
操作系統(tǒng)原理中介紹了大量進(jìn)程調(diào)度算法,這些算法從實(shí)現(xiàn)的角度看僅僅是從運(yùn)行隊(duì)列中選擇一個(gè)新進(jìn)程,選擇的過程中運(yùn)用了不同的策略而已。
對(duì)于理解操作系統(tǒng)的工作機(jī)制,反而是進(jìn)程的調(diào)度時(shí)機(jī)與進(jìn)程的切換機(jī)制更為關(guān)鍵。
調(diào)度時(shí)機(jī) 背景
不同類型的進(jìn)程有不同的調(diào)度需求
第一種分類:
I/O-bound
頻繁的進(jìn)行I/O
通常會(huì)花費(fèi)很多時(shí)間等待I/O操作的完成
CPU-bound
計(jì)算密集型
需要大量的CPU時(shí)間進(jìn)行運(yùn)算
第二種分類
批處理進(jìn)程(batch process)
不必與用戶交互,通常在后臺(tái)運(yùn)行
不必很快響應(yīng)
典型的批處理程序:編譯程序、科學(xué)計(jì)算
實(shí)時(shí)進(jìn)程(real-time process)
有實(shí)時(shí)需求,不應(yīng)被低優(yōu)先級(jí)的進(jìn)程阻塞
響應(yīng)時(shí)間要短、要穩(wěn)定
典型的實(shí)時(shí)進(jìn)程:視頻/音頻、機(jī)械控制等
交互式進(jìn)程(interactive process)
需要經(jīng)常與用戶交互,因此要花很多時(shí)間等待用戶輸入操作
響應(yīng)時(shí)間要快,平均延遲要低于50~150ms
典型的交互式程序:shell、文本編輯程序、圖形應(yīng)用程序等
Linux中的進(jìn)程調(diào)度
Linux既支持普通的分時(shí)進(jìn)程,也支持實(shí)時(shí)進(jìn)程
Linux中的調(diào)度是多種調(diào)度策略和調(diào)度算法的混合。
什么是調(diào)度策略?
是一組規(guī)則,它們決定什么時(shí)候以怎樣的方式選擇一個(gè)新進(jìn)程運(yùn)行
Linux的調(diào)度基于分時(shí)和優(yōu)先級(jí)
隨著版本的變化,分時(shí)技術(shù)在不斷變化
Linux的進(jìn)程根據(jù)優(yōu)先級(jí)排隊(duì)
根據(jù)特定的算法計(jì)算出進(jìn)程的優(yōu)先級(jí),用一個(gè)值表示
這個(gè)值表示把進(jìn)程如何適當(dāng)?shù)姆峙浣oCPU
Linux中進(jìn)程的優(yōu)先級(jí)是動(dòng)態(tài)的
調(diào)度程序會(huì)根據(jù)進(jìn)程的行為周期性的調(diào)整進(jìn)程的優(yōu)先級(jí)
較長(zhǎng)時(shí)間未分配到CPU的進(jìn)程,通?!?/p>
已經(jīng)在CPU上運(yùn)行了較長(zhǎng)時(shí)間的進(jìn)程,通?!?/p>
相關(guān)的系統(tǒng)調(diào)用
nice
getpriority/setpriority
sched_getscheduler/sched_setscheduler
sched_getparam/sched_setparam
sched_yield
sched_get_priority_min/sched_get_priority_max
sched_rr_get_interval
scheudle 函數(shù)
schedule函數(shù)實(shí)現(xiàn)調(diào)度
目的:在運(yùn)行隊(duì)列中找到一個(gè)進(jìn)程,把CPU分配給它
調(diào)用方法:
直接調(diào)用,如sleep_on
松散調(diào)用,根據(jù)need_resched標(biāo)記
進(jìn)程調(diào)度的時(shí)機(jī)(重點(diǎn))
中斷處理過程(包括時(shí)鐘中斷、I/O中斷、系統(tǒng)調(diào)用和異常)中,直接調(diào)用schedule(),或者返回用戶態(tài)時(shí)根據(jù) need_resched 標(biāo)記調(diào)用schedule();
內(nèi)核線程可以直接調(diào)用schedule()進(jìn)行進(jìn)程切換,也可以在中斷處理過程中進(jìn)行調(diào)度,也就是說內(nèi)核線程作為一類的特殊的進(jìn)程可以主動(dòng)調(diào)度,也可以被動(dòng)調(diào)度;
用戶態(tài)進(jìn)程無法實(shí)現(xiàn)主動(dòng)調(diào)度,僅能通過陷入內(nèi)核態(tài)后的某個(gè)時(shí)機(jī)點(diǎn)進(jìn)行調(diào)度,即在中斷處理過程中進(jìn)行調(diào)度。
用戶態(tài)被動(dòng)調(diào)度
內(nèi)核線程只有內(nèi)核態(tài)沒有用戶態(tài)的特殊進(jìn)程,無需系統(tǒng)調(diào)用。
插曲:張銀奎說程序進(jìn)入內(nèi)核態(tài)猶如人睡覺啦。這個(gè)笑話很有意思
進(jìn)程的切換
為了控制進(jìn)程的執(zhí)行,內(nèi)核必須有能力掛起正在CPU上執(zhí)行的進(jìn)程,并恢復(fù)以前掛起的某個(gè)進(jìn)程的執(zhí)行,這叫做進(jìn)程切換、任務(wù)切換、上下文切換;
掛起正在CPU上執(zhí)行的進(jìn)程,與中斷時(shí)保存現(xiàn)場(chǎng)是不同的,中斷前后是在同一個(gè)進(jìn)程上下文中,只是由用戶態(tài)轉(zhuǎn)向內(nèi)核態(tài)執(zhí)行;
區(qū)別是否是同一個(gè)進(jìn)程
進(jìn)程上下文包含了進(jìn)程執(zhí)行需要的所有信息
用戶地址空間:包括程序代碼,數(shù)據(jù),用戶堆棧等
控制信息:進(jìn)程描述符,內(nèi)核堆棧等
硬件上下文(注意中斷也要保存硬件上下文只是保存的方法不同)
還有硬件上下文
schedule()函數(shù)選擇一個(gè)新的進(jìn)程來運(yùn)行,并調(diào)用context_switch進(jìn)行上下文的切換,這個(gè)宏調(diào)用switch_to來進(jìn)行關(guān)鍵上下文切換
next = pick_next_task(rq, prev);//進(jìn)程調(diào)度算法都封裝這個(gè)函數(shù)內(nèi)部
context_switch(rq, prev, next);//進(jìn)程上下文切換
switch_to利用了prev和next兩個(gè)參數(shù):prev指向當(dāng)前進(jìn)程,next指向被調(diào)度的進(jìn)程
進(jìn)程代碼切換代碼分析(重點(diǎn))
第一節(jié)第二堂課
位置:kernel/sched/core.c
如果想看到這里面詳細(xì)的值,可以使用gcc -O0試試
待補(bǔ)充
esp eip 切換 ,
esp 先切換
eip 再切換
利用push eip +call 起到了類似的call 作用,但是靈活修改了eip 。/這點(diǎn)很牛/
Linux系統(tǒng)的一般執(zhí)行過程
位置:教程第二節(jié)第一講
最一般的情況:正在運(yùn)行的用戶態(tài)進(jìn)程X切換到運(yùn)行用戶態(tài)進(jìn)程Y的過程
在運(yùn)行的用戶態(tài)進(jìn)程X 發(fā)生中斷,硬件完成以下:
save cs:eip/esp/eflags(current) to kernel stack
load cs:eip(entry of a specific ISR) and ss:esp(point to kernel stack).
SAVE_ALL //保存現(xiàn)場(chǎng)
中斷處理過程中或中斷返回前調(diào)用了schedule(),其中的switch_to做了關(guān)鍵的進(jìn)程上下文切換
標(biāo)號(hào)1之后開始運(yùn)行用戶態(tài)進(jìn)程Y(這里Y曾經(jīng)通過以上步驟被切換出去過因此可以從標(biāo)號(hào)1繼續(xù)執(zhí)行)
已經(jīng)變成Y進(jìn)程上下文,真是 莊周做夢(mèng)
restore_all //恢復(fù)現(xiàn)場(chǎng)
iret - pop cs:eip/ss:esp/eflags from kernel stack
繼續(xù)運(yùn)行用戶態(tài)進(jìn)程Y
進(jìn)程間的 幾種特殊情況
先普通 再特殊
通過中斷處理過程中的調(diào)度時(shí)機(jī),用戶態(tài)進(jìn)程與內(nèi)核線程之間互相切換和內(nèi)核線程之間互相切換,與最一般的情況非常類似,只是內(nèi)核線程運(yùn)行過程中發(fā)生中斷沒有進(jìn)程用戶態(tài)和內(nèi)核態(tài)的轉(zhuǎn)換;
2個(gè)內(nèi)核線程之間切換,cs段沒有改變我
用戶進(jìn)程和內(nèi)核線程間切換
內(nèi)核線程主動(dòng)調(diào)用schedule(),只有進(jìn)程上下文的切換,沒有發(fā)生中斷上下文的切換,與最一般的情況略簡(jiǎn)略;
沒有發(fā)生中斷,也就是沒有int 指令和iret指令喔,
創(chuàng)建子進(jìn)程的系統(tǒng)調(diào)用在子進(jìn)程中的執(zhí)行起點(diǎn)及返回用戶態(tài),如fork;
pre :parent next: child so next_ip=ret_from_fork ,不是switch_to中的標(biāo)號(hào)1喔
加載一個(gè)新的可執(zhí)行程序后返回到用戶態(tài)的情況,如execve;
pre:parent
next:execve產(chǎn)生的進(jìn)程(記住,execve也是系統(tǒng)調(diào)用)
聯(lián)想start_thread(execve內(nèi)部),里面有修改進(jìn)程上下文的內(nèi)容喔,所以以新的中斷上下文返回
開眼界 內(nèi)核 舞女
dancing girls vs Taxi girl
0-3g
3g-4g 內(nèi)核態(tài)
如果每個(gè)進(jìn)程都有自己的內(nèi)核棧,如何切換?
原因是:內(nèi)核態(tài)下(3G以上空間),各進(jìn)程的代碼段/堆棧段是可以統(tǒng)一訪問的
借用老師的話:內(nèi)核是taxi
內(nèi)核是什么?
內(nèi)核是各種中斷處理過程和內(nèi)核線程的集合! 精煉啊 大道至簡(jiǎn) 道法自然
Linux操作系統(tǒng)架構(gòu)和系統(tǒng)執(zhí)行過程概覽
操作系統(tǒng)的基本概念
? 任何計(jì)算機(jī)系統(tǒng)都包含一個(gè)基本的程序集 合,稱為操作系統(tǒng)。
– 內(nèi)核(進(jìn)程管理,進(jìn)程調(diào)度,進(jìn)程間通訊機(jī) 制,內(nèi)存管理,中斷異常處理,文件系統(tǒng),I/O 系統(tǒng),網(wǎng)絡(luò)部分)
– 其他程序(例如函數(shù)庫、shell程序、系統(tǒng)程序 等等)
? 操作系統(tǒng)的目的
– 與硬件交互,管理所有的硬件資源
– 為用戶程序(應(yīng)用程序)提供一個(gè)良好的執(zhí)行 環(huán)境
典型的Linux操作系統(tǒng)的結(jié)構(gòu)
圍繞系統(tǒng)架構(gòu)圖
最簡(jiǎn)單也是最復(fù)雜的操作
ls 命令 就是 一講! 不簡(jiǎn)單
有時(shí)間的話 可以看看strace
換個(gè)角度 cpu執(zhí)行指令 +內(nèi)存角度看
某種程度上說,
cpu執(zhí)行指令的演示很精彩
后者就是在說進(jìn)程地址空間
本章要求 理解進(jìn)程調(diào)度時(shí)機(jī)跟蹤分析進(jìn)程調(diào)度與進(jìn)程切換的過程
理解Linux系統(tǒng)中進(jìn)程調(diào)度的時(shí)機(jī),可以在內(nèi)核代碼中搜索schedule()函數(shù),看都是哪里調(diào)用了schedule(),判斷我們課程內(nèi)容中的總結(jié)是否準(zhǔn)確;
驗(yàn)證
使用gdb跟蹤分析一個(gè)schedule()函數(shù) ,驗(yàn)證您對(duì)Linux系統(tǒng)進(jìn)程調(diào)度與進(jìn)程切換過程的理解;推薦在實(shí)驗(yàn)樓Linux虛擬機(jī)環(huán)境下完成實(shí)驗(yàn)。
特別關(guān)注并仔細(xì)分析switch_to中的匯編代碼,理解進(jìn)程上下文的切換機(jī)制,以及與中斷上下文切換的關(guān)系;
根據(jù)本周所學(xué)知識(shí)分析并理解Linux中進(jìn)程調(diào)度與進(jìn)程切換過程,撰寫一篇署名博客,并在博客文章中注明“真實(shí)姓名(與最后申請(qǐng)證書的姓名務(wù)必一致) + 原創(chuàng)作品轉(zhuǎn)載請(qǐng)注明出處 + 《Linux內(nèi)核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 ”,博客內(nèi)容的具體要求如下:
題目自擬,內(nèi)容圍繞對(duì)進(jìn)程調(diào)度的時(shí)機(jī)和進(jìn)程切換進(jìn)行;
可以結(jié)合關(guān)鍵代碼、實(shí)驗(yàn)截圖、堆棧狀態(tài)、CPU寄存器狀態(tài)等;
博客內(nèi)容中需要仔細(xì)分析進(jìn)程的調(diào)度時(shí)機(jī)、switch_to及對(duì)應(yīng)的堆棧狀態(tài)等。
總結(jié)部分需要闡明自己對(duì)“Linux系統(tǒng)一般執(zhí)行過程”的理解
其他
可以找到一個(gè)ppt 講 switch_to ,看寄存器變化嗎?
mykernel其實(shí)就是一個(gè)簡(jiǎn)化版本的switch
總結(jié)
以上是生活随笔為你收集整理的linux每隔多久调度y,Linux 进程调度+Linux系统一般执行过程 笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OCP-052考试题库汇总(58)-CU
- 下一篇: Linux版本tomcat下载及安装