當前位置:編程學習大全網 - 編程語言 - 計算機基礎知識都包括哪些?

計算機基礎知識都包括哪些?

基礎知識重要,但是具體來說,哪些點重要呢?

今天我就試圖總結壹下,也歡迎大家補充。

信息的表示和處理

計算機如何表示整數:有符號數和無符號數,尤其是如何用補碼表示負數,數字的取值範圍。

計算機如何表示浮點數,為什麽小數的二進制表示法只能近似表示十進制小數。

數值的轉換、移位

這幾點非常重要,因為幾乎所有的編程語言都有數據類型,而最基本數據類型必然包括整數和浮點數。

搞不清這些表示和運算,在編程中就會遇到壹些稀奇古怪的問題。

從匯編層面理解程序的執行

順序、分支、循環、函數調用、數組、結構體等在匯編層面是怎麽實現的,寄存器和內存是怎麽使用的。

理解了這些其實也就理解了馮諾依曼計算機體系結構,這是計算機學科壹個基礎性的東西。

知道程序在底層是怎麽運轉的, 對於學習各種虛擬機有很大的幫助,比如JVM,它要解析執行的是字節碼,字節碼本質上要表達的就是這些東西,只不過有所擴展。

理解了棧幀,就能理解函數調用的本質,遞歸,以及尾遞歸的實現。還有安全相關的概念,如緩沖區溢出這個臭名卓著的漏洞及其防範辦法。

進程和線程

程序員必備的知識,不了解這個,簡直是無法編程。

需要掌握進程的地址空間,代碼在哪裏,堆在哪裏,棧在哪裏。

要準確理解進程和線程之間的關系,為什麽說進程是擁有資源的基本單位, 線程是CPU調度的基本單位?

進程切換和線程切換之間的區別和聯系。

他們是如何創建,執行,有哪些狀態,狀態之間的轉換。 由此會涉及到並發和並行,線程之間的競爭和合作。

鎖的本質(硬件層面),樂觀鎖,悲觀鎖,死鎖等問題。

線程的實現方式,用戶級線程和內核級線程的對應方式。

在編程的過程中,有些知識點會直接使用,如多線程編程,鎖。 還有壹些概念能用到很多地方,例如CAS,不僅僅是編程語言的概念,還能在更新數據庫時使用。再比如妳理解了線程的實現方式,迅速就能掌握go語言中並發的手段:goroutine。

存儲器的層次結構

Tomcat用了多線程執行請求,Redis用了單線程來處理請求,Node.js也用了單線程來,這是為什麽? 秘密都在存儲器的層次結構。

人類制造的計算機設備之間有著巨大的速度差異:

總之,CPU超級快,內存比較快,硬盤非常慢,網絡更慢, 這個速度差異是IT行業的壹個核心問題,人類想了很多辦法試圖去彌補這個差異:多線程,緩存,異步,多路復用,硬件層面的DMA。

記著下面這張圖,每當妳遇到某個軟件的特性的時候,想壹想和它有什麽關系:

數據結構和算法

它的重要性我羅嗦過很多次了,不用再重復了, 我就舉個最簡單的例子: 理解了B+ Tree才能理解MySQL的InnoDB的索引,理解了索引才能更好地優化查詢,對吧?

計算機網絡

現在的程序基本上都是網絡程序, 所以這也是壹個必備的基礎知識,學習計算機網絡的壹大好處就是和工作直接相關,能直接使用,比較有動力。

HTTP協議肯定跑不掉,TCP,UDP也得會,尤其是TCP可靠傳輸的原理:如何在壹個不可靠的網絡中進行可靠的傳輸, 這是無數前輩總結的經驗,壹定得掌握。

要理解什麽是通信協議,也許某壹天妳自己就需要定制壹個協議來傳輸數據。

分組交換是什麽意思? 協議分層的本質是什麽? 什麽叫無狀態的協議?

Socket相關的編程更是重點,尤其是涉及到服務器端高並發的時候,如何維持和處理這些海量的socket, epoll等技術就得上場了。

還有非常重要的HTTPs的基本原理,也是網絡安全的精華所在:對稱加密,非對稱加密,消息摘要,數字證書,中間人攻擊。

數據庫

不多說,關系模型、範式、SQL、索引、事務等知識都得掌握,尤其是要了解他們的實現方式。

分布式的基礎知識

這些已經偏向應用層面了,但是現在很多系統都是分布式的了,分布式就變成了壹種基礎知識。

系統通信:RPC, 消息隊列等

負載均衡的原理

CAP原理,BASE原理,冪等性,壹致性模型(強壹致性,最終壹致性.....)和相關協議(兩階段提交,Raft,Paxos......)

數據分片:取模算法,壹致性Hash,虛擬桶

基本的設計思想

下面這幾種設計思想對我影響很大,需要大家特別註意。但是掌握起來卻很不容易,需要在實踐中不斷地體會:

正交:各個概念之間可以獨立變化

抽象:拋棄細節,找到本質和***性

《深入理解計算機系統》壹書中提到:“指令集是對CPU的抽象, 文件是對輸入/輸出設備的抽象, 虛擬存儲器是對程序存儲的抽象, 進程是對壹個正在運行的程序的抽象, 而虛擬機是對整個計算機(包括操作系統、處理器和程序)的抽象。 如果妳對這句話透徹理解了,說明對計算機系統的認識已經很深刻了。

分層:我只想和我的鄰居打交道, 如網絡協議,Web應用開發。

分而治之:大事化小,小事化了,架構設計必備。

關鍵點來了,怎麽學習呢?

我原來的方式是先看書,看了很多書,數據結構,操作系統,匯編,網絡...... 這種辦法的最大問題就是枯燥(嗯,那時候還沒有碼農翻身這樣用故事講解技術的文章)。

理論多,實踐少,很多知識點體會不深, 等到參與的項目多了,Coding多了,這些知識點才慢慢地鮮活起來。

壹種更加有效的辦法是從工作中用到的知識點出發,從這個知識點向外擴展,由點到線,由線到面,然後讓各個層次都連接起來,形成壹個立體的網絡。

切記,學習是壹個螺旋上升的過程,想要上升就得深度思考,多問幾個為什麽。

比如工作中用到了Redis,妳在學習過程中發現這個Redis用了單線程來處理讀寫請求,為什麽要這麽做? 對於成千上萬的請求它是如何處理的? 然後再聯想壹下別的軟件:Tomcat為什麽不這麽幹? 想回答這些問題,需要發掘很多基礎知識。

這樣做的次數多了,積累到壹定程度,量變就會引起質變,整個系統就被妳看透了,妳的知識又擴大了壹圈,更多的疑問出現了......

  • 上一篇:音頻開發篇壹
  • 下一篇:真人CS大戰作文
  • copyright 2024編程學習大全網