2013-01-17 16 views
5

Linux'ta bir işlemin paylaşılan bellek boyutunu elde etmeye çalıştım.Bir işlemin doğru paylaşılan bellek boyutu nasıl alınır?

mapped: 206672K writeable/private: 4352K shared: 128K 

Bunu görebilirsiniz:

  1. üst ve SHR alanıyla kontrol:

    PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
    1734 root  20 0 201m 4072 1012 S 0.0 0.1 22:00.65 php-fpm 
    
  2. pmap -d Burada 2 farklı komutları kullanarak sonucudur pmap'deki paylaşılan bellek boyutu, üst kısımdan çok daha küçüktür.

    Nedenini bulmak için bazı kaynak kodunu okudum.

    unsigned long task_statm(struct mm_struct *mm, 
        unsigned long *shared, unsigned long *text, 
        unsigned long *data, unsigned long *resident) 
    { 
        *shared = get_mm_counter(mm, MM_FILEPAGES); 
        *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK)) 
                     >> PAGE_SHIFT; 
        *data = mm->total_vm - mm->shared_vm; 
        *resident = *shared + get_mm_counter(mm, MM_ANONPAGES); 
        return mm->total_vm; 
    } 
    

    Tüm dosya sayfaları paylaşılan bellek olarak sayılır görünüyor: Üst/proc // statm değeri okuyor ve değerler hesaplanır görünüyor?

    Ve pmap komut/proc // haritalardan bilgi okuma ve daha sonra bazı bayraklar aracılığıyla paylaşılan hafızayı hesaplamak:

    3dc822a000-3dc822d000 rw-p 0002a000 08:13 5134288  /usr/lib64/libmcrypt.so.4.4.8 
    start-end flags file_offset dev_major:dev_minor inode 
    

    bayraklar [3] == 's' o zaman bu haritayı olacak olursa Paylaşılan olarak sayılmalıdır.

    Bu yüzden sorum, hangisinin daha doğru olduğu? Ve neden paylaşılan bellek boyutunu hesaplamak için farklı yöntemler var?

    Şimdiden teşekkürler!

cevap

2

top yılında SHR kolon pmap s shared giriş yaptığının aynısını bildirmez. top, belleğe yüklenen bir dinamik kitaplık içerdiği için diğer işlemlerle paylaşılan bellek miktarını bildirir ve bu kitaplığı kullanan tüm işlemler, bu sayfalar salt okunur olduğu için, görüntülerinde aynı sayfaları içerir. pmap, okuma-yazma veya salt okunur olabilecek ve shmget() ile ilgili işlevler ve ilgili işlevler arasında paylaşılan veri sayfaları olan "paylaşımlı bellek" bölümlerini gösteriyor gibi görünüyor.

İlgili konular