最近收到很多讀者留言,關於怎麼學「操做系統」和「計算機網絡」的留言,小林寫這一塊的內容也有半年多了,啃很是多的書,也看了不少視頻,有好的有差的,今天就掏心掏肺地分享給你們。程序員
操做系統和計算機網絡有多重要呢?若是沒有操做系統,咱們的手機和電腦能夠說是廢鐵了,天然它們都沒有使用價值了,另外若是沒有計算機網絡,咱們的手機和電腦就是一座「孤島」了,孤島的世界很單調,也沒有什麼色彩,也正是由於計算機網絡,才創造出這麼豐富多彩的互聯網世界。面試
身爲程序員的咱們,那更應該深入理解和掌握它們,雖然咱們平常 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 的機制,才能找到解決之道。併發
鋪墊了那麼多,接下里進入正題。app
計算機網絡相比操做系統好學很是多,由於計算機網絡不抽象,你要想知道網絡中的細節,你均可以經過抓包來分析,並且無論是手機、我的電腦和服務器,它們所使用的計算網絡協議是一致的。
也就是說,計算機網絡不會由於設備的不一樣而不一樣,你們都遵循這一套「規則」來相互通訊,這套規則就是 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 語言、彙編語言等知識,是一本綜合性比較強的書。
它告訴咱們計算機是如何設計和工做的,操做系統有哪些重點,它們的做用又是什麼,這本書的目標其實即是要講清楚原理,但並不會把某個話題挖掘地過於深刻,過於細節。看看這本書後,咱們就能夠對計算機系統各組件的工做方式有了理性的認識。在必定程度上,其實它是在鍛鍊一種思惟方式 —— 計算思惟。
好了,小林本次的分享就到這裏了,不知道推薦的書和視頻是否和你的「口味」,同時也歡迎你在留言區裏分享你是怎麼學習它們的,又有什麼好書推薦給你們呢?