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