Nginx記憶體對齊優化

2021-08-03 11:55:50 字數 925 閱讀 9036

nginx在記憶體使用方面做了較多優化,其中有一項就是記憶體對齊。記憶體對齊都有哪些好處?單從nginx的**來看,有兩點:

減少cpu訪問記憶體次數,我們知道cpu都有乙個叫做匯流排寬度的東西,我們平時所說的32位cpu,其實就是它的匯流排寬度是32位,也就是一次能讀32/8=4個位元組。假設有一塊記憶體位址為0 1 2 3 4 5 6 7八個位元組,cpu從該記憶體中讀乙個整數出來,如果該整數佔據著 0 1 2 3四個位元組,則cpu可以一次讀出;如果該整數佔據著 2 3 4 5,則cpu需要讀兩次記憶體,這樣看來變數在記憶體中的布局會影響到cpu訪問記憶體的次數,如果該變數訪問很頻繁的話,比如應用系統中訪問量很大的快取資料,該程式就有優化的空間。

列表內容盡量與cpu快取字或者系統記憶體頁塊對齊,能占用乙個快取條目的不佔據兩條,這樣能提高快取記憶體的利用率,我們可以看到nginx中執行時頻繁使用的crc32表資料就考慮了cpu快取記憶體字對齊。src/core/ngx_cpuinfo.c有獲取各種型別cpu快取記憶體條目的**。src/os/unix/ngx_posix_ini.c的函式ngx_os_init中有獲取作業系統快取頁大小的**。

#define ngx_align(d, a)     (((d) + (a - 1)) & ~(a - 1))
這個巨集本質上是計算大於d的a的最小倍數。一般來說a是2的冪運算。比如說a=8,也就是乙個位元組對齊,a-1二進位制形式就是0111。根據d的值,會有兩種情況出現:

1)當d是a的整數倍時,其最低三位都是0,加上a-1,最低三位就變成全1,然後與~(a - 1)按位與後最低又三位變成全0,高於3位的部分未變,所以當d是a的整數倍時,ngx_align(d, a)等於d。

2)當d不是a的整數倍時,由於d的低三位有1出現,加上0111後第四位會進一,當和~(a - 1)與運算後低三位變為全0,這樣就是a的整數倍了,高於低三位的部分獲得了乙個進製,所以剛好是大於d的a的最小倍數。

記憶體對齊 記憶體對齊規則解釋 記憶體對齊原理

一 記憶體對齊的原因 我們都知道計算機是以位元組 byte 為單位劃分的,理論上來說cpu是可以訪問任一編號的位元組資料的,我們又知道cpu的定址其實是通過位址匯流排來訪問記憶體的,cpu又分為32位和64位,在32位的cpu一次可以處理4個位元組 byte 的資料,那麼cpu實際定址的步長就是4個...

記憶體對齊(自然對齊)

參考 今天與超,暉,棟,宇幾人論此問題,終得以下結論,不知正確與否,姑且記下。對於32位機,cpu的記憶體讀寫週期是4word,所以在記憶體對齊時,皆以此填滿。如 struct a char a double b char c sizeof a 4 8 4 16 struct b char a do...

位元組對齊 記憶體對齊 對齊粒度

其實標題裡面的三個關鍵字說的都是同乙個東西。也就是c 中類和結構體在記憶體中的分配策略,專業術語可以稱之為 對齊模數 alignment modules 對齊模數分為三類 1.自身對齊模數,也就是類或結構體中成員的大小,1,2,4,8之中的乙個,對應byte word dword qword。2.指...