計算機組成原理之內存數據的組織格式


1、存儲字長

存儲字長:存儲單元中的二進制代碼(存儲字)位數,存儲字長可以是8位、16位、32位等。

早期計算機的存儲字長一般和機器的指令字長與數據字長相等,故訪問一次主存便可取一條指令或一個數據。隨着計算機的應用范圍的不斷擴大,解題精度的不斷提高,往往要求指令字長是可變的,數據字長也要求可變。為了適應指令和數據字長的可變性,其長度不由存儲字長來確定,而由字節的個數來表示。1個字節(Byte)被定義為由8位(Bit)二進制代碼組成。

字長是根據當前的操作系統是有關系的,如果操作系統是64位的,那么表示的是有64根地址總線來進行控制,每個能夠定位到多少個0101數據,然后通過數據總線運送數據到CPU中來進行執行。

ISA:

指令集架構(英語:Instruction Set Architecture,縮寫為ISA),又稱指令集或指令集體系,是計算機體系結構中與程序設計有關的部分,包含了基本數據類型,指令集,寄存器,尋址模式,存儲體系,中斷,異常處理以及外部I/O。指令集架構包含一系列的opcode即操作碼(機器語言),以及由特定處理器執行的基本命令。

解決上面的問題:

2、數據存儲和邊界的關系

從上面可以看到在32位的操作系統中,連續的4個字節(32位01數字組合)放在一起,表示的是32位操作系統。

按照邊界對齊的意思就是在連續的四個字節中,找到能夠放得下當前的字節數的。如果放不下,就另起一行來存放當前數據。

對於i、k、x、c和j來取地址,獲取得到的都是連續存放的字節的首地址內存單元編號。比如說i占據的是連續的四個字節,在對其進行取地址操作之后,返回的只是連續4個字節的第一個字節的地址編號。

從這種方式上來說,可以看到有三個字節的數據沒有被利用。

3、未按照邊界對其的數據存儲

在這種方式中,值需要找到能夠進行存儲的對應的即可。但是對於操作系統來說,CPU和內存之間的交互次數又會增加。

這種方式下會以性能來換取空間的方式。上面的方式是交互兩次,而現在這種方式會交互三次。

因為對於32位的操作系統來說,表示的是一次性可以讀取32位01所能夠表示的位數,如果按照上面的未按照邊界來進行對齊,那么讀取變量x可以一次性讀取完,但是在讀取變量x的時候,需要讀取三次;在讀取變量j的時候,需要來讀取兩次

在按照邊界進行對齊的情況下,明明只需要讀取到一次,而未按照邊界對齊的情況下,各種情況都不相同。

4、數據存儲和邊界的關系

4.1、重點說明

參考博文:https://blog.csdn.net/WWIandMC/article/details/105215361?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163342133416780274149240%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163342133416780274149240&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-5-105215361.pc_search_ecpm_flag&utm_term=%E5%8F%8C%E5%AD%97%E9%95%BF%E6%95%B0%E6%8D%AE%E8%BE%B9%E7%95%8C%E5%AF%B9%E9%BD%90%E7%9A%84%E8%B5%B7%E5%A7%8B%E5%9C%B0%E5%9D%80%E7%9A%84%E6%9C%80%E6%9C%AB%E4%B8%89%E4%BD%8D%E4%B8%BA000&spm=1018.2226.3001.4187

因為雙字長類似double這種數據類型,單字長的類似int這種數據類型,對於半字長邊界對齊的類似char這種數據類型,

但是對於半字節的數據存儲來說,要是想存儲的是1這個數字,計算機中的其實地址的最后一位不應該是1嗎?

答案:真的是找了好多篇博客來對這里的內容來進行講解,終於算是領悟到了一點東西出來。

c/c++的數據類型要求邊界對齊(實際上這是由存儲器的結構)決定的,並不是語言本身的特性)。

處理器的數據線的根數決定了處理器的處理字長。
如上圖左側所示,內存是按字節為單位編址並按順序排列,如果內存按照“一個存儲體,每個單元的寬度”為一個字節”的方式來組織的話,處理器需要4個總線周期來讀取一個4字節數據。

但實際上,並沒有必要花4個總線周期來讀取,我們有辦法讓處理器用1個總線周期完成讀取——采用低位多體交叉存儲結構(如上圖右側所示)。

盡管我們把內存空間分成了4個部分,但尋址的時候是仍然是把內存空間當成上圖左側那樣連續的空間。

如果把雙字數據的最低的8位放在Bank 0的X地址(X是一個能被16整除的偶地址)

X+3 X+2 X+1 X

如果一個int類型的數據的起始存儲位置能夠被4整除,處理器在一個總線周期就能夠讀取完整個int。

然而,如果一個int的起始存儲位置的地址不能被4整除,如下圖:

處理器讀取時,就需要掃描兩行,需要2個總線周期完成。

不同數據類型的邊界對齊要求

short ( 2 bytes ) int ( 4 bytes ) double ( 8 btyes )
存儲在Bank 0和Bank 1 占用存儲體一行的空間,從低位到高位,依次存放在Bank 0,Bank 1,Bank 2,Bank 3 32位機器:占用存儲體兩行的空間。需要兩個總線周期來讀取。
存儲在Bank 2和Bank 3 64位機器:存儲體分成8個部分,一次能夠處理64位數據,只需要1個總線周期。

如果一個int類型的數據的起始存儲位置能夠被4整除,處理器在一個總線周期就能夠讀取完整個int。

如果一個double類型的數據的起始存儲位置能夠被8整除,處理器在一個總線周期就能夠讀取完整個double。

等等,依次進行類推。那么對於short類型這種數據類型來說,就是被2整除,處理器就可以在一個總線周期中讀取完整個short類型。

在對齊情況下,對於s1來說,占用的是12個字節;但是對於s2來說,占用的是9個字節。這種采用對其的是否效率高呢?

看看右邊的圖,如果要是以數組的方式存在,從右邊圖中可以看到,對於d[1]和d[2]來說,每個結構體結點都將會浪費3個字節,這種效果也是不好的。

5、大端和小端

最高字節地址和最低字節地址的划分?

6、大端和小端的存儲方式

這種也只是一種程序設計的方式。

7、內存中邊界對齊有什么用

從處理器的角度來看,需要盡可能減少對內存的訪問次數以實現對數據結構進行更加高效的操作。為什么呢?因為盡管處理器包含了緩存,但它在處理數據時還得讀取緩存中的數據,讀取緩存的次數當然是越少越好!如上圖所示,在采用邊界對齊的情況下,當處理器需要訪問a_變量和b_變量時都只需進行一次存取(圖中花括號表示一次存取操作)。若不采用邊界對齊,a_變量只要一次處理器操作,而b_變量卻至少要進行兩次操作。對於b_,處理器還得調用更多指令將其合成一個完整的4字節,這樣無疑大大降低了程序效率。

8、測試題

1、設存儲字長為64位,對 short 變量長度為16位,數據存儲按整數邊界對齊,關於short 變量 j 在主存中地址的下列描述中正確的是( ) (此題為多選題)

A.j的物理地址 mod  8  = 0 
B.j的物理地址 mod  8  = 1 
C.j的物理地址 mod  8  = 2 
D.j的物理地址 mod  8  = 3 

正確答案是:AC

因為對於short數據類型,長度是16位,也就是2個字節,那么64位操作系統要是想在一個操作周期內來找到,那么要求的是起始地址的最末位代表的二進制能夠被2來進行整除,也就是是2的倍數;所以進行取模運算之后,應該是0、2、4這三個數字

2、設存儲字長為64位,對 char 變量長度為8位,數據存儲按整數邊界對齊,關於char 變量 j 在主存中地址的下列描述中正確的是( ) (此題為多選題)

A.j的物理地址 mod  8  = 0 
B.j的物理地址 mod  8  = 1 
C.j的物理地址 mod  8  = 2 
D.j的物理地址 mod  8  = 3 

正確答案是:ABCD

對於char類型來說,占據8位,是一個字節,那么說明可以存儲在連續的四個位置的任意地方,因為可以在任何地方都可以來進行存儲。

對於char和byte數據類型來說,邊界對齊的約束是無效的,哪里可以進行存儲,就可以往哪里來進行存放。

所以起始地址應該是1的倍數,那么對於上述的四種選擇,都是可以的。

3、下列關於大端與小端模式的描述中,正確的是 ( ) (此題為多選題)

A.大端模式(Big-endian)是指數據的低位保存在內存的高地址中,而數據的高位保存在內存的低地址中
B.小端模式(Little-endian)是指數據的低位保存在內存的低地址中,而數據的高位保存在內存的高地址中
C.0x12345678 按大端模式存放時,其所在存儲單元最低字節單元存放的數據是0x12
D.0x12345678 按小端模式存放時,其所在存儲單元最高字節單元存放的數據是0x12

正確答案是:ABCD

這里也正確的來描述了大端模式和小端模式的概念。

大端模式是指數據的低位保存在內存的高地址中,而數據的高位保存在內存的低地址中;

小端模式是指數據的低位保存在內存的低地址中,而數據的高位保存在內存的高地址中;

所以大端還是小端,只需要根據小端來進行對應即可。小端是數據低位放在內存低位,數據高位放在內存高位;

而大端是數據低位放在內存高地址中,數據高位放在的是內存低地址中;

從CD選項上,我們來進行判斷一下:

對於0x12345678這種數據,低位確定的是后面的,高位確定的是前面的。

0x12345678 按大端模式存放時,其所在存儲單元最低字節單元存放的數據是0x12

0x12345678 按小端模式存放時,其所在存儲單元最高字節單元存放的數據是0x12

4、下列關於存儲字長的描述中正確的是( ) (此題為多選題)

A.主存一個單元能存儲的二進制位數的最大值
B.存儲字長與所存放的數據類型有關
C.存儲字長等於存儲在主存中數據類型包含的二進制位數
D.存儲字長一般應是字節的整數倍

正確答案:AD

存儲字長是和操作系統的設計相關的,不和其中的內存單元中的二進制位數有關。因為有了個先來后到的區別。

5、某計算機按字節編址,數據按整數邊界存放,可通過設置使其采用小端方式或大端方式,有一個float 型變量的地址為 FFFF C000H ,數據 X = 12345678H,無論采用大端還是小端方式,在內存單元 FFFF C001H,一定不會存放的數是 ( ) (此題為多選題)

A.12H
B.34H
C.56H
D.78H

正確答案:AD

12345678H數據高位和數據低位是從左邊往右邊的。

如果是按照小端,那么低位應該是12H,高位是78H;

如果是按照大端,那么低位應該是78H,高位應該是12H;

那么對應的是第一個地址,那么就應該開始往后面移動:

小端來說,低位是34H;大端來說56H

所以綜合對比,一定不會是AD


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM