進程地址空間中的共享內存?(譯)


最近在看Linux進程間通信,看到共享內存了,思索一個問題,進程創建的共享內存是系統中哪一塊內存呢?

stackoverflow中找到了答案:Shared memory in process address space?

 


 

問題1:我從操作系統書中了解到Linux的進程結構包括:代碼段、數據段、堆段、棧段,當進程創建共享內存時,創建的共享內存屬於哪部分?在堆嗎?

問題2:內核知道系統中每個進程的PCB格式信息,並將此PCB保存在進程表中。進程表雙向鏈表是什么?

 


答案1:我猜你的問題是關於進程內存布局。如果是這樣,LinuxSolaris進程具有以下部分:

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_LINKSREMOVE_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/

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM