Python'da Eş Zamanlılık - İş Parçacıkları

Genel olarak, bildiğimiz gibi, iplik genellikle pamuklu veya ipek kumaştan çok ince bükülmüş bir iptir ve giysi dikmek için kullanılır. Aynı terim, bilgisayar programlama dünyasında da kullanılmaktadır. Şimdi, giysi dikmek için kullanılan ipliği bilgisayar programlaması için kullanılan iplikle nasıl ilişkilendireceğiz? İki iş parçacığı tarafından gerçekleştirilen roller burada benzerdir. Giysilerde, iplik, bezi bir arada tutar ve diğer tarafta, bilgisayar programlamasında, iplik bilgisayar programını tutar ve programın aynı anda sıralı eylemleri veya birçok eylemi gerçekleştirmesine izin verir.

Threadbir işletim sistemindeki en küçük yürütme birimidir. Kendi başına bir program değildir, ancak bir program içinde çalışır. Başka bir deyişle, evreler birbirinden bağımsız değildir ve kod bölümünü, veri bölümünü vb. Diğer evreler ile paylaşır. Bu iplikler aynı zamanda hafif işlemler olarak da bilinir.

İplik Durumları

İş parçacığının işlevselliğini derinlemesine anlamak için, iş parçacıklarının yaşam döngüsü veya farklı iş parçacığı durumları hakkında bilgi edinmemiz gerekir. Tipik olarak, bir iş parçacığı beş farklı durumda bulunabilir. Farklı durumlar aşağıda gösterilmiştir -

Yeni Konu

Yeni bir iş parçacığı, yeni durumda yaşam döngüsüne başlar. Ancak bu aşamada henüz başlamamış ve herhangi bir kaynak tahsis edilmemiştir. Bunun sadece bir nesnenin örneği olduğunu söyleyebiliriz.

Runnable

Yeni doğan iplik başlatıldığında, iplik çalıştırılabilir hale gelir, yani çalışmayı bekler. Bu durumda, tüm kaynaklara sahiptir, ancak yine de görev zamanlayıcı çalışacak şekilde zamanlamamıştır.

Koşu

Bu durumda, iş parçacığı ilerleme kaydeder ve çalıştırmak için görev zamanlayıcı tarafından seçilen görevi yürütür. Şimdi, iş parçacığı ya ölü duruma ya da çalıştırılamaz / bekleme durumuna gidebilir.

Çalışmıyor / beklemede

Bu durumda, iş parçacığı duraklatılır çünkü ya bazı G / Ç isteğinin yanıtını beklemektedir ya da diğer iş parçacığının yürütülmesinin tamamlanmasını beklemektedir.

Ölü

Çalıştırılabilir bir evre, görevini tamamladığında veya başka şekilde sona erdiğinde sonlandırılmış duruma girer.

Aşağıdaki şema, bir iş parçacığının tüm yaşam döngüsünü göstermektedir -

İplik Türleri

Bu bölümde farklı iplik türlerini göreceğiz. Türler aşağıda açıklanmıştır -

Kullanıcı Seviyesi Konuları

Bunlar, kullanıcı tarafından yönetilen konulardır.

Bu durumda, iş parçacığı yönetimi çekirdeği evrelerin varlığından haberdar değildir. İş parçacığı kitaplığı, evreler arasında ileti ve verileri iletmek, iş parçacığı yürütmeyi programlamak ve iş parçacığı bağlamlarını kaydetmek ve geri yüklemek için evrelerin oluşturulması ve yok edilmesi için kod içerir. Uygulama tek bir iş parçacığı ile başlar.

Kullanıcı düzeyindeki iş parçacıklarının örnekleri -

  • Java konuları
  • POSIX konuları

Kullanıcı seviyesindeki Konuların Avantajları

Aşağıdakiler, kullanıcı seviyesi konularının farklı avantajlarıdır -

  • İş parçacığı değiştirme, Kernel modu ayrıcalıkları gerektirmez.
  • Kullanıcı seviyesi iş parçacığı herhangi bir işletim sisteminde çalışabilir.
  • Çizelgeleme, kullanıcı seviyesi iş parçacığında uygulamaya özel olabilir.
  • Kullanıcı seviyesi konuları oluşturmak ve yönetmek için hızlıdır.

Kullanıcı seviyesindeki Konuların dezavantajları

Aşağıdakiler, kullanıcı seviyesi konularının farklı dezavantajlarıdır -

  • Tipik bir işletim sisteminde, çoğu sistem çağrısı engelliyor.
  • Çok iş parçacıklı uygulama, çoklu işlemden yararlanamaz.

Çekirdek Seviyesi Konuları

İşletim Sistemi tarafından yönetilen iş parçacıkları, bir işletim sistemi çekirdeği olan çekirdek üzerinde hareket eder.

Bu durumda, Çekirdek, iş parçacığı yönetimi yapar. Uygulama alanında iş parçacığı yönetim kodu yoktur. Çekirdek iş parçacıkları doğrudan işletim sistemi tarafından desteklenir. Herhangi bir uygulama, çok iş parçacıklı olacak şekilde programlanabilir. Bir uygulama içindeki tüm iş parçacıkları tek bir işlem içinde desteklenir.

Çekirdek, bir bütün olarak sürecin bağlam bilgisini ve süreç içindeki tek tek iş parçacıklarını saklar. Kernel tarafından çizelgeleme iş parçacığı temelinde yapılır. Kernel, Kernel alanında iş parçacığı oluşturma, planlama ve yönetim gerçekleştirir. Çekirdek iş parçacıklarının oluşturulması ve yönetilmesi genellikle kullanıcı iş parçacıklarından daha yavaştır. Çekirdek seviyesi iş parçacığı örnekleri Windows, Solaris'tir.

Çekirdek Seviyesi Konularının Avantajları

Aşağıda, çekirdek düzeyinde iş parçacığının farklı avantajları verilmiştir -

  • Çekirdek aynı anda birden çok işlemde aynı işlemden birden çok iş parçacığı planlayabilir.

  • Bir süreçteki bir iş parçacığı engellenirse, Çekirdek aynı işlemin başka bir iş parçacığını zamanlayabilir.

  • Çekirdek rutinleri çok iş parçacıklı olabilir.

Çekirdek Seviyesi Konularının Dezavantajları

  • Çekirdek iş parçacıklarının oluşturulması ve yönetilmesi genellikle kullanıcı iş parçacıklarından daha yavaştır.

  • Aynı süreç içinde bir iş parçacığından diğerine kontrol aktarımı, Çekirdeğe bir mod anahtarı gerektirir.

İplik Kontrol Bloğu - TCB

İş Parçacığı Kontrol Bloğu (TCB), temel olarak iş parçacığı hakkında bilgi içeren işletim sistemi çekirdeğindeki veri yapısı olarak tanımlanabilir. TCB'de depolanan iş parçacığına özgü bilgiler, her işlemle ilgili bazı önemli bilgileri vurgulayacaktır.

TCB'de bulunan konularla ilgili aşağıdaki noktaları göz önünde bulundurun -

  • Thread identification - Her yeni iş parçacığına atanan benzersiz iş parçacığı kimliğidir (tid).

  • Thread state - İş parçacığının durumu (Çalışıyor, Çalıştırılabilir, Çalışmıyor, Ölü) ile ilgili bilgileri içerir.

  • Program Counter (PC) - İş parçacığının mevcut program talimatını gösterir.

  • Register set - İş parçacığının hesaplamalar için kendilerine atanan yazmaç değerlerini içerir.

  • Stack Pointer- İşlemdeki iş parçacığının yığınına işaret eder. İş parçacığının kapsamı altındaki yerel değişkenleri içerir.

  • Pointer to PCB - Bu iş parçacığını oluşturan işlemin işaretçisini içerir.

Süreç ve iş parçacığı arasındaki ilişki

Çoklu kullanımda, süreç ve iş parçacığı, bilgisayarın aynı anda birden fazla şeyi yapabilmesini sağlamak için aynı amaca sahip, birbiriyle çok yakından ilişkili iki terimdir. Bir süreç bir veya daha fazla iş parçacığı içerebilir, ancak tersine iş parçacığı bir işlem içeremez. Ancak, ikisi de iki temel yürütme birimi olmaya devam ediyor. Bir dizi talimatı yürüten bir program, hem süreci hem de iş parçacığını başlatır.

Aşağıdaki tablo süreç ve iş parçacığı arasındaki karşılaştırmayı gösterir -

İşlem Konu
Süreç ağırdır veya kaynak yoğundur. İş parçacığı hafiftir ve bir işlemden daha az kaynak gerektirir.
İşlem değiştirme, işletim sistemiyle etkileşim gerektirir. İş parçacığı değiştirmenin işletim sistemiyle etkileşime girmesine gerek yoktur.
Birden çok işlem ortamında, her işlem aynı kodu yürütür ancak kendi belleğine ve dosya kaynaklarına sahiptir. Tüm iş parçacıkları aynı açık dosya kümesini, alt işlemleri paylaşabilir.
Bir işlem engellenirse, ilk işlem engeli kaldırılana kadar başka hiçbir işlem yürütülemez. Bir iş parçacığı engellenip beklerken, aynı görevdeki ikinci bir iş parçacığı çalıştırılabilir.
İş parçacığı kullanmadan birden çok işlem daha fazla kaynak kullanır. Çoklu iş parçacıklı süreçler daha az kaynak kullanır.
Çoklu süreçlerde her süreç diğerlerinden bağımsız olarak çalışır. Bir iş parçacığı başka bir iş parçacığının verilerini okuyabilir, yazabilir veya değiştirebilir.
Üst süreçte herhangi bir değişiklik olursa, alt süreçleri etkilemez. Ana iş parçacığında herhangi bir değişiklik olursa, bu işlemin diğer iş parçacıklarının davranışını etkileyebilir.
Kardeş süreçlerle iletişim kurmak için süreçler süreçler arası iletişimi kullanmalıdır. Konular, bu sürecin diğer konuları ile doğrudan iletişim kurabilir.

Multithreading Kavramı

Daha önce tartıştığımız gibi, Multithreading, bir CPU'nun aynı anda birden fazla iş parçacığı çalıştırarak işletim sistemi kullanımını yönetme becerisidir. Çoklu okumanın ana fikri, bir süreci birden fazla iş parçacığına bölerek paralellik sağlamaktır. Daha basit bir şekilde, çoklu iş parçacığının, iş parçacığı kavramını kullanarak çoklu görevi başarmanın yolu olduğunu söyleyebiliriz.

Çoklu okuma kavramı aşağıdaki örnek yardımıyla anlaşılabilir.

Misal

Bir işlem yürüttüğümüzü varsayalım. Süreç, bir şeyler yazmak için MS kelimesini açmak olabilir. Bu tür bir işlemde, bir iş parçacığı MS sözcüğünü açmak için atanacak ve yazmak için başka bir iş parçacığı gerekecektir. Şimdi, bir şeyi düzenlemek istiyorsak, düzenleme görevini yapmak için başka bir iş parçacığı gerekeceğini varsayalım.

Aşağıdaki şema, bellekte nasıl birden çok iş parçacığı olduğunu anlamamıza yardımcı olur -

Yukarıdaki diyagramda, her evrenin kendi kayıt kümesini ve yerel değişkenlerini içerdiği bir süreç içinde birden fazla evrenin var olabileceğini görebiliriz. Bunun dışında, bir süreçteki tüm iş parçacıkları genel değişkenleri paylaşır.

Multithreading Artıları

Şimdi çoklu kullanımın birkaç avantajını görelim. Avantajlar aşağıdaki gibidir -

  • Speed of communication - Çok iş parçacıklı okuma, hesaplama hızını artırır, çünkü her bir çekirdek veya işlemci aynı anda ayrı iş parçacıkları işler.

  • Program remains responsive - Bir iş parçacığı girdiyi beklerken diğeri aynı anda bir GUI çalıştırdığı için bir programın yanıt vermesini sağlar.

  • Access to global variables - Çoklu kullanımda, belirli bir sürecin tüm iş parçacıkları genel değişkenlere erişebilir ve genel değişkende herhangi bir değişiklik varsa, o zaman diğer evreler tarafından da görülebilir.

  • Utilization of resources - Her programda birkaç iş parçacığının çalıştırılması CPU'nun daha iyi kullanılmasını sağlar ve CPU'nun boşta kalma süresi azalır.

  • Sharing of data - Bir programdaki evreler aynı verileri paylaşabildiğinden, her iş parçacığı için fazladan alan gerekmez.

Multithreading Eksileri

Şimdi çok iş parçacıklı okumanın birkaç dezavantajını görelim. Dezavantajlar aşağıdaki gibidir -

  • Not suitable for single processor system - Multithreading, çok işlemcili sistemdeki performansa kıyasla tek işlemcili sistemde hesaplama hızı açısından performans elde etmeyi zor buluyor.

  • Issue of security - Bir programdaki tüm iş parçacığının aynı verileri paylaştığını bildiğimiz için, bu nedenle her zaman bir güvenlik sorunu vardır, çünkü bilinmeyen herhangi bir iş parçacığı verileri değiştirebilir.

  • Increase in complexity - Çoklu okuma, programın karmaşıklığını artırabilir ve hata ayıklama zorlaşır.

  • Lead to deadlock state - Çok iş parçacıklı okuma, programı, kilitlenme durumuna ulaşma olasılığına yol açabilir.

  • Synchronization required- Karşılıklı dışlamayı önlemek için senkronizasyon gereklidir. Bu, daha fazla bellek ve CPU kullanımına yol açar.