本學期的LINUX內核這門課程已經進行了一半,這門課的學習方法和上個學期深刻理解計算機系統的方式差很少,因此也沒有特別多不適應,LINUX內核在我看來,就是理解一個操做系統是如何實現各個功能的,先從宏觀上讓咱們理解一下,LINUX操做系統,而後再讓咱們看看各個功能實現的代碼和過程,包括進程的建立,進程的中斷,進程的調度等等,每一節的實驗,基本都是讓咱們跟蹤一個進程的實現過程。網課基本上已經結束了,之後的日子,老師會佈置新的任務,但願在往後的學習中,可以學習到更加有用的知識,讓咱們對LINUX的內核有更深入地瞭解。javascript
重寫了虛擬內存系統,最終官方版本誕生java
LINUX內核也是公開軟件linux
當內核運行的時候,系統之內核態進入內核空間執行。而執行一個普通用戶程序時,系統將以用戶態進入以用戶空間執行。git
LINUX是單內核算法
獲取內核源碼 Git:下載和管理Linux內核源代碼
獲取最新提交到版本樹的一個副本
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
下載代碼後,更新本身的分支到最新分支
$ git pull安全
用系統調用號指明到底執行哪一個系統調用。服務器
引用空指針會產生一個oops;垃圾數據會致使系統崩潰。
定時限制和競爭條件都容許多個線程在內核中同時運行產生的結果。併發
oops函數
會向終端輸出的內容:oop
fork創造的子進程複製了父進程資源,包括內存及進程描述符的內容,資源的複製而不是指針的複製。
vfork的行爲更像一個線程(指沒有自已獨立的內存空間),更明顯的是vfork的調用將掛起當前進程(即父進程)。
clone根據flag的不一樣能夠實現不一樣的功能。
只要退出,最終都調用了do_exit。
I/O消耗型進程:大部分時間用來提交I/O請求或是等待I/O請求,常常處於可運行狀態,但運行時間短,等待請求過程時處於阻塞狀態。如交互式程序。
處理器消耗型進程:時間大都用在執行代碼上,除非被搶佔不然一直不停的運行。
綜合型:既是I/O消耗型又是處理器消耗型。
調度策略要在:進程響應迅速(響應時間短)和最大系統利用率(高吞吐量)之間尋找平衡。
優先級:基於進程價值和對處理器時間需求進行進程分級的調度。
時間片:代表進程被搶佔前所能持續運行的時間,規定一個默認的時間片。時間片過長致使系統交互性的響應很差,
程序並行性效果差;時間片過短增大進程切換帶來的處理器耗時。矛盾!
間片耗盡進程運行到期,暫時不可運行狀態。直到全部進程時間片都耗盡,從新計算進程時間片。
Linux調度程序提升交互式程序優先級,提供較長時間片;實現動態調整優先級和時間片長度機制。
進程搶佔:Linux系統是搶佔式,始終運行優先級高的進程。
決定調度程序在什麼時候讓進程運行。
I/O消耗型:大多時間在提交或等待I/O請求。
處理器消耗型:大多時間在執行代碼。不屬於I/O驅動類型。
相同優先級按照輪轉方式進行調度。
調度程序老是選擇時間片未用盡且優先級高的進程運行。
nice值做爲權重將調整進程所使用的處理器時間使用比。
I/O消耗型:不須要長的時間片。
處理器消耗型:須要越長越好的時間片。
文字編輯程序顯然是 1/0 消耗型的,由於它大部分時間都在等待用戶的鍵盤輸入〈不管用戶的輸入速度有多快,都不可能遇上處理的速度λ 用戶老是但願按下鍵系統就能立刻響應。 視頻編碼程序是處理器消耗型的。
以模塊方式提供的,這樣作的目的是容許不一樣類型的進程能夠有針對性地選
擇調度算哉。
CFS的作怯是容許每一個進程運行一段時間、循環輪轉、選擇運行最少的進程做爲下一個運行進程,而再也不採用分配給每一個進程時間片的作法了,在全部可運行進程總數基礎上計算出一個進程應該運行多久。 - -
nice 值在 CFS 中被
做爲進程得到的處理器運行比的權重:越高的nice 值(越低的優先級)進程在得更低的處理器
使用權重。
可運行進程數量趨於無窮,每一個最少也能得到 lms 的運行時間。
任何進程所得到的處理器時間是由它本身和其餘全部可運行進程nice 值的相對差值決定的。
全部的調度器都必須對進程運行時間作記帳。 CFS 使用調度器實體結構(定義在文件<linux/sched.h>的 struct_sched _entity 中)來追蹤進程運行記帳。 CFS 使用 vruntime 變量來記錄一個程序到底運行了多長時間以及它還應該再運行多久。 定義在kemeVsched_fair.c 文件中的 update_curr()函數實現了該記帳功能。 update_ currO 計算了當前進程的執行時間,而且將其存放在變量delta_exec 中,update_ curr()是囪系統定時器週期性調用。
主要入口點是函數schedule(),它定義在文件kemel/sched.c中。
睡眠:爲了等待一些事件。 內核的操做都相同 2 進程把本身標記成休眠狀態,從可執行紅黑樹中移出,放入等待隊列,而後調用 schedule()選擇和執行一個其餘進程。 喚醒的過程恰好相反進程被設置爲可執行狀態,而後再從等待隊列中移到可執行紅黑樹中。
用戶搶佔在如下狀況時產生:
從中斷處理程序返回用戶空間時;
內核搶佔會發生在:
中斷處理程序正在執行,且返回內核空間以前 內核代碼再一次具備可搶佔性 若是內核中的任務顯式地調用 schedule() 若是內核中的任務阻塞(這一樣也會導敖調用 schedule()
兩種策略
SCHED_FIFO和 SCHED_RR
SCHED_FIFO 實現了一種簡單的、先入先出的調度算怯
SCHED_RR 是帶有時鬧片的 SCHED_FIFO,一種實時輪流調度算掛.
sched_setparam()和sched__getparam()分別用於設置和獲取進程的實時優先級