看似简单又难说清的内存具体分配问题。

jnjndong 2007-04-17 05:52:30
我知道进程会被windows 系统分配代码区,数据区,STACK区,HEAP区,也知道他们的增长,我现在想知道:这些区是在内存的什么范围内分配的,也就是在哪个地址范围,每个进程都从这个范围内分别分配代码区,数据区,STACK区,HEAP区吗?STACK区分配时是给每个进程都预留相同的大小吗?比如2M,那样如果没有用完怎么办?大家都先预留2M,那分完了,而进程的这个空间又没都用完不是浪费吗?HEAP也是一样的,是不是有一个范围专门分给HEAP,也 就是申请堆只能在这个范围不能在别的范围,还是可以遍历整个空间了,请详细的说说,另外给我推荐几本详细介绍这些知识的书,一般的操作系统的书没有具体谈这些,谢谢。
...全文
279 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
iambic 2007-04-18
  • 打赏
  • 举报
回复
这些东西操作系统的教科书未必会详细讲明。
iambic 2007-04-18
  • 打赏
  • 举报
回复
Windows核心编程
jnjndong 2007-04-18
  • 打赏
  • 举报
回复
我看操作系统了,可这些没具体说,我自己不敢确定
yixiao386 2007-04-18
  • 打赏
  • 举报
回复
好好看下操作系统这方面的书吧 看完就清楚了
thinkinnight 2007-04-18
  • 打赏
  • 举报
回复
我感觉最清楚就是要看intel的CPU原理的那本了,但是没有必要,看看windows核心编程就足够了
yutaooo 2007-04-17
  • 打赏
  • 举报
回复
不是物理地址相同. 是虚拟地址相同.

我是这样理解这个问题的. 我把虚拟地址和实际的物理存储(内存和硬盘的交换空间)分做两层来看. 每个进程都有自己私有的一个虚拟地址空间, 而实际的物理存储会影射到这个地址空间来. 给人感觉就象是一个大雪地, 你走到的地都是实的,这点由系统确保, 只要你往那个点踩, 它就一定把一块实地准备在那里, 但你不踩的地方, 其实下面全是窟窿, 啥也没的.

我说的可能不贴切, 也可能理解不正确的啊. 你要相信写书的大师, 我的听听就够了啊.
jnjndong 2007-04-17
  • 打赏
  • 举报
回复
谢谢大家,yutaooo 我想问你和大家,你说的2 每个进程的基址相同的话是不是物理地址相同了,那不乱套了吗? 核心编程这本书正在看,还没看到他具体讲栈和堆,看到目录上有内存管理.
我现在的理解是:每个进程都有自己的代码,数据,栈区,各个进程互不侵犯,每个进程的各个区也不侵犯,我这么认为对吗?可是堆区呢?每个进程都有自己的堆取?我怎么感觉是所有的都有共同的堆区呀,就好象链一样的,分配时就分给某个进程,不用时就回收?对吗?
还有,老说虚拟内存,是指比如32位虚拟内存是指4GB,但实际上不能用这么多吗?虚拟内存到底指什么?还是每个进程相对于自己的内存地址叫虚拟内存?
还有就是虚拟存储器是指内存和外存的容量了对不对?这个虚拟内存又是不同的是吗?
多谢大家
jnjndong 2007-04-17
  • 打赏
  • 举报
回复
谢谢大家,我怎么给你门分数呀,我刚到这里来,不知道怎么给你们分数,呵呵
wangzhangyong411 2007-04-17
  • 打赏
  • 举报
回复
你每种都申请一个 然后再打印出他的地址就知道啦

呵呵楼上的已经说得比较详细了,在windows核心编程里讲得比较详细

但是那里的用户的2G空间的分法不详细

yutaooo 2007-04-17
  • 打赏
  • 举报
回复
windows的实际版本我想有几百种,他们做每日构建的, 我们能遇到的也几十种(把补丁考虑在内), 各个版本内部做些策略的细微调整也很常有啊. 从高层抽象理解, 不拘泥于实现, 但能快速掌控实现我想才是重要的.
HewpKanXue 2007-04-17
  • 打赏
  • 举报
回复
看Windows核心编程,楼主后面几个问题都有讲。
femalelover 2007-04-17
  • 打赏
  • 举报
回复
这种问题也是我常常思考的, 不过不同的操作系统稍微有点不同, 关于XP的内存管理, 权威的书籍里没见过, 网上的道听途说有些又不可信.
不过楼上说的windows核心编程确实大篇幅讲了讲这个问题, 且和XP是一个系列的操作系统.
touchminami 2007-04-17
  • 打赏
  • 举报
回复
up
yutaooo 2007-04-17
  • 打赏
  • 举报
回复
1.windows的用户进程,每个都有独立的4GB地址空间.通常其中的2GB(但可改变)是用于用户的.

2.每个进程都有一个基地址.有非常多的进程基地址都是一样的.但它是可以不同的. 比方说可以通过rebase.exe这种工具调整.

3.进程通常会有一个默认大小的栈.好象是1M.没用完就没用完咯.

4.真的分完了,引发分页错误啊,系统做决策把分页置换出去.

5.我想你参考下windows编程方面的书就好了.MSDN也行的啊.

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧