社区
C++ 语言
帖子详情
malloc分配内存不需要经过虚拟内存吗?
mengxiang2003
2008-04-09 05:09:05
为什么一下子就得到了所要的物理内存?不符合虚拟内存的特性?(随用随分配物理内存)
...全文
1601
54
打赏
收藏
malloc分配内存不需要经过虚拟内存吗?
为什么一下子就得到了所要的物理内存?不符合虚拟内存的特性?(随用随分配物理内存)
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
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
是如何
分配内存
的?
大家好,我是小林。 很早之前写了一篇图解
虚拟内存
的文章:真棒!20 张图揭开内存管理的迷雾,瞬间豁然开朗 最近想多写一些内存管理的文章,这次我们就以
malloc
动态内存分配为切入点,我在文中也做了小实验:
malloc
是如何
分配内存
的?
malloc
分配的是物理内存吗?
malloc
(1) 会分配多大的内存? free 释放内存,会归还给操作系统吗? free() 函数只传入一个内存地址,为什么能知道要释放多大的内存? 发车! Linux 进程的内存分布长什么样? 在 Linux 操作系统中,
学习笔记:
malloc
动态内存分配
笔记目录
malloc
是如何
分配内存
的?
malloc
() 分配的是物理内存吗?
malloc
(1) 会分配多大的
虚拟内存
? free 释放内存,会归还给操作系统吗? 为什么不全部使用 mmap 来
分配内存
? 既然 brk 可以大大降低CPU消耗,为什么不全部使用 brk 来分配? free() 函数只传入一个内存地址,为什么能知道要释放多大的内存?
malloc
是如何
分配内存
的? 实际上,
malloc
() 并不是系统调用,而是 C 库里的函数,用于动态
分配内存
。
malloc
申
malloc
是如何
分配内存
的
malloc
是如何
分配内存
的
malloc
和free的实现与原理 什么场景下
malloc
() 会通过 brk()
分配内存
?又是什么场景下通过 mmap()
分配内存
?
malloc
(1) 会分配多大的
虚拟内存
? free 释放内存,会归还给操作系统吗? 为什么不全使用`mmap()` 或`brk()` free() 函数只传入一个内存地址,为什么能知道要释放多大的内存?......
用
malloc
分配内存
,操作系统会为程序分配物理内存,什么时候会分配?
虚拟内存
与物理内存的分配时机
虚拟内存
的分配: 当程序调用
malloc
函数请求一定大小的内存时,
malloc
会首先尝试在进程的虚拟地址空间中为该请求分配一块连续的
虚拟内存
区域。这个过程通常是通过系统调用如brk(对于小块内存)或mmap(对于大块内存)来完成的。 重要的是要理解,这个步骤只是分配了
虚拟内存
,并没有直接涉及物理内存的分配。
虚拟内存
空间在逻辑上是连续的,但实际上它与物理内存的映射关系是动态的,即按需建立。 物理内存的分配: 物理内存的分配发生在进程第一次尝试访问已分配的
虚拟内存
linux进程的内存
分配内存
空间,【十问Linux
虚拟内存
管理】第三问:
malloc
分配多大的内存,就占用多大的物理内存空间吗?...
第三问来啦!3
malloc
分配多大的内存,就占用多大的物理内存空间吗?我们知道,
malloc
分配的的内存是虚拟地址空间,而虚拟地址空间和物理地址空间使用进程页表进行映射,那么分配了空间就是占用物理内存空间了吗?首先,进程使用多少内存可通过 ps aux 命令 查看,其中关键的两信息(第五、六列)为:1. VSZ , virtual memory size ,表示进程总共使用的虚拟地址空...
C++ 语言
65,189
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章