Bir sürecin “Bekleyen Kanalı” nedir?


36

GNOME Sistem Monitörü'nün İşlemler sekmesinde bir "Bekleyen Kanal" sütunu var. Burada gördüğüm en yaygın değerler poll_schedule_timeout , ancak diğer değerleri de görüyorum: 0 , do_exit , do_wait , futex_wait_queue_me , pipe_wait , __skb_recv_datagram ve unix_stream_data_wait .

Peki bu "Kanal Bekliyor" sütunu ne anlama geliyor? Ve belki de bu değerlerden bazıları ne anlama geliyor?

Ekran görüntüsü

Yanıtlar:


42

Bekleyen kanal, Çekirdeğin görevin beklemekte olduğu yerde olduğu yerdir. Bir görevin, veri veya işlem süresi olabilen bir Kaynak beklemesi gerekir. Bu ikisi ağ soketlerini, donanımları, dosyaları vb. İçerir; Çünkü çoğu Unix benzeri sistemlerde sadece dosya.

  • 0: İşlem beklemiyor

  • poll_schedule_timeout

    poll()G / Ç'yi işlemek için kullanılan bir sistem çağrısıdır 1 . Buna benzer select(). 2

    Engellenmeyen G / Ç kullanan uygulamalar, bu çağrıları, bir dosyayı engellemek zorunda kalmadan okuyabileceklerini veya dosyaya yazabileceklerini görmek için kullanır. Genellikle engellenmeyebilecek giriş / çıkış akışları için kullanılırlar (aksi takdirde farenizin hareketi durur).

    Bekleyen kanal poll_schedule_timeout, bir görevin G / Ç'yi (klavyeler ve fareler gibi donanımlar, ses aygıtları veya hatta ağ soketleri) beklediğini gösterir.

    1. Çekirdekte bir işlev
    2. İçinde tanımlanmıştır <linux/poll.h>. pollİlk önce Sistem V'de görülen bir uygulamaydı select, BSD UNIX eşdeğeri.
  • futex_wait_queue_me:

    Bunu açıklamak için, Kilitlere bakmak zorundayız. Kilit, bir görevin bir kaynakla çalıştığını gösteren sistemdeki kaydedilmiş bir durumdur. Örneğin, bir dosyayı okuyan sadece bir görev olabilir. Bu görev dosyayı kilitler, dosyayı okumaya çalışan başka bir görev 1 , kilitli olduğunu bilir ve erişebilmesi için kilidin kaybolmasını bekler. Aynı şey işlemci süresi için de olur.

    Linux'un modern versiyonu (çoğu mimaride), çekirdekte bir Futex (hızlı kullanıcı alanı mutex) kilidi kullanır. Karşılıklı dışlama olan Mutex, ortak bir kaynağa her zaman yalnızca bir görevle erişilebileceği fikrini ifade eder. Bunun için sistemdeki bayraklar ayarlanmıştır.

    Bir işlem kilitli bir kaynağı bekliyorsa, buna Meşgul Bekliyorum veya "Döndürme" denir ve bu işlem yapana kadar tekrar tekrar erişmeye çalıştığını gösterir. Bir görev döndüğünde engellendiği söylenir .

    Bunu okuyabilirseniz, bu cevapta en az bir hatayı düzeltmek zorundasınız: P

    FUTEX kilitleri (kaynak durumlarda bir görev tarafından yükseltilmesi ya da azaltılması edilebilir userspace bir dizi olarak düşünülebilir olabilir , bu sayı birden büyük olabilir çoklu görevler tarafından erişilebilir). Bu, şema 4'te gösterilen sayıdır .

    Bu görevler bekleme kuyruğunda , bazı işlemlerin yapılması gereken basit bir görev sırası, işlem süresi mevcut olduğunda, görevler işlerini yapar ve sıradan kaldırılır.

    futex_wait_queue_megörevleri yerine getirir. Daha sonra bir sinyal, zaman aşımı veya uyanma için bekler. Bu bekleme kanalında bulunan görev bekleme kuyruğunda değil, bekletilmeyi bekliyor.


    1. Görev, İşlem 3 veya İş parçacığı 2 olabilir.
    2. Bir iş parçacığı bir işlemin bir alt bölümüdür. Birçok iş parçacığı paralel çalışabilir
    3. Bir işlem tam gelişmiş bir programdır, bir program birden fazla işlemden oluşabilir, ancak bir veya daha fazla iş parçacığından oluşur.
    4. Unutmayın, bu hala durumların çok yüksek bir görünümüdür, uygulama ayrıntılarını dikkate almaz
  • __skb_recv_datagram

    Kilitli bir ağ soketinde bazı veriler bekleyin.

  • sk_wait_data

    Ağ soketinde bazı veriler bekleyin.

  • do_exit

    Bu bir işlemden vazgeçmenin son kısmı. başka bir işlem planlamak için diğerini do_exit()çağırır schedule(). Çağrıldığında do_exit(), süreç bir ZOMBIE.

  • do_wait

    Zamanlayıcıların bekleme sırasına bir işlem eklenir.

  • pipe_wait, unix_stream_data_wait

    Bir İşlem, bir alt işlemden veri bekliyor. Bu, örneğin, bu tür bir kod çalıştırdığınızda gerçekleşir:

    echo | sleep 10 && echo hallo              # pipe
    

    veya

    cat < hello.c                              # unix data stream
    
  • hrtimer_nanosleep

    İşlem, hrtimer_nanosleep()yöntemi kullanarak uyuyor . Bu yöntem, bir programın nanosaniye doğrulukla belirli zaman aralıklarında uyuması için kullanılabilir.

Bunların hepsi değil, ama başkalarını gözlemlemedim. Bir şey kaçırdıysam yorum gönder.


Ben rastladım sleep_on_page_killable?
Bay Axilus,

Sleep_on_page_killable'ın en olası nedeni, işlemin bellekte olmayan bir sayfa yüklemeye çalışıyor olmasıdır, bu nedenle sayfa hatasına neden olur ve sayfa yüklenene kadar işlemin uykuya alınması gerekir. Eğer G / Ç alt sistemi aşırı yüklenmişse (belki de çok fazla G / Ç yaptığınız için) bu sıkça ortaya çıkabilir.
tsuna

Ne hakkında signal? Buna rastladım. İşlem öldü mü? zombi? ya da ne? Sürece ne olacak?
itsnotmyrealname 5:18

11

Bekleyen kanal değeri, işlemin şu anda engellendiği çekirdek işlevinin adıdır.

İsim genellikle bir manuel sayfa olacak bir sistem çağrısı ile ilgilidir.

  • futex_wait_queue_me futex ile ilgilidir . Bu muteksin bir tipine karşılık gelir kilit bir işlemci çok sayıda işlem çalışma saatleri için kullanılır (hızlı kullanıcı alanı karşılıklı dışlama). Durum, işleminizin kilidi almak için sıkıştırıldığını gösterir. 2
  • do_wait ilgilidir bekleyin .
  • vb.

Gerçekten daha ayrıntılı bilgi istiyorsanız, çekirdek kaynağını kontrol edebilirsiniz .

Eğer yazarsanız cat /proc/some_pid/stackbir terminal içinde o gibi bazı çıktıyı alırsınız:

[<c0227f4e>] poll_schedule_timeout+0x3e/0x60
[<c022879f>] do_select+0x55f/0x670
[<c0228f40>] core_sys_select+0x140/0x240
[<c0229241>] sys_select+0x31/0xc0
[<c05c9cc4>] syscall_call+0x7/0xb
[<ffffffff>] 0xffffffff

Ve ilk satırda, sistem monitöründe görüntülenenleri elde edersiniz. Bildiğim kadarıyla poll_schedule_timeout , işleminizin bir şey beklediğini gösteriyor.

Asenkron I / O ve yoklama ile ilgilenir .

Kaynak (lar): 1. proses bekleme kanalı (WCHAN) ve alarm? - 2. AskUbuntu cevap


Bunu tekrar söyle . : P
Stefano Palazzo

Farkında gibisin, cevabını, onu geliştirmek için tekrar kullandım ;-) Ne tür bir nitelik istersiniz?
Maxime R.

2
Yorumunuz beni mutlu etmek için fazlasıyla yeterli :) :) Atıfın nasıl çalıştığını öğrenmek istiyorsanız , konuyla ilgili güzel bir SO blog yazısı var. Yine de fazla endişelenmeyin, insanların işimi mümkün olduğu kadar tekrar kullanmalarını istiyorum.
Stefano Palazzo

1
Ben sadece bu konuda metada bir soru yazıyordum. (blog gönderisini çoktan okumuştu)
Maxime R.

O var burada . Ve iddiaya girerim cevabınız benim için bir noktada sona erecek ^^
Maxime R.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.