malloc(size_t size)的物理内存分配问题

时间:2021-08-04 09:18:41

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

main()
{
char *p1 = malloc(0);
short *p2 = malloc(4);
int *p3 = malloc(8);

printf("p1=%p\n", p1);
printf("++p1=%p\n", ++p1);
printf("++p1=%p\n", ++p1);
printf("++p1=%p\n", ++p1);
printf("++p1=%p\n", ++p1);
printf("++p1=%p\n", ++p1);
printf("p2=%p\n", p2);
printf("++p2=%p\n", ++p2);
printf("++p2=%p\n", ++p2);
printf("p3=%p\n", p3);
printf("++p3=%p\n", ++p3);
printf("++p3=%p\n", ++p3);

printf("pid = %d\n", getpid());
while(1);
}


malloc(size_t size)的物理内存分配问题

下面在linux下做了测试。有一些疑问求解惑

malloc分配的指针类型影响偏移,p1,p2,p3虚拟地址因为链式存储结构4个成员的原因,所以3个首地址彼此相差了16个字节空间。就linux分配的虚拟内存来说 也看不出size的实际意义
很想知道实际映射的物理内存是什么样的? 怎么看物理内存的具体情况呢?
我想知道参数size的分配不同的值 做相应的操作 物理内存会有何变化?

6 个解决方案

#1


malloc()的参数指定了在内存中划分给你多大的内存空间
不管你有没有得到,你都可以使用指针访问任意的内存位置,但如果你试图写这个位置,那么下一次你读取的时候未必就还是你写的数据,即没划分给你的内存,不保证只有你能够修改
malloc(0)在某些编译环境下会直接失败

物理内存的管理涉及操作系统底层的操作,你需要学习计算机原理等底层知识,而不是编程语言
做测试是一种很直接很不靠谱的学习方法,没有足够的理论指引你,一个现象可以让你猜出一百种奇谈怪论,更不用提“可重复性”和“语言标准”等等

#2



只能看到内存的逻辑地址,物理地址是看不到的,在应用层面也是没有意义的。

引用 楼主 u012425973 的回复:

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

main()
{
char *p1 = malloc(0);
short *p2 = malloc(4);
int *p3 = malloc(8);

printf("p1=%p\n", p1);
printf("++p1=%p\n", ++p1);
printf("++p1=%p\n", ++p1);
printf("++p1=%p\n", ++p1);
printf("++p1=%p\n", ++p1);
printf("++p1=%p\n", ++p1);
printf("p2=%p\n", p2);
printf("++p2=%p\n", ++p2);
printf("++p2=%p\n", ++p2);
printf("p3=%p\n", p3);
printf("++p3=%p\n", ++p3);
printf("++p3=%p\n", ++p3);

printf("pid = %d\n", getpid());
while(1);
}




malloc(size_t size)的物理内存分配问题

下面在linux下做了测试。有一些疑问求解惑

malloc分配的指针类型影响偏移,p1,p2,p3虚拟地址因为链式存储结构4个成员的原因,所以3个首地址彼此相差了16个字节空间。就linux分配的虚拟内存来说 也看不出size的实际意义
很想知道实际映射的物理内存是什么样的? 怎么看物理内存的具体情况呢?
我想知道参数size的分配不同的值 做相应的操作 物理内存会有何变化?

#3


我就想研究操作系统底层,写了这个测试,段页式的内存管理方式,应该是会分配4k的整数倍物理空间,
您看我的那个运行结果,p1,p2,p3虚拟地址都是相差了16个字节空间,实际的结构就是4个成员指针,存储都是物理内存的地址,我是想看看malloc中的size参数影响的物理内存实际的变化。
比如说我写malloc(1000) malloc(5) 这些变化


#4


引用 3 楼 u012425973 的回复:
我就想研究操作系统底层,写了这个测试,段页式的内存管理方式,应该是会分配4k的整数倍物理空间,
您看我的那个运行结果,p1,p2,p3虚拟地址都是相差了16个字节空间,实际的结构就是4个成员指针,存储都是物理内存的地址,我是想看看malloc中的size参数影响的物理内存实际的变化。
比如说我写malloc(1000) malloc(5) 这些变化


malloc()申请分配堆内存的时候,是根据系统空闲内存空间碎片中选择一块跟你申请的内存大小差不多的内存块给你,在保护模式下你想看真的物理地址就需要 段、叶、逻辑地址、实地址之间的关系转换,所以即使逻辑地址上只相差16字节,但是实地址上相差多少就的自己算了
《个人理解,纯属虚构》

#5


引用 4 楼 N_sev7 的回复:
Quote: 引用 3 楼 u012425973 的回复:

我就想研究操作系统底层,写了这个测试,段页式的内存管理方式,应该是会分配4k的整数倍物理空间,
您看我的那个运行结果,p1,p2,p3虚拟地址都是相差了16个字节空间,实际的结构就是4个成员指针,存储都是物理内存的地址,我是想看看malloc中的size参数影响的物理内存实际的变化。
比如说我写malloc(1000) malloc(5) 这些变化


malloc()申请分配堆内存的时候,是根据系统空闲内存空间碎片中选择一块跟你申请的内存大小差不多的内存块给你,在保护模式下你想看真的物理地址就需要 段、叶、逻辑地址、实地址之间的关系转换,所以即使逻辑地址上只相差16字节,但是实地址上相差多少就的自己算了
《个人理解,纯属虚构》


= =!自己算一下和实际中跑一下看看能是一样的理解么。。
我接着跟再深入进去看看吧。。好多东西没学扎实,本来想偷懒问问。 

#6


结贴。5楼的兄弟回答的最中肯 分给你。

#1


malloc()的参数指定了在内存中划分给你多大的内存空间
不管你有没有得到,你都可以使用指针访问任意的内存位置,但如果你试图写这个位置,那么下一次你读取的时候未必就还是你写的数据,即没划分给你的内存,不保证只有你能够修改
malloc(0)在某些编译环境下会直接失败

物理内存的管理涉及操作系统底层的操作,你需要学习计算机原理等底层知识,而不是编程语言
做测试是一种很直接很不靠谱的学习方法,没有足够的理论指引你,一个现象可以让你猜出一百种奇谈怪论,更不用提“可重复性”和“语言标准”等等

#2



只能看到内存的逻辑地址,物理地址是看不到的,在应用层面也是没有意义的。

引用 楼主 u012425973 的回复:

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

main()
{
char *p1 = malloc(0);
short *p2 = malloc(4);
int *p3 = malloc(8);

printf("p1=%p\n", p1);
printf("++p1=%p\n", ++p1);
printf("++p1=%p\n", ++p1);
printf("++p1=%p\n", ++p1);
printf("++p1=%p\n", ++p1);
printf("++p1=%p\n", ++p1);
printf("p2=%p\n", p2);
printf("++p2=%p\n", ++p2);
printf("++p2=%p\n", ++p2);
printf("p3=%p\n", p3);
printf("++p3=%p\n", ++p3);
printf("++p3=%p\n", ++p3);

printf("pid = %d\n", getpid());
while(1);
}




malloc(size_t size)的物理内存分配问题

下面在linux下做了测试。有一些疑问求解惑

malloc分配的指针类型影响偏移,p1,p2,p3虚拟地址因为链式存储结构4个成员的原因,所以3个首地址彼此相差了16个字节空间。就linux分配的虚拟内存来说 也看不出size的实际意义
很想知道实际映射的物理内存是什么样的? 怎么看物理内存的具体情况呢?
我想知道参数size的分配不同的值 做相应的操作 物理内存会有何变化?

#3


我就想研究操作系统底层,写了这个测试,段页式的内存管理方式,应该是会分配4k的整数倍物理空间,
您看我的那个运行结果,p1,p2,p3虚拟地址都是相差了16个字节空间,实际的结构就是4个成员指针,存储都是物理内存的地址,我是想看看malloc中的size参数影响的物理内存实际的变化。
比如说我写malloc(1000) malloc(5) 这些变化


#4


引用 3 楼 u012425973 的回复:
我就想研究操作系统底层,写了这个测试,段页式的内存管理方式,应该是会分配4k的整数倍物理空间,
您看我的那个运行结果,p1,p2,p3虚拟地址都是相差了16个字节空间,实际的结构就是4个成员指针,存储都是物理内存的地址,我是想看看malloc中的size参数影响的物理内存实际的变化。
比如说我写malloc(1000) malloc(5) 这些变化


malloc()申请分配堆内存的时候,是根据系统空闲内存空间碎片中选择一块跟你申请的内存大小差不多的内存块给你,在保护模式下你想看真的物理地址就需要 段、叶、逻辑地址、实地址之间的关系转换,所以即使逻辑地址上只相差16字节,但是实地址上相差多少就的自己算了
《个人理解,纯属虚构》

#5


引用 4 楼 N_sev7 的回复:
Quote: 引用 3 楼 u012425973 的回复:

我就想研究操作系统底层,写了这个测试,段页式的内存管理方式,应该是会分配4k的整数倍物理空间,
您看我的那个运行结果,p1,p2,p3虚拟地址都是相差了16个字节空间,实际的结构就是4个成员指针,存储都是物理内存的地址,我是想看看malloc中的size参数影响的物理内存实际的变化。
比如说我写malloc(1000) malloc(5) 这些变化


malloc()申请分配堆内存的时候,是根据系统空闲内存空间碎片中选择一块跟你申请的内存大小差不多的内存块给你,在保护模式下你想看真的物理地址就需要 段、叶、逻辑地址、实地址之间的关系转换,所以即使逻辑地址上只相差16字节,但是实地址上相差多少就的自己算了
《个人理解,纯属虚构》


= =!自己算一下和实际中跑一下看看能是一样的理解么。。
我接着跟再深入进去看看吧。。好多东西没学扎实,本来想偷懒问问。 

#6


结贴。5楼的兄弟回答的最中肯 分给你。