linux核心設計與實踐第三版讀書筆記

2021-08-21 09:34:45 字數 2275 閱讀 5787

程序提供兩種虛擬機制,虛擬cpu和虛擬記憶體

linux中所有的程序都在乙個list中,可以通過下面的方法來訪問整合中的子執行緒

struct task_struct *task;

struct list_head *list;

list_for_each(list,¤t->children)

這裡的sibling是task_struct中的成員變數,表示這個task的所有子程序

遍歷所有程序

struct task_struct *task;

for(task=current;task!=&init_task;task=task->parent)

獲取下乙個程序

struct task_struct *task;

list_entry(task->tasks.next;struct task_struct,tasks)

獲取前乙個程序

struct task_struct *task;

list_entry(task->tasks.prev;struct task_struct,tasks)

通過for_each_process可以遍歷所有的task

struct task_struct *task;

for_each_process(task)

user space 通過fork/clone 來建立新的程序,在kernel中通過kthread_create/kthread_run來建立執行緒,

其中kthread_create建立的執行緒不會立即執行,而kthread_run建立的執行緒會立即執行.

這兩者的關係如下:

#define kthread_run(threadfn, data, namefmt, ...) \

()可以在核心執行緒中呼叫do_exit()或者kthread_stop()來退出核心執行緒

cfs 排程不在有時間片的概念,而是確保每個程序公平的分配處理器執行時間

在kernel/sched_fair.c中的update_curr()函式會更新sched_entity

struct sched_entity ;

static void update_curr(struct cfs_rq *cfs_rq)

排程器的入口是schedule()函式,其要做的事情就會通過pick_next_task()來選擇乙個高優先順序的程序

context_switch()來執行程序的切換

set_tsk_need_resched()來設定程序中的need_resched標誌,clear_tsk_need_resched()來清除need_resched標誌,need_resched()用來判斷這個標誌是否置位

使用者搶占發生在:從系統呼叫返回使用者空間,從中斷處理程式返回使用者空間

核心搶占發生在:中斷程式返回核心空間之前,核心**再一次具有可搶占性的時候,核心顯示呼叫是schedule(),核心任務阻塞

使用者空間程式可以條用sched_yield()來放棄cpu

遍歷鍊錶:list_for_each / list_for_each_entry /list_for_each_entry_reverse

遍歷的同時刪除list_for_each_entry_safe / list_for_each_entry_safe_reverse

核心中的佇列是通過kfifo來實現的

對映是指乙個key 關聯乙個指標

儲存大量資料,並且要求檢索迅速就用紅黑樹

異常與中斷不同,它產生是必須考慮與處理器的時鐘同步,所以異常也被稱為同步中斷

中斷不可以重入,設定irqf_shared標誌可以共享中斷,用引數dev可以卻分是哪個裝置的中斷

軟中斷執行的是在:硬中斷返回時/ksoftirq,顯式呼叫軟中斷,軟中斷的入口函式是do_softirq()

taskset和軟中斷 可以工作在中斷上下文,而workqueue 只能工作在程序上下文。

local_bh_disable/local_bh_enable 可以啟用本地處理器的軟中斷和tasklet的處理

核心的同步方法有:原子操作/自旋鎖/讀寫自旋鎖/訊號量/讀寫訊號量/互斥體/完成量/順序鎖/順序和屏障

vfs中的四個主要物件型別是:超級快物件,索引節點物件,目錄項物件,檔案物件

i/o排程策略:as**,cfq 完全公正的排隊,dealine 最終期限,noop,可以通過命令列倉鼠elevator=as來修改所有塊裝置的排程策略

使用depmod -a 產生模組依賴,模組依賴資訊在/lib/modules/version/modules.dep中

Python核心程式設計 第三版 練習

目錄 1.6 練習 1 16 1 17 1 16 為gendata.py更新 使資料直接輸出一redata.txtm而不是螢幕。user bin env python from random import randrange,choice from string import ascii lower...

程序 深入理解Linux核心(第三版)

寫在前面的話,因為只看不思考真的很睏,所以把一些疑惑和重要的地方記下來。1.程序與執行緒的區別 程序是系統進行資源分配和排程的乙個獨立單位.執行緒是程序的乙個實體,是cpu排程和分派的基本單位。2.父子程序 共享含有程式 的頁,但是各自擁有獨立的資料拷貝,因此子程序對乙個記憶體單元的修改對父程序是不...

編譯apue 第三版

想要直接使用作者提供的源 就需要編譯下,這個檔名是src.3e.tar.gz 很簡單的幾步就搞定了.解壓src.3e.tar.gz 進入apue.3e make 進入apue.3e lib目錄,複製libapue.a到 usr local lib目錄 進入 apue.3e include目錄,複製 ...