当前位置: 首页 > 编程日记 > 正文

malloc一次性最大能申请多大内存空间

受用户态内存地址空间的限制。64 位系统下分配几个 T 不成问题。

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:zz matrix
链接:http://www.zhihu.com/question/20836462/answer/22833295
来源:知乎

考虑32位linux情况的话,依据版本的话
如果是2.4版本之前的话,因为映射区是在1G地址位置,而且映射区与栈相对生长,malloc申请的空间大于128KB的话,调用的是mmap函数,因此分配的地址起始在1G位置,末端为3G,最大2G左右,所以一次最大申请为2G左右,如果小块小块累计申请的话算上堆区128M到1G区间的话,小块申请 malloc调用brk总和就0.9G,累计能申请到的为2.9G。
2.6到当前版本的话,因为映射区是在顶端靠近栈区,但是生长方向向下,与堆向上相对,一次malloc申请大空间,malloc调用mmap()能最大申请到2.9G左右,算上堆区128M开始向上小块累计的话,(因为2.9G被mmap了)累计就剩下零头,累计申请最大也是2.9G。
现在分配的才是虚拟地址(不是物理内存,即使物理内存才0.5G),只有真正使用的话,才会建立页表开始关联物理内存。
测试代码如下(Linux系统下,物理内存+交换内存>=4G情况下,得到2.8G左右,如果物理内存+交换内存 = N < 4GB, 得到的大概为(N - 0.2)G)
#include<stdio.h>

#include<stdlib.h>

size_t maximum=0;
int main(int argc,char *argv[])
{
void * block;
void * tmpblock;
size_t blocksize[]={1024*1024, 1024, 1};
int i,count;
for(i=0;i<3;i++){
for(count=1;;count++){
block = malloc(maximum+blocksize[i]*count);
if(block){

tmpblock = block;
maximum += blocksize[i]*count;
free(block);
}else{
break;
}
}
}
printf("maximum malloc size = %lf GB\n",maximum*1.0 / 1024.0 / 1024.0 / 1024.0);
printf("the address is %x\n",tmpblock);
printf("the address end is %x\n", tmpblock + maximum);
while(1);
}
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Cascade
链接:http://www.zhihu.com/question/20836462/answer/16341442
来源:知乎

地址空间限制是有的,但是malloc通常情况下申请到的空间达不到地址空间上限。

内存碎片会影响到你“一次”申请到的最大内存空间。比如你有10M空间,申请两次2M,一次1M,一次5M没有问题。但如果你申请两次2M,一次4M,一次1M,释放4M,那么剩下的空间虽然够5M,但是由于已经不是连续的内存区域,malloc也会失败。

系统也会限制你的程序使用malloc申请到的最大内存。Windows下32位程序如果单纯看地址空间能有4G左右的内存可用,不过实际上系统会把其中2G的地址留给内核使用,所以你的程序最大能用2G的内存。除去其他开销,你能用malloc申请到的内存只有1.9G左右。

理论上这个空间能达到系统给分配的线性空间最大值,而和具体的内存实际大小没有关系。比如32位下windows大概2g,而Linux3G,其余的都是给了内核。
malloc的机制是:分配时先从进程线性地址空间分配一块线性地址返回给用户进程,直到你读写这块地址才触发真正的缺页请求,从内存申请真正的内存块给用户。也就是说你请求了比如100M,但你只用过一次这块内存50k,那么实际上内核真正给你用的可能很就是128k,内存伙伴算法。

相关文章:

MD5算法之C#程序

MD5算法比较特别&#xff0c;最适合用汇编语言来写&#xff0c;好多高级语言对之无能无力或效率极低。 比如我最开始尝试用Python和Euphoria编写&#xff0c;发现不太容易。相比而言&#xff0c;C#作为C家簇 中新兴的一门.net语言&#xff0c;功能比较全面。花了一晚上的工夫终…

unix环境汇编语言常用工具

汇编器 MASM&#xff1a;微软的汇编器不支持unix NASM&#xff1a;unix环境下兼容微软平台 GAS&#xff1a;GNU 的免费软件包&#xff0c;unix环境下最流行跨平台汇编器 安装GNU汇编器 检查binunits RedHat #rpm -qa |grep binunits Debian #dpkg -l|grep binunit 下载地…

用Python远程登陆服务器的最佳实践

来源 | Python编程时光&#xff08;ID: Cool-Python&#xff09;在使用 Python 写一些脚本的时候&#xff0c;在某些情况下&#xff0c;我们需要频繁登陆远程服务去执行一次命令&#xff0c;并返回一些结果。在 shell 环境中&#xff0c;我们是这样子做的。$ sshpass -p ${pass…

Exchange Server 2013 LAB Part 4.内部客户端访问

关于Exchange服务器内部客户端访问的更详细介绍&#xff0c;请参考Exchange Server 2010链接&#xff1a;http://xutonglin.blog.51cto.com/8549515/1390715每个组织在AD林中都至少有一台客户端访问服务器和一台邮箱服务器。另外&#xff0c;每个AD站点中都必须至少有一台客户端…

VirtualBox安装64位Linux

VirturlBox安装64位的Linux 原因 virtualbox 本身不带 64 位支持&#xff0c;它的 64 位支持依赖于通过cpu虚拟技术把cpu的64位指令直接映射过去。 所以&#xff0c;要支持64位必须&#xff1a; 1.你的cpu支持64位。 2.你的cpu支持虚拟化&#xff0c;并且你的bios支持把cpu虚…

6个步骤,告诉你如何用树莓派和机器学习DIY一个车牌识别器!(附详细分析)...

作者 | Robert Lucian Chiriac翻译 | 天道酬勤&#xff0c;编辑 | Carol出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;几个月前&#xff0c;作者开始考虑让汽车能够具备检测和识别物体的能力。他很喜欢这个主意&#xff0c;因为已经见识到了特斯拉的能力…

推荐bpython

可能很多人都对ipython比较熟悉&#xff0c;但是我这里要推荐的是bpython&#xff0c;我发现用起来更加顺手。详细的信息可以从其官方网站上获得。下面介绍几个主要的feature&#xff08;使用系统为Linux&#xff09;&#xff1a;1. 语法高亮&#xff1a;2. 自动提示&#xff0…

几个定制 iTerm2 的 tip

重装 Mac 才想起来很多配置没有备份过, 找起来麻烦, 所以记一下 按文本开头搜索命令 一个是 Bash 里按上下键直接查找历史, 匹配开头相同的内容最开始是我朋友在 Matlab 下用到提到想要这个方案, 一起找了结果真有于是记录一下配置: ➤➤ cat ~/.inputrc "\e[A":hist…

从1的补码说起计算机的数制

字节换算 bit(b)位 字节(byte)8位 -128~127 0&#xff5e;255 半字2字节16位 -32768~32767 0&#xff5e;65,535 字(word)4字节32位 -2147483848~2147483647 0&#xff5e;4,294,967,295 双字8字节64位 -9223372036854775808~9223372036854775807 0&#xff5e;18,446,744…

类:认识类的继承

先新建一个 VCL Forms Application 工程, 代码中就已经出现了两个类:一个是 TForm 类; 一个是 TForm1 类; TForm1 继承于 TForm.TForm 是 TForm1 的父类; TForm1 是 TForm 的子类. Codeunit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, C…

机器会成为神吗?

作者 | Roman Wiligut翻译 | 天道酬勤&#xff0c;编辑 | Carol出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;看着科技的飞速发展&#xff0c;我们越来越想知道&#xff0c;到底科技发展有没有极限呢&#xff1f;在我看来&#xff0c;没有。至少在我们的…

1、Linux汇编——初识汇编

2019独角兽企业重金招聘Python工程师标准>>> 前序 本来想Qt能继续坚持下来&#xff0c;可是绕了一大圈&#xff0c;最终还是选择回到学期伊始的Linux汇编编程上来。鉴于图书馆只能借到这本书&#xff0c;虽然不厚&#xff0c;但是内容还是比较实用丰富&#xff0c;作…

汇编语言调用Linux系统调用

首先查找系统调用文件 #find / -name unistd.h /root/linux/include/unistd.h /usr/include/linux/unistd.h /usr/include/sys/unistd.h /usr/include/bits/unistd.h /usr/include/unistd.h 查看系统调用值 /root/linux/include/unistd.h #define __NR_setup 0 /* use…

为什么说Transformer就是图神经网络?

作者 | Chaitanya Joshi译者 | Kolen出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;前言有些工程师朋友经常问我这样一个问题&#xff1a;“图深度学习听起来很棒&#xff0c;但是现在是否有非常成功的商业案例&#xff1f;是否已经在实际应用中部署&#xff1f;”除…

IIS日志清理CMD版,VBS版,JS版,WSH版

IIS日志清理之IIS日志生成系统(CreateIISLog.vbs) 创建文件夹Function CreateFolder(Folder)On Error Resume NextSet FSO CreateObject("Scripting.FileSystemObject")FSO.CreateFolder(Folder)If Err>0 ThenErr.ClearCreateFolder FalseElseCreateFolder Tr…

make执行过程

make 的执行过程如下&#xff1a; 1.依次读取变量“MAKEFILES”定义的 makefile 文件列表 2.读取工作目录下的 makefile文件&#xff08;根据命名的查找顺序“GNUmakefile”&#xff0c; “makefile”&#xff0c;“Makefile”&#xff0c;首先找到那个就读取那个&#xff09; …

C语言不要重复包含.h头文件和.c文件

1.不要重复包含头文件 --以上出自《C语言程序设计&#xff1a;现代方法(第2版)》 f3.h //#ifndef AE_OK #define AE_OK 0 typedef int ngx_int_t; //#endiff2.h #include "f3.h"f1.h #include "f3.h" test.c #include <stdio.h>#include &…

论推荐系统与精细化运营

作者丨gongyouliu来源 | 大数据与人工智能&#xff08;ID: ai-big-data&#xff09;随着大数据与人工智能(AI)技术的发展与成熟&#xff0c;国家政策层面对大数据与人工智能技术、创新、创业层面的支持&#xff0c;企业越来越意识到数据和AI技术的价值&#xff0c;并逐步认可数…

服务器产品选型与性价比图解

转载于:https://blog.51cto.com/lijichao/229471

解决jsp引用其他项目时出现的 cannot be resolved to a type错误

JSP页面引用其他项目的时候&#xff0c;在jsp页面上写如下代码&#xff1a; <%List<CandleEntity> candleEntities;CandleOperate candleOperate new CandleOperate(DataBaseEntity.getInstance()); %>虽然也添加了引用 <%page import"com.sjzh.xtrader.l…

ATT格式汇编语言

1.编译与链接 方法一&#xff1a;使用as #as -o test.o test.s #ld -o test test.o 方法二&#xff1a;使用gcc #gcc -o test test.s gnu连接器查找_start标签以确定程序的开始&#xff0c;但gcc查找main标签&#xff0c;所以使用gcc要把 _start改为main 2.调试 #as -gsta…

取得Repeater内部控件命令名与命令参数

前台&#xff1a; <table border"0"cellpadding"0"cellspacing"1"class"meet_tbl"><tr class"meet_title bold"><td>会议名称</td><td>制定日期</td><td>删除</td></tr…

Python在计算内存时值得注意的几个问题

作者 | 豌豆花下猫来源 | python猫&#xff08;ID:python_cat&#xff09;我之前的一篇文章&#xff0c;带大家揭晓了 Python 在给内置对象分配内存时的 5 个奇怪而有趣的小秘密。文中使用了sys.getsizeof()来计算内存&#xff0c;但是用这个方法计算时&#xff0c;可能会出现意…

HDU 1816, POJ 2723 Get Luffy Out(2-sat)

HDU 1816&#xff0c; POJ 2723 Get Luffy Out 题目链接 题意&#xff1a;N串钥匙。每串2把&#xff0c;仅仅能选一把。然后有n个大门&#xff0c;每一个门有两个锁&#xff0c;开了一个就能通过&#xff0c;问选一些钥匙&#xff0c;最多能通过多少个门 思路&#xff1a;二分通…

AI战“疫“之路:​揭秘高精准无感测温系统的全栈AI 技术

在这个全民抗疫的特殊时期&#xff0c;今年的春节返潮来得比往年迟了许多。如今不少企业结束了远程办公&#xff0c;开始陆续复工&#xff0c;一时间&#xff0c;无论是重点防控的机场、火车站&#xff0c;还是学校、企业、社区等密集型场所&#xff0c;都安排了密集的防疫驻扎…

关于text段、data段和bss段

根据APUE&#xff0c;程序分为下面的段&#xff1a;.text, data (initialized), bss, stack, heap。 data/bss/text: text段在内存中被映射为只读&#xff0c;但.data和.bss是可写的。 bss是英文Block Started by Symbol的简称&#xff0c;通常是指用来存放程序中未初始化的全局…

091023 T GIX4 项目中的 智能部署 和 智能客户端

先说一下ClickOnce的使用方法&#xff1a;先给一个要发布的工程设置安全和签名。然后发布到iis中。当用户访问该iis目录下的.application文件时,就会自动安装整个应用程序。 再说一下我们目前的应用程序。相对还是比较复杂的&#xff0c;分为框架部分和特定应用程序部分。其中的…

STL学习系列九:Map和multimap容器

1.map/multimap的简介 map是标准的关联式容器&#xff0c;一个map是一个键值对序列&#xff0c;即(key,value)对。它提供基于key的快速检索能力。map中key值是唯一的。集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入&#xff0c;所以不能指定插入位置。map的具体…

人工智能改变未来教育的5大方式!

作者 | Zohaib翻译 | 天道酬勤&#xff0c;编辑 | Carol出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;科技正在改变着我们的生活、工作和娱乐方式&#xff0c;教育领域也不例外。 人工智能将像大多数其他领域一样全面改变教育领域&#xff0c;这取决于当…

程序在内存中运行的奥秘

简介当丰富多彩的应用程序在计算机上运行&#xff0c;为你每天的工作和生活带来便利时&#xff0c;你是否知道它们是如何在计算机中工作呢&#xff1f;本文用形象的图表与生动的解释&#xff0c;揭示了程序在计算机中运行的奥秘。 内存管理是操作系统的核心功能&#xff0c;无论…