1. 程式人生 > >計算機是怎麼跑起來的?

計算機是怎麼跑起來的?

01

在學習工作中,經常會遇到些讓我腦子短路無法回血的問題?

  • 你去評估下這專案需要幾臺機器能維持穩定性,CPU要幾核,記憶體要多大?
  • X模組偶發出現記憶體飆升的情況,你追查下原因順便想想如何優化?

瞬間,鴉雀無聲甚至氣氛一度及其尷尬。作為一個CURD男孩,寫程式碼就是一把梭複製貼上,那能管那麼寬?仔細一想,我也是學過計算機組成原理、作業系統原理的男孩,豈能說慫就慫?

這時,馮·諾依曼、暫存器、記憶體、二進位制、補碼這些詞忽隱忽現的飄過,就像一堆雜亂無章的思緒擠地鐵一樣擠入我的腦海。然而,我發現這跟上面的問題並沒有絲毫聯絡,放佛我有一把方天畫戟卻切不動一盤菜的感覺,並沒有什麼用。

我相信,大多數同學在熟練編寫業務程式碼後,會在出現一些複雜問題後被委以重任,這就非常考驗大家的基本功了。

於是,我趁疫情在家時間充裕,花了一些時間閱讀書籍和思考,嘗試再去總結下計算機的基礎知識。

02

首先,我先從計算機的三大原則開始說起。

1. 是什麼?計算機是執行輸入、運算、輸出的機器

計算機本質上就是一臺機器,機器的工作模式:接收指令(輸入)、理解指令(運算)、做出動作(輸出)。工作模式很簡單,關鍵是計算機如何理解指令的呢?

舉個例子:在一個陽光明媚的早上,你對你物件說:不去上班行不行?你物件嬌滴滴的回答:不去上班你養我啊?

針對這橋段,你仔細想想你物件腦子裡是怎麼流轉的?

  • 輸入:聲音(漢語)
  • 理解:
    • 接收聲訊號
    • 分析聲訊號是鳥語、英語、日語還是漢語?
    • 從腦庫存(記憶體)中抽取積累的資訊(學習所得),自我翻譯理解
  • 輸出:表情(嬌滴滴) + 聲音(漢語)

其實,計算機也有三大基礎元件。

  • CPU(處理器):負責解釋、執行程式。
  • 記憶體:負責儲存程式和資料。
  • I/O(Input/Output):負責將計算機和外部裝置(周邊裝置)連線在一起。

簡單說,I/O就相當於五官跟大自然連線的器官,記憶體就相當於你的腦庫存(腦知識庫),CPU就相當於你的腦神經中樞。

2. 怎麼交流?計算機只能理解數字

不同人種,不同的生物,有不同的語言。機器也不例外,它也有獨特的語言,你只有跟它說數字才能理解。

你可能質疑道:放屁,我明明在我的瀏覽器用搜索引擎搜尋關鍵字「靚仔」,它給我輸出「博主照片」,它明明可理解中文。

其實,這功勞就要歸功於程式,程式充當了中間翻譯官。比如,我們人類本身是無法識別語言的,有些人上知天文下知地理,而有些人卻只會牛逼和臥槽。這一切,取決於我們的腦庫存的知識,這些知識會把外界的資訊進行翻譯讓大腦能夠理解。

於是,計算機中的記憶體是程式的載體,計算機只能理解數字,那麼程式就必須被翻譯成數字才能在計算機中執行。 程式要想執行起來,它將經歷:程式 -> 編譯(翻譯)-> 機器語言。

這時候,你可能會想:程式到底是什麼東西,能解釋清楚嗎?

3. 程式是什麼?指令和資料的集合

程式就像是我們腦庫存中的知識庫一樣,資料相當於人的記憶,指令相當於人的邏輯。

舉個例子:

例子1: 1 + 1 = 2
1是資料,+運算是指令

例子2:
int i = 1; // 資料
int j = 0; // 資料

// 指令:順序、條件、迴圈
if (i > 0) {
    j = i + i;
} else {
    j = i - i;
}

03

通過敘述,大概解釋清楚了計算機的硬核元件是CPU、記憶體、I/O,程式的硬核內容是資料、指令,程式儲存在記憶體中供CPU讀取執行運算。

那麼,我們用Java、C還是Php寫程式,到底在寫什麼?

本質上,寫程式就是在輸入初始值(申請記憶體),執行運算(順序、條件、迴圈),輸出預期值(寫入記憶體)。

但是,我們知道記憶體是連續的,順序執行是順理成章的被計算機理解,條件/迴圈執行呢?於是,就出現跳轉指令,用於跳轉到指定的程式塊。

基於記憶體約束,資料也就是連續儲存在記憶體中。但是,人類對世界的需求是千奇百怪的,更不是純線性結構的。同時,我們又無法去改變記憶體的結構。

於是,出現了很多的資料結構。

  • 線性:連結串列、堆、棧
  • 樹狀:二叉樹
  • 圖狀:鄰接矩陣、鄰接表、逆鄰接表、十字連結串列

那麼,這些資料結構有什麼用?本質上來說,是為了適應各種運算方式從而找到最優解也就是演算法,我認為「資料結構」是為「演算法」服務的,這樣才能更好的運轉。

簡單說,程式就是「資料 + 指令」線性儲存在記憶體中供CPU調遣,CPU運算就是在執行順序、條件、迴圈的運算邏輯。為了滿足現實世界的訴求,人類為了更好讓機器服務,於是研究出了各種各樣的運演算法則(演算法),演算法需要特殊的儲存結構(資料結構),這樣在現實世界與機器就友好相處了。

04

我們常聽資深程式設計師說:不要去爭執學什麼語言了,學透一門語言,學習其他語言是很容易的?

通過上面分析,你仔細想想學習程式語言的過程?

  • 第一課:資料型別(int、long、char、指標、bool)
  • 第二課:運算子(+-*/)、控制流程(順序、條件、迴圈)
  • 第三課:陣列、結構體、類
  • 第四課:集合
  • 第五課:檔案、網路(I/O)
  • 第六課:併發程式設計(CPU)
  • 第七課:記憶體管理(記憶體)

其實,學習一門程式語言的邏輯是非常簡單的,你想你按這個邏輯去學習一門新程式語言也可以輕鬆上手,主要關注不同語言的差異。

  1. 學習程式基礎結構「資料 + 指令」。於是,先學習資料型別,運算方式、控制流程、陣列、結構體、類。
  2. 為了簡化我們的使用成本,於是必然會有很多可複用的集合「資料結構 + 演算法」,list、map、set一定會與你相遇,只不過是穿什麼大褲衩罷了。
  3. 網路程式設計、檔案處理,就是計算機跟外界接觸的器官,輸入/輸出罷了。
  4. CPU是執行運算的大腦,為了更好的榨乾CPU,那就必然會併發程式設計,至於怎麼並就取決於計算機有幾核。
  5. 記憶體管理就像倉庫管理,你要有進有出。那麼,記憶體你申請了不釋放,必然會出現飆升直到倉庫飽滿掛掉。不同的是,記憶體管理是一項基本工作也是很複雜的事情,不同語言可能會推出自動回收記憶體的機制,也有像C++這種需手動回收的機制。

這樣,我們理清楚了計算機硬體跟我們寫的程式在巨集觀上的一個關係。於是,我們回到最初的問題。

問題1: 你去評估下這專案需要幾臺機器能維持穩定性,CPU要幾核,記憶體要多大?

根據監控峰值QPS,根據不同QPS狀況統計CPU和記憶體的佔用情況,根據實際情況給個折中值就好。

問題2: X模組偶發出現記憶體飆升的情況,你追查下原因順便想想如何優化?

這就是個記憶體管理問題,主要去review記憶體申請和銷燬的程式邏輯,重點看是否有申請不釋放的邏輯,輔之以工具,那就有解決辦法了。

總而言之,有時候並不是碰到的問題的有多難,而是如何去思考定位關鍵問題,輔之以工具,不斷實驗和除錯,最終從根本上解決問題。而不是,鬍子眉毛一把抓,或怒氣衝冠大喊尼瑪狗逼,或驚慌失措叨叨涼了涼了。相信自己,腦子在思考,我們就能贏。

相關推薦

【讀書筆記】計算機是如何起來

tab 循環 隊列 mac 消息 傳遞 tracer 私鑰 表示 記錄一下書中每章我認為的要點。 前言 作者在前言闡述了一個道理,計算機基礎知識的牢固是深入學習和興趣來源的所在。 劃分一個知識範圍-》基礎中的基礎的知識-》設定目標,這些知識可以做什麽 第

計算機是怎樣起來

時間開銷: 共計12h 閱讀+隨手記 181107: 2h 181108: 0.25h+3h 181112: 1h+1.5h+1.5h 小計:9.5h ~ 10h 總結+進階計劃 181112:2h 分章節筆記 00 序言 本書2003年出版,2015年5月譯版第1版 如果僅僅把技術當作一個黑

計算機是怎樣起來的》閱讀筆記

前言 其實不僅是計算機,其他學問亦是如此。首先要劃出一個“知識的範圍”,精通一門學問所必知必會的知識都在這個範圍內。其次是掌握該範圍內每個知識點中“基礎中的基礎知識”。最後是能獨當一面的“目標”,即掌

計算機是怎麼起來的?

01 在學習工作中,經常會遇到些讓我腦子短路無法回血的問題? 你去評估下這專案需要幾臺機器能維持穩定性,CPU要幾核,記憶體要多大? X模組偶發出現記憶體飆升的情況,你追查下原因順便想想如何優化? 瞬間,鴉雀無聲甚至氣氛一度及其尷尬。作為一個CURD男孩,寫程式碼就是一把梭複製貼上,那能管那麼寬?仔細一想

讓我們的LED燈起來

基礎 images ges 結合 log 基本上 很多 出了 網上    相信我們通過前面兩章的討論我們基本上對51單片機的代碼編寫有了一定初步的了解了,所以我們如果還是有很多不懂得的地方我們一定得結合圖片,或者去網上查找一些相關的資料,一定得讓不懂得的地方徹底弄懂,不要讓

如何從github上克隆項目並在自己的機器上起來

img 進行 all github上 分享 ges 項目依賴 瀏覽器 clone 第一步:git clone 項目地址 第二步:在項目目錄內安裝相應的項目依賴包 npm install 第三步:啟動相應的服務 第四步:打開瀏覽器,輸入地址進行訪問,ok 參照github上一

corethink功能模塊探索開發(四)讓這個模塊起來

src 後臺菜單 evel pst 新建 mod depend htm news 讓這個模塊跑起來,太費勁了,多半原因是自己太粗心,opencmf.php中“uid”寫成了“pid”,de了好幾天的bug也沒有搞出來,又加上最近發生了些事(brokenhearted)。。。

讓Kafka在scala裏面起來

時間 all tex 區分 系統變量 factor 命名 zoo.cfg topic Kafka集群對消息的保存是根據Topic進行歸類的,由消息生產者(Producer)和消息消費者(Consumer)組成,另外,每一個Server稱為一個Broker(經紀人)。對於Ka

讓Web應用起來

集成 不能 需要 host 部署 pos http version cnblogs 上一篇我們在基於Maven構建的Java Web項目中編寫了Servlet以及jsp:http://www.cnblogs.com/lay2017/p/8468519.html 本文,我們將

起來JEE論壇、商城和網站的經驗總結

ins 我想 mysq 啟動 cep 安裝 管理 使用 ide 前言:昨天我們老大給我分配了幾個任務,讓我把幾個公司的項目運行起來跑一下,幾個項目都是JEE上開源的,三個項目,一個網站內容系統、一個BBS論壇、一個jspgou商城,這三個都是開源的,倒騰了兩天,今天下午快下

微服務---加入redis配置時候,boot+cloud一起來就報錯

專案依託redis部分的jar包只有這個部分,經過對jar的依賴,報錯資訊的提示,發現缺少了對應的spring-data-redis的jar包。 <dependency> <groupId>org.springframework.boot</groupI

專案本來Run可以起來,debug卻卡著不動

解決方案: 到debug介面,點breakpoints,刪除所有斷點,再執行就可以了。 具體操作步驟  eclipse  >>>  window  >>>  show view  >>

讀書筆記-程式是如何起來的(第二章)

1.由於cpu中的引腳只有兩種狀態,0v或者5v,所以就只有0或1兩種符號來表示計算機的狀態 2.一個位元組=8位二進位制數(位元組是資訊計量的基本單位,位是最小單位) 3.二進位制轉十進位制的換算:各個數位的數值乘以位權再相加

讀書筆記-程式是如何起來的(第一章)

1.機器語言:計算機cpu可以直接識別並且執行的語言 2.程式是一組指令和資料的集合 3.記憶體是儲存命令和資料的場所,通過地址來標記 4.cpu負責的就是解釋和執行最終轉換為機器語言的程式內容 5.cpu內部由暫存器,控制器,運算器

130個微信小程式原始碼demo,拿來就可以起來的小程式

微信小程式未來也將會是個趨勢,在現在這個時代,安卓手機使用者寧願先從微信裡面去搜一下是否有這個軟體,這個軟體是否值得安裝也不願意開啟手機應用商店去下載應用。 其中有以下兩個主要原因: 第一,使用者的惰性警惕性越來越高,現在的手機APP動不動就要獲取使用者的全部許可權,本

Solr學習一(先起來solr)

  一:Solr簡介        Solr是一個獨立的企業級搜尋應用伺服器,它對外提供類似於Web-service的API介面。使用者可以通過http請求,向搜尋引擎伺服器提交一定格式的XML檔案,生成索引;也

程序是怎樣起來

做了 傳統 神奇 信息論 基礎知識 怎麽 能夠 說了 做到 時間開銷: 共計11h,273頁。 閱讀+隨手記 181112: 2h 181113: 2h 181114: 2.5h 181121: 1.5h 181126: 1.5h 181127: 0.5h 小計:10h 總

kafka 在linux ubuntu下起來攻略(不包含解壓之類的)

kafka 跑起來 步驟 首先 剛進來的時候 測試Java的環境是否 正常執行 輸入 Java -version 如果 正常就進行下一步  進入系統許可權 輸入 sudo -i 回車然後 $變為#即為成功 然後下一步 進入 你kafka解壓的目錄 不需要 進入bin目錄 輸入 bin/zo

java 在 centos7 上起來 集成了 zookeeper 的kafka 教程

首先 剛進來的時候 測試Java的環境是否 正常執行 輸入 Java -version 如果 正常就進行下一步  進入系統許可權 輸入 sudo -i 回車然後 $變為#即為成功 然後下一步 進入 你kafka解壓的目錄 不需要 進入bin目錄 輸入 bin/zookeeper-serve

Qt讓桌面圖示起來

效果如下: 實現要關注以下幾點 WindowsAPI——如何獲取桌面圖示個數 WindowsAPI——如何獲取桌面解析度 WindowsAPI——如何設定每個圖示的位置 WindowsAP