學習操作系統的知識,看哪本書好?

我學習操作系統的知識~看哪本書好 操作系統概念 現代操作系統 操作系統:精髓與設計原理 操作系統設計與實現 本人看了現代操作系統的前50頁,看得十分吃力,感覺是有點基礎才能看.。求大神,說說這些書的特點,怎麼看?


操作系統概念的英文原版,即《Operating System Concepts》,通俗易懂,講得明明白白。現代操作系統我看過,確實晦澀難懂


光看書不動手很容易出現這種情況...

我推薦 6.828 / Fall 2014,往年的視頻也很容易找到。這門課會接觸到兩個小的操作系統: xv6 和 jOS。課堂上主要講xv6, 一個小的unix操作系統;而課程Lab分6~7個階段讓你填寫jOS的關鍵代碼。

這門課的好處就是理論加實踐,而且課程節奏很好。

比如講完系統調用,你就可以試著給xv6加個timer調用;講完threads,你就可以試著給xv6加個系統調用,然後讓這個系統支持線程...

Lab實現的jOS和xv6有很多設計決策不同,對比它們你可以更好的理解什麼是操作系統;當然能自己親手寫一些代碼感覺會很不一樣(理論怎麼轉換到實踐)

幾點體會:

  • homework也許比Lab更有啟發性(我是這麼認為的);

  • 如果看過CSAPP就最好了,彙編都不用學了,shell也會寫了,memory也了解了。
  • 6.828有個作業提交系統,只要郵箱就能註冊了,然後可以互評Lab...

有了一些自己的體驗後,然後結合書看也許就完全不一樣了。


結合實際一起看,效果會好的多。

書籍上講的多是理論,可以自己再去找個開源的嵌入式OS,一起看著代碼實現,就會好的多了。比如FreeRTOS,可以也買本書,學會編譯,並在電腦里當成個應用跑起來,學會自己創建進程、協程後,進入對應的API實現看看。內核的調度、優先順序、內存管理、資源管理、搶佔式任務切換等等。

選擇嵌入式OS是因為足夠小,畢竟要為這個事情讀Linux源碼就是個大坑。FreeRTOS擁有大部分現代OS的各種核心功能,用來學習真是個好的例子。我也是學了FreeRTOS後,才逐漸讓數年前操作系統的知識變得靈活起來了。

舉幾個例子,在FreeRTOS中的實現:

1. 線程管理:

給每個線程建立個私有的堆棧,每次在線程里調用任何的函數,所需的參數傳遞、本地變數等都是放在線程私有堆棧里的。這樣各個線程之間不會發生混亂。該堆棧的建立一般還有個最大長度值,以免浪費內存過多,同時也限制了遞歸過深的情況。需要OS應用一開始就進行一個估算,調用棧會有多深。

2. 內存管理:

一般是先從物理內存里申請一大塊內存,建立針對這塊內存的分配表,每當有申請內存就記錄一條,釋放內存就選擇時機將剩餘內存合併。分配策略有多種,比如按照順序,或者優先選擇符合條件的最小空閑段。每個線程都建立自己的堆,有助於提高內存分配效率。

3. 進程/線程切換:

使用系統硬體上的定時器,每隔一定時間就發生一次硬體中斷,此時當前進程/線程被停止,所有寄存器被保存到進程私有棧里。兩次中斷之間實際執行任務代碼的部分,就叫做一個時間片。然後調用中斷處理函數。這個中斷處理函數就是OS內核里的任務切換功能,會重新選擇處於就緒(ready)狀態的各個任務中優先順序最高的那個來運行。所以,理解並實現這個中斷處理函數,就是理解任務切換的關鍵。放心代碼不長。

4. OS內核調用:

現代的CPU,包括一些嵌入式MCU,都會嚴格區分user space和kernel space。兩者的各種資源相對獨立,甚至堆棧都不同。當user application需要調用內核提供的服務時,往往是將自己要調用的內核調用符號、參數、返回值放到內存中指定位置,然後觸發一個軟體中斷。比如Cortex-M系列的SVCall,或者DOS的80中斷。此時就切換到了kernel mode。此模式下的中斷處理函數會根據系統調用內容分發調用請求,執行結束後,再根據返回地址跳轉回去。


先看視頻課程吧,再看書。

看書的話,很多知識點對於新手比較晦澀,如果看視頻,有老師講解,至少比看書容易點

我倒是收集了一些操作系統視頻課程

操作系統原理

操作系統 - 浙江大學

浙江大學操作系統共38講視頻由李善平主講更新完畢

操作系統-學堂在線慕課(MOOC)平台


6.828 / Fall 2014

xv6的鏈接。Learn by doing。


你看那些書看得吃力,是因為很多隱藏的知識你不具備。

可以試著從這本書開始,看得比較明白了,再去讀你列的書單中的書。

編碼 (豆瓣)


Synchronization (Windows)

先看這個


看了很多回答,感覺有些同學的建議簡直太離譜了。

先說鳥哥linux私房菜,樓主可以到鳥哥網站上先看看。他的風格是告訴你怎麼做,不告訴你為什麼,很雜很亂。

還有Linux系統編程手冊這種手冊書都拿出來,不是誤人子弟嗎?

再說深入理解計算機系統,這本書是好書,需要耐心和精力,不過不推薦初學者學習。因為你會因為裡面複雜的細節喪失很多興趣。

最後有推薦6.828這個網路課程,有些靠譜,我先去看看然後回頭補充答案。


1.於淵的《自己動手寫操作系統》,這本書從零開始實現一個小的操作系統內核,看完之後可以對操作系統最基本的原理有比較好的理解。

2.網易雲課堂李治軍老師的操作系統課程,講的通俗易懂,用的是linux0.11的源碼,真的很好。

3.Linux內核完全剖析(linux0.12),很全面。


視頻:推薦北京大學操作系統原理公開課(2015年)(free,需註冊賬號)

Coursera - Free Online Courses From Top Universities

書籍:趙迥的《linux內核完全剖析》

這兩個講得都是很實際的操作系統知識,不會給你一種空中樓閣的感覺。

視頻快照:

1、中斷

2、進程的概念

3、fork( )

4、進程間通信


我只說說我對如何看書的理解,希望對樓主有所幫助。

首先理解操作系統是幹嗎用的。籠統點說,操作系統就是管理各種資源的,包括CPU資源、內存資源、其他設備資源等等。樓主可以結合看書來考慮一下,如果是你作為一個OS設計人員,打算如何管理這些資源,怎麼才能把這些資源管理好。然後帶著你的答案和書里的思路進行比較,看看差距在哪裡。

其次,在對問題領域有了進一步認識和思考後,就自然會發現操作系統管理資源要遇到的一些關鍵點及難點,同樣的,你先考慮你的解決辦法,然後和書里的辦法進行比較,這會加深你對這些東西的理解。

一開始時,不用去關注各種演算法的實現細節,理解思路最重要,甚至對某些演算法本身都不必關注,只關注該演算法解決了什麼重要問題。最後一步,才是去關注各種具體實現細節,從而對書有一個完整的理解。


哈工大張英濤的視頻加上湯子瀛的操作系統書,是一個不錯的選擇,不過看操作系統心態要放正,用碩大大的話就是,不是讓你自己寫一個操作系統,而是為了更好學習你下面的知識


大學的時候把操作系統的課給逃了,嫌他講的爛,四月的時候入手一本《現代操作系統》,本以為看起來沒問題的,結果看了二十幾天,看的自己雲里霧裡的……棄書了,最近想起來的時候,覺得是自己方法錯了,我該先看視頻,從簡單的地方入手的,剛下載的清華的操作系統課程,這次應該沒問題了


1、鳥哥的鳥哥的Linux私房菜 (基礎學習篇 第三版),你一定要看,

2、Linux UNIX系統編程手冊 套裝上下冊

只推薦這兩本。


深度探索嵌入式操作系統:從零開始設計、架構和開發

http://www.amazon.cn/dp/B017IJE5BU/ref=tmm_kin_swatch_0?_encoding=UTF8qid=1454080846sr=8-1#nav-belt


先仔細看深入理解計算機系統這本書,這本書是用來解惑釋疑的,解你對計算機系統所有方方方面的疑惑,這樣可以大大降低對操作系統這個神乎其神的龐然大物的恐懼心理,之後可以看前面大牛們說的那個做中學的視頻,當然也可以直接看書,譬如linux情景分析,設計與實現,深入理解。尤其情景分析,就是用每一個場景來分析內核,很重要。

以題主的說法,同時指出一點,看書也有規則,不能一頭扎進去就看,可以大致瀏覽目錄,了解並思考諸如內存管理,進程,中斷,驅動等詞的具體含義,遇見一個不明白的詞就找答案,等這些詞理解了, 這個時候應該對操作系統有大致的圖像了,這個時候就可以深入進每一個部分看了,當然因為內核很複雜方方面面的東西很多,沒有一個人可以裝下那麼多東西,那怎麼辦?抽象,抽象在操作系統乃至程序設計中都有廣泛的體現,將所有的設備抽象為文件,完全可以忽略硬體的特性,這樣的目的就是減少思考複雜度,然後就是不懂就多看幾遍。

同時就是保持好奇心。我說的是內核,不知道是跑題沒啊。


為什麼沒人推薦這個 Operating Systems: Three Easy Pieces


《Freebsd操作系統設計與實現》《深入Linux內核架構》。前者純理論,後者偏實現,有中文版,翻譯的也不錯。


騷年,來一條龍啊

xv6+深入理解操作系統+unix環境高級編程+c程序設計語言


推薦兩本適合入門和建立基本概念的書,都是以linux0.1x版本為範例來講解的:

&,書中有非常多的圖解,比起單純的文字描述更容易接受和理解;

&,還有趙炯的其它幾本書;

上面兩本看完了可以看下面這本:

&<深入理解Linux內核&>,對應的英文版"Understanding The Linux Kernel",中文版的翻譯不是很令人滿意,很多專業名詞一旦翻譯成中文反而更難理解,建議直接看英文版.


推薦閱讀:

C語言里,main 函數中 return x和 exit(x) 到底有什麼區別 ?
為何linux作為伺服器端十年不重啟都不卡而安卓用半年就十分卡?
2017年6月19-20日在北京舉行的 LinuxCon 會議有哪些看點?
linux為什麼需要內核棧,系統調用時直接使用用戶棧不行嗎?
裝載著操作系統的磁碟是默認裝到內存0x8000位置,那ORG 0x7c00又是在做一個什麼事情呢?

TAG:操作系統 | 計算機 | Linux內核 |