由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Linux版 - 问一个跟 memory (process address space) 的有关的问题
相关主题
question on mem management这要放美国,出了个kylin
glibc和kernel的兼容性问题开源虚拟机VirtualBox 3.1.6 发布
mmap question为啥用mmap访问文件的效率高呢?
Char x[] = "abc"; 是在heap还是stack上? (转载)Google go 还挺不错的
virtualization and CPU design请教个文件权限的问题
问一下mmap怎么读的文件啊?24 processes reading one file
howto install vboxguestadditions on CentOS.linux怎么读入一个超过有超过1B integer的binary file? (转载)
有人玩树梅么? Raspery pimodule load problem on android
相关话题的讨论汇总
话题: mmap话题: page话题: memory话题: process话题: heap
进入Linux版参与讨论
1 (共1页)
c*********t
发帖数: 2921
1
在Linux下,一个process运行的时候address space都会有stack section, data
section, test section, bss section,等等,以及由 malloc()所得到的 memory.
我的问题是,malloc()到底是从系统的什么地方得到的动态memory?是不是从所谓的
heap 得到的?
如果是这样,是不是 heap 就是整个系统共有的 memory pool,各个process可以从这里
动态的得到memory via malloc()?
谢谢!
S*A
发帖数: 7142
2
这个问题问得好。
Malloc 一般可以从两个地方得到 address space. 一个就是 heap.
address space 是通过 brk 系统调用来调整 heap 的最高可用的
地址。但是 brk 可以扩展的有限,至少在 x86 是这样。
另外一个地方就是通过 mmap. mmap anonymous page 就是可以
获得新的可以用的 memory.
但是这个和系统的 memory 又是另一回事。对 kernel 来说,
kernel 看到的是 raw pages. 这些 page 可以根据需要 bind
在某一个 virtual memory address space 里面。这个 binding
不是固定的。 kernel 可以把 某个 process 的 page unmap
出来用干其他的事情,等那个 process 用到那个 page 才产生
page fault, kernel 知道去什么地方把那个 page 内容从新搞
出来。一般是在某个文件,如果是 file backing, 或者是 swap
file 如果没有 file backing.
所以这里有三层的关系。process address space,先是有个
vma list, 描述这个 virtual address 里面什么 address 是可以
用的,vma 里面有个 pointer 到第二层,就是 vma 到 raw page
的mapping. 这个 mapping 可以是虚的,就是没有 raw page backup.
用到的时候动态产生 page fault,随便抢一个 free page, 然后到,
第三层 file mapping 里面去找内容, 然后把这个 page 给 process
用。
所以这个有个 over commit 的问题。所有 process address space
加起来可能比实际的 raw pages 要多,kernel 就是通过拆东墙补西墙,
来动态慢足大家的要求。

【在 c*********t 的大作中提到】
: 在Linux下,一个process运行的时候address space都会有stack section, data
: section, test section, bss section,等等,以及由 malloc()所得到的 memory.
: 我的问题是,malloc()到底是从系统的什么地方得到的动态memory?是不是从所谓的
: heap 得到的?
: 如果是这样,是不是 heap 就是整个系统共有的 memory pool,各个process可以从这里
: 动态的得到memory via malloc()?
: 谢谢!

c*********t
发帖数: 2921
3
SSA,
谢谢你的回答。你说的很好,俺长知识了。
我看过 Robert Love的<>,它的第14章,讲过你提到的
mmap, vma等等。只是看的不是完全明白。
请教个问题,到底heap 是个什么?是每个process有自己独立的heap? 还是整个系统只
有一个公用的heap?
我在 programming版也问了这个问题,有一个回答,你觉得如何?希望能通过讨论,把
这个问题弄明白。
http://www.mitbbs.com/article_t0/Programming/31197197.html
谢谢!

【在 S*A 的大作中提到】
: 这个问题问得好。
: Malloc 一般可以从两个地方得到 address space. 一个就是 heap.
: address space 是通过 brk 系统调用来调整 heap 的最高可用的
: 地址。但是 brk 可以扩展的有限,至少在 x86 是这样。
: 另外一个地方就是通过 mmap. mmap anonymous page 就是可以
: 获得新的可以用的 memory.
: 但是这个和系统的 memory 又是另一回事。对 kernel 来说,
: kernel 看到的是 raw pages. 这些 page 可以根据需要 bind
: 在某一个 virtual memory address space 里面。这个 binding
: 不是固定的。 kernel 可以把 某个 process 的 page unmap

r****o
发帖数: 1950
4
Each process有自己独立的heap。

【在 c*********t 的大作中提到】
: SSA,
: 谢谢你的回答。你说的很好,俺长知识了。
: 我看过 Robert Love的<>,它的第14章,讲过你提到的
: mmap, vma等等。只是看的不是完全明白。
: 请教个问题,到底heap 是个什么?是每个process有自己独立的heap? 还是整个系统只
: 有一个公用的heap?
: 我在 programming版也问了这个问题,有一个回答,你觉得如何?希望能通过讨论,把
: 这个问题弄明白。
: http://www.mitbbs.com/article_t0/Programming/31197197.html
: 谢谢!

r****o
发帖数: 1950
5
我的理解是:
heap就是一段内存空间。每个process都有自己独立的heap和stack,在这个heap和
stack中间还有一个过渡地带。
brk是用来扩大heap的边界(往过渡地带延伸),
mmap是用来在过渡地带中直接划出一块内存出来(不一定和heap相连),kernel也有可能
从其他process的heap和过渡地带中暂时调用空闲的内存页。
不知道我的理解是否准确。希望大家指正。

【在 c*********t 的大作中提到】
: SSA,
: 谢谢你的回答。你说的很好,俺长知识了。
: 我看过 Robert Love的<>,它的第14章,讲过你提到的
: mmap, vma等等。只是看的不是完全明白。
: 请教个问题,到底heap 是个什么?是每个process有自己独立的heap? 还是整个系统只
: 有一个公用的heap?
: 我在 programming版也问了这个问题,有一个回答,你觉得如何?希望能通过讨论,把
: 这个问题弄明白。
: http://www.mitbbs.com/article_t0/Programming/31197197.html
: 谢谢!

S*A
发帖数: 7142
6

别人回答这个了,我同意 :-)
说的对啊。
关键是我觉得你不熟悉 process virtual memory mapping 这个概念。
在 linux 里面, /proc//maps
就说明这个 process 的 virtual memory 是如何 map 的。
你可以看到当前的 [heap] 在什么 virtual address range.
brk 可以调整那个 [heap] 的结束地址。
里面还有 [stack] 是 stack 的 virtual address.

【在 c*********t 的大作中提到】
: SSA,
: 谢谢你的回答。你说的很好,俺长知识了。
: 我看过 Robert Love的<>,它的第14章,讲过你提到的
: mmap, vma等等。只是看的不是完全明白。
: 请教个问题,到底heap 是个什么?是每个process有自己独立的heap? 还是整个系统只
: 有一个公用的heap?
: 我在 programming版也问了这个问题,有一个回答,你觉得如何?希望能通过讨论,把
: 这个问题弄明白。
: http://www.mitbbs.com/article_t0/Programming/31197197.html
: 谢谢!

S*A
发帖数: 7142
7

这个都对。
这个不对。这个表明你还没有理解 kernel 的 virtual memory 是如何工作的。
没有用上的 virtual address 是 page table 是空的。你如果访问
就直接 signal 11 segfault. 这个 virtual address 有没有用上是
vma 那层管理的。 每个 process 有自己 vma list.
kernel 可以 swap 几乎任何 heap 甚至 mmap 里面的内存页。kernel 把
那个页里的内容写到 file backing 里面就可以把那个 page 偷走了。
被偷的 vma 里面换成 empty page, 访问的时候产生 page fault.
在 page fault handler 里面把那个页的原来内容再从文件里恢复
出来。这个就是 swapping. 恢复的那个 physical page 完全可能和
原来上一次的 physical page 不是同一个。只是内容一样。对 process
来说是透明的。

【在 r****o 的大作中提到】
: 我的理解是:
: heap就是一段内存空间。每个process都有自己独立的heap和stack,在这个heap和
: stack中间还有一个过渡地带。
: brk是用来扩大heap的边界(往过渡地带延伸),
: mmap是用来在过渡地带中直接划出一块内存出来(不一定和heap相连),kernel也有可能
: 从其他process的heap和过渡地带中暂时调用空闲的内存页。
: 不知道我的理解是否准确。希望大家指正。

r****o
发帖数: 1950
8
多谢指正。你说的page fault handler中的文件是hard disk里吗?
我对mmap还有点不懂,我发现它的一个用途是用来把磁盘中的文件映射到内存空间,还
有一个用途是用在malloc里面。不知道这两个用法是不是有什么关

【在 S*A 的大作中提到】
:
: 这个都对。
: 这个不对。这个表明你还没有理解 kernel 的 virtual memory 是如何工作的。
: 没有用上的 virtual address 是 page table 是空的。你如果访问
: 就直接 signal 11 segfault. 这个 virtual address 有没有用上是
: vma 那层管理的。 每个 process 有自己 vma list.
: kernel 可以 swap 几乎任何 heap 甚至 mmap 里面的内存页。kernel 把
: 那个页里的内容写到 file backing 里面就可以把那个 page 偷走了。
: 被偷的 vma 里面换成 empty page, 访问的时候产生 page fault.
: 在 page fault handler 里面把那个页的原来内容再从文件里恢复

S*A
发帖数: 7142
9
所有被 swap out 的 page mapping 都有一个 page backing file,
并且有个 file offset.
如果是 mmap 硬盘上的文件,那就是这个 file, private mapping 另说。
如果没有对应的 mmap 的 file, 这个 page backing file 就是
swap file.
mmap 那只是你从 kernel 外部来看的作用。
从内部看 mmap 是整个 virtual memory management 的灵魂。
不懂 mmap 是如何工作的就不可能懂 kernel VMM system。
brk 说白了就是另一种简单的 anonymous mmap.

【在 r****o 的大作中提到】
: 多谢指正。你说的page fault handler中的文件是hard disk里吗?
: 我对mmap还有点不懂,我发现它的一个用途是用来把磁盘中的文件映射到内存空间,还
: 有一个用途是用在malloc里面。不知道这两个用法是不是有什么关

i*****e
发帖数: 1359
10
再拜高手
相关主题
问一下mmap怎么读的文件啊?这要放美国,出了个kylin
howto install vboxguestadditions on CentOS.开源虚拟机VirtualBox 3.1.6 发布
有人玩树梅么? Raspery pi为啥用mmap访问文件的效率高呢?
进入Linux版参与讨论
S*A
发帖数: 7142
11
小混混,都是混口饭吃,没有高低之分。

【在 i*****e 的大作中提到】
: 再拜高手
r****o
发帖数: 1950
12
多谢。
再问一下,
fork()函数生成的child process和parent process共享text segment,这里是不是也
用到了mmap?

【在 S*A 的大作中提到】
: 所有被 swap out 的 page mapping 都有一个 page backing file,
: 并且有个 file offset.
: 如果是 mmap 硬盘上的文件,那就是这个 file, private mapping 另说。
: 如果没有对应的 mmap 的 file, 这个 page backing file 就是
: swap file.
: mmap 那只是你从 kernel 外部来看的作用。
: 从内部看 mmap 是整个 virtual memory management 的灵魂。
: 不懂 mmap 是如何工作的就不可能懂 kernel VMM system。
: brk 说白了就是另一种简单的 anonymous mmap.

S*A
发帖数: 7142
13
是用到了 mmap, 但是跟 fork() 的直接关系不大。
一般程序的 .text segment 是从 ELF 的 .text section mmap 进来的。
也就是说,你有 500 个 bash process, 他们没有父子关系,也全部
共享同一个段 physical memory, if exist(swap in).
fork() 里面有更加激进的办法。父子进程的 virtual memory 是 clone
出来的,不但 text 共享,所有的 data, stack 也是共享,copy on write。
然后父子进程在改动任何一个 page (page fault) 的时候才安装一个自己的
private copy. 也就是说,在刚刚 fork 完那一下,所有东西都是共享的。

【在 r****o 的大作中提到】
: 多谢。
: 再问一下,
: fork()函数生成的child process和parent process共享text segment,这里是不是也
: 用到了mmap?

r****o
发帖数: 1950
14

多谢。请问这里的clone也是用到了mmap吗?
可不可以这样理解? 父进程把elf文件的.text section mmap到自己
的.text segment,子进程再把父进程的.text segment mmap到自己的.text segment,
结果
等价于直接从elf文件中的.text section mmap?

【在 S*A 的大作中提到】
: 是用到了 mmap, 但是跟 fork() 的直接关系不大。
: 一般程序的 .text segment 是从 ELF 的 .text section mmap 进来的。
: 也就是说,你有 500 个 bash process, 他们没有父子关系,也全部
: 共享同一个段 physical memory, if exist(swap in).
: fork() 里面有更加激进的办法。父子进程的 virtual memory 是 clone
: 出来的,不但 text 共享,所有的 data, stack 也是共享,copy on write。
: 然后父子进程在改动任何一个 page (page fault) 的时候才安装一个自己的
: private copy. 也就是说,在刚刚 fork 完那一下,所有东西都是共享的。

S*A
发帖数: 7142
15

没有。
这个理解是不对的。因为父子进程 fork 之后就分叉了,没有继承关系了。
也就是说, fork() 以后父进程改自己的 page, 子进程是看不到的。
如果用你的 mmap relay 的理解,子进程可以看到父进程的改动了。
子进程就是 copy 父进程的 mmap 关系, 不是 mmap 另外一遍。
自己看看 fork.c 的 dup_mmap()

【在 r****o 的大作中提到】
:
: 多谢。请问这里的clone也是用到了mmap吗?
: 可不可以这样理解? 父进程把elf文件的.text section mmap到自己
: 的.text segment,子进程再把父进程的.text segment mmap到自己的.text segment,
: 结果
: 等价于直接从elf文件中的.text section mmap?

q**d
发帖数: 16
16
IMO, your interpretation is correct if you understand that mmap ( or brk for
that matter) merely sets up page table entries, not actual page allocations
.
In the case of text segment, child/parent share pages (read only)- writing
to these pages would cause protection fault. In the case of data segment,
COW is used - writing to these pages by child cause page fault at which time
page fault handler is called to allocate physical memory.
S*A
发帖数: 7142
17
Just a friendly reminder that if you expect to see that logic
express in code, some thing like "if page is read only, do this,
else do COW" . It simply does not exist in dup_mmap().
That is why I am reluctant to twist the code to fit the
"mmap relay" story.
It is just a simple copy of the memory mappings.

time

【在 q**d 的大作中提到】
: IMO, your interpretation is correct if you understand that mmap ( or brk for
: that matter) merely sets up page table entries, not actual page allocations
: .
: In the case of text segment, child/parent share pages (read only)- writing
: to these pages would cause protection fault. In the case of data segment,
: COW is used - writing to these pages by child cause page fault at which time
: page fault handler is called to allocate physical memory.

1 (共1页)
进入Linux版参与讨论
相关主题
module load problem on androidvirtualization and CPU design
print out task_struct contents问一下mmap怎么读的文件啊?
glibc question,howto install vboxguestadditions on CentOS.
Linux 新手求教:在Cygwin下运行linux程序,主要有哪些限制? (转载)有人玩树梅么? Raspery pi
question on mem management这要放美国,出了个kylin
glibc和kernel的兼容性问题开源虚拟机VirtualBox 3.1.6 发布
mmap question为啥用mmap访问文件的效率高呢?
Char x[] = "abc"; 是在heap还是stack上? (转载)Google go 还挺不错的
相关话题的讨论汇总
话题: mmap话题: page话题: memory话题: process话题: heap