国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 操作系統(tǒng) > 正文

讀核日記(四)

2024-07-26 00:31:37
字體:
供稿:網(wǎng)友

這幾天身體不太好,進展不快.有時候突然發(fā)現(xiàn)在拼命的讀代碼的間隙里,停一會想一想,收獲會更大.特別是對于這種非常龐大的系統(tǒng)來說.把握整體的意義尤其重要.隨著對linux整體的拆解,我對于整個系統(tǒng),已經(jīng)不想開始是那么模糊.好像已經(jīng)度過了那個極點.不過我也應(yīng)做好準備,因為一但我對整個細節(jié)解讀時,肯定也會有同樣的經(jīng)歷.

整個linux內(nèi)核之所以這樣艱澀,難懂就在于它的整體性.想我們這樣很少寫萬行以上程序的人來說,它就好像一個龐大的肉球.讓你不知道如何下嘴.不過一但咬破.就非常香美了.畢竟,讀這么優(yōu)秀的代碼也是一種享受.

我個人認為linux 的內(nèi)核難在這幾點:1,系統(tǒng)龐大,太多的變量,結(jié)構(gòu), 以及typedef定義的東西不容易找到.2,作為操作系統(tǒng),它的函數(shù)調(diào)用時動態(tài)的,讀不懂大量的makefile 你根本就不知道這50 M的東西是怎么組織起來的,況且,你絕對不可以像跟蹤程序一樣用debug走一下.3, 龐大的數(shù)據(jù)結(jié)構(gòu),可能是比較簡單的運算變得不容易讀.

因此在讀核的初級階段.我們應(yīng)該善于想象,善于將不容易理解的部分用偽碼的理解方式走過,當(dāng)我們對大局把握好了,將整個結(jié)構(gòu)拆解清楚了,在讀不遲.況且,雖內(nèi)核本身來說,它所涉及到的運算,結(jié)構(gòu). 本質(zhì)上和課本上的沒有差別.(可惜我不是計算機系畢業(yè)的).只不過是內(nèi)容多了一些罷了.

比如說進程調(diào)度這一部分,說白了,就是在調(diào)用fork()的時候,就產(chǎn)生一task_strut 類型的指針,它包含進程調(diào)度所用到的一切信息.然后將這個指針插到隊列中去就行了,然后cpu 一次總隊類中取出指針,分配給他們時間片.

而這個指針如何插入呢?說白了就是看它的weight,weight 的計算方法,有根據(jù)進程類型的不同由不同的算法(實時進程,內(nèi)核進程,普通進程).好了,這樣我們想一下<<數(shù)據(jù)結(jié)構(gòu)中>>關(guān)于隊列的操作,插入,刪除,插到隊頭,置于隊尾.再想一下,這些操作如何同操作系統(tǒng)的應(yīng)用結(jié)合在一塊.例如;好隊進程正在運行,突然,由于一硬件中斷.產(chǎn)生一進程,它必須馬上處理.系統(tǒng)應(yīng)把它插入到隊頭.

好了.你可以讀一下/usr./src/linux/kenrel/sched.c,不要過那么多全局變量,現(xiàn)在數(shù)據(jù)結(jié)構(gòu)上走過去,如下面的代碼:

 

static inline void move_last_runqueue(struct task_struct * p)

{

struct task_struct *next = p->next_run;

struct task_struct *PRev = p->prev_run;

 

/* remove from list */

next->prev_run = prev;

prev->next_run = next;

/* add back to list */

p->next_run = &init_task;

prev = init_task.prev_run;

init_task.prev_run = p;

p->prev_run = prev;

prev->next_run = p;

}

 

static inline void move_first_runqueue(struct task_struct * p)

{

struct task_struct *next = p->next_run;

struct task_struct *prev = p->prev_run;

 

/* remove from list */

next->prev_run = prev;

prev->next_run = next;

/* add back to list */

p->prev_run = &init_task;

next = init_task.next_run;

init_task.next_run = p;

p->next_run = next;

next->prev_run = p;

}

如果你還不懂,你可能要先,在c語言和數(shù)據(jù)結(jié)構(gòu)上下一點功夫.其他的模塊,我想也是大同小異, 不過,也修補會這么簡單.如內(nèi)存管理中用到了好多平衡二叉樹的排序,遍歷等等.但總的結(jié)構(gòu)時不變的.只要可以通欄全局,在不開定義的情況下,可以讀懂全局變量的意思(其實,猜個八九不成問題),看懂是不成問題的.起碼我是信心十足.

我應(yīng)該在熟悉一下,計算機專業(yè)的軟件基礎(chǔ)課!!


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 维西| 仁布县| 方正县| 泰州市| 青岛市| 隆昌县| 遂宁市| 怀柔区| 沈丘县| 阿拉善盟| 蒲江县| 凤翔县| 吉木萨尔县| 徐闻县| 衡山县| 耿马| 竹溪县| 永吉县| 大石桥市| 报价| 海林市| 丘北县| 抚顺县| 桐柏县| 亚东县| 微博| 玉树县| 高邮市| 吉安县| 武义县| 襄樊市| 淅川县| 山阴县| 东丰县| 芒康县| 咸阳市| 仁布县| 丰都县| 龙井市| 太和县| 宁津县|