Linux çekirdek iş parçacıkları gerçekten çekirdek işlemleri midir?


19

Birçok yerde Linux'un Java VM'deki her kullanıcı iş parçacığı için bir çekirdek iş parçacığı oluşturduğunu okudum. ("Çekirdek iş parçacığı" teriminin iki farklı şekilde kullanıldığını görüyorum:

  1. çekirdek işletim sistemi çalışması için oluşturulmuş bir iş parçacığı ve
  2. İşletim Sisteminin bildiği bir iş parçacığı ve kullanıcı çalışması gerçekleştirmek için zamanlama.

İkinci türden bahsediyorum.)

Çekirdek iş parçacığı çekirdek işlemiyle aynı mıdır, çünkü Linux işlemleri ebeveyn ve çocuk arasındaki paylaşılan bellek alanlarını destekliyor mu yoksa gerçekten farklı bir varlık mı?

Yanıtlar:


23

Linux'ta bir iş parçacığı ve işlem arasında kesinlikle hiçbir fark yoktur. Klon (2) 'ye bakarsanız , iş parçacıkları arasında neyin paylaşıldığını ve paylaşılmadığını belirleyen bir dizi bayrak görürsünüz.

Klasik süreçler sadece hiçbir şeyi paylaşmayan evrelerdir; Linux altında istediğiniz bileşenleri paylaşabilirsiniz.

Bu, çok daha önemli farklılıkların bulunduğu diğer işletim sistemi uygulamalarında geçerli değildir.


22

Dokümantasyon oldukça kafa karıştırıcı olabilir, bu yüzden " gerçek " Linux modeli:

  • Linux çekirdeğinin içinde çalıştırılabilen (& planlanan) bir şeye "süreç" denir,
  • her işlemde sisteme özgü bir İşlem Kimliği (PID) ve bir İş parçacığı Grubu Kimliği (TGID) vardır,
  • "normal" bir işlemin PID = TGID'si vardır ve bu TGID değerini paylaşan başka bir işlem yoktur,
  • "iş parçacıklı" bir işlem, TGID değerinin diğer işlemler tarafından paylaşıldığı bir işlemdir,
  • aynı TGID'yi paylaşan birçok işlem de en azından aynı bellek alanını ve sinyal işleyicilerini (bazen daha fazla) paylaşır,
  • "iş parçacığı" işleminde PID = TGID varsa, "ana iş parçacığı" olarak adlandırılabilir,
  • getpid()herhangi bir işlemden çağrıldığında TGID (= "ana iş parçacığı" PID) döndürülür,
  • gettid()herhangi bir işlemden çağrıldığında PID'si (!) döndürülür,
  • clone(2)sistem çağrısı ile her türlü işlem oluşturulabilir ,
  • TGID'ler ls /procgibi listeleyebileceğiniz klasörlerin sayısal adlarını /proc/NUMBER,
  • içinde klasörler sayısal isimleri /proc/TGID/taskolarak /proc/TGID/task/NUMBER, PID'ler vardır
  • mevcut tüm PID'leri görmemenize ls /procrağmen, yine de yapabilirsiniz cd /proc/any_PID.

Sonuç : Çekirdek bakış açısından, her biri kendi benzersiz PID'sine sahip olan yalnızca işlemler mevcuttur ve sözde bir iş parçacığı sadece farklı bir süreçtir.

Not: Linux'ta "thread" kavramının uygulanması bir kelime dağınıklığına yol açtı ve eğer getpid() yalan söylüyorsanız düşündüğünüzü yapmazsa, bunun sebebi davranışının POSIX uyumluluğunu izlemesidir (evrelerin ortak bir PID'yi paylaşması gerekir) .


1
Öneri: "görev" kelimesinin kullanılması, işleme / iş parçacığı karmaşasına girmeden çalıştırılabilir bir şeye başvurmanıza yardımcı olabilir.
19'da Totor

17

Konular Linux altındaki süreçlerdir. Bunlar, tıpkı bir işlem gibi clone, killsistem çağrısı yoluyla sinyal gönderilebilen bir işlem kimliği döndüren sistem çağrısı ile oluşturulur . İş parçacığı süreçleri psçıktıda görülebilir . cloneÇağrı iplik süreci nasıl paylaşıldığı üst sürecin çevre çoğunu belirleyen bayrakları geçirilir.


1
Adam pthreads(7), geçerli NPTL (Yerel POSIX İş Parçacığı Kitaplığı) uygulaması için "bir işlemdeki tüm iş parçacıklarının aynı iş parçacığı grubuna yerleştirildiğini; iş parçacığı grubunun tüm üyelerinin aynı PID'yi paylaştığını" söylüyor. Eski LinuxThreads uygulamasında her "iş parçacığının" kendi PID'si vardır.
Totor
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.