当前位置: 技术问答>linux和unix
进程解剖的疑惑,谁帮忙解答?
来源: 互联网 发布时间:2015-10-17
本文导语: 一个进程的映像大概是这样的: 高地址 命令行参数和环境变量 栈 堆 未初始化的数据 //由EXEC赋值0 初始化的数据 //由EXEC...
一个进程的映像大概是这样的:
高地址 命令行参数和环境变量
栈
堆
未初始化的数据 //由EXEC赋值0
初始化的数据 //由EXEC从文件读出
低地址 程序文本 //由EXEC从文件读出
我的疑惑是关于堆的.
1.进程的可用内存有4G
2.堆栈大小sSize在.stack段里写定了,但这个数目好像都不是很大,至少它远比不上4G这个数目
3.我的程序里malloc了很多内存,数目远大于sSize,而且都申请成功了
那么,我malloc来的内存是在堆里申请的吗?(UNIX高级编程UNIX系统编程都是这么说的),但不够大啊
如果不是,那又是在哪里申请的?哪个系统进程负责?
高地址 命令行参数和环境变量
栈
堆
未初始化的数据 //由EXEC赋值0
初始化的数据 //由EXEC从文件读出
低地址 程序文本 //由EXEC从文件读出
我的疑惑是关于堆的.
1.进程的可用内存有4G
2.堆栈大小sSize在.stack段里写定了,但这个数目好像都不是很大,至少它远比不上4G这个数目
3.我的程序里malloc了很多内存,数目远大于sSize,而且都申请成功了
那么,我malloc来的内存是在堆里申请的吗?(UNIX高级编程UNIX系统编程都是这么说的),但不够大啊
如果不是,那又是在哪里申请的?哪个系统进程负责?
|
首先对搂主的问题得不到满意的答案表示深切的同情 :-)
不过搂主因此对整个中国的程序员有如此判断未免有井底之蛙的嫌疑 :-(
废话少说,我懂多少说多少:
进程的映像大体如此,没有错,malloc从堆中分配,也没有错。但是你用malloc来分配内存,肯定得不到4G--堆没那么大!况且不需要这么大,单个进程需要使用4G的内存是很难想象的。由于不同进程有独立地址空间,因此总的内存使用量可以允许4G甚至超过(32bit的计算机需要在总线上动手脚)。
“有效”,“无效”标记?你说的应该是“读”,“写”,“执行”这些权限标记吧?这些标记在进程页表中指定,非法操作将引起软中断。
关于线程栈的问题就有点复杂了,因为不同系统对“线程”的实现方式不同,因此机制不一定就是一样。在Linux中,“线程”其实就和进程一样,只不过共享了进程(主线程)的某些资源(如堆,打开的文件句柄等),而栈是各自独立的。
不过搂主因此对整个中国的程序员有如此判断未免有井底之蛙的嫌疑 :-(
废话少说,我懂多少说多少:
进程的映像大体如此,没有错,malloc从堆中分配,也没有错。但是你用malloc来分配内存,肯定得不到4G--堆没那么大!况且不需要这么大,单个进程需要使用4G的内存是很难想象的。由于不同进程有独立地址空间,因此总的内存使用量可以允许4G甚至超过(32bit的计算机需要在总线上动手脚)。
“有效”,“无效”标记?你说的应该是“读”,“写”,“执行”这些权限标记吧?这些标记在进程页表中指定,非法操作将引起软中断。
关于线程栈的问题就有点复杂了,因为不同系统对“线程”的实现方式不同,因此机制不一定就是一样。在Linux中,“线程”其实就和进程一样,只不过共享了进程(主线程)的某些资源(如堆,打开的文件句柄等),而栈是各自独立的。
|
malloc 的内存实在堆中分配的,没有看过 malloc 的源码,但觉得楼主 1和2有点矛盾,不知道2中的
sSize 是哪儿的 ?
sSize 是哪儿的 ?
|
堆栈说的不是堆,其实是栈,每一个线程都有自己的栈,一般在链接的时候可以通过参数去修改默认的栈大小。
现在回答你的问题:
1、可用空间没有4G,其中大概有1G的样子是内核的映射,最多也就3G得样子,还要保存一些进程创建以后就要存在的东西,实际上你能用大概也就2G左右(stack不修改而用默认的话),当然了,最主要的还是考虑内核映射占据的空间
2、根据最上面说的,你应该知道栈的大小其实并不大的……
3、malloc是在heap,也就是堆上面分配的,大概可以有2G左右的空间吧(但是一般不会比2G多)
最后说一下,这个是一般的32位平台上的情况,如果是64位平台,未必是这样的(至少限制空间的时候完全可以超过4G)
现在回答你的问题:
1、可用空间没有4G,其中大概有1G的样子是内核的映射,最多也就3G得样子,还要保存一些进程创建以后就要存在的东西,实际上你能用大概也就2G左右(stack不修改而用默认的话),当然了,最主要的还是考虑内核映射占据的空间
2、根据最上面说的,你应该知道栈的大小其实并不大的……
3、malloc是在heap,也就是堆上面分配的,大概可以有2G左右的空间吧(但是一般不会比2G多)
最后说一下,这个是一般的32位平台上的情况,如果是64位平台,未必是这样的(至少限制空间的时候完全可以超过4G)