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