[英]Why do memory managers use (size + PAGE_SIZE-1) / PAGE_SIZE to calculate the number of pages to allocate?
我在不同的地方多次遇到過這樣的公式(例如;Linux kernel 和 glibc)。 為什么他們使用這個公式而不是簡單地:
pages = (size / PAGE_SIZE) + 1;
作為一種猜測,我認為上面公式的問題是當大小是PAGE_SIZE
對齊時( PAGE_SIZE
的倍數),因為在這種情況下,它報告的頁面比需要的多,因此我們還必須這樣做:
pages = (size / PAGE_SIZE) + 1;
if (!(size & (PAGE_SIZE-1))) /* is size a multiple of PAGE_SIZE? */
pages--;
這顯然比(size + PAGE_SIZE-1) / PAGE_SIZE
更多的代碼!
是的,它用於獲取除法結果的上限,即四舍五入的商
問題與
pages = (size / PAGE_SIZE) + 1;
if (!(size & (PAGE_SIZE-1))) /* is size a multiple of PAGE_SIZE? */
pages--;
不僅是更多的代碼,而且事實上
當然,二進制計算機中的頁面大小始終是 2 的冪,但是(size + PAGE_SIZE-1) / PAGE_SIZE
適用於除數的任何值
也可以看看
這是四舍五入。 您將(PAGE_SIZE - 1)
添加到nbytes
,因此如果您有確切數量的PAGE_SIZE
nbytes
,那么您將獲得所需的最小頁面數,如果您將其傳遞一個,那么您將獲得一個新頁面,以便為額外的字節。
還有另一種方法可以使用頁面大小的log2 。 在 Linux kernel 源中,它是PAGE_SHIFT 。 例如,如果PAGE_SIZE為 4096 = 2^12 字節,則 PAGE_SHIFT為 12(即 log2(2^12))。 因此,要獲得給定size的頁數,通常使用以下公式:
頁數= (大小+ PAGE_SIZE - 1) >> PAGE_SHIFT
順便說一句,頁面大小通常定義為:
#define PAGE_SIZE (1 << PAGE_SHIFT )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.