Redian新闻
>
问一个跟 memory (process address space) 的有关的问题
avatar
问一个跟 memory (process address space) 的有关的问题# Linux - Linux 操作系统
L*7
1
关于我们:
皇家橡树资产管理 (ROAM) 总管理资产为20亿美元,包括美国各类房地产资产组合,
业务涵盖美国所有主要房地产类型(办公室、住宅、酒店、博彩/娱乐、工业和基础设
施)。
此为,我们同时为客户寻求房地产及相关领域的新机会,包括在美国和全球形成新的投
资工具及基金架构。通过与合作伙伴的密切合作,我们利用深厚的行业专业知识和丰富
的经验,利用这些机会最大化满足投资者需求。
我们关注并保护客户的利益,通过创新解决方案,满足当今瞬息万变的竞争格局和需求
,助力投资人实现自己的目标,时刻保护投资者的资本是每一个决策的核心。
工作职责:
• 通过电话或者当面咨询与客户有效沟通,了解客户的移民需求、背景和条
件;准确评估客户需求,并针对不同客户制定专属移民计划
• 维护客户关系,有效协助律师和客户解决申请过程中的问题
• 耐心向客户解释材料,保证申请过程清晰顺利
• 负责市场调研,为业务拓展创建市场定量分析报告
• 积极安排、组织和参加移民营销活动,以获取新客户
优先参考以下背景的候选人:
• 学士、硕士教育背景优先
• 必须具备移民经验和背景
• 团队合作精神与协调能力
• 英语和中文双语
• 优秀的沟通技巧
• 了解 移民签证,移民法,合同法,融资并购相关法律法规之一。
avatar
l*9
2
想和一个朋友(美国公民)合伙注册一个公司,不知自己的F2身份是否可以?
avatar
c*t
3
在Linux下,一个process运行的时候address space都会有stack section, data
section, test section, bss section,等等,以及由 malloc()所得到的 memory.
我的问题是,malloc()到底是从系统的什么地方得到的动态memory?是不是从所谓的
heap 得到的?
如果是这样,是不是 heap 就是整个系统共有的 memory pool,各个process可以从这里
动态的得到memory via malloc()?
谢谢!
avatar
P*0
4
yes, you can depending on types. but you cannot *work* for it without
authorization. You can have passive investment, e.g., shares.

【在 l*******9 的大作中提到】
: 想和一个朋友(美国公民)合伙注册一个公司,不知自己的F2身份是否可以?
avatar
S*A
5
这个问题问得好。
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()?
: 谢谢!

avatar
l*9
6
Thanks a lot!
avatar
c*t
7
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

avatar
r*o
8
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
: 谢谢!

avatar
r*o
9
我的理解是:
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
: 谢谢!

avatar
S*A
10

别人回答这个了,我同意 :-)
说的对啊。
关键是我觉得你不熟悉 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
: 谢谢!

avatar
S*A
11

这个都对。
这个不对。这个表明你还没有理解 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和过渡地带中暂时调用空闲的内存页。
: 不知道我的理解是否准确。希望大家指正。

avatar
r*o
12
多谢指正。你说的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 里面把那个页的原来内容再从文件里恢复

avatar
S*A
13
所有被 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里面。不知道这两个用法是不是有什么关

avatar
i*e
14
再拜高手
avatar
S*A
15
小混混,都是混口饭吃,没有高低之分。

【在 i*****e 的大作中提到】
: 再拜高手
avatar
r*o
16
多谢。
再问一下,
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.

avatar
S*A
17
是用到了 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?

avatar
r*o
18

多谢。请问这里的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 完那一下,所有东西都是共享的。

avatar
S*A
19

没有。
这个理解是不对的。因为父子进程 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?

avatar
q*d
20
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.
avatar
S*A
21
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.

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。