Linux設計與實現學習筆記

2021-06-26 10:53:35 字數 1532 閱讀 9949

從第三章開始吧,前面都是overview的介紹:

第三章:程序管理

程序的概念

處於執行期的程式+其他占用的資源(開啟的檔案,掛起的訊號...)

linux中線程是一種特殊的程序,區別於其他系統。

fork-->exec->exit

程序描述符及任務結構

每個程序對應乙個資料結構:task_struct,稱為程序描述符。

重要的元素:state(程序狀態),parent(父程序描述符指標),pid(不用解釋了),prio(程序的優先順序)...

slab分配器分配task_struct,這地方會在12章繼續研究,mark一下。

程序的唯一識別符號:pid,可以通過修改/proc/sys/kernel/pid_max來提高上限。

通過current巨集獲得task_struct,中間需要thread_info.

程序狀態:

task_running :程序是可執行的--執行中或等待被執行

task_interruptible :程序是休眠的,等待被喚醒。

task_uninterruptible:程序是休眠的,不能被喚醒。用的較少。

_task_traced:被其他程序跟著,如ptrace(gdb的基礎)。

_task_stopped:程序停止執行,受到sigstop,sigtstp,sigttin,sigttou等訊號。

設定當前程序狀態:

就是修改task_struct中state的值,需要考慮smp.

程序上下文:

使用者空間執行的程序「陷入」到核心空間,核心空間會」代表程序執行「。在核心退出後悔繼續在使用者空間執行。

系統呼叫和異常處理是陷入核心的唯一兩種方式。

程序家族樹:

通過current->parent訪問父程序

雙向鍊錶儲存程序的子程序

程序的建立:

linux不同於其他系統(spawn),而是採用fork+exec的方式建立新程序。

寫時拷貝:

新程序需要寫入時才會複製資料,其他都是以唯讀方式共享。可以大大提高效率。

fork():

fork,vfork._clone----系統呼叫--->clone

vfork():

不copy頁表項,不建議使用。

執行緒在linux中的實現:

執行緒被稱為」輕量級程序「,他與父程序共享位址空間,檔案系統只有,檔案描述符和訊號處理程式。

建立執行緒:

clone的參賽與普通程序不同加上了clone_vm.

核心執行緒:

以後章節會講,為什麼核心中以執行緒方式實現?

程序終結:

exit->do_exit

孤兒程序定義:

父程序在子程序之前退出。會尋找新的父程序。

上面是第三章程序管理的學習筆記,下一節開始程序排程的學習。

Linux設計與實現學習筆記之程序排程

程序排程 這一章講的內容是非常有趣的,很多的思想和觀點生活中也能用到呢。這一章最重要的兩個字是排程。何為排程,就是在有限的處理器和無限的程序中尋找平衡點的策略,方法。排程的目的 最大限度地利用處理器。排程的原則 高效,公平。多工系統的兩種方式 搶占式多工和非搶占式多工。非搶占式多工有點像計畫經濟,每...

Redis設計實現 學習筆記

最近在準備面試,問到redis相關知識,只能說個皮毛,說的既不深入也不全面,所以抓緊突擊一下,先學 redis設計與實現 選擇看書的原因是 書中全面深入,且能出書一定十分用心 搜部落格也找不到比書更全面的文章,且費時 直接看原始碼乙個是對c掌握不好,且易困,效率不高,所以跟著書同步學原始碼,是我認為...

《Redis設計與實現》學習筆記 Lua指令碼

redis從2.6開始支援lua指令碼,和事務的功能類似,可以通過lua指令碼原子的執行多個redis命令。redis提供了eval和evalsha命令執行lua指令碼。redis在伺服器內嵌了乙個lua壞境,並進行了一系列的修改,從而確保這個lua壞境可以滿足redis伺服器的需要,通過下列步驟建...