帥地吐血整理:那些讓你起飛的計算機基礎知識
我公眾號里的文章,寫的大部分都是與計算機基礎知識相關的,這些基礎知識,就像我們的內(nèi)功,如果在未來想要走的更遠,這些內(nèi)功是必須要修煉的。
框架千變?nèi)f化,而這些通用的底層知識,卻是幾乎不變的,了解了這些知識,可以幫助我們更快著學習一門知識,更加懂得計算機的運行機制。
當然,在面試中也經(jīng)常會被問到,特別是對于應屆生,對于春秋招,也可以看看我前陣子寫過的文章歷經(jīng)兩個月,我的秋招之路結(jié)束了!。
也有讀者經(jīng)常問的計算機基礎知識究竟是指啥?學習順序?推薦書籍?
我公眾號的讀者學生以及非科班的應該挺多的,所以我今天這篇文章就寫一寫,我學過的計算機基礎知識,看過的書以及我學過的順序
當然,以下是我個人的一些經(jīng)驗,并且學過的一些知識,僅供參考,也歡迎大家進行補充,文章涉及的資料文末都會提供。
一、計算機網(wǎng)絡
在我們用的程序中,99% 都離不開網(wǎng)絡,作為一個程序員,我覺得了解計算機網(wǎng)絡是必須的,在大學的課程中,一般也都會開設這一門課。
在我學習這門課之前,我就特別好奇,一臺電腦是怎么把消息發(fā)給另外一臺電腦的呢?例如:
1、兩臺電腦啥線路也沒有相連,怎么就能把消息發(fā)送給他呢?
2、世界上的電腦那么多,咋就能找到那臺特點的電腦呢?有人說我們可以 MAC 或者 IP 來唯一標識啊,可是,我就有點疑惑了,世界那么大,電腦那么多,有了這個標識,我們該怎么找到他呢?遍歷所有電腦?
3、多個程序同時發(fā)消息給一臺電腦,電腦是如何準確把這些消息拿給這些不同程序的呢?
4、發(fā)送的消息丟失了怎么辦?
總之,一大堆疑問,看了計算機網(wǎng)絡之后,才豁然開朗。自己也寫了一篇評價不錯的文章:一文讀懂一臺計算機是如何把數(shù)據(jù)發(fā)送給另一臺計算機的
所以這里,我是強烈建議大家學一下的,在面試中,計算機網(wǎng)絡也是高頻考點,這里我大致總結(jié)一下一些必學協(xié)議以及面試高頻考點:
物理層、鏈路層:
MTU,MAC地址,以太網(wǎng)協(xié)議。
廣播與 ARP 協(xié)議
網(wǎng)絡層
ip 地址分類
IP 地址與 MAC 地址區(qū)別
子網(wǎng)劃分,子網(wǎng)掩碼
ICMP 協(xié)議及其應用
路由尋址
局域網(wǎng),廣域網(wǎng)區(qū)別
傳輸層(主要就是 TCP)
TCP首部報文格式(SYN、ACK、FIN、RST必須知道)
TCP滑動窗口原理,TCP 超時重傳時間選擇
TCP 擁塞控制,TCP 流量控制
TCP 三次握手與四次揮手以及狀態(tài)碼的變化
TCP連接釋放中TIME_WAIT狀態(tài)的作用
SYN 泛洪攻擊
TCP 粘包,心跳包
UDP 如何實現(xiàn)可靠傳輸
UDP 與 TCP 的區(qū)別
UDP 以及 TCP 的應用場景
應用層
DNS 原理以及應用
HTTP 報文格式,HTTP1.0、HTTP1.1、HTTP2.0 之間的區(qū)別
HTTP 請求方法的區(qū)別:GET、HEAD、POST、PUT、DELETE
HTTP 狀態(tài)碼
HTTP 與 HTTPS 的區(qū)別
數(shù)字證書,對稱加密與非對稱加密
cookie與session區(qū)別
輸入一個URL到顯示頁面的流程(越詳細越好,搞明白這個,網(wǎng)絡這塊就差不多了)
上面寫的這些協(xié)議,我覺得是比較重要的,特別是在面試中。之前寫過一個計算機網(wǎng)絡入門教程:別看教材了,帥地熬夜肝了一份計算機網(wǎng)絡極簡入門教程
對于新手推薦視頻:可以看韓老師講的視頻,在嗶哩嗶哩搜索韓老師就可以找到 韓老師講高?!队嬎銠C網(wǎng)絡原理》。
推薦書籍:《計算機網(wǎng)絡:自頂向下》、《圖解http》
我是先看了視頻,在看這兩本書的(文末我會給出電子版)。
二、操作系統(tǒng)
操作系統(tǒng)也是一門非常重要的知識,在面試中也是問的非常多(當然,看公司,有些公司技術(shù)棧是 Java 的,可能問的比較少)。對于操作系統(tǒng),要學的也挺多,例如:
啥是進程,啥是線程,他們的本質(zhì)區(qū)別?我們運行一個程序時,數(shù)據(jù)放在哪里?代碼放在哪里?咋就還要分堆和棧?線程切換時是上下文是啥意思?
虛擬地址是什么鬼東西?線程需要那么多種狀態(tài)干啥子?什么是樂觀鎖、悲觀鎖?死鎖是怎么造成的?解決死鎖的策略有哪些?等等
大致就是如下知識
進程與線程區(qū)別 線程同步的方式:互斥鎖、自旋鎖、讀寫鎖、條件變量 互斥鎖與自旋鎖的底層區(qū)別 孤兒進程與僵尸進程 死鎖及避免 多線程與多進程比較 進程間通信:PIPE、FIFO、消息隊列、信號量、共享內(nèi)存、socket
管道與消息隊列對比
fork進程的底層:讀時共享,寫時復制
線程上下文切換的流程
進程上下文切換的流程
進程的調(diào)度算法
阻塞IO與非阻塞IO
同步與異步的概念
靜態(tài)鏈接與動態(tài)鏈接的過程
虛擬內(nèi)存概念(非常重要)
MMU地址翻譯的具體流程
缺頁處理過程
缺頁置換算法:最久未使用算法、先進先出算法、最佳置換算法
推薦視頻:這個我沒看過視頻,所以想學的,我推薦去中國mooc大學找各大高校的課,也可以去國外找對應的課。
推薦書籍:我看過的書籍是《操作系統(tǒng)—精髓與設計原理(第八版)》,不過大佬們都推薦《深入理解計算機操作系統(tǒng)(原書第三版)》,我看過目錄,感覺還不錯,這里也推薦這一本。不過對于零基礎的,我建議可以先看一本專門給小白看的書:《程序是如何跑起來的》。
操作系統(tǒng)的學習,還是挺枯燥的,不過,只有把最難的啃過去,才能變的更加強大。
三、數(shù)據(jù)庫(這里我用 MySQL)
在大學的課程里,一般都會開設一門數(shù)據(jù)庫的課程,不過這門數(shù)據(jù)庫是沒有針對某一種數(shù)據(jù)庫語言的(例如 MySQL、Oracle)。不過我這里只講 MySQL的學習,別問為什么,問就是我逃了二十分之十九的課。
把MySQL學好,還是特別重要的,千萬不能停留在會用的層面上,而是應該要了解一下原理,特別是對于要面試的同學,會問挺多原理,我每次被問到 MySQL 我都會信心大增。
記得騰訊、shopee面試時,面完 MySQL,面試官好像對我刮目相看了。好了,不吹了,說這些也是強大 MySQL 的重要性。下面就說我學過的一些知識以及推薦的學習資料吧。
對于 MySQL,需要學的還挺多的,例如,
1、一條 sql 語句是如何執(zhí)行的?也就是說,從客戶端執(zhí)行了一條 sql 命令,服務端會進行哪些處理?(例如驗證身份,是否啟用緩存啥的)。
2、索引相關:索引是如何實現(xiàn)的?多種引擎的實現(xiàn)區(qū)別?聚族索引,非聚族索引,二級索引,唯一索引、最左匹配原則等等(非常重要)。
3、事務相關:例如事務的隔離是如何實現(xiàn)的?事務是如何保證原子性?不同的事務看到的數(shù)據(jù)怎么就不一樣了?難道每個事務都拷貝一份視圖?MVCC 的實現(xiàn)原理(重要)等等。
4、各種鎖相關:例如表鎖,行鎖,間隙鎖,共享鎖,排他鎖。這些鎖的出現(xiàn)主要是用來解決哪些問題?(重要)
5、日志相關:redolog,binlog,undolog,這些日志的實現(xiàn)原理,為了解決怎么問題?日志也是非常重要的吧,面試也問的挺多。
6、數(shù)據(jù)庫的主從備份、如何保證數(shù)據(jù)不丟失、如何保證高可用等等。
7、一些故障排查的命令,例如慢查詢,sql 的執(zhí)行計劃,索引統(tǒng)計的刷新等等。
推薦書籍:連 sql 都不會寫的,推薦《SQL必知必會》,接著推薦《MySQL技術(shù)內(nèi)幕:InnoDB存儲引擎》。
四、數(shù)據(jù)結(jié)構(gòu)與算法
數(shù)據(jù)結(jié)構(gòu)與算法,我就不想多說了,看我文章的都知道,,重要性不用說。我秋招最大的優(yōu)勢估計就是數(shù)據(jù)結(jié)構(gòu)與算法的掌握了。
上面三門課程的學習,基本也都是離不開數(shù)據(jù)結(jié)構(gòu)的,對于如何學習數(shù)據(jù)結(jié)構(gòu)與算法,可以看這篇:【方法篇】帥地也學過幾年算法,談一談「如何學好算法」。
五、匯編
我覺得,如何有時間,學習下匯編是必須的,學習了匯編,能夠更好著幫助我們知道計算機是如何處理程序代碼的,例如寄存器和內(nèi)存是如何使用的?循環(huán)、函數(shù)調(diào)用、數(shù)組是如何實現(xiàn)的?地址是怎么一回事?等等。
很多二進制代碼是可以反編譯成匯編的,如何你會匯編,那么可以幫助我們更好著去理解一些東西。所以這里建議大家學習下匯編,并且要動手寫一些程序。
對于匯編的資料,我可能沒啥好推薦的,自己看的不多??催^兩本書,對于入門的,我建議看 王爽的那本書《匯編語言(第三版)》,不過這本只適合入門,如果想繼續(xù),可以看《匯編程序設計》。
六、編譯原理
說實話,編譯原理還挺難,反正我覺得很難,不過有時間我覺得可以學學,學了這個你可以知道我們的編譯器如何分析我們的代碼的,例如詞法分析,語法分析,語義分析等等。當然,你未來可能會自己寫個特定分析代碼的編譯器也不一定,這個時候,就更加需要學了。
對于學習的資料,我覺得可以看視頻 + 書。視頻的話中國 mooc 大學搜索即可,書的話,說時候,我也看的不多,只看過學校指定的教材,所以這里給不了多少建議,自己當當自行搜索,哪本熱門賣哪本勒。
七、計算機組成原理
其實組成原理我覺得也是挺難的,如果你數(shù)字電路學的比較好,可能會稍微簡單一些,記得當時這門課的最后一個任務就是自己做一個 8 位的 CPU,通過做這個 CPU,真的漲了 很多知識。
對于這門課的學習,我覺得重點就是要弄明白整數(shù)啊,浮點數(shù)啊,這些在計算機是如何存儲的,兩個數(shù)相加是如何通過電路的與或門操作的。
個人覺得,跟著學校的課本來就行,不用學的太深入,面試問的也不多。
八、學習順序
個人覺得算法,計算機網(wǎng)絡,操作系統(tǒng)和 MySQL 是剛需,這幾門要先學,如果是大一大二,推薦優(yōu)先學算法,然后計算機網(wǎng)絡,操作系統(tǒng)和數(shù)據(jù)庫這些,也可以并行學習。
至于匯編,編譯原理和計算機組成原理,其實面試考的不多,可以有時間再學,沒時間就先放一放。
總結(jié)
暫時先介紹這么多吧,說實話,學了這些,不單單是多學了一門知識,更重要的是可以提升你的羅輯思維,給你帶來更多的 idea。
然后上面的書籍我也整理好了,但是書籍經(jīng)常百度云失效 + 版權(quán)風險,大家如果需要,可以加我的企業(yè)微信,通過好友請求后,發(fā)送「資源」,會自動拉你進群,之后群公告文檔領取。
記住,好友請求通過后,發(fā)送「資源」兩個字,一定要按照要求來,否則不會拉,為了節(jié)省帥地的時間,大家進去記得看公告,資源都在公告里。
一定要看公告,資料在公告文檔里
一定要看公告,資料在公告文檔里
一定要看公告,資料在公告文檔里
