最近在看Linux進程間通信,看到共享內存了,思索一個問題,進程創建的共享內存是系統中哪一塊內存呢?
從stackoverflow中找到了答案:Shared memory in process address space?
問題1:我從操作系統書中了解到Linux的進程結構包括:代碼段、數據段、堆段、棧段,當進程創建共享內存時,創建的共享內存屬於哪部分?在堆嗎?
問題2:內核知道系統中每個進程的PCB格式信息,並將此PCB保存在進程表中。進程表雙向鏈表是什么?
答案1:我猜你的問題是關於進程內存布局。如果是這樣,Linux和Solaris進程具有以下部分:
Text
Data
BSS
Heap
MMS (memory mapping segment)
Stack
堆和棧之間的內存(所謂內存映射段(MMS)),負責共享內存映射。不僅如此,共享庫,打開的文件也映射到該部分內存中。(多個進程的邏輯地址指向同一塊物理地址)
你也可以通過pmap命令檢查Linux上的進程內存布局,或者讀取進程映射文件/proc//maps。下面是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 ]
答案2:
進程鏈表
進程鏈表是一種雙向鏈表數據結構(list_head),簡單的說一下雙向鏈表。每一個雙向鏈表,都有一組操作,插入和刪除一個元素,掃描鏈表等等。雙向鏈表和鏈表相同,但雙向鏈表除了有指向下一個元素的指針,還有指向上一個元素的指針,所以被稱為雙向鏈表。
list_head 結構
struct list_head { struct list_head *next, *prev; };
進程鏈表是一個雙向鏈表(list_head),進程鏈表把所有進程的描述符鏈接起來。每個task_struct 結構都包含一個list_head類型的tasks字段,這個類型的prev和next字段分別指向前面和后面的task_struct元素。
進程鏈表的表頭是init_task描述符,就是0進程(process 0)或swapper進程的進程描述符。init_task的tasks.prev字段指向鏈表中最后插入的進程描述符的tasks字段。SET_LINKS和REMOVE_LINKS宏分別用於從進程鏈表中插入和刪除一個進程描述符。另外for_each_process宏用來掃描整個進程鏈表。
TASK_RUNNING狀態的進程鏈表
當內核尋找一個在CPU上運行的進程,必須考慮可運行的進程。早先的Linux把所有可運行的進程都放在一個叫做運行隊列(runqueue)的鏈表中,由於維持鏈表中的進程優先級排序開銷過大,因此早起的調度程序不得不為了某些特殊的功能掃描整個鏈表。在Linux 2.6實現的運行隊列則有所不同。其目的是讓調度程序能在固定的時間內選出『最佳』可運行進程,與隊列中可運行的進程數無關。
提高調度程序運行速度的訣竅是建立多個可運行進程鏈表,每種進程優先級對應一個不同的鏈表。
每個task_struct描述符包含一個list_head類型的字段run_list。如果進程的優先級等於k1,run_list字段把該進程加入優先權為k的可允許進程鏈表中。在多CPU系統中,每個CPU都有自己的運行隊列,這是一個通過使數據結構更復雜來改善性能的典型例子。
進程描述符的prio字段存放進程的動態優先級,而array字段是一個指針,指向當前運行隊列的prio_array_t的數據結構。
參考:
http://guojing.me/linux-kernel-architecture/posts/process-list/