【问题标题】:page size of a unix machine using malloc使用 malloc 的 unix 机器的页面大小
【发布时间】:2011-05-09 14:17:00
【问题描述】:

我如何使用 malloc() 知道 unix 机器的页面大小?

【问题讨论】:

  • 为什么需要使用malloc()?为什么不使用 getpagesize()?
  • 面试时被问到的,所以他们可能想问我是否知道 malloc 返回什么以及它实际保留什么(可能是一个页面)

标签: unix malloc page-size


【解决方案1】:

我猜如果你分配一个足够大的缓冲区,它必须再获取几页,然后它会将缓冲区放在第一页的开头。所以你可以分配两个非常大的缓冲区,删除缓冲区头偏移量,然后 GCD 两个缓冲区。在我的系统上运行得非常好。

#include <stdlib.h>
#include <stdio.h>

unsigned gcd(unsigned a, unsigned b)
{
        if (b == 0)
                return a;
        else
                return gcd(b, a % b);
}

void main() {
    void *p1 = malloc(1000000);
    void *p2 = malloc(1000000);
    unsigned p1r = (unsigned) p1 & 0xfffffff0;
    unsigned p2r = (unsigned) p2 & 0xfffffff0;
    printf("page size = %u\n", getpagesize());
    printf("p1 = %p, p2 = %p\n", p1, p2);
    printf("p1r = %p, p2r = %p\n", p1r, p2r);
    printf("gcd = %u\n", gcd(p1r, p2r));
}

【讨论】:

  • 丑,但有黑客本性。
  • p1 & 0xfffffff0 有什么意义,为什么要屏蔽最后 4 位?
  • 因为每个分配的缓冲区都有一个与之关联的标头。结构取决于堆的实现,但通常有一些东西。返回值是分配的内存加上隐藏该结构的偏移量。因此,要获取页面的开头,我们必须忽略该偏移量。
【解决方案2】:

不过,我不知道 malloc 与它有什么关系:

#include <unistd.h>

(size_t) sysconf(_SC_PAGESIZE);

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2021-10-15
    相关资源
    最近更新 更多