使用malloc的unix计算机的页面大小

使用malloc的unix计算机的页面大小,unix,malloc,page-size,Unix,Malloc,Page Size,使用malloc()我如何知道unix机器的页面大小?我不知道malloc和它有什么关系,但是: #include <unistd.h> (size_t) sysconf(_SC_PAGESIZE); #包括 (size_t)sysconf(_SC_PAGESIZE); 我不知道malloc和它有什么关系,但是: #include <unistd.h> (size_t) sysconf(_SC_PAGESIZE); #包括 (size_t)sysconf(_SC_

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

我不知道malloc和它有什么关系,但是:

#include <unistd.h>

(size_t) sysconf(_SC_PAGESIZE);
#包括
(size_t)sysconf(_SC_PAGESIZE);

我不知道malloc和它有什么关系,但是:

#include <unistd.h>

(size_t) sysconf(_SC_PAGESIZE);
#包括
(size_t)sysconf(_SC_PAGESIZE);

我想如果你分配一个足够大的缓冲区,它必须再获得几页,然后它会将缓冲区放在第一页的开头。因此,您可以分配两个非常大的缓冲区,删除缓冲区标头偏移量,然后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));
}
#包括
#包括
无符号gcd(无符号a、无符号b)
{
如果(b==0)
返回a;
其他的
返回gcd(b,a%b);
}
void main(){
void*p1=malloc(1000000);
void*p2=malloc(1000000);
无符号p1r=(无符号)p1&0xfffffff0;
无符号p2r=(无符号)p2&0xfffffff0;
printf(“页面大小=%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));
}

我想如果你分配一个足够大的缓冲区,它必须再获得几页,然后它会将缓冲区放在第一页的开头。因此,您可以分配两个非常大的缓冲区,删除缓冲区标头偏移量,然后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));
}
#包括
#包括
无符号gcd(无符号a、无符号b)
{
如果(b==0)
返回a;
其他的
返回gcd(b,a%b);
}
void main(){
void*p1=malloc(1000000);
void*p2=malloc(1000000);
无符号p1r=(无符号)p1&0xfffffff0;
无符号p2r=(无符号)p2&0xfffffff0;
printf(“页面大小=%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));
}

为什么需要使用malloc()?为什么不使用getpagesize()?这是在采访中问到的,所以他们可能想问我是否知道malloc返回的内容和它实际保留的内容(可能是一个页面),为什么需要使用malloc()?为什么不使用getpagesize()?这是在采访中被问到的,所以他们可能想问我是否知道malloc返回了什么以及它实际上保留了什么(可能是一个页面),但它具有黑客的性质。p1&0xfffffff0的意义是什么,为什么我们要屏蔽最后4位?因为每个分配的缓冲区都有一个与之相关的头。结构取决于堆的实现,但通常会有一些东西。返回值是分配的内存加上隐藏该结构的偏移量。因此,为了获得页面的开头,我们必须忽略偏移量。丑陋,但它具有黑客性质。p1&0xfffffff0的意义是什么,为什么我们要屏蔽最后4位?因为每个分配的缓冲区都有一个与之相关联的头。结构取决于堆的实现,但通常会有一些东西。返回值是分配的内存加上隐藏该结构的偏移量。因此,为了得到页面的开头,我们必须忽略偏移量。