社区
C++ 语言
帖子详情
malloc分配内存不需要经过虚拟内存吗?
mengxiang2003
2008-04-09 05:09:05
为什么一下子就得到了所要的物理内存?不符合虚拟内存的特性?(随用随分配物理内存)
...全文
1582
54
打赏
收藏
malloc分配内存不需要经过虚拟内存吗?
为什么一下子就得到了所要的物理内存?不符合虚拟内存的特性?(随用随分配物理内存)
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
54 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
走着走着跑了
2012-06-11
打赏
举报
回复
必须的
Felven
2011-11-27
打赏
举报
回复
学习了
pankun
2008-04-11
打赏
举报
回复
这也不对, 那段汇编是为了应付X86的段式内存管理用的, 和进程的数据段, 堆, 栈并非一种概念
===============================================
我这里本来就没指进程的数据段,堆,栈的
这句话也不清不楚, 什么叫做进程的堆? 进程有被创建时的默认堆, 有动态C运行库的堆, 可能还有静态链接的C运行库的堆, 可能还有用户自己建立的堆.malloc只能从他所属的C运行库的堆里分配内存. new就更复杂, 因为可能会被重载, 谁知道那个new跑到什么地方去分配内存去了.
===============================================
这里是我说得不严谨,谢谢指正 :-)
sheenl
2008-04-11
打赏
举报
回复
对于目前的大多数机器,都是采用段页式内存管理
===========================================================================
这句话应该改成,
"对于目前的大多数机器,都是不采用段页式内存管理. 但是X86架构的cpu是这么做的."
实际上LINUX内核堆栈段和数据段根本不分的
===============================================
这也不对, 那段汇编是为了应付X86的段式内存管理用的, 和进程的数据段, 堆, 栈并非一种概念.
malloc只管在当前进程堆上分配内存
==================================================
这句话也不清不楚, 什么叫做进程的堆? 进程有被创建时的默认堆, 有动态C运行库的堆, 可能还有静态链接的C运行库的堆, 可能还有用户自己建立的堆.
malloc只能从他所属的C运行库的堆里分配内存. new就更复杂, 因为可能会被重载, 谁知道那个new跑到什么地方去分配内存去了.
zhoufuguo8802
2008-04-11
打赏
举报
回复
malloc只是从c运行库的默认堆里分配内存,
对malloc来说, 连虚拟内存的边还怎么没沾上呢, 物理内存更是遥不可及的东西.
pankun
2008-04-11
打赏
举报
回复
加为好友
发送私信
在线聊天
* jinwei1984
*
* 等级:
发表于:2008-04-10 16:43:2836楼 得分:0
你要明白OS 虚拟内存机制,分页,分段
你的任何一个程序在运行时,创建一个进程
包括(进程表, 进程的地址空间 UNIX系统)
这个进程的地址空间包括三部分:
1代码段(程序代码和常数)
2数据段(就是一些全局,静态变量等等)
3堆栈段(就是用来给你运行时预留的空间,可以从这里动态分配,包括在栈中分配,
在堆中分配两种动态分配,只是各自增长方式不一样)
对于目前的大多数机器,都是采用段页式内存管理,进程的每个段都放在内存的不同的段中,
然后对进程的段分页,实现虚拟内存机制,这中间地址的变化过程:
段的二维地址-->一维的线性地址--->通过MMU页面映射到物理地址
malloc是在进程的地址空间中分配的,申请的动态内存,即上面的 3堆栈段的堆中
--------------------
这位老兄说法有问题,malloc在哪分取绝于OS实现,实际上LINUX内核堆栈段和数据段根本不分的,参见linux源码include/asm-i386/processor.h
#define start_thread(regs, new_eip, new_esp) do { \
__asm__("movl %0,%%fs ; movl %0,%%gs": :"r" (0)); \
set_fs(USER_DS); \
regs->xds = __USER_DS; \
regs->xes = __USER_DS; \
regs->xss = __USER_DS; \
regs->xcs = __USER_CS; \
regs->eip = new_eip; \
regs->esp = new_esp; \
} while (0)
ss被始始化成_USER_DS段描述符,同ds, es
malloc只管在当前进程堆上分配内存,是C library,当前进程堆内存不够时会用系统调用向OS申请,至于申请的是什么内存,OS决定
pankun
2008-04-11
打赏
举报
回复
怎么大部分人都不去看看保护模式和虚拟内存原理呢,汗
wjlsmail
2008-04-11
打赏
举报
回复
Study
青葱岁月不可追
2008-04-11
打赏
举报
回复
LZ可以用%p逐个地址输出一下,看看具体的不就知道是不是真正的物理内存了吗?
myullian
2008-04-11
打赏
举报
回复
[Quote=引用 27 楼 fetag 的回复:]
引用 25 楼 mymtom 的回复:
malloc和虚拟内存没有什么关系嘛。
TC 2.0 的时代哪里来的虚拟内存,malloc照样用的好好的。
呵呵,终于有人说到点子上了!malloc()本身是不知道自己分配的内存是物理内存还是虚拟内存的!而实际上到底分哪部分,是有OS的内存
管理部分来决定的!
[/Quote]
myullian
2008-04-11
打赏
举报
回复
[Quote=引用 37 楼 Polarislee 的回复:]
malloc的实现是完全依赖于操作系统的。它会调用操作系统的API来进行内存分配。
至于分配到的内存会被怎么处理,你不知道,也不需要知道。反正即使内存被交换到了硬盘上在你访问的时候也会交换回来的
[/Quote]
con_con
2008-04-11
打赏
举报
回复
怎么不需要
只不过底层的事情对我们来说是透明的罢了
除了你自己写的操作系统,
估计没有哪个操作系统会直接给MALLOC()物理地址了
建议多看看与操作系统平台相关的编程书籍
jeff_nie
2008-04-11
打赏
举报
回复
mark
sky54laozhu
2008-04-11
打赏
举报
回复
路过。。。
zhdsheng
2008-04-11
打赏
举报
回复
学习!
endlessdream
2008-04-11
打赏
举报
回复
这个不是一个层面上的东西吧。malloc还得通过操作系统来分配得到内存。具体的怎么分配,还有在哪分配就是操作系统的工作了,我们没有权利来干涉它的工作了。
boxxer
2008-04-11
打赏
举报
回复
学习学习。
ppzzhhsky
2008-04-10
打赏
举报
回复
在内存中有一块冗余的内存叫help区
所有编译申请的东西都在这一块
malloc也在这一块
和物理内存根本就没有任何关系的
bhujm
2008-04-10
打赏
举报
回复
[Quote=引用 29 楼 juniper123 的回复:]
C library 是建立在OS之上的,最终通过OS 的系统调用来实现内存分配。
[/Quote]
对啊,就这么个道理。
outwindows
2008-04-10
打赏
举报
回复
mark
加载更多回复(34)
相关推荐
malloc
是如何
分配内存
的
malloc
是如何
分配内存
的
malloc
和free的实现与原理 什么场景下
malloc
() 会通过 brk()
分配内存
?又是什么场景下通过 mmap()
分配内存
?
malloc
(1) 会分配多大的
虚拟内存
? free 释放内存,会归还给操作系统吗? 为什么不全使用`mmap()` 或`brk()` free() 函数只传入一个内存地址,为什么能知道要释放多大的内存?......
Malloc
()和free()实现
写C语言的人对
malloc
和free不陌生,c语言只能通过
malloc
和free来申请和释放内存,在linux下sbrk()系统调用来实现。而brk()和sbrk()主要实现从
虚拟内存
到物理内存的映射。 在GUN C中,内存分配过程如下: 每个进程可以访问
虚拟内存
地址为3G,但程序编译时,不
需要
这么多内存,没必要分配这么大的空间,只分配数据段不大的空间。如果空间不够,
malloc
函数族(realloc,calloc)就调用sbrk将数据段向下移。sbrk(...
深入理解
malloc
内存分配函数
最近想多写一些内存管理的文章,这次我们就以
malloc
动态内存分配为切入点,我在文中也做了小实验: 目录 1、Linux 进程的内存分布长什么样? 2、
malloc
是如何
分配内存
的? 什么场景下
malloc
() 会通过 brk()
分配内存
?又是什么场景下通过 mmap()
分配内存
?
malloc
() 分配的是物理内存吗? 3、
malloc
(1) 会分配多大的
虚拟内存
? 3.1、free 释放内存,会归还给操作系统吗? 4、为什么不全部使用 mmap 来
分配内存
? 5、既...
Linux
虚拟内存
、Java直接内存和内存映射
文章目录Linux
虚拟内存
分页和页表内存寻址和分配
虚拟内存
空间分布
malloc
和free是如何分配和释放内存?内存分配的原理
malloc
(brk,sbrk)和mmap
分配内存
方式的比较Java 中的直接内存三个场景场景一:将一个文件通过网络发送出去传统方式java mmapjava的sendfile场景二:将应用程序中的内存中的数据通过网络发送出去(非磁盘上的)场景三:从网络读数据到Java应用程...
嵌入式linux内存使用与性能优化
1、内核分配物理内存的最小单位为一个物理页面,一个物理页面为4kb。无论
虚拟内存
分配了多少字节,比如
malloc
(400),内核仍然分配4kb物理内存页面。 2、
malloc
语句执行时,只是给进程分配了
虚拟内存
,
虚拟内存
此时不占用物理内存。当使用此处内存时,比如变量赋值*p =
发帖
C++ 语言
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
6.3w+
社区成员
25.0w+
社区内容
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
帖子事件
创建了帖子
2008-04-09 05:09
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下