malloc与系统内存分配

问题1:Windows编程中malloc实际上能支持多大的内存呢?

编写程序如下:

#include <stdio.h>  
#include <stdlib.h>  
int count = 0;
void *p = NULL;
int main(int argc, char *argv[])
{
	int blocksize[4] = { 1024 * 1024 * 1024, 1024 * 1024, 1024, 1 };
	int i, j;
	//从大向小进行分配 
	for (i = 0; i<4; ++i)
	{
		for (j = 1; ; ++j)
		{
			if (NULL == (p = malloc(count + blocksize[i])))
			{
				switch(i){
					case 0: printf("有%dGB\n", j); break;
					case 1: printf("有%dMB\n", j); break;
					case 2: printf("有%dKB\n", j); break;
					case 3: printf("有%dByte\n", j); break;
				} 
				break; 
			}
			count += blocksize[i];
			free(p);
		}
	}
	printf("因此最大内存为:%dByte\n", count);
	return 0;
} 

运行结果如下图:

  可以观察到,所申请到的内存大约在2GB左右。原因在于虽然给一个进程分配的虚拟内存空间为4GB,但是有内核等其他的占用,会导致最终申请到的只有大概2GB。

问题2:不断增加物理内存,能够增加malloc的内存大小吗?

  不断增加物理内存,并不能增加malloc的内存大小。
  首先需要明确的是:malloc所申请到的内存大小并不是实际物理内存,而是虚拟内存。为什么malloc申请的是虚拟内存,不是物理内存呢? 第一,由用户直接申请物理内存的方法提供给了用户直接访问物理地址的权力,而这样直接访问物理内存的方式过于危险;第二,只有物理内存才能运行和处理数据,但物理内存大小有限,如果将一个进程直接加载进物理内存太浪费空间。基于这两个原因,产生了使用虚拟内存的方法,让用户只能访问虚拟内存地址(如malloc申请内存),而由系统调配虚拟内存中的信息到物理内存中;避免了直接访问物理内存也避免了物理内存空间的浪费。
  其次,虚拟内存又是什么呢? 物理内存指的就是我们电脑上的内存条,那虚拟内存既然不同于物理内存,且具有存储、读写数据的功能,那么很自然的我们就想到,虚拟内存的实际载体应该就是我们硬盘中没有被使用的部分。
  那么,虚拟内存又有多大呢? 看到这里你可能认为,那既然虚拟内存的实际载体是硬盘,那它的大小应该和硬盘大小一样。但其实并不是这样的。为保证程序的组织、访问和载入的有序性,虚拟内存的大小被限定在一定范围内。对现有32位系统而言,虚拟内存的大小被设定为 2 32 B y t e = 4 G B 2^{32}Byte=4GB 232Byte=4GB。由此可见,虚拟内存的大小其实是由系统位数所决定的,和物理内存大小没有直接关系。
  这时我们便会思考,虚拟内存又是如何与物理内存联系的呢? 实际上,系统为每个进程都分配了一个独立的4GB大小的虚拟内存空间。而这4GB大小的空间管理起来是很麻烦的,也不能直接把这些空间的内容加载进物理内存,因此,操作系统会自动对这个虚拟内存空间进行分页管理,将4GB划分成很多小页,并通过一个函数计算出当前虚拟内存地址在加载到物理内存时应该放在哪个物理地址,这些函数形成的表便是页表,通过这个页表就能将虚拟内存和物理内存联系起来。
  实际上,每个进程中只有很少一部分页加载并运行在物理内存上,绝大部分都处于虚拟内存中,正在等待被加载或者不需要被加载。当物理内存中的页被运行完成后,便通过页表信息将需要的页从虚拟内存加载进入物理内存进行运行。这样便完成了虚拟内存到物理内存的过程。
  综上可以得知,malloc所能占用的大小就是一个进程的虚拟大小,而该大小由系统位数决定,和物理内存大小并没有实际关系。

问题3:为什么增加物理内存,能够使系统跑得更流畅?

  根据上面的理论,一部分进程在物理内存中运行完后,将进行下一部分的加载和运行,而增加物理内存后,可以使得加载的速度更快,等待的进程更少,从而使系统运行得更流畅。
  举个例子:假如物理内存跑10个就满了,不能再加了,那得等其中一个跑完再加载,这时候可能有3个还在等;但是扩大物理内存后,一个页还是那么大,所以同时能跑的个数就增加了,比如现在可能最多能跑20个,那系统原来运行了13个,有3个在等,而现在可以直接全跑上,不用等了,所以就快了。

参考资料

[1]. malloc 背后的系统知识 https://www.sohu.com/a/131488979_261288
[2]. 物理内存与虚拟内存之间的映射https://blog.csdn.net/zhyfxy/article/details/70157248

  • 11
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D-A-X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值