1. 程式人生 > >計算機原理學習(1)

計算機原理學習(1)

序言

又有兩年沒有寫Blog了, 這2年從做windows phone 到 Android C++, 慢慢的很多觀念也有所改變了。以前一心想做C#相關的工作,現在卻感覺,什麼語言都無所謂了。公司專案挺忙,加班比較多,不忙的時候又想休息休息。 所以blog又荒廢了好久。也很少有時間早學習, 加上年紀越來越大,學習動力和熱情也越來越小了。最近一個月不是特別忙,抽空看了看《深入理解計算機系統》、《程式設計師的自我修養》、《現代作業系統》三本書,然後順帶看了看編譯,彙編相關的知識, 也在網上查了不少資料。突然發現好多東西其實是大學裡都學過,這也算是工作6年對以前知識的一個總體的複習吧。在不同時期看相同的書,總會有不同的收穫。

對於一個應用層的開發者來說,不瞭解CPU是如何工作的,記憶體是如何佈局的,多程序是怎麼實現的並不會影響他寫出好的應用程式。就好像一個武術演員,不懂九陽神功一樣可以拍出很好的動作電影。但是看了那麼多武俠劇,那些路人甲,宋兵乙為什麼總是被大俠們狂虐?原因很簡單,他們木有內功。套路只是一方面,拼的還是內功啊。大俠們內功那裡來的?不是武二代就是出師名門,說白了還是看背景而不是背影。這種東西不是隨便教的,當然也不是誰都能學會的。恩,有點扯遠了。對於我們來說,這些知識就是我們要學習的計算機內功的一部分。雖然這些知識並不能交我們怎麼寫一個Android APP,也不能幫我們學習Web開發,就好像虛竹有了內功不會招式也是沒用的,所以要內外兼修。對於我們這些已經掌握了招式的宋兵乙來說,在沒有乾爹的情況下,就只能靠自己來修煉內功了。不奢求稱為大俠,只求3招內不被打倒。

對於計算機專業畢業的人來說,後面大部分都是學校都學過,從純硬體的類比電路,數位電路,到軟硬體相關的計算機組成原理,計算機體系結構,再就是最底層的作業系統,編譯原理,彙編,C語言,到上層存軟體的開發語言。但是很多人都覺得是枯燥的理論知識,實際這真是挺有用的東西。但是工作後基本不會接觸,所以都忘記的差不多了,看下書一段時間又忘記了,所以這次決定寫下來,算是學習筆記,也算是為一些朋友提供一個參考。

但是對於這些知識,我也純粹是一個現學現賣的理論派,我可以給你介紹一些基本的彙編命令。你就不要為難我要我用匯編寫個完整程式;我可以說說Linux裝置驅動結構,你克別要我給你的自行車也寫個驅動。 所謂術業有專攻,我們不是為了能去做硬體,寫彙編,寫驅動,所以也不要奇怪為什麼我有時還會看看Linux驅動開發的書,我可能也就是隨便翻翻,找想了解的重點看,可能1天就看完了。我們學習這個只是為了瞭解相關的知識和原理,幫助我們更好的做開發。有一層的九陽神功足以保命了,練得太多小心走火入魔。大笑

問題

作為一個IT工程師,用現在流行的話來說,這也是個高階大氣上檔次的工作。但是你是否真的瞭解你每天都在用的計算機,你又是否真的瞭解你自己寫的程式呢?當一個人問你計算機是怎麼工作的時候,你會不會一臉茫然的想,我怎麼從來沒想過這個問題?

  1. 我們的程式碼是如何被編譯成可執行檔案的?
  2. 程式是如何被CPU執行的?
  3. 程序和執行緒到底是什麼東西?
  4. CPU的指令和組合語言和程式庫和開發語言有什麼關係?
  5. 為什麼系統可以同時執行多個程式,是如何做到的?
  6. .NET的編譯出來的是託管程式碼,和C++的Native程式碼執行有區別嗎?
  7. 為什麼我new了1G的記憶體空間,實際記憶體卻沒變化?

如果你能很確定的回答這些問題,那麼我有不懂的問題就應該可以向你請教了。那也麻煩你幫我找找文章中的錯誤。如果你不太清楚甚至是完全說不清,那我們就一起來學習學習。

大綱

這個系列是介紹計算機的原理,主要涉及的是軟體方面的,硬體原理只會簡單的從體系結構方面進行介紹。每一個點都不會特別深入,一方面是沒這個能力,另一方面是沒必要,因為每一個點可能都是厚厚的一本書。而且對於我這種基本和應用程式打交道的碼農來說,這個程度的瞭解也是比較合適的。整個學習過程也就是看書,查資料,再重新看書,再查資料,最後總結。裡面也會結合自己有點一點點經驗,把比較零散的點結合起來方便理解。 文章裡肯定會存在很多錯誤,希望可以指出來。

另外我把有讀到相關的書列出來:

  • 《深入理解計算機系統》– 這是外國大學的教材,可以多花點時間看,總體理解計算機體系結構和原理
  • 《現代作業系統》 – 挺不錯,幫助理解作業系統運作方式
  • 《Linux核心設計與實現》–《linux kernel development》簡稱lkd ,先大概看一遍,很多地方不懂,學習了其他在重新看
  • 《程式設計師的自我修養》 – 相當好的一本書,主要介紹程式編譯和載入,瞭解程式到底怎麼開始執行
  • 《Windows核心程式設計》 – 《Windows Programming》 以前看過2遍了,看過了lkd,準備再看一邊進行對比
  • 《80x86組合語言程式設計教程》 – 回一下定址方式,暫存器的作用
  • 《Linux裝置驅動開發詳解》 – 大概瀏覽了幾章,還不錯,雖然沒做個 ,但是比較容易懂
  • 《Android核心剖析》 – 最近剛開始看,和這裡寫的東西可能沒太大關係,而且偏Framework層
  • 網上搜索的文章,論壇,部落格等等….

還有一些沒讀的

  • 《計算機程式的構造與解釋》– 看了下目錄,有空再隨便翻翻
  • 《深入理解Linux核心》 –《understading the linux kernel》簡稱utlk ,很經典的一本書,相對於lkd更加深入
  • 《Linux裝置驅動程式》–《linux device drivers》簡稱ldd ,驅動開發,可以大概瞭解下
  • 《深入分析linux核心原始碼》 – 需要結合原始碼比較好吧,不一定會去看了
  • 《深入解析Windows作業系統》 – 《Microsoft Windows Internals》和Linux的對照著看看
  • 《ARM體系結構與程式設計》– X86弄完後瞭解下ARM架構,估計不太看得懂

主要是Linux相關的書比較多,但是後續文章中一些內容都是比較通用的,有些地方會寫出Windows和Linux的差異。其中ldd,lkd,utk三本經常看到論壇大神回答問題是說你看那看utk那裡那裡就知道了,我後來搜尋發現我也看了2本了,雖然只是瞭解性的看了看。偷笑

計算機原理學習(8)– 程序的記憶體對映和記憶體共享

計算機原理學習(9)– 可執行檔案的編譯和結構

計算機原理學習(10)– 可執行檔案的載入和執行

計算機原理學習(11)– 程序的記憶體佈局

(TBD) 2014.4.26 Update



相關推薦

(轉)計算機原理學習1-- 馮諾依曼體系和CPU工作原理

原文:https://blog.csdn.net/cc_net/article/details/10419645 對於我們80後來說,最早接觸計算機應該是在95年左右,那個時候最流行的一個詞語是多媒體。 依舊記得當時在同學家看同學輸入幾個DOS命令就成功的打開了一個遊戲,當時實在是佩服的五體投地。因為對我來

計算機原理學習1

序言 又有兩年沒有寫Blog了, 這2年從做windows phone 到 Android C++, 慢慢的很多觀念也有所改變了。以前一心想做C#相關的工作,現在卻感覺,什麼語言都無所謂了。公司專案挺忙,加班比較多,不忙的時候又想休息休息。 所以blog又荒廢了好久。也很少有時間早學習, 加上年紀越來

計算機原理學習1-- 馮諾依曼體系和CPU工作原理

前言 對於我們80後來說,最早接觸計算機應該是在95年左右,那個時候最流行的一個詞語是多媒體。 依舊記得當時在同學家看同學輸入幾個DOS命令就成功的打開了一個遊戲,當時實在是佩服的五體投地。因為對我來說,螢幕上的東西簡直就是天書。有了計算機我們生活發生了巨大的變化,打遊

計算機原理學習

序言 又有兩年沒有寫Blog了, 這2年從做windows phone 到 Android C++, 慢慢的很多觀念也有所改變了。以前一心想做C#相關的工作,現在卻感覺,什麼語言都無所謂了。公司專案挺忙,加班比較多,不忙的時候又想休息休息。 所以blog又荒廢了

Hadoop 原理學習1Hadoop 各服務的作用簡述

注:以下服務為基於安裝Hadoop 2.6.0-cdh5.8.3後的所得服務,但並不是全部。 1. HDFS NameNode NameNode是一箇中心伺服器,負責管理檔案系統的namespace以及客戶端對檔案的訪問。 NameNode執行檔

深入理解計算機系統學習1

原始檔:0, 1 組成每行以一個看不見的’\n’結尾, 執行一個原始檔分四個階段:預處理, 編譯,彙編,連線 .i 檔案:.c檔案預處理後生成 .ii檔案: .cpp檔案預處理後生成 預處理階段:前處理器(cpp)根據以#開頭的命

計算機原理學習6-- x86-32 CPU和記憶體管理之分頁管理

前言 上一篇我們瞭解了x86-16 CPU計算機的記憶體訪問方式,定址方式,以及基於MS-DOS的應用程式的記憶體佈局。這一篇會主要介紹32位處理器的記憶體訪問,記憶體管理以及應用程式的記憶體佈局。雖然目前64位CPU已經非常普及了,不過相對於32位的記憶體管理方式並沒

計算機原理學習5-- x86-16 CPU和記憶體管理

前言 前面我們已經瞭解了計算機硬體的工作原理,以及作業系統的發展。我們知道是記憶體把計算機硬體和軟體聯絡了起來。不誇張的說,瞭解了軟體在記憶體中的結構,就基本瞭解了程式最底層的執行原理。所以從這一篇開始,將深入的討論計算機中記憶體管理和佈局。記憶體的管理同計算機硬體以及

OpenCV計算機視覺學習1——影象基本操作影象視訊讀取,ROI區域擷取,常用cv函式解釋

1,計算機眼中的影象   我們開啟經典的 Lena圖片,看看計算機是如何看待圖片的:    我們點選圖中的一個小格子,發現計算機會將其分為R,G,B三種通道。每個通道分別由一堆0~256之間的數字組成,那OpenCV如何讀取,處理圖片呢,我們下面詳細學習。 2,影象的載入,顯示和儲存   我們看

計算機軟體技術基礎的學習1:資料結構

本文為大三下學習《計算機軟體技術基礎》的知識點一、------------資料結構:研究非數值運算(資料元素之間的關係)的程式設計------------------------------------(1)線性表:            順序儲存和鏈式儲存         

安卓Dalvik虛擬機器學習1----Dalvik虛擬機器執行原理

安卓Dalvik虛擬機器相關知識點總結 0x01 Java虛擬機器與Dalvik虛擬機器的區別 Java虛擬機器執行的是Java位元組碼(儲存在class檔案中),Dalvik執行的是Dalvik位元組碼(由Java位元組碼轉化而來,打包到DEX檔案中

redis學習1--- NoSQL介紹

redis學習 模型 width 快速查詢 init 文件 borde 處理 only 一、NoSQL介紹 1、什麽是NoSQL NoSQL = Not Only SQL 非關系型數據庫 2、為什麽用NoSQL High performance - 高

ArcGIS API for JavaScript學習1:第一個地圖

樣式表 參數 資源 charset 底層 arcgis 順序 api navi 1.簡介 ArcGIS API for JavaScript跟隨ArcGIS 9.3同時發布,是ESRI根據JavaScript技術實現的調用ArcGIS Server REST API接口的一

Linux學習1

linux開始學習Linux了,希望能學有所成————測試中本文出自 “Linux學習” 博客,請務必保留此出處http://mmchy.blog.51cto.com/13044974/1941714Linux學習(1)

facets學習1:什麽是facets

遺失 air 不同的 無縫切換 over 快速 後來 樣式 觀察 ML 數據集可以包含數億個數據點,每個數據點由數百(甚至數千)的特征組成,幾乎不可能以直觀的方式了解整個數據集。為幫助理解、分析和調試 ML 數據集,谷歌開源了 Facets,一款可視化工具。 Facets

C++學習1:最大子段和多種解法

多少 問題: code namespace 數據 組成 amp using () 問題:給定由n個數(可能為負數)組成的序列a1,a2,a3,...,an,求該序列子段和的最大值。 第一種解法:(最容易考慮的方法,將所有的子段一一相加,然後比較) 1 #include&

嵌入式開發學習1<ARM體系結構>

特點 如何 現在 訪問 任務 物聯網 嵌入 專用 arm1 SoC : 在cpu 裏內嵌了很多外設,現在所說的cpu 實際上都是SoC。 32位cpu指的是數據總線是32位的。 32位的地址總線尋址範圍是4G。2的32次方。 CISC complex instruction

IDEA 學習筆記之 Java項目開發深入學習1

java項目 bsp 重構 str 代碼提示 log pan ora tro Java項目開發深入學習(1): 定義編譯輸出路徑: 繼承以上工程配置 重新定義新的項目編譯路徑 添加source目錄:點擊添加,再點擊移除: 編譯項目: 常用快捷鍵總結: Ctr

nodejs學習1

管理工具 cti 分享 環境 scrip alt world 命令提示符 true 1.安裝:可以在http://nodejs.org/dist/下載nodejs的所有版本,我在裏面下載了node-v8.9.0-x64.msi,安裝完成,在命令提示符中輸入“node --v

Win10下Docker學習1安裝

ner table 組成 高效率 down 提高 打開 cpu 其他人 Docker簡介 Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,