问个关于进程的比较傻的问题吧

gattuso8 2008-11-28 01:49:38
程序运行过程中,内存分成5个区,
堆、栈、自由存储区、静态存储区和常量存储区。

那么这五个区对进程而言是什么样子的呢?
1。每个进程都有自己独立的五个区,
还是仅仅五个区只是逻辑上属于某个进程呢?
2。对于一个进程而言,量级上,这五个区是什么样子的呢?
...全文
118 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
gattuso8 2008-11-30
  • 打赏
  • 举报
回复
谢谢大伙。。。
nj_dobetter 2008-11-28
  • 打赏
  • 举报
回复
你说的这几个段是程序员可以理解的几个段,程序员可以给代码分段;
段页式内存管理,分段面向程序员,分页面向硬件和操作系统(页对程序员不可见)
gattuso8 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xhs_lh04 的回复:]
不是这样理解
是给进程的虚拟空间4G,这其中有1G的系统空间,3G的用户空间,呵呵这是LINUX的,WINDOWS我不知道了
[/Quote]

哦 一个进程的理论空间哈
xhs_lh04 2008-11-28
  • 打赏
  • 举报
回复
不是这样理解
是给进程的虚拟空间4G,这其中有1G的系统空间,3G的用户空间,呵呵这是LINUX的,WINDOWS我不知道了
gattuso8 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xhs_lh04 的回复:]
有些操作系统是可以调整堆栈的大小的,比如HP-UX
一般是多少限制,不好说对一个进程来说代码段上来是数据段,再上来是未用的,最上面才是栈区,栈是从上往下长,数据区是从下往上长,两个要碰到了,就到了堆栈的最大限了,
[/Quote]

谢拉!
gattuso8 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xhs_lh04 的回复:]
这个问题扩展起来回答挺费劲的
我们先来看看执行文件的格式
通常计算机目标文件有三种格式可重定位的目标文件:包含二进制代码和数据,与其他可重定位目标文件合并起来,创建一个可执行目标文件。可执行的目标文件:包含二进制代码和数据,其形式可以被直接拷贝到存储器中并执行,共享目标文件:一种特殊的可重定位目标文件,即我们通常所说的动(静)态链接库
可重定位的目标文件格式,大概的,记的不是很清
节头部表
.s…
[/Quote]


另外进程在虚拟空间又分为用户空间(3G)跟系统空间(1G),并不仅只是楼主提到的上面5个区,这5个区仅指代码中变量的存储区域而已
------------------------------------
可以理解为
一个个进程 分别站用了用户空间的一部分吧?
xhs_lh04 2008-11-28
  • 打赏
  • 举报
回复
有些操作系统是可以调整堆栈的大小的,比如HP-UX
一般是多少限制,不好说对一个进程来说代码段上来是数据段,再上来是未用的,最上面才是栈区,栈是从上往下长,数据区是从下往上长,两个要碰到了,就到了堆栈的最大限了,
gattuso8 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xhs_lh04 的回复:]
引用 8 楼 gattuso8 的回复:
俺是楼猪
1 到底是三种 还是五种呢
是不是只是讲法不同?
自由存储区、静态存储区和常量存储区 听着在实际物理内存里 好象差不多
2 比如进程的栈 是不是进程在启动时直接分配了一定数量,需要时系统在继续分配呢。。。

1.C++通常说法是你最早提到的5种
2.不是实际物理内存,OK,实现物理内存里不分分出5个区域里给你放这种东西,是分配的连续虚拟页面,可能是物理内存里,也有可能不在

[/Quote]

1 物理内存的说法确实不太贴切
2 我试了一下 楼上描述的比较贴切
使用疯狂嵌套的方法调用函数 调用到一万多次时栈益处
而疯狂分配内存到是不会产生崩溃
估计进程栈应该是没法动态增加的
3 进程栈一般多大啊 能否给给量级?
xhs_lh04 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gattuso8 的回复:]
俺是楼猪
1 到底是三种 还是五种呢
是不是只是讲法不同?
自由存储区、静态存储区和常量存储区 听着在实际物理内存里 好象差不多
2 比如进程的栈 是不是进程在启动时直接分配了一定数量,需要时系统在继续分配呢。。。
[/Quote]
1.C++通常说法是你最早提到的5种
2.不是实际物理内存,OK,实现物理内存里不分分出5个区域里给你放这种东西,是分配的连续虚拟页面,可能是物理内存里,也有可能不在
3.另一开始就规划好了栈底的位置,栈顶的位置根据入栈/出栈操作而改变,但它的大小是有限制的
gattuso8 2008-11-28
  • 打赏
  • 举报
回复
俺是楼猪
1 到底是三种 还是五种呢
是不是只是讲法不同?
自由存储区、静态存储区和常量存储区 听着在实际物理内存里 好象差不多
2 比如进程的栈 是不是进程在启动时直接分配了一定数量,需要时系统在继续分配呢。。。
xhs_lh04 2008-11-28
  • 打赏
  • 举报
回复
这个问题扩展起来回答挺费劲的
我们先来看看执行文件的格式
通常计算机目标文件有三种格式可重定位的目标文件:包含二进制代码和数据,与其他可重定位目标文件合并起来,创建一个可执行目标文件。可执行的目标文件:包含二进制代码和数据,其形式可以被直接拷贝到存储器中并执行,共享目标文件:一种特殊的可重定位目标文件,即我们通常所说的动(静)态链接库
可重定位的目标文件格式,大概的,记的不是很清
节头部表
.strtab //一个字符串表,其内容包含.systab和.debug节中的符号表
.line //原始C程序的行号和.text节中机器指令之间的映射
.debug //调试信息.如-g编译出来的
.rel.data //被模块定义和引用的任何全局变量的信息
.rel.text //不清楚了,记不得了,抱歉
.symtab //符号表,存放在程序中被定义和引用的函数和全局变量的信息
.bss //未初始化的全局变量
.dataa //已初始化的全局变量
.rodata //只读数据,如pintf和switch语句中的字符串和常量值
.textt//已编译程序的机器代码
ELF头
内核在load二进制文件时会将ELF读入,并分配页面(虚拟4G空间),并初始化进程页面,页面最高作为进程的堆栈区,从高(栈底)往下(栈顶)

这些区域当然都是逻辑的,并没有在内存中有明显的区域划分,但是内核限制,会有些判断来判定是否栈区大小超界
另外进程在虚拟空间又分为用户空间(3G)跟系统空间(1G),并不仅只是楼主提到的上面5个区,这5个区仅指代码中变量的存储区域而已

哎,这种问题说起来话长,说了半天也没感觉说到点子上

呵呵,有空看看内核方面的书
whsfer 2008-11-28
  • 打赏
  • 举报
回复
冒似只有三个区:静态存储区,动态堆存储区,动态栈存储区。
本人感觉界限不应该分太清,因为有的进程要调用其他进程的函数或者变量。
ARLENE_YANG 2008-11-28
  • 打赏
  • 举报
回复
UP
DarknessTM 2008-11-28
  • 打赏
  • 举报
回复
进程间自然都是独立的

进程内部的话,堆是共享的,栈是各个线程独立的
zhanshen2891 2008-11-28
  • 打赏
  • 举报
回复
准确的说是可用内存只有堆和栈,各个进程是独立的,初始化系统给你分配一块,可以动态改变大小,你写用户代码就这么认为。
就呆在云上 2008-11-28
  • 打赏
  • 举报
回复
每个程序都有自己的一份空间,包括你说的5个区
应该是逻辑上的吧

具体的空间分配可以google一下,我也不记得了
下楼的顶起
hhyttppd 2008-11-28
  • 打赏
  • 举报
回复
果真存在这个的分区?

64,647

社区成员

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

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