进程地址空间中的共享内存?
Posted
技术标签:
【中文标题】进程地址空间中的共享内存?【英文标题】:Shared memory in process address space? 【发布时间】:2014-07-12 13:50:35 【问题描述】:通过阅读操作系统概念书,我知道内存中的进程包括:文本部分、数据部分、堆栈和堆。
但我想问的是,当创建此部分时,进程何时要求内核创建共享内存段?在堆中?
另一个问题内核以PCB格式知道系统中每个进程的信息,并将这个PCB保存在进程表中。
问题是:进程表是双向链表吗?
【问题讨论】:
是的,它是双向链表(struct list_head tasks;)但是CFS调度器使用RB-tree来维护runqueue 【参考方案1】:我想您的问题是关于进程内存布局的。 如果是这样,Linux 和 Solaris 进程具有以下部分:
Text
Data
BSS
Heap
MMS (memory mapping segment)
Stack
Heap 和 Stack 之间的内存数组,也就是所谓的Memory Mapping Segment,负责共享内存映射。而且不仅如此。共享库、打开的文件也映射到那段内存中。
您可以通过 pmap 命令或读取进程映射文件 /proc//maps 来检查 Linux 上的进程内存布局。 这是 pmap 实用程序在 Linux 机器上检查的 DB2 进程内存布局的片段(查看堆栈和 shmid、共享内存 ID、条目):
0000000000400000 52K r-x-- /opt/ibm/db2/bin/db2vend
000000000060d000 4K rwx-- /opt/ibm/db2/bin/db2vend
000000000c33e000 132K rwx-- [ anon ]
0000000200000000 35520K rwxs- [ shmid=0x57a58007 ]
000000323f200000 112K r-x-- /lib64/ld-2.5.so
and more more more shared libraries
00002b55bb45b000 4K r-x-- /lib64/libnss_files-2.5.so
00002b55bb45c000 4K rwx-- /lib64/libnss_files-2.5.so
00002b55bb45d000 39252K rwxs- [ shmid=0x57a50006 ]
00002b55bdab2000 1152K rwx-- [ anon ]
00007ffffaf35000 84K rwx-- [ stack ]
ffffffffff600000 8192K ----- [ anon ]
【讨论】:
以上是关于进程地址空间中的共享内存?的主要内容,如果未能解决你的问题,请参考以下文章
进程间通信 - 动态链接库中共享内存(利用DLL的2~3G的地址段空间)
# 2017-2018-1 20155302 课下实践IPC
20155332 linux进程间通信(IPC)机制(未完成,待续)