簡體   English   中英

為什么 memory 管理器使用 (size + PAGE_SIZE-1) / PAGE_SIZE 來計算要分配的頁數?

[英]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 的冪

當然,二進制計算機中的頁面大小始終是 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM