Re: [问题] memory stack 的问题

楼主: tinlans ( )   2016-08-29 13:36:39
※ 引述《kyuudonut (善良老百姓)》之铭言:
: 最近在研读virtual memory相关知识,大致上了解paging的运作模式
: [问题二] 如果有多个 process 同时运作,各自 stack 的起始位置又是如何分配呢?
: (一直往下长不会撞到吗@@)
: (当某 process 需要的 stack 大小超过两个 page 又是如何维护?
: page 如果不连续怎么办?)
你既然是在读 virtual memeory,应该知道每个 process 都有自己一块虚拟位址空间。
以 32-bit 系统来说,就是每个 process 各自有 4GB 的寻址空间。
这 4GB 的寻址空间,再细一点的分法是再区分成 user space 跟 kernel space。
默认的状况下,Windows 是 2GB/2GB,Linux 则是 3GB/1GB。
有些人在 32-bit 的 XP 插了很大内存的显示卡,结果内存剩下 2.xx GB,
原因就是这样来的,因为 kernel space 要划一块去映射,细节要问熟微软系统的。
stack 和 heap 这些东西都在 user space,user space 是各 process 之间独立的。
换句话说对每个 32-bit Linux process 而言,那 3GB 里不会有其它 process 的资料。
所以没有什么撞到的问题,两个平行世界的东西你要怎么让它们相撞?
如果要 programmer 去担心这种事,那 virtual memory 存在的意义就没有了。
你没特别设定的话,同个编译系统生出来的执行档,在同个 OS 执行,
每个 process 的 stack 起始位址都是一模一样的,当然这不会是实体位址。
stack 的 page 当然是连续的。
在每个 process 各自独立的虚拟 3GB 寻址空间里,有什么理由划不出连续空间?
你 C 程式里 pointer 看到的内存位址都是这些虚拟位址,并不是实体的。
至于这些 page 怎么对应到实体内存的 frame,我想书上应该都写得很清楚了。
作者: tjjh89017 (伊达政宗)   2016-08-29 16:53:00
你没有假设ASLR disable的情况不能说“stack 起始位址都是一模一样的”
楼主: tinlans ( )   2016-08-29 21:14:00
确实现在的系统 ASLR 默认都打开了,但会把他的问题更复杂化。不过还是感谢补充 XD
作者: wtchen (没有存在感的人)   2016-08-29 23:15:00
请问个问题,32bit一个process就4GB,64bit应该就unlimit那系统要怎么判断有无out-of-memory?
作者: suhorng ( )   2016-08-29 23:40:00
4GB 是 memory address space, 要用内存要配置才有作业系统管理内存的分配跟 mapping, 会知道有没有 OOM
作者: ah7675 (阿毛)   2016-08-29 23:43:00
address space跟使用多少是两回事啊啊啊
作者: lsc36 (lsc36)   2016-08-29 23:45:00
指标有32/64bit这么长可是还是要跟OS拿page来用啊
作者: kyuudonut (善良老百姓)   2016-08-30 00:21:00
谢谢前辈回答,所以kernel在切换process的时候,会再依另外依各自的page table做映射的意思吗?
作者: wtchen (没有存在感的人)   2016-08-30 01:09:00
那请问一个process里的不同thread的stack要怎么划?据我所知Linux默认的stack size limit是8MiB远小于user space的3GB...其实我很不懂heap是往下延伸stack往上直到两者相撞的话为啥heap还是可以无限增加(看OS支援大小)而stack不行
作者: PkmX (阿猫)   2016-08-30 02:03:00
linux的话thread的stack是userspace自己allocate然后pass给clone(2)8MB是默认的softlimit 你爽的话也可以ulimit -s去加大它其实我很讨厌往上/下长的说法 说往0或无限大长不是很好吗XD
作者: kdjf (我抓得到什么呢?)   2016-08-30 02:10:00
stack也可以无限加,只是OS申请要先跟OS申请heap要用brk跟系统要空间一样
作者: wtchen (没有存在感的人)   2016-08-30 02:13:00
感谢说明,受教了
作者: kdjf (我抓得到什么呢?)   2016-08-30 02:13:00
只是习惯上把已知一定连续又可预测生命的资料放在自然连续的stack里方便又快刚刚google到setrlimit,可能是他吧不过stack叫做stack&他的用法可能是古老的hardware stack时留下来的?
作者: tjjh89017 (伊达政宗)   2016-08-30 02:24:00
是说,64bit还有实体寻址的问题,不是真的一定有2^64
作者: kyuudonut (善良老百姓)   2016-08-30 15:21:00
谢谢前辈指点! 难怪每次看到memory的内存分配图有些都会称为 process memory
作者: CaptainH (Cannon)   2016-08-30 22:38:00
作者: askacis (ASKA)   2016-08-31 18:19:00
linux下setrlimit()也是可以用来调Stack sizepthread_attr_setstacksize()可以拿来调整thread

Links booklink

Contact Us: admin [ a t ] ucptt.com