最近收到不少讀者留言,關于怎么學「作業系統」和「計算機網路」的留言,小林寫這一塊的內容也有半年多了,啃非常多的書,也看了很多視頻,有好的有差的,今天就掏心掏肺地分享給大家,
作業系統和計算機網路有多重要呢?如果沒有作業系統,我們的手機和電腦可以說是廢鐵了,自然它們都沒有使用價值了,另外如果沒有計算機網路,我們的手機和電腦就是一座「孤島」了,孤島的世界很單調,也沒有什么色彩,也正是因為計算機網路,才創造出這么豐富多彩的互聯網世界,
身為程式員的我們,那更應該深刻理解和掌握它們,雖然我們日常 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 網路模型,

TCP/IP 網路參考模型共有 4 層,其中需要我們熟練掌握的是應用層、傳輸層和網路層,至于網路介面層(資料鏈路層和物理層)我們只需要做簡單的了解就可以了,
對于應用層,當然重點要熟悉最常見的 HTTP 和 HTTPS,傳輸層 TCP 和 UDP 都要熟悉,網路層要熟悉 IPv4,IPv6 可以做簡單點了解,
我覺得學習一個東西,就從我們常見的事情開始著手,
比如, ping 命令可以說在我們判斷網路環境的時候,最常使用的了,你可以先把你電腦 ping 你舍友或同事的電腦的程序中發生的事情都搞明白,這樣就基本知道一個資料包是怎么轉發的了,于是你就知道了網路層、資料鏈路層和物理層之間是如何作業,如何相互配合的了,
搞明白了 ping 程序,我相信你學起 HTTP 請求程序的時候,會很快就能掌握了,因為網路層以下的作業方式,你在學習 ping 的時候就已經明白了,這時就只需要認真掌握傳輸層中的 TCP 和應用層中的 HTTP 協議,就能搞明白訪問網頁的整個程序了,這也是面試常見的題目了,畢竟它能考察你網路知識的全面性,
重中之重的知識就是 TCP 了,TCP 不管是建立連接、斷開連接的程序,還是資料傳輸的程序,都不能放過,針對資料可靠傳輸的特性,又可以拆解為超時重新、流量控制、滑動視窗、擁塞控制等等知識點,學完這些只能算對 TCP 有個「感性」的認識,另外我們還得知道 Linux 提供的 TCP 內核的引數的作用,這樣才能從容地應對作業中遇到的問題,
接下來,推薦我看過并覺得不錯的計算機網路相關的書籍和視頻,
入門系列
此系列針對沒有任何計算機基礎的朋友,如果已經對計算機輕車熟路的大佬,也不要忽略,不妨看看我推薦的正確嗎,
如果你要入門 HTTP,首先最好書籍就是《圖解 HTTP》了,作者真的做到完完全全的「圖解」,小林的圖解功夫還是從這里偷學到不少,書籍不厚,相信優秀的你,幾天就可以看完了,

如果要入門 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 資料,那必定是《The TCP/IP GUIDE》這本書了,目前只有英文版本的,而且有個專門的網址可以白嫖看這本書的內容,圖片都是彩色,看起來很舒服很鮮明,小林之前寫的 TCP 文章不少案例和圖片都是參考這里的,這本書精華部分就是把 TCP 滑動視窗和流量控制說的超級明白,很可惜擁塞控制部分說的不多,

白嫖站點: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 本都能看完了,

作業系統怎么學?
作業系統真的可以說是 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 語言、匯編語言等知識,是一本綜合性比較強的書,

它告訴我們計算機是如何設計和作業的,作業系統有哪些重點,它們的作用又是什么,這本書的目標其實便是要講清楚原理,但并不會把某個話題挖掘地過于深入,過于細節,看看這本書后,我們就可以對計算機系統各組件的作業方式有了理性的認識,在一定程度上,其實它是在鍛煉一種思維方式 —— 計算思維,
最后
好了,小林本次的分享就到這里了,不知道推薦的書和視頻是否和你的「口味」,同時也歡迎你在留言區里分享你是怎么學習它們的,又有什么好書推薦給大家呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/143595.html
標籤:其他
上一篇:2020年春招秋招各個大廠面試題總結(答案持續更新中)
下一篇:買不到的數目[藍橋杯]
