malloc分配内存不需要经过虚拟内存吗?

mengxiang2003 2008-04-09 05:09:05
为什么一下子就得到了所要的物理内存?不符合虚拟内存的特性?(随用随分配物理内存)




...全文
1582 54 打赏 收藏 举报
写回复
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
  • 打赏
  • 举报
回复
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)
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-04-09 05:09
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下