THREADS (İŞ PARÇACIKLARI) - ppt indir
... konulu sunumlar: "THREADS (İŞ PARÇACIKLARI)"— Sunum transkripti:
Görevler & Threads Görevler ve threadler birbirleriyle ilgili kavramlardır. Bir görev; Adres alanı, kaynakları vb. tanımlar. çekirdek düzeyli bir varlıktır. (Kernel Level) Bir görevin yapısına sistem çağrıları ile erişilir. Bir thread; Bir görev içinde tek sıralı yürütme akışı tanımlar. Threadler, görevlerden kontrol bilgileri sayesinde ayrılır. Her görev kendi içinde çoklu threade ayrılabilir. Genellikle kullanıcı düzeyli bir varlıktır (User Level)(Çekirdek düzeylide olabilir, ancak sistemi yavaşlatır) Kullanıcı seviyesindeki kütüphanelerle ulaşılır. Threadler arasında işbirliğinde sistem çağrılarını kullanmazlar. Mesaj yollama ve paylaşılan bellek alanı kullanımı daha basittir.
Threadlerin Kullanımına Örnek3 thread ile bir kelime işlemci programının kontrolü
Thread kullanımına örnek- Web Sitesi SunucusuWeb sunucusunda threadler kullanılmasaydı?
Bir görev iki farklı bölümden oluşmaktadır.Kaynakları(açık dosyalar, çocuk görevler, program texti, program verileri, göreve özel olan diğer veriler...) Çalışan kod kısmı, yani şu anda çalışan kod ve bir sonraki çalışacak kod bölümü.(program sayacı, yazmaçlar, yığın(stack), çağrılmış fakat geri dönülmemiş prosedürler).
İş Parçacığı(thread) kavramının bize getirdiği, aynı görev ortamında çoklu çalıştırma (execution-yürütme) işleminin yerine getirilmesidir. Tek bir görev içerisinde çoklu iş parçacıklarının(multithread) çalışması, çoklu programlamada birden fazla görevin aynı anda (işlemcide sırayla) çalışmasına eşdeğerdir.
Threadlerin Kullanıcı Uzayında Gerçekleştirilmesi
Thread KarakteristiğiBir Thread Control Block içinde; Program Counter Register Set Yığın bulunur. Bu yüzden Görev Kontrol Bloğu Thread Kontrol Bloğuna indirgenmiştir. Geleneksel olarak bir görevi bir işi icra eden tek bir thread olarak görebiliriz. Görev içindeki threadler aynı bellek uzayında otururlar. Bu uzay kullanıcı düzeyli uzaydır.
Tek ve Çoklu Threadler
Threadin paylaştıklarıHer threade özel Adres Uzayı Global değişkenler Açık dosyalar Çocuk görevler Bekleyen sinyaller Sinyal işleyiciler Kullanıcı bilgileri Program sayacı Saklayıcılar Yığın durum
her threadin kendi yığını varyığında çağrılmış ama dönülmemiş yordamlarla ilgili kayıtlar ve yerel değişkenler her thread farklı yordam çağrıları yapabilir geri dönecekleri yerler farklı ⇒ ayrı yığın gerekli
Performans açısından ThreadlerUNIX sistemlerde thread oluşturmak görev oluşturmaktan 10 kat daha hızlıdır.(Mac geliştiricileri) Bir threadin terminete olması görevden daha az zaman gerektirir. Görevler arasındaki anahtarlama için geçen süreden aynı göreve ait threadlerin anahtarlanması için geçen süre daha fazladır. Threadler arası iletişim daha etkindir.
Thread KarakteristiğiEğer bir thread görev değişkenlerinden birini değiştirirse bütün threadler bu değişikliği görür. Eğer bir thread bir dosya açıp okursa diğer threadlerde bu dosyayı okuyabilir. Threadler görevlere göre daha hızlıdır. Neden?
Thread KarakteristiğiSisteme daha az yük getirir. Threadlerin oluşturulmasıyla çekirdeğin yapısı etkilenmez. Dolayısıyla çekirdek seviyeli kaynaklar tüketilmediği için thread oluşturmak daha ucuzdur.
Neden threadler? Bir proses içinde birden fazla işlem olabilirBazı işlemler bazen bloke olabilir; threadlere bölmek performansı arttırır threadlerin kendi kaynakları yok Oluşturulmaları / yok edilmeleri proseslere göre kolay Threadlerin bazıları işlemciye yönelik bazıları giriş-çıkış işlemleri yapıyorsa performans artar çok işlemcili sistemlerde faydalı
Threadlerin Türleri İki türlü – kullanıcı uzayında (User Level)– çekirdek uzayında (Kernel Level) (lightweight process) hibrid bir gerçekleme de olabilir
Threadlerin Kullanıcı uzayında gerçeklenmesiÇekirdeğin threadlerden haberi yoktur Çoklu thread yapısını desteklemeyen işletim sistemlerinde de gerçeklenebilir Threadlerin üzerinde çalıştığı sistem Thread yönetim fonksiyonları Örn: thread_create, thread_exit, thread_yield, thread_wait Thread tablosu Program sayacı, saklayıcılar, yığın işaretçisi, durumu…
Threadlerin Kullanıcı uzayında gerçeklenmesiThread bloke olacak bir işlem yürüttüyse Örneğin bir başka threadin bir işi bitirmesini beklemek Bir rutin çağırır Rutin threadi bloke duruma sokar Threadin progream sayacı ve saklayıcı içeriklerini thread tablosunda saklar Sıradaki threadin bilgilerini tablodan alıp saklayıcılara yükler Sıradaki threadi çalıştırır. Hepsi yerel yordamlarSistem çağrısını yapmaktan daha hızlı
Threadlerin AvantajlarıThreadlerin ayrı bir zamanlama algoritmaları olabilir Thread yönetim veri yapısı kullanıcı adres uzayı içinde olduğu için Thread anahtarlamada kernel mod ayrıcalıkları verilmesine gerek yoktur. Tüm çağrılar yerel rutinler Çekirdeğe çağrı yapmaktan daha hızlı
Threadlerin Kullanıcı uzayında gerçeklenmesi Threadlerin DezavantajlarıOS kullanıcı düzeyinde thread varlığını bilmediği için, gereksiz zamanlama kararları verilebilir.
Threadlerin Kullanıcı uzayında gerçeklenmesi Threadlerin Problemlerisistem çağrılarının gerçekleşmesi Kullanıcı taraflı thread bir sistem çağrısı çalıştırdığında görev bloke olur tüm threadler bloke olur Bazı sistemlerde yapılan çağrının bloke olup olmayacağını döndüren sistem çağrıları da var. Sistem çağrılarına arabirim yazılır. Önce kontrol edilir, bloke olunacaksa sistem çağrısı yapılmaz, thread bekletilir.
Threadlerin Kullanıcı uzayında gerçeklenmesi Threadlerin ProblemleriSayfa hataları Programın çalışması gereken kod parçasına ilişkin kısım ana bellekte değilse Sayfa hatası olur Görev bloke olur Gereken sayfa ana belleğe alınınr. Görev çalışabilir Sayfa hatasına thread sebep olduysa Çekirdek threadlerden habersiz Tüm görev bloke edilir.
Threadlerin Kullanıcı uzayında gerçeklenmesi Threadlerin ProblemleriZamanlama Thread kendisi çalışmayı bırakmazsa diğer threadler çalışamaz Altta çalışan sistem belirli sıklıkta saat kesmesi isteyebilir Threadlerin de saat kesmesi ile işi varsa karışır Çok threadli çalışma istendiği durumlarda sıkça bloke olan ve sistem çağrısı yapan threadler olur Çekirdek düzeyinde işlemek çekirdeğe çok yük getirmez.
Bir süreçte üç adet thread bulunsunBir süreçte üç adet thread bulunsun. Eğer bilgisayarda tek işlemci var ise, bu threadlerin her biri CPU nun1/3 hızda çalışabilir. Eğer sistemde birden fazla işlemci var ise, her thread farklı işlemcide çalıştırılır, bu şekilde uygulama işlemci ve thread sayısına bağlı olarak hızlanır.
Thread kullanımının kötü yanları ise; threadleri kullanan uygulamanın yazımının özenli yapılması gereklidir. Her thread ortak veri kullandığı için birinin bir veri üzerindeki etkisi diğer threadleri etkiler. Örneğin, bir thread bir dosya ile işlemini bitirdiğinde dosyayı kapatsın. Eğer süreçteki başka thread bu dosyayı kullanıyorsa, uygulama çalışmaz ya da sonuçlar yanlış olabilir.
Thread Modelleri Many-to-one, one-to-one, many-to-many and two-level
Many-to-one ThreadingBu multithread mekanizmasında işletim sisteminin çekirdeği(kernel) multithread mekanizmasından habersizdir. İşletim sistemi basit olarak bir process veya thread çalıştırdığını düşünmektedir. Ancak user alanında thread kütüphanesi sayesinde birden fazla thread oluşturulup kullanılabilmekte ve threadler arası geçiş yapılabilmektedir. Solaris Green Threadleri, GNU Portable Threadleri ve Linux üzerindeki Pthread kütüphanesi de bu mekanizmadadır. Bu mekanizmanın önemli bir dezavantajı vardır, eğer threadlerden biri bloke olur ise, kernel işlemin sadece bir thread taarafından yapıldığını düşündüğünden threadler arası geçiş yapamaz, böylece görev içerisindeki tüm threadler bloke olur.
One – To – One Threading Her bir user threadi için kernel tarafında bir threadin oluşturulduğu mekanizmadır. Bu mekanizmanın kullanılabilmesi için, işletim sisteminin kernel tarafında thread mekanizmasını desteklemesi gerekmektedir. Windows NT/XP/2000 threadleri, Linux threadleri ve Solaris 9 threadleri bu gruba girmektedir. Avantajları : Bir thread tarafından yapılan bir sistem çağrısı aynı görev içerisindeki diğer threadleri bloke etmez. Bir görev birden fazla işlemci kullanabilir. Threadlerin oluşturulması, yok edilişi ve birbirleri arasındaki geçişi görevlere göre daha ekonomiktir. Dezavantajları : Kernel threadlerinin oluşturulması, yok edilişi ve birbirleri arasındaki geçişi user threadlerine gore daha maliyetlidir. CPU zamanlama algoritmaları adil değildir : Her threade aynı zaman dilimi verilir. Bu sebeple çok sayıda threadi olan işlemler daha az sayıda threadleri olan işlemlere göre daha çok CPU zamanı kazanmış olurlar.
Many – To – Many ThreadingBu mekanizmanın kullanılabilmesi için kernel multithreadingi desteklemek zorundadır. Fakat one-to-one model de olduğu gibi her bir user threadine karşılık bir tane kernel threadi olmak zorunda değildir. N tane user threadine karşılık M tane kernel threadi oluşturulmakta (M<=N) ve user threadi önce n. thread ile daha sonra n+1. thread ile ilgilenebilmektedir, user threadleri değiştirilebilir. İşletim sistemi gerekli sayıda kernel threadinin oluşmasına ve birçok kernel threadinin user threadine eşleşmesine izin verir. IRIX, HP-UX ve Tru64 UNIX threadleri bu gruba girmektedir.
Thread Programları Tasarımı (Paralel Programlama)Çok çekirdekli bilgisayarlarda, pthreadler paralel programlama yapıları için uygundur. Paralel Programlama unsurları, problem bölümleme yük dengeleme (Load Balancing) İletişim veri bağımlılıkları Senkronizasyon ve yarış koşulları bellek sorunları I / O sorunları Program karmaşıklığı Programcı çaba / maliyet / zaman
Bir iş parçacığı oluşturulduktan sonra, nasıl bilirsina) işletim sistemi tarafından ne zaman çalıştırmak için planlanmış olabilir b) hangi işlemci / çekirdek üzerinde çalışacak?
Creating and Terminating Threadspthread_create (thread,attr,start_routine,arg) pthread_exit (status) pthread_cancel (thread) pthread_attr_init (attr) pthread_attr_destroy (attr)
Creating and Terminating Threadspthread_create arguments: thread: yeni iş parçacığı için benzersiz bir tanımlayıcı attr: Konu özelliklerini ayarlamak için kullanılabilir özellik nesnesi. Varsayılan değerler için bir thread özelliklerini nesne veya NULL belirtebilirsiniz. start_routine: C rutini oluşturulduktan sonra yürütülecek iş parçacığı. arg: start rutin için üretilen bir argüman. Void tipindeki bir işaretçi olarak referanstan geçmiş olması gerekir. Herhangi bir argüman geçirilecekse NULL kullanılabilir.
prosesin başta bir threadi var Thread kütüphane yordamları ile yeni thread yaratır – örn: thread_create parametresi: koşturacağı yordamın adı yaratılan thread aynı adres uzayında koşar bazı sistemlerde threadler arası anne – çocuk hiyerarşik yapısı var – çoğu sistemde tüm threadler eşit
işi biten thread kütüphane yordamı çağrısı ile sonlanır – örn: thread_exit zaman paylaşımı için zamanlayıcı yok – threadler işlemciyi kendileri bırakır örn: thread_exit Threadler arası senkronizasyon ve haberleşme olabilir
Örnek Thread Programı
Çoklu Thread oluşturmak için iki genel strateji vardırAsenkron Thread Threadler birbirinden bağımsız çalışabilir. Çok az veri paylaşımı vardır. Parent thread child threadlerin terminate olduğunu bilmesine gerek yoktur. Senkron Thread Parent, child threadlerin bitmesini bekleyebilir. Her thread bittiğinde paret çalışır. Örneğin parent thread, child threadlerden gelen sonuçları birleştirebilir. Genellikle bu thread yapısı tercih edilir.
"THREADS (İŞ PARÇACIKLARI)" indir ppt