從第三章開始吧,前面都是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伺服器的需要,通過下列步驟建...