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.
- Çekirdekte bir işlev
- İç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 .
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_me
gö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.
- Görev, İşlem 3 veya İş parçacığı 2 olabilir.
- Bir iş parçacığı bir işlemin bir alt bölümüdür. Birçok iş parçacığı paralel çalışabilir
- 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.
- 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.