首先取得 mask, 如果 aligment 是 2 的冪, aligment - 1 則可以取得此 aligment 完整的 mask,
e.g:
,
此時取 not 後變成 0b11111000, 就可以把不是 aligment 的倍數給去除.
另外考慮到, 如果 sz 不是剛好 aligment 的倍數, 則需多增加 1個 aligment 來處理
假設取完畢 aligment 之後剩下的數字為 n , 此時若將此數加上 alignment - 1後取餘數, 則 所以加完之後的數字也會落在 0 ~ alignment 之間, 之後再用 mask 將之去除, 就可以得到相對應的 min alignment size.
若非 2 的冪, 則演算法類似, 同樣考慮多增加一個 aligment 處理(+ mask), 之後計算他是 aligment 的幾倍, 在乘上 aligment 來處理, 就可以得出最小值.
e.g:
aligment 5, input sz = 8
8 的 aligment 是 10
__ALIGN_KERNEL(x, a) : Kernel define macro.
fs/ext4, 最近剛好在看 file system的資料, 其中 ext4 在write blk 的時候, 就有使用到對齊這個特性, 如此就可以一次按照 data bus 的寬度, 直接寫入 disk blk 中, 可以避免一筆資料寫入時跨兩個 block 的狀態.
slub: 在 cache 機制中, 透過 kmem_cache_create可以用 slub 機制建立 memory cache, 這邊也會計算 alignment.
可以發現 qsort_mt.c:211 在 write 的時候, 另一個 thread 在 sort_mt.c:344 時候會 read, 兩個 thread 操作的變數是 struct qsort->st, 而這個變數因為兩個 thread 都會進行操作, 所以必須用 lock 將之保護, 開始看哪個 st 是沒有保護的.
c->pool[i].st = ts_work; 這邊變動的時候 沒有進行 lock 保護, 所以將之移入 lock 保護