內存對齊的原因調查

在讀《c專家編程》的3.2.1關於結構:

struct pid_tag {

unsigned int inactive:1;

unsigned int :1; /*1位的填充*/

unsigned int refcount : 6;

unsigned int :0; /*填充到下一個子邊界*/

short    pid_id;

}

很有意思,嚴格遵守了字對齊,字對齊的原因、用法在課堂也曾提到過,

用法爲:

#pragma pack(n) /* n = 1, 2, 4, 8, 16 */

當內存存放沒有對齊的時候會影響機器性能,一直都記着這句話,卻知其然不知其所以然,今天偶然翻看《計算機組成與設計硬件/軟件接口》(強烈推薦,沒有系統學過計算機課程,這本書作爲計算機組成原理看最好了)纔算是對其中原理有了點了解,記錄下來,防備以後忘了。

 對齊的作用和原因:各個硬件平臺對存儲空間的處理上有很大的不同。一些平臺對某些特定類型的數據只能從某些特定地址開始存取。比如有些架構的CPU在訪問 一個沒有進行對齊的變量的時候會發生錯誤,那麼在這種架構下編程必須保證字節對齊.其他平臺可能沒有這種情況,但是最常見的是如果不按照適合其平臺要求對 數據存放進行對齊,會在存取效率上帶來損失。比如有些平臺每次讀都是從偶地址開始,如果一個int型(假設爲32位系統)如果存放在偶地址開始的地方,那 麼一個讀週期就可以讀出這32bit,而如果存放在奇地址開始的地方,就需要2個讀週期,並對兩次讀出的結果的高低字節進行拼湊才能得到該32bit數 據。顯然在讀取效率上下降很多。

更爲嚴重的是,所影響到的並不僅僅是一個讀週期,MIPS對內存的操作僅出現在存取操作中,這一限制意味着可以在指令執行級計算內存地址,在下一個步驟訪問內存。在流水線操作中,內存沒有對齊,將出現一條數據傳輸指令需要兩次內存訪問的情況,所請求的數據不能在單個流水線步驟內完成在處理器和內存之間的傳輸。這時候流水線將發生數據冒險:一個操作必須等待另一個操作完成後才能進行,流水線必須停頓!這纔是造成性能下降的主要因素。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章