进程地址空间中的共享内存?

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)机制(未完成,待续)

20155301 滕树晨linux基础——linux进程间通信(IPC)机制总结

2017-2018-1 学号20155209 《信息安全系统设计基础》第十周学习总结