Bölüm 4: Threads (İş Parçaları) Mehmet Demirci tarafından çevrilmiştir. Silberschatz, Galvin and Gagne 2013
Bölüm 4: Threads (İş Parçaları) Genel bakış Çok çekirdekli programlama Çok iş parçalı modeller İş parçası kütüphaneleri Örtük iş parçalama İş parçalama sorunları OS örnekleri 4.2 Silberschatz, Galvin and Gagne 2013
Hedefler İş parçası kavramına giriş Pthreads, Windows ve Java thread kütüphaneleri için API lere bakış Örtük iş parçalama stratejilerini incelemek Çok iş parçalı programlama ile ilgili sorunları incelemek Windows ve Linux ta iş parçaları için var olan OS desteğini öğrenmek 4.3 Silberschatz, Galvin and Gagne 2013
Motivasyon Modern uygulamaların çoğu çok iş parçalıdır. İş parçaları uygulama içinde çalışır. Uygulamadaki birden fazla görev ayrı iş parçaları ile gerçekleştirilebilir. Görüntü yenileme Veri getirme Yazım denetimi Ağ isteğine yanıt verme Süreç oluşturma ağır, thread oluşturma hafif bir iş. Bu yolla kod basitleşir, verim artar. Çekirdekler (kernels) genellikle çok iş parçalıdır. 4.4 Silberschatz, Galvin and Gagne 2013
Çok İş Parçalı Sunucu Mimarisi 4.5 Silberschatz, Galvin and Gagne 2013
Faydalar Yanıt verebilirlik sürecin bir parçası engellense bile yürütme devam edebilir, özellikle UI için önemlidir Kaynak paylaşımı iş parçaları sürecin kaynaklarını paylaşır, bellek paylaşımı veya mesajlaşmadan daha kolay Maliyet süreç oluşturmadan daha ucuz, iş parçası değiştirme bağlam değiştirmeden daha az masraflı Ölçeklenebilirlik süreç çok işlemcili sistemlerden faydalanabilir 4.6 Silberschatz, Galvin and Gagne 2013
Çok Çekirdekli Programlama Çok çekirdekli (multicore) veya çok işlemcili (multiprocessor) sistemlerde programlama zorluğu çoktur: Etkinlikleri bölme Denge Veriyi bölme Veri bağımlılıkları Sınama ve hata ayıklama Parallellik sistemin aynı anda birden fazla iş yapabileceğini belirtir. Eşzamanlılık birden fazla işin ilerlemesini destekler. Tek işlemci/çekirdek, planlayıcı eşzamanlılık sağlar. 4.7 Silberschatz, Galvin and Gagne 2013
Çok Çekirdekli Programlama Paralellik türleri Veri parallelliği verinin alt kümelerini birden çok çekirdeğe dağıtır, hepsine aynı işlemi uygular. Görev parallelliği iş parçalarını çekirdeklere dağıtır, her iş parçası farklı işlem yapar. Thread sayısı arttıkça iş parçalama için mimari desteği de artar. CPU larda çekirdekler ve donanım threadleri bulunur. Oracle SPARC T4 8 çekirdeklidir, her çekirdekte 8 hardware thread vardır. 4.8 Silberschatz, Galvin and Gagne 2013
Eşzamanlılık vs. Parallellik Tek çekirdekli sistemde eşzamanlı yürütme: Çok çekirdekli sistemde paralellik: 4.9 Silberschatz, Galvin and Gagne 2013
Tek ve Çok İş Parçalı Süreçler 4.10 Silberschatz, Galvin and Gagne 2013
Amdahl Yasası Seri ve paralel bileşenlere sahip bir uygulama için ek çekirdeklerden kaynaklanan performans kazanımlarını ifade eder. S seri kısım N işlemci çekirdeği Yani, uygulama %75 paralel / %25 seri ise, 1 çekirdekten 2 ye geçiş hızı 1,6 katına çıkarır. N sonsuza giderken, hızlanma 1 / S e yaklaşır. Uygulamanın seri kısmı ek çekirdeklerle gelen performans kazanımını orantısız biçimde etkiler. 4.11 Silberschatz, Galvin and Gagne 2013
Kullanıcı Threadleri ve Çekirdek Threadleri Kullanıcı threadleri yönetim kullanıcı seviyesindeki thread kütüphanesi tarafından yapılır. Üç ana thread kütüphanesi: POSIX Pthreads Windows threads Java threads Çekirdek threadleri Çekirdek destekli Örnekler neredeyse bütün genel amaçlı OS ler: Windows Solaris Linux Tru64 UNIX Mac OS X 4.12 Silberschatz, Galvin and Gagne 2013
Çok İş Parçalı Modeller Many-to-One (Çoktan bire) One-to-One (Bire bir) Many-to-Many (Çoktan çoğa) 4.13 Silberschatz, Galvin and Gagne 2013
Many-to-One (Çoktan Bire) Birçok kullanıcı seviyeli thread tek çekirdek thread ine eşlenir. Bir thread in engellenmesi hepsinin engellenmesine yol açar. Birden çok thread çok çekirdekli sistemde paralel çalışamaz çünkü her an yalnızca biri kernel da olabilir. Bu modeli kullanan az sistem vardır. Örnekler: Solaris Green Threads GNU Portable Threads 4.14 Silberschatz, Galvin and Gagne 2013
One-to-One (Bire Bir) Her kullanıcı seviyeli thread bir çekirdek thread ine eşlenir. Kullanıcı seviyeli thread oluşturulunca çekirdek threadi de oluşur. Çoktan bire modelinden daha fazla eşzamanlılık vardır. Süreç başına thread sayısı bazen kısıtlanır (masraftan). Örnekler Windows Linux Solaris 9 ve sonrası 4.15 Silberschatz, Galvin and Gagne 2013
Many-to-Many (Çoktan Çoğa) Birçok kullanıcı seviyeli thread yine birçok çekirdek thread ine eşlenir. OS in yeterli sayıda çekirdek threadi oluşturmasına imkan verir. Solaris versiyon 9 öncesi Windows ThreadFiber package 4.16 Silberschatz, Galvin and Gagne 2013
İki Seviyeli Model Çoktan çoğa benzeri, ama kullanıcı thread inin çekirdek thread ine bağlanmasına izin verir. Örnekler IRIX HP-UX Tru64 UNIX Solaris 8 ve öncesi 4.17 Silberschatz, Galvin and Gagne 2013
Thread Kütüphaneleri Thread kütüphanesi programcıya thread oluşturma ve yönetme için API sunar. İki ana yolla gerçekleştirilir: Tamamen kullanıcı alanındaki kütüphane Çekirdek seviyeli kütüphane OS desteklidir. 4.18 Silberschatz, Galvin and Gagne 2013
Pthreads Kullanıcı veya çekirdek seviyesinde olabilirler. İş parçası oluşturma ve senkronlama için POSIX standardı (IEEE 1003.1c) API Şartname (gerçekleştirim değil) API thread kütüphanesinin davranışını belirler, gerçekleştirim kütüphanenin geliştirilmesine bırakılır. UNIX tabanlı işletim sistemlerinde yaygındır (Solaris, Linux, Mac OS X) 4.19 Silberschatz, Galvin and Gagne 2013
Pthreads Örneği 4.20 Silberschatz, Galvin and Gagne 2013
Pthreads Örneği Pthreads Example (Cont.) 4.21 Silberschatz, Galvin and Gagne 2013
10 Thread Birleştiren Pthreads Kodu perating System Concepts 9 th Edition 4.21 Silberschatz, Galvin and Gagne 2013 4.22 Silberschatz, Galvin and Gagne 2013
Windows ta Çok İş Parçalı C Programı 4.23 Silberschatz, Galvin and Gagne 2013
Windows ta Çok İş Parçalı C Programı 4.24 Silberschatz, Galvin and Gagne 2013
Java Threads Java thread leri JVM tarafından yönetilir. Alttaki OS tarafından sunulan iş parçası modeli kullanılarak gerçekleştirilir. Java thread leri şöyle oluşturulabilir: Thread sınıfını genişleterek (Extend) Runnable arayüzünü gerçekleştirerek (Implement) 4.25 Silberschatz, Galvin and Gagne 2013
Java da Çok İş Parçalı Program 4.26 Silberschatz, Galvin and Gagne 2013
Java da Çok İş Parçalı Program 4.27 Silberschatz, Galvin and Gagne 2013
Örtük İş Parçalama Yaygınlaşan bir yöntem çünkü iş parçası sayısı arttıkça açık iş parçaları ile program doğruluğunu sağlamak zorlaşır. İş parçalarının oluşturulup yönetilmesi programcıya değil derleyicilere ve çalışma zamanı kütüphanelerine bırakılır. Üç yöntem İş parçası havuzları OpenMP Merkezi sevkiyat Diğer yöntemler: Microsoft Threading Building Blocks (TBB), java.util.concurrent package 4.28 Silberschatz, Galvin and Gagne 2013
İş Parçası Havuzları İş parçalarını oluşturup havuza at, iş beklesinler. Avantajları: Hazır thread ile isteğe hizmet vermek yenisini oluşturmaktan biraz daha hızlıdır. Uygulamalardaki thread sayısı havuz boyutuyla sınırlıdır. Yapılacak görev ile görev oluşturma mekanizmasını ayırır, böylece görev çalıştırma için farklı stratejilere izin verir. Yani görevler periyodik olarak çalışacak şekilde planlanabilir. Windows API iş parçası havuzlarını destekler: 4.29 Silberschatz, Galvin and Gagne 2013
OpenMP C, C++, FORTRAN için derleyici talimatları ve API Paylaşılan bellekli ortamlarda paralel programlama desteği sağlar. Paralel bölgeleri belirler - paralel çalışabilen kod blokları #pragma omp parallel Çekirdek sayısı kadar thread oluştur #pragma omp parallel for for(i=0;i<n;i++) { } c[i] = a[i] + b[i]; For döngüsünü paralel çalıştır 4.30 Silberschatz, Galvin and Gagne 2013
Merkezi Sevkiyat Mac OS X and ios için geliştirilen Apple teknolojisi C, C++ dillerine eklentiler, API, ve çalışma zamanı kütüphanesi Paralel bölümlerin belirlenmesine imkan verir. İş parçalama ayrıntılarını yönetir. Blok ^{ } içinde - ˆ{ printf("i am a block"); } Bloklar sevkiyat kuyruğuna koyulur. Kuyruktan çıkarılınca iş parçası havuzundaki uygun iş parçasına atanır. 4.31 Silberschatz, Galvin and Gagne 2013
Merkezi Sevkiyat İki tür sevkiyat kuyruğu: seri bloklar FIFO sırasıyla çıkarılır, her süreç için bir kuyruk, adı ana kuyruk Programmers can create additional serial queues within program eşzamanlı FIFO sırasıyla çıkarılır ama tek seferde birkaç tane çıkabilir. Üç tane sistem kuyruğu düşük, varsayılan, yüksek öncelikli 4.32 Silberschatz, Galvin and Gagne 2013
İş Parçalama Sorunları fork() ve exec() sistem çağrılarının anlamları Sinyal yönetimi Eşzamanlı ve eşzamansız Thread iptali Eşzamansız veya ertelenen Thread-yerel depolama Planlayıcı etkinleştirme 4.33 Silberschatz, Galvin and Gagne 2013
fork() ve exec() anlamı fork()sadece çağıran thread i mi yoksa hepsini mi kopyalar? Bazı UNIX versiyonlarında iki çeşit fork vardır. exec() genellikle çalışan süreci bütün thread lerle birlikte değiştirir. 4.34 Silberschatz, Galvin and Gagne 2013
Sinyal Yönetimi Sinyaller UNIX sistemlerinde süreci belirli bir olay olduğunda haberdar eder. Sinyal yönetici sinyalleri işlemekle görevlidir. 1. Belirli bir olay sinyal üretir. 2. Sinyal bir sürece yollanır. 3. Sinyal iki sinyal yöneticiden biri tarafından işlenir: 1. Varsayılan 2. Kullanıcı tanımlı Her sinyal için bir varsayılan yönetici bulunur, çekirdek tarafından çalıştırılır. Kullanıcı tanımlı sinyal yönetici varsayılanın yerine geçebilir. Tek thread varsa sinyal sürece verilir. 4.35 Silberschatz, Galvin and Gagne 2013
Sinyal Yönetimi Birden fazla thread varsa sinyal hangisine verilmeli? Sinyalle ilgili thread e ver. Süreçteki her thread e ver. Süreçteki belli thread lere ver. Bir thread i sürece gelen bütün sinyalleri almakla görevlendir. 4.36 Silberschatz, Galvin and Gagne 2013
Thread İptali Thread bitmeden sonlandırmak İptal edilecek thread hedef thread İki yaklaşım: Eşzamansız iptal hedef thread i hemen sonlandırır. Ertelenen iptal hedef thread in periyodik olarak iptal edilip edilmeyeceğini kontrol etmesine izin verir. Pthread koduyla thread oluşturup iptal etme: 4.37 Silberschatz, Galvin and Gagne 2013
Thread İptali Thread iptalini başlatmak iptal isteği oluşturur ama iptalin gerçekleşmesi thread durumuna bağlıdır. Thread iptali kapalıysa, thread açana kadar iptal beklemede kalır. Varsayılan iptal türü ertelenendir. Thread iptal noktasına ulaşınca iptal gerçekleşir. pthread_testcancel() Sonra temizleme yöneticisi çağrılır. Linux sistemlerinde thread iptali sinyallerle yönetilir. 4.38 Silberschatz, Galvin and Gagne 2013
Thread-Yerel Depolama Thread-local storage (TLS) her thread in verinin bir kopyasına sahip olmasına izin verir. Thread oluşturma üzerinde kontrol yoksa faydalıdır. (thread havuzu kullanılıyorsa) Yerel değişkenlerden farklıdır Yerel değişkenler ancak tek fonksiyon çağrısı sırasında görülebilir. TLS farklı fonksiyon çağrıları arasında görülebilir. static veriye benzer TLS her thread için eşsizdir. 4.39 Silberschatz, Galvin and Gagne 2013
Planlayıcı Etkinleştirme Çoktan çoğa ve iki seviyeli modellerde uygulamaya ayrılan çekirdek thread lerinin sayısını uygun tutmak için iletişime ihtiyaç duyulur. Kullanıcı ve çekidek thread leri arasında ara veri yapısı kullanılır lightweight process (hafif süreç) (LWP) sürecin üzerinden kullanıcı thread inin çalışmasını planlayabildiği sanal işlemci Her LWP çekirdek thread ine bağlıdır. Kaç LWP gerekir? Planlayıcı etkinleştirme upcalls (yukarıya çağrı) sunar çekirdekten thread kütüphanesindeki yukarıya çağrı yöneticisine iletişim mekanizması Bu iletişim uygulamanın doğru sayıda çekirdek thread i tutmasını sağlar. 4.40 Silberschatz, Galvin and Gagne 2013
İşletim Sistemi Örnekleri Windows Threads Linux Threads 4.41 Silberschatz, Galvin and Gagne 2013
Windows Threads Windows API Win 98, Win NT, Win 2000, Win XP, and Win 7 için ana API Bire bir eşlemeyi çekirdek seviyesinde gerçekleştirir. Her thread içinde Thread id İşlemci durumunu temsil eden register kümesi Ayrı kullanıcı ve çekirdek stack leri thread kullanıcı ve çekirdek modunda çalışırken kullanılır. Özel veri depolama alanı çalışma zamanı kütüphaneleri ve dinamik bağlama kütüphaneleri (DLL) tarafından kullanılır. Register kümesi, stack ler, ve özel depo alanı iş parçasının bağlamı (context) 4.42 Silberschatz, Galvin and Gagne 2013
Windows Threads İş parçasının ana veri yapıları: ETHREAD (Yönetici iş parçası bloğu) iş parçasının ait olduğu sürece ve KTHREAD e pointer içerir, çekirdek alanındadır. KTHREAD (Çekirdek iş parçası bloğu) planlama ve senkronizasyon bilgisi, çekirdek modu stack, TEB e pointer, çekirdek alanındadır. TEB (İş parçası ortam bloğu) thread id, kullanıcı modu stack, thread-yerel depo, kullanıcı alanındadır. 4.43 Silberschatz, Galvin and Gagne 2013
Windows Threads Veri Yapıları 4.44 Silberschatz, Galvin and Gagne 2013
Linux Threads Linux iş parçalarına görev (task) der. Thread oluşturma clone() sistem çağrısı ile yapılır. clone() çocuk görevin ebeveyn görevin (süreç) adres alanını paylaşmasına imkan verir. Bayraklar davranışı kontrol eder. struct task_struct süreç veri yapılarına işaret eder (paylaşılan veya eşsiz) 4.45 Silberschatz, Galvin and Gagne 2013
Bölüm 4 Sonu Silberschatz, Galvin and Gagne 2013