GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mendaftar proses yang dilampirkan ke segmen memori bersama di linux?

Untuk berjaga-jaga jika seseorang hanya tertarik pada proses seperti apa yang menciptakan moeries bersama, hubungi

ls -l /dev/shm

Itu mencantumkan nama-nama yang terkait dengan memori bersama - setidaknya di Ubuntu. Biasanya namanya cukup jitu.


Saya rasa Anda tidak dapat melakukan ini dengan alat standar. Anda dapat menggunakan ipcs -mp untuk mendapatkan ID proses terakhir proses untuk melampirkan/melepaskan tetapi saya tidak mengetahui cara mendapatkan semua proses terlampir dengan ipcs .

Dengan segmen yang terhubung dengan dua proses, dengan asumsi keduanya tetap terlampir, Anda mungkin dapat mengetahuinya dari PID pembuat cpid dan PID lpid yang dipasang terakhir yang merupakan dua proses tetapi itu tidak akan menskalakan lebih dari dua proses sehingga kegunaannya terbatas.

cat /proc/sysvipc/shm metode tampaknya juga terbatas tetapi saya yakin ada cara untuk melakukannya dengan bagian lain dari /proc sistem file, seperti yang ditunjukkan di bawah ini:

Ketika saya melakukan grep pada procfs peta untuk semua proses, saya mendapatkan entri yang berisi baris untuk cpid dan lpid proses.

Misalnya, saya mendapatkan segmen memori bersama berikut dari ipcs -m :

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 123456     pax        600        1024       2          dest

dan, dari ipcs -mp , cpid adalah 3956 dan lpid adalah 9999 untuk segmen memori bersama yang diberikan (123456).

Lalu, dengan perintah grep 123456 /proc/*/maps , saya mengerti:

/proc/3956/maps: blah blah blah 123456 /SYSV000000 (deleted)
/proc/9999/maps: blah blah blah 123456 /SYSV000000 (deleted)

Jadi ada adalah cara untuk mendapatkan proses yang melekat padanya. Saya cukup yakin bahwa dest status dan (deleted) indikatornya adalah karena pembuat telah menandai segmen untuk dihancurkan setelah pelepasan terakhir terjadi, bukan karena telah dihancurkan.

Jadi, dengan memindai /proc/*/maps "files", Anda seharusnya dapat menemukan PID mana yang saat ini dilampirkan ke segmen tertentu.


Saya menulis sebuah alat yang disebut who_attach_shm.pl, itu mem-parsing /proc/[pid]/maps untuk mendapatkan informasinya. Anda dapat mengunduhnya dari github

contoh keluaran:

shm attach process list, group by shm key
##################################################################

0x2d5feab4:    /home/curu/mem_dumper /home/curu/playd
0x4e47fc6c:    /home/curu/playd
0x77da6cfe:    /home/curu/mem_dumper /home/curu/playd /home/curu/scand

##################################################################
process shm usage
##################################################################
/home/curu/mem_dumper [2]:    0x2d5feab4 0x77da6cfe
/home/curu/playd [3]:    0x2d5feab4 0x4e47fc6c 0x77da6cfe
/home/curu/scand [1]:    0x77da6cfe

berikan contoh Anda di atas - untuk menemukan proses yang dilampirkan ke shmid 98306

lsof | egrep "98306|COMMAND"

Linux
  1. Cara Menghapus Cache Memori di Linux

  2. Bagaimana saya bisa mendapatkan daftar jaringan nirkabel yang tersedia di Linux?

  3. Cara menggunakan memori bersama dengan Linux di C

  1. Cara Menggunakan Perintah SS Linux

  2. Bagaimana saya mendapat pemberitahuan tentang kesalahan ECC di Linux?

  3. Bagaimana cara Linux mengalokasikan bandwidth antar proses?

  1. Cara Mendaftar Proses yang Berjalan di Linux

  2. Cara Mendaftar Proses yang Berjalan di Linux:Panduan Pemula

  3. Cara Mendaftar Pengguna di Linux