'編程基礎:高級編程需要了解的計算機組織結構與內存基礎'

"
"
編程基礎:高級編程需要了解的計算機組織結構與內存基礎

編程基礎

程序就是我們人類編寫的一連串的指令集合來告訴計算機如何去做某件事,要想編寫出好的程序,必須對我們要發號施令對象有所瞭解才行。

知己知彼嘛,所以在學習編程之前,瞭解計算機到底是個什麼,它內部大體是個什麼模樣,它是如何去執行我們給它的程序的非常有必要。

當然,如果你只想做個機械翻譯式的碼農,完全不需要了解這些,只學會編程語言的語法,就可以幹了,有些人也會幹的不錯。

但是對於編程對象的不瞭解,終究還會是一個進一步前進的阻礙,所以我還是想帶大家來了解一下編程跟硬件之間的關係,以助於我們更好的去理解各類編程語言的設計基礎和操作原理。不說廢話了,我們先出計算機體系結構這個基礎概念說起吧。

計算機組織結構:

組裝過電腦的同學可能都知道,我們可以買一堆的零部件然後自己來組裝一天台式電腦,其實對於計算機來說在更內部的層級上也是一個分開設計的產物。

因為從內到外計算機從來都不是一個單一的元器件,而是一組元器件相連接構成的計算機系統。系統就意味著有多個獨立的部分一聯合成的一個整體。

對於計算機系統發展來說,一直以來一個很重要的方向就是先假定它的各個部件都以做好,任務是研究它的組織結構,設計一些連接方式和組成架構,然後驗證計算機部件是否按預期運行,這就是計算機體系結構要做的事。

因此計算機體系結構研究只關注的是我們用戶所看到的計算機的結構和行為。

它包括用於我們如何從內存空間中找到信息,以及這些信息的格式,我們操作這些內容需要的指令集合和相關的技術方案。

要想有一個好的計算機,我們需要像搭積木一樣去不斷的設計,然後實踐測試,這個過程主要涉及到處理器和存儲器等各種功能模塊的規範,

找到一個最佳的方案來將它們組合成計算機系統

說了這麼多背景,其實就像想說明一點,計算機可以有很多架構類型,只要你能設計的出來。

不過目前來說,計算機架構設計中主流的只有兩種基本類型:馮·諾伊曼結構哈佛結構

因為現在絕大部分主流計算機都採用了馮·諾依曼體系結構設計,所以我們想學編程必須對它有一定的瞭解。

因為它描述了計算機硬件、程序和數據應該遵循的一般框架或結構。

馮諾依曼結構體系:

簡單來說,馮·諾依曼設想計算機系統的結構是由下列組件組成:

  • 算術邏輯單元(ALU):執行計算機的計算和邏輯功能的算術邏輯單元。
  • 隨機存取存儲器(RAM):內存,更具體地說,計算機的主存儲器,或快速存儲器,也 稱為隨機存取存儲器(RAM)。
  • 控制器單元(CU):這是一個組件,它負責指示計算機的其他組件執行某些操作,比如指示從內存中提取數據或指令交給ALU來處理。
  • 人機接口(I/O): 我們常說的輸入和輸出設備,比如鍵盤用於輸入和顯示器用於輸出。

我們的臺式機就是一個典型的馮諾依曼體系結構的計算機。

"
編程基礎:高級編程需要了解的計算機組織結構與內存基礎

編程基礎

程序就是我們人類編寫的一連串的指令集合來告訴計算機如何去做某件事,要想編寫出好的程序,必須對我們要發號施令對象有所瞭解才行。

知己知彼嘛,所以在學習編程之前,瞭解計算機到底是個什麼,它內部大體是個什麼模樣,它是如何去執行我們給它的程序的非常有必要。

當然,如果你只想做個機械翻譯式的碼農,完全不需要了解這些,只學會編程語言的語法,就可以幹了,有些人也會幹的不錯。

但是對於編程對象的不瞭解,終究還會是一個進一步前進的阻礙,所以我還是想帶大家來了解一下編程跟硬件之間的關係,以助於我們更好的去理解各類編程語言的設計基礎和操作原理。不說廢話了,我們先出計算機體系結構這個基礎概念說起吧。

計算機組織結構:

組裝過電腦的同學可能都知道,我們可以買一堆的零部件然後自己來組裝一天台式電腦,其實對於計算機來說在更內部的層級上也是一個分開設計的產物。

因為從內到外計算機從來都不是一個單一的元器件,而是一組元器件相連接構成的計算機系統。系統就意味著有多個獨立的部分一聯合成的一個整體。

對於計算機系統發展來說,一直以來一個很重要的方向就是先假定它的各個部件都以做好,任務是研究它的組織結構,設計一些連接方式和組成架構,然後驗證計算機部件是否按預期運行,這就是計算機體系結構要做的事。

因此計算機體系結構研究只關注的是我們用戶所看到的計算機的結構和行為。

它包括用於我們如何從內存空間中找到信息,以及這些信息的格式,我們操作這些內容需要的指令集合和相關的技術方案。

要想有一個好的計算機,我們需要像搭積木一樣去不斷的設計,然後實踐測試,這個過程主要涉及到處理器和存儲器等各種功能模塊的規範,

找到一個最佳的方案來將它們組合成計算機系統

說了這麼多背景,其實就像想說明一點,計算機可以有很多架構類型,只要你能設計的出來。

不過目前來說,計算機架構設計中主流的只有兩種基本類型:馮·諾伊曼結構哈佛結構

因為現在絕大部分主流計算機都採用了馮·諾依曼體系結構設計,所以我們想學編程必須對它有一定的瞭解。

因為它描述了計算機硬件、程序和數據應該遵循的一般框架或結構。

馮諾依曼結構體系:

簡單來說,馮·諾依曼設想計算機系統的結構是由下列組件組成:

  • 算術邏輯單元(ALU):執行計算機的計算和邏輯功能的算術邏輯單元。
  • 隨機存取存儲器(RAM):內存,更具體地說,計算機的主存儲器,或快速存儲器,也 稱為隨機存取存儲器(RAM)。
  • 控制器單元(CU):這是一個組件,它負責指示計算機的其他組件執行某些操作,比如指示從內存中提取數據或指令交給ALU來處理。
  • 人機接口(I/O): 我們常說的輸入和輸出設備,比如鍵盤用於輸入和顯示器用於輸出。

我們的臺式機就是一個典型的馮諾依曼體系結構的計算機。

編程基礎:高級編程需要了解的計算機組織結構與內存基礎

圖片來源於網絡

哈佛結構體系:

而對於哈佛體系結構來說,它與馮諾依曼體系結構不同的地方是它使用了獨立的存儲和信號通路來處理指令和數據。

因為它最早在哈佛大學的Mark I和中繼鎖存器數據中被採用,所以叫做哈佛體系結構。

在採用哈佛架構的計算機中,CPU可以同時從內存中讀取指令和數據,這使得使內存帶寬有加倍的效果。

基於微控制器單片機的計算機系統和基於數字信號處理器(DSP)的計算機系統都是採用了哈佛體系結構的例子。

其實,我們現在用的主流計算機組織結構是馮諾依曼結構,其中跟我們編程關係最密切的就是內存,所以我們先說一下內存單元部分。

計算機內存單元:

因為內存就是一塊塊可以存儲的空間,我們邏輯上將其劃分為一塊塊同樣的磚塊一樣的單元,本身是一整塊,我們劃分了單元,所以排序是不變的,

如此我們可以設定起始位置,沿著某個方向移動的單位,偏移量,以及當前位置,最大位置,都用下標標記,連續的區域我們可以把它看成一個數學裡數組,不連續的可以用每個區域保存數據同時保存一個位置信息變成鏈塊,多個散列的鏈塊通過左右位置信息就有了邏輯上的順序,構成鏈表等等。

這些其實都是在一個固定的內存空間中進行的一種空間的邏輯操作。

接下來我們先說一下計算機內存單元體系,那什麼是內存單元呢? 簡單理解它就是計算機裡一個負責存儲東西的地方,這個地方一個體系,它有空間放東西,還有負責將東西搬入搬出的通路,合在一起才是內存體系。

因為它是個固定尺寸的空間,但是有需要被很多應用程序共享使用,所以必須好好的管理調配才可以。

為了直觀理解,我們可以把它想象成可以連通的儲物櫃,我們一次可以操作一個,也可以操作連載一塊的多個,我們可以在多個儲物櫃之間想東西搬來搬去,我們預訂它們,也可以清空它們。

如果我們要知道儲物櫃能裝多少東西,首先得有計量單位。

"
編程基礎:高級編程需要了解的計算機組織結構與內存基礎

編程基礎

程序就是我們人類編寫的一連串的指令集合來告訴計算機如何去做某件事,要想編寫出好的程序,必須對我們要發號施令對象有所瞭解才行。

知己知彼嘛,所以在學習編程之前,瞭解計算機到底是個什麼,它內部大體是個什麼模樣,它是如何去執行我們給它的程序的非常有必要。

當然,如果你只想做個機械翻譯式的碼農,完全不需要了解這些,只學會編程語言的語法,就可以幹了,有些人也會幹的不錯。

但是對於編程對象的不瞭解,終究還會是一個進一步前進的阻礙,所以我還是想帶大家來了解一下編程跟硬件之間的關係,以助於我們更好的去理解各類編程語言的設計基礎和操作原理。不說廢話了,我們先出計算機體系結構這個基礎概念說起吧。

計算機組織結構:

組裝過電腦的同學可能都知道,我們可以買一堆的零部件然後自己來組裝一天台式電腦,其實對於計算機來說在更內部的層級上也是一個分開設計的產物。

因為從內到外計算機從來都不是一個單一的元器件,而是一組元器件相連接構成的計算機系統。系統就意味著有多個獨立的部分一聯合成的一個整體。

對於計算機系統發展來說,一直以來一個很重要的方向就是先假定它的各個部件都以做好,任務是研究它的組織結構,設計一些連接方式和組成架構,然後驗證計算機部件是否按預期運行,這就是計算機體系結構要做的事。

因此計算機體系結構研究只關注的是我們用戶所看到的計算機的結構和行為。

它包括用於我們如何從內存空間中找到信息,以及這些信息的格式,我們操作這些內容需要的指令集合和相關的技術方案。

要想有一個好的計算機,我們需要像搭積木一樣去不斷的設計,然後實踐測試,這個過程主要涉及到處理器和存儲器等各種功能模塊的規範,

找到一個最佳的方案來將它們組合成計算機系統

說了這麼多背景,其實就像想說明一點,計算機可以有很多架構類型,只要你能設計的出來。

不過目前來說,計算機架構設計中主流的只有兩種基本類型:馮·諾伊曼結構哈佛結構

因為現在絕大部分主流計算機都採用了馮·諾依曼體系結構設計,所以我們想學編程必須對它有一定的瞭解。

因為它描述了計算機硬件、程序和數據應該遵循的一般框架或結構。

馮諾依曼結構體系:

簡單來說,馮·諾依曼設想計算機系統的結構是由下列組件組成:

  • 算術邏輯單元(ALU):執行計算機的計算和邏輯功能的算術邏輯單元。
  • 隨機存取存儲器(RAM):內存,更具體地說,計算機的主存儲器,或快速存儲器,也 稱為隨機存取存儲器(RAM)。
  • 控制器單元(CU):這是一個組件,它負責指示計算機的其他組件執行某些操作,比如指示從內存中提取數據或指令交給ALU來處理。
  • 人機接口(I/O): 我們常說的輸入和輸出設備,比如鍵盤用於輸入和顯示器用於輸出。

我們的臺式機就是一個典型的馮諾依曼體系結構的計算機。

編程基礎:高級編程需要了解的計算機組織結構與內存基礎

圖片來源於網絡

哈佛結構體系:

而對於哈佛體系結構來說,它與馮諾依曼體系結構不同的地方是它使用了獨立的存儲和信號通路來處理指令和數據。

因為它最早在哈佛大學的Mark I和中繼鎖存器數據中被採用,所以叫做哈佛體系結構。

在採用哈佛架構的計算機中,CPU可以同時從內存中讀取指令和數據,這使得使內存帶寬有加倍的效果。

基於微控制器單片機的計算機系統和基於數字信號處理器(DSP)的計算機系統都是採用了哈佛體系結構的例子。

其實,我們現在用的主流計算機組織結構是馮諾依曼結構,其中跟我們編程關係最密切的就是內存,所以我們先說一下內存單元部分。

計算機內存單元:

因為內存就是一塊塊可以存儲的空間,我們邏輯上將其劃分為一塊塊同樣的磚塊一樣的單元,本身是一整塊,我們劃分了單元,所以排序是不變的,

如此我們可以設定起始位置,沿著某個方向移動的單位,偏移量,以及當前位置,最大位置,都用下標標記,連續的區域我們可以把它看成一個數學裡數組,不連續的可以用每個區域保存數據同時保存一個位置信息變成鏈塊,多個散列的鏈塊通過左右位置信息就有了邏輯上的順序,構成鏈表等等。

這些其實都是在一個固定的內存空間中進行的一種空間的邏輯操作。

接下來我們先說一下計算機內存單元體系,那什麼是內存單元呢? 簡單理解它就是計算機裡一個負責存儲東西的地方,這個地方一個體系,它有空間放東西,還有負責將東西搬入搬出的通路,合在一起才是內存體系。

因為它是個固定尺寸的空間,但是有需要被很多應用程序共享使用,所以必須好好的管理調配才可以。

為了直觀理解,我們可以把它想象成可以連通的儲物櫃,我們一次可以操作一個,也可以操作連載一塊的多個,我們可以在多個儲物櫃之間想東西搬來搬去,我們預訂它們,也可以清空它們。

如果我們要知道儲物櫃能裝多少東西,首先得有計量單位。

編程基礎:高級編程需要了解的計算機組織結構與內存基礎

儲物櫃與內存空間

內存的計量單位

我們知道在計算機內存裡它只能保存二進制信息,也就是0和1,成比特位組,這些一組組的比特位就是內存單位:

可以將它理解成多個比特位封裝成的實體。一個比特位的小箱子,每次從內存空間中搬入和搬出的單位,它可大可小,只取決於我們要定義的數據最小單位。

一個內存字就是一組0和1組合,它可能代表一個數字,一個操作指令代碼,一個或多個字母數字字符或者任何其他的二進制編碼信息。

由於我們的二進制表示的數據都是2的倍數位,所以我們一般取8比特位作為一組,我們稱之為一個字節(byte)。

大多數計算機內存使用的字的比特數是8的倍數,也就是多少字節。

因此,比如一個16位的字就包含兩個字節,一個32位的字將由4個字節組成。

我們通常說的計算機的內存容量通常表示為可存儲的總字節數。

目前,計算機的內存可能的範圍在2^10個字節,需要10位的地址表示,到2^32字節,需要32位地址表示。

由於數字過大,所以我們通常用K,M和G三個字符分別代表三個量級的內存空間。

1K=2^10字節,1M=2^20字節,1G=2^30字節。

以上就是我們需要初步瞭解的計算機編程中最重要的一個操作目標:內存空間,它的簡單理解。

後面我們會抽時間繼續說CPU和輸出輸出部分的理解。

可能有些人還是不理解我這麼說,那麼計算機組織體系結構跟我們編程的關聯在哪裡呢?

"
編程基礎:高級編程需要了解的計算機組織結構與內存基礎

編程基礎

程序就是我們人類編寫的一連串的指令集合來告訴計算機如何去做某件事,要想編寫出好的程序,必須對我們要發號施令對象有所瞭解才行。

知己知彼嘛,所以在學習編程之前,瞭解計算機到底是個什麼,它內部大體是個什麼模樣,它是如何去執行我們給它的程序的非常有必要。

當然,如果你只想做個機械翻譯式的碼農,完全不需要了解這些,只學會編程語言的語法,就可以幹了,有些人也會幹的不錯。

但是對於編程對象的不瞭解,終究還會是一個進一步前進的阻礙,所以我還是想帶大家來了解一下編程跟硬件之間的關係,以助於我們更好的去理解各類編程語言的設計基礎和操作原理。不說廢話了,我們先出計算機體系結構這個基礎概念說起吧。

計算機組織結構:

組裝過電腦的同學可能都知道,我們可以買一堆的零部件然後自己來組裝一天台式電腦,其實對於計算機來說在更內部的層級上也是一個分開設計的產物。

因為從內到外計算機從來都不是一個單一的元器件,而是一組元器件相連接構成的計算機系統。系統就意味著有多個獨立的部分一聯合成的一個整體。

對於計算機系統發展來說,一直以來一個很重要的方向就是先假定它的各個部件都以做好,任務是研究它的組織結構,設計一些連接方式和組成架構,然後驗證計算機部件是否按預期運行,這就是計算機體系結構要做的事。

因此計算機體系結構研究只關注的是我們用戶所看到的計算機的結構和行為。

它包括用於我們如何從內存空間中找到信息,以及這些信息的格式,我們操作這些內容需要的指令集合和相關的技術方案。

要想有一個好的計算機,我們需要像搭積木一樣去不斷的設計,然後實踐測試,這個過程主要涉及到處理器和存儲器等各種功能模塊的規範,

找到一個最佳的方案來將它們組合成計算機系統

說了這麼多背景,其實就像想說明一點,計算機可以有很多架構類型,只要你能設計的出來。

不過目前來說,計算機架構設計中主流的只有兩種基本類型:馮·諾伊曼結構哈佛結構

因為現在絕大部分主流計算機都採用了馮·諾依曼體系結構設計,所以我們想學編程必須對它有一定的瞭解。

因為它描述了計算機硬件、程序和數據應該遵循的一般框架或結構。

馮諾依曼結構體系:

簡單來說,馮·諾依曼設想計算機系統的結構是由下列組件組成:

  • 算術邏輯單元(ALU):執行計算機的計算和邏輯功能的算術邏輯單元。
  • 隨機存取存儲器(RAM):內存,更具體地說,計算機的主存儲器,或快速存儲器,也 稱為隨機存取存儲器(RAM)。
  • 控制器單元(CU):這是一個組件,它負責指示計算機的其他組件執行某些操作,比如指示從內存中提取數據或指令交給ALU來處理。
  • 人機接口(I/O): 我們常說的輸入和輸出設備,比如鍵盤用於輸入和顯示器用於輸出。

我們的臺式機就是一個典型的馮諾依曼體系結構的計算機。

編程基礎:高級編程需要了解的計算機組織結構與內存基礎

圖片來源於網絡

哈佛結構體系:

而對於哈佛體系結構來說,它與馮諾依曼體系結構不同的地方是它使用了獨立的存儲和信號通路來處理指令和數據。

因為它最早在哈佛大學的Mark I和中繼鎖存器數據中被採用,所以叫做哈佛體系結構。

在採用哈佛架構的計算機中,CPU可以同時從內存中讀取指令和數據,這使得使內存帶寬有加倍的效果。

基於微控制器單片機的計算機系統和基於數字信號處理器(DSP)的計算機系統都是採用了哈佛體系結構的例子。

其實,我們現在用的主流計算機組織結構是馮諾依曼結構,其中跟我們編程關係最密切的就是內存,所以我們先說一下內存單元部分。

計算機內存單元:

因為內存就是一塊塊可以存儲的空間,我們邏輯上將其劃分為一塊塊同樣的磚塊一樣的單元,本身是一整塊,我們劃分了單元,所以排序是不變的,

如此我們可以設定起始位置,沿著某個方向移動的單位,偏移量,以及當前位置,最大位置,都用下標標記,連續的區域我們可以把它看成一個數學裡數組,不連續的可以用每個區域保存數據同時保存一個位置信息變成鏈塊,多個散列的鏈塊通過左右位置信息就有了邏輯上的順序,構成鏈表等等。

這些其實都是在一個固定的內存空間中進行的一種空間的邏輯操作。

接下來我們先說一下計算機內存單元體系,那什麼是內存單元呢? 簡單理解它就是計算機裡一個負責存儲東西的地方,這個地方一個體系,它有空間放東西,還有負責將東西搬入搬出的通路,合在一起才是內存體系。

因為它是個固定尺寸的空間,但是有需要被很多應用程序共享使用,所以必須好好的管理調配才可以。

為了直觀理解,我們可以把它想象成可以連通的儲物櫃,我們一次可以操作一個,也可以操作連載一塊的多個,我們可以在多個儲物櫃之間想東西搬來搬去,我們預訂它們,也可以清空它們。

如果我們要知道儲物櫃能裝多少東西,首先得有計量單位。

編程基礎:高級編程需要了解的計算機組織結構與內存基礎

儲物櫃與內存空間

內存的計量單位

我們知道在計算機內存裡它只能保存二進制信息,也就是0和1,成比特位組,這些一組組的比特位就是內存單位:

可以將它理解成多個比特位封裝成的實體。一個比特位的小箱子,每次從內存空間中搬入和搬出的單位,它可大可小,只取決於我們要定義的數據最小單位。

一個內存字就是一組0和1組合,它可能代表一個數字,一個操作指令代碼,一個或多個字母數字字符或者任何其他的二進制編碼信息。

由於我們的二進制表示的數據都是2的倍數位,所以我們一般取8比特位作為一組,我們稱之為一個字節(byte)。

大多數計算機內存使用的字的比特數是8的倍數,也就是多少字節。

因此,比如一個16位的字就包含兩個字節,一個32位的字將由4個字節組成。

我們通常說的計算機的內存容量通常表示為可存儲的總字節數。

目前,計算機的內存可能的範圍在2^10個字節,需要10位的地址表示,到2^32字節,需要32位地址表示。

由於數字過大,所以我們通常用K,M和G三個字符分別代表三個量級的內存空間。

1K=2^10字節,1M=2^20字節,1G=2^30字節。

以上就是我們需要初步瞭解的計算機編程中最重要的一個操作目標:內存空間,它的簡單理解。

後面我們會抽時間繼續說CPU和輸出輸出部分的理解。

可能有些人還是不理解我這麼說,那麼計算機組織體系結構跟我們編程的關聯在哪裡呢?

編程基礎:高級編程需要了解的計算機組織結構與內存基礎

體系結構與編程的關係

這裡我先簡單的大概說一下,以後我們編程會在哪些方面需要用到這些理解。

其實與我們編程相關的主要部分是馮諾依曼體系結構裡的CPU,內存和I/O。

它們是所有操作系統都要實現的主要管理對象,也是我們任何編程語言都要處理交互的重中之重。

可以把馮諾依曼體系架構中的這三個主要構件看成三個單元體系,分別是中央處理單元(CPU),主內存存儲單元(MM)和I/O處理器單元。

這三個主要部件之間通過總線系統兩兩相互連接,如此就構成了它們之間的三組輸入輸出關係。

CPU與主內存之間的輸入輸出,CPU與I/O處理器之間的輸入輸出,還有就是主內存與I/O處理器之間的輸入輸出。

其實我們所編寫的任何程序都不外乎是對它們之間這種輸入輸出數據流的處理。

這可以體現在內存區域的移動複製,數據通道的建立銷燬,數據流的讀寫,包括中斷事件處理,線程調度等等。

我們對於CPU內部結構的瞭解,有助於讓我們知道我們的CPU每次從所謂的一級緩存,二級緩存,三級緩存等高級緩存讀取數據,要比從主內存中讀取速度要快很多,也讓我們知道每次線程切換時數據和執行的記錄和內存空間的拷貝複製,以及從寄存器刷出到主內存,這些操作有個更加形象的理解。

當我們需要大塊數據讀入和讀出時,我們如何使用主內存和I/O處理器之間的直連總線來不經過CPU進行數據的讀取和寫出等等。

從阻塞式IO到非阻塞式IO以及同步和異步輸入輸出等這些編程規範設計,它到底是建立在怎樣一個內存空間轉換調度上的。

這些以後有時間我會細說,因為這些都是編寫高併發應用處理程序的核心,也是你編寫高性能應用程序的要義所在。

"

相關推薦

推薦中...