最近收到不少讀者留言,關于怎麼學「作業系統」和「計算機網絡」的留言,小林寫這一塊的内容也有半年多了,啃非常多的書,也看了很多視訊,有好的有差的,今天就掏心掏肺地分享給大家。
作業系統和計算機網絡有多重要呢?如果沒有作業系統,我們的手機和電腦可以說是廢鐵了,自然它們都沒有使用價值了,另外如果沒有計算機網絡,我們的手機和電腦就是一座「孤島」了,孤島的世界很單調,也沒有什麼色彩,也正是因為計算機網絡,才創造出這麼豐富多彩的網際網路世界。
身為程式員的我們,那更應該深刻了解和掌握它們,雖然我們日常
CURD
的工作中,即使不熟悉它們,也不妨礙我們寫代碼,但是當出現問題時,沒有這些基礎知識,你是無厘頭的,根本沒有思路下手,這時候和别人差距就顯現出來了,可以說是程式員之間的分水嶺。
事實上,我們工作中會有大量的時間都是在排查和解決問題,編碼的時間其實比較少,如果計算機基礎學的很紮實,雖然不敢保證我們能 100% 解決,但是至少遇到問題時,我們有一個排查的方向,或者直接就定位到問題所在,然後再一步一步嘗試解決,解決了問題,自然就展現了我們自身的實力和價值,職場也會越走越遠。
我自己工作中就深刻體會到了它們多重要性,我最近項目就遇到 TCP 比較底層的問題,我們的一個 Web 服務運作久之後,就無法與用戶端正常建立連接配接了,使用 tcpdump 抓包發現 TCP 三次握手過程中,服務端把用戶端握手過程中最後 1 個 ack 給丢掉了。
剛開始覺得非常的莫名奇妙,後面想起自己寫過一篇 TCP 半連接配接和全連接配接隊列的文章,就往這個方向排查問題,于是執行 netstat -s 指令檢視 TCP error 相關的資訊,發現 TCP 全連接配接隊列溢出了,接着再通過 ss -lnt 指令進一步确認,目前 TCP 全連接配接隊列确實超過了 TCP 全連接配接隊列最大值,這個問題就很快定位出來了。
另外,當 TCP 全連接配接隊列溢出後,由于
tcp_abort_on_overflow
核心參數預設為 0,是以服務端會丢掉用戶端發過來的 ack,如果你把該參數設定為 1,那現象将變成,服務端會給用戶端發送 RST 封包,廢棄掉連接配接。
那要擴大全連接配接隊列也不難,TCP 全連接配接隊列最大值取決于 somaxconn 和 backlog 之間的最小值,也就是
min(somaxconn, backlog)
,其中 somaxconn 是核心參數,而 backlog 是我們程式 listen 方法中指定的參數。
上面這個小例子,很明顯是無法通過看應用層的代碼來解決的,必須了解 TCP 的機制,才能找到解決之道。
鋪墊了那麼多,接下裡進入正題。
計算機網絡怎麼學?
計算機網絡相比作業系統好學非常多,因為計算機網絡不抽象,你要想知道網絡中的細節,你都可以通過抓包來分析,而且不管是手機、個人電腦和伺服器,它們所使用的計算網絡協定是一緻的。
也就是說,計算機網絡不會因為裝置的不同而不同,大家都遵循這一套「規則」來互相通信,這套規則就是 TCP/IP 網絡模型。
OSI 參考模型與 TCP/IP 的關系
TCP/IP 網絡參考模型共有
4
層,其中需要我們熟練掌握的是應用層、傳輸層和網絡層,至于網絡接口層(資料鍊路層和實體層)我們隻需要做簡單的了解就可以了。
對于應用層,當然重點要熟悉最常見的 HTTP 和 HTTPS,傳輸層 TCP 和 UDP 都要熟悉,網絡層要熟悉 IPv4,IPv6 可以做簡單點了解。
我覺得學習一個東西,就從我們常見的事情開始着手。
比如, ping 指令可以說在我們判斷網絡環境的時候,最常使用的了,你可以先把你電腦 ping 你舍友或同僚的電腦的過程中發生的事情都搞明白,這樣就基本知道一個資料包是怎麼轉發的了,于是你就知道了網絡層、資料鍊路層和實體層之間是如何工作,如何互相配合的了。
搞明白了 ping 過程,我相信你學起 HTTP 請求過程的時候,會很快就能掌握了,因為網絡層以下的工作方式,你在學習 ping 的時候就已經明白了,這時就隻需要認真掌握傳輸層中的 TCP 和應用層中的 HTTP 協定,就能搞明白通路網頁的整個過程了,這也是面試常見的題目了,畢竟它能考察你網絡知識的全面性。
重中之重的知識就是 TCP 了,TCP 不管是建立連接配接、斷開連接配接的過程,還是資料傳輸的過程,都不能放過,針對資料可靠傳輸的特性,又可以拆解為逾時重新、流量控制、滑動視窗、擁塞控制等等知識點,學完這些隻能算對 TCP 有個「感性」的認識,另外我們還得知道 Linux 提供的 TCP 核心的參數的作用,這樣才能從容地應對工作中遇到的問題。
接下來,推薦我看過并覺得不錯的計算機網絡相關的書籍和視訊。
入門系列
此系列針對沒有任何計算機基礎的朋友,如果已經對計算機輕車熟路的大佬,也不要忽略,不妨看看我推薦的正确嗎。
如果你要入門 HTTP,首先最好書籍就是《圖解 HTTP》了,作者真的做到完完全全的「圖解」,小林的圖解功夫還是從這裡偷學到不少,書籍不厚,相信優秀的你,幾天就可以看完了。
《圖解 HTTP》
如果要入門 TCP/IP 網絡模型,我推薦的是《圖解 TCP/IP》,這本書也是以大量的圖文來介紹了 TCP/IP 網絡模式的每一層,但是這個書籍的順序不是從「應用層 —> 實體層」,而是從「實體層 -> 應用層」順序開始講的,這一點我覺得不太好,這樣一上來就把最枯燥的部分講了,很容易就被勸退了,是以我建議先跳過前面幾個章節,先看網絡層和傳輸層的章節,然後再回頭看前面的這幾個章節。
《圖解 TCP/IP》
另外,你想了解網絡是怎麼傳輸,那我推薦《網絡是怎樣連接配接的》,這本書相對比較全面的把通路一個網頁的發生的過程講解了一遍,其中關于電信等營運商是怎麼傳輸的,這部分你可以跳過,當然你感興趣也可以看,隻是我覺得沒必要看。
《網絡是怎樣連接配接的》
如果你覺得書籍過于枯燥,你可以結合 B 站《計算機網絡微課堂》視訊一起學習,這個視訊是湖南科技大學老師制作的,PPT 的動圖是我見過做的最用心的了,一看就懂的佳作。
《計算機網絡微課堂》
B 站視訊位址:https://www.bilibili.com/video/BV1c4411d7jb?p=1
深入學習系列
看完入門系列,相信你對計算機網絡已經有個大體的認識了,接下來我們也不能放慢腳步,快馬加鞭,借此機會繼續深入學習,因為隐藏在背後的細節還是很多的。
對于 TCP/IP 網絡模型深入學習的話,推薦《計算機網絡 - 自頂向下方法》,這本書是從我們最熟悉 HTTP 開始說起,一層一層的說到最後實體層的,有種挖地洞的感覺,這樣的内容編排順序相對是比較合理的。
《計算機網絡 - 自頂向下方法》
但如果要深入 TCP,前面的這些書還遠遠不夠,賦有計算機網絡聖經的之說的《TCP/IP 詳解 卷一:協定》這本書,是進一步深入學習的好資料,這本書的作者用各種實驗的方式來細說各種協定,但不得不說,這本書真的很枯燥,當時我也啃的很難受,但是它品質是真的很高,這本書我隻看了 TCP 部分,其他部分你可以選擇性看,但是你一定要過幾遍這本書的 TCP 部分,涵蓋的内容非常全且細。
《TCP/IP 詳解 卷一:協定》
要說我看過最好的 TCP 資料,那必定是《The TCP/IP GUIDE》這本書了,目前隻有英文版本的,而且有個專門的網址可以白嫖看這本書的内容,圖檔都是彩色,看起來很舒服很鮮明,小林之前寫的 TCP 文章不少案例和圖檔都是參考這裡的,這本書精華部分就是把 TCP 滑動視窗和流量控制說的超級明白,很可惜擁塞控制部分說的不多。
《The TCP/IP GUIDE》
白嫖站點:http://www.tcpipguide.com/free/t_TCPSlidingWindowAcknowledgmentSystemForDataTranspo-6.htm
當然,計算機網絡最牛逼的資料,那必定 RFC 文檔,它可以稱為計算機網絡世界的「法規」,也是最新、最權威和最正确的地方了,困惑大家的 TCP 為什麼三次握手和四次揮手,其實在 RFC 文檔幾句話就說明白了。
TCP 協定的 RFC 文檔:https://datatracker.ietf.org/doc/rfc1644/
實戰系列
在學習書籍資料的時候,不管是 TCP、UDP、ICMP、DNS、HTTP、HTTPS 等協定,最好都可以親手嘗試抓資料報,接着可以用 Wireshark 工具看每一個資料封包的資訊,這樣你會覺得計算機網絡沒有想象中那麼抽象了,因為它們被你「抓」出來了,并毫無保留地顯現在你面前了,于是你就可以肆無忌憚地「扒開」它們,看清它們每一個頭資訊。
那在這裡,我也給你推薦 2 本關于 Wireshark 網絡分析的書,這兩本書都是同一個作者,書中的案例都是源于作者工作中的實際的案例,作者的文筆相當有趣,看起來堪比小說一樣爽,相信你不用一個星期 2 本都能看完了。
《Wireshark 網絡分析就這麼簡單》 與 《Wireshark 網絡分析的藝術》
作業系統怎麼學?
作業系統真的可以說是
Super Man
,它為了我們做了非常厲害的事情,以至于我們根本察覺不到,隻有通過學習它,我們才能深刻體會到它的精妙之處,甚至會被計算機科學家設計思想所震撼,有些思想實際上也是可以應用于我們工作開發中。
作業系統比較重要的四大子產品,分别是記憶體管理、程序管理、檔案系統管理、輸入輸出裝置管理。這是我學習作業系統的順序,也是我推薦給大家的學習順序,因為記憶體管理不僅是最重要、最難的子產品,也是和其他子產品關聯性最大的子產品,先把它搞定,後續的子產品學起來我認為會相對輕松一些。
學習的過程中,你可能會遇到很多「虛拟」的概念,比如虛拟記憶體、虛拟檔案系統,實際上它們的本質上都是一樣的,都是向下屏蔽差異,向上提供統一的東西,以友善我們程式員使用。
還有,你也遇到各種各樣的排程算法,在這裡你可以看到資料結構與算法的魅力,重要的是我們要了解為什麼要提出那麼多排程算法,你當然可以說是為了更快更有效率,但是因什麼問題而是以引入新算法的這個過程,更是我們重點學習的地方。
你也會開始明白程序與線程最大的差別在于上下文切換過程中,線程不用切換虛拟記憶體,因為同一個程序内的線程都是共享虛拟記憶體空間的,線程就單這一點不用切換,就相比程序上下文切換的性能開銷減少了很多。由于虛拟記憶體與實體記憶體的映射關系需要查詢頁表,頁表的查詢是很慢的過程,是以會把常用的位址映射關系緩存在 TLB 裡的,這樣便可以提高頁表的查詢速度,如果發生了程序切換,那 TLB 緩存的位址映射關系就會失效,緩存失效就意味着命中率降低,于是虛拟位址轉為實體位址這一過程就會很慢。
你也開始不會傻傻的認為 read 或 write 之後資料就直接寫到硬碟了,更不會覺得多次操作 read 或 write 方法性能會很低,因為你發現作業系統會有個「磁盤高速緩沖區」,它已經幫我們做了緩存的工作,它會預讀資料、緩存最近通路的資料,以及使用 I/O 排程算法來合并和排隊磁盤排程 I/O,這些都是為了減少作業系統對磁盤的通路頻率。
……
還有太多太多了,我在這裡就不贅述了,剩下的就交給你們在學習作業系統的途中去探索和發現了。
還有一點需要注意,學作業系統的時候,不要誤以為它是在說 Linux 作業系統,這也是我初學的時候犯的一個錯誤,作業系統是集合大多數作業系統實作的思想,跟實際具體實作的 Linux 作業系統多少都會有點差别,如果要想 Linux 作業系統的具體實作方式,可以選擇看 Linux 核心相關的資料,但是在這之前你先掌握了作業系統的基本知識,這樣學起來才能事半功倍。
對于沒學過作業系統的小白,我建議學的時候,不要直接悶頭看書。相信我,你不用幾分鐘就會打退堂鼓,然後就把厚厚的書拿去墊顯示器了,從此再無後續,畢竟直接看書太特喵的枯燥了,當然不如用來墊顯示器玩遊戲來着香。
B 站關于作業系統課程資源很多,我在裡面也看了不同老師講的課程,覺得比較好的入門級課程是《作業系統 - 清華大學》,該課程由清華大學老師向勇和陳渝授課,雖然我們上不了清華大學,但是至少我們可以在網上選擇聽清華大學的課嘛。課程授課的順序,就如我前面推薦的學習順序:「記憶體管理 -> 程序管理 -> 檔案系統管理 -> 輸入輸出裝置管理」。
《作業系統 - 清華大學》
B 站清華大學作業系統視訊位址:https://www.bilibili.com/video/BV1js411b7vg?from=search&seid=2361361014547524697
該清華大學的視訊教學搭配的書應該是《現代作業系統》,你可以視訊和書籍兩者結合一起學,比如看完視訊的記憶體管理,然後就看書上對應的章節,這樣相比直接啃書相對會比較好。
《現代作業系統》
清華大學的作業系統視訊課講的比較精煉,涉及到的内容沒有那麼細,《作業系統 - 哈工大》李治軍老師授課的視訊課程相對就會比較細節,老師會用 Linux 核心代碼的角度帶你進一步了解作業系統,也會用生活小例子幫助你了解。
《作業系統 - 哈工大》
B 站哈工大作業系統視訊位址:https://www.bilibili.com/video/BV1d4411v7u7?from=search&seid=2361361014547524697
《現代作業系統》這本書我感覺缺少比較多細節,說的還是比較籠統,而且書也好無聊。
推薦一個說的更細的作業系統書 —— 《作業系統導論》,這本書不僅告訴你 What,還會告訴你 How,書的内容都是循序漸進,層層遞進的,閱讀起來還是覺得挺有意思的,這本書的記憶體管理和并發這兩個部分說的很棒,這本書的中文版本我也沒找到資源,不過微信讀書可以免費看這本書。
《作業系統導論》
當然,少不了這本被稱為神書的《深入了解計算機系統》,豆瓣評分高達
9.8
分,這本書嚴格來說不算作業系統書,它是以程式員視角了解計算機系統,不隻是涉及到作業系統,還涉及到了計算機組成、C 語言、彙編語言等知識,是一本綜合性比較強的書。
《深入了解計算機系統》
它告訴我們計算機是如何設計和工作的,作業系統有哪些重點,它們的作用又是什麼,這本書的目标其實便是要講清楚原理,但并不會把某個話題挖掘地過于深入,過于細節。看看這本書後,我們就可以對計算機系統各元件的工作方式有了理性的認識。在一定程度上,其實它是在鍛煉一種思維方式 —— 計算思維。
最後
好了,小林本次的分享就到這裡了,不知道推薦的書和視訊是否和你的「口味」,同時也歡迎你在留言區裡分享你是怎麼學習它們的,又有什麼好書推薦給大家呢?
關注公衆号:「小林coding」 ,回複「我要學習」即可免費獲得「伺服器 Linux C/C++ 」成長路程(書籍資料 + 思維導圖)