Obj-C’nin çoklu iş parçacığı kavramı, programların aynı anda birden fazla işlem yapmasına olanak tanır Bu, programın daha hızlı çalışmasını ve performansını artırmasını sağlar İş parçacıkları, ayrı işlemleri eşzamanlı olarak gerçekleştirir ve uygulamanın daha kararlı hale gelmesini sağlar Multithreading için kullanılan teknolojiler arasında Grand Central Dispatch GCD ve NSThread yer alır GCD, Dispatch Queues kullanarak farklı işlemleri öncelikle sıralar ve Semaphore teknolojisini kullanarak blokajları önler NSThread ise, Thread yönetimini yaparak daha karmaşık uygulamalar için kullanılır GCD teknolojisi, iOS uygulamalarının daha hızlı ve verimli bir şekilde çalışmasına yardımcı olur
![Obj-C Multithreading (Çoklu İş Parçacığı) Kavramı](/uploads/bloglar3/165360-Obj-C-Multithreading-Coklu-Is-Parcacigi-Kavrami.webp)
Obj-C'de çoklu iş parçacığı kavramı, programların daha hızlı ve verimli bir şekilde çalışmasına olanak sağlar. Çoklu iş parçacığı, programların tek bir iş parçacığının tamamlanmasını beklemek yerine, birden fazla işi aynı anda yapabilmesini sağlar. Böylece, işlem gücü ve performans artar.
Bu kavramın önemi, özellikle büyük ve karmaşık programlarda daha belirgindir. Örneğin, programın bir kısmı kullanıcı girişini işlerken, diğer bir kısmı arka planda veri tabanından bilgi çeker veya ekranda herhangi bir işlem yapılırken, arka planda başka bir işlem yapılır. Multithreading, programların bu işlemleri eş zamanlı yapabilmesine imkan verir.
Bu nedenle, özellikle büyük ölçekli ve yüksek performans gerektiren uygulamalarda, çoklu iş parçacığı kavramını anlamak ve uygulamak oldukça önemlidir. Obj-C'de bu kavramı doğru bir şekilde uygulamak, hem programın performansını artırır hem de kullanıcılara daha iyi bir deneyim sunar.
İş Parçacıkları Nedir?
İş parçacıkları (threads), bir programda aynı anda birden fazla iş yapmanızı sağlayan işlem birimleridir. Bu işlem birimleri, program içinde tanımlanan ayrı görevleri eşzamanlı olarak yaparlar. Bu sayede, tek bir thread ile yapılacak işlemler çok daha hızlı ve efektif bir şekilde yapılabilir.
İş parçacıkları, program performansını artırırken aynı zamanda kullanıcılara daha iyi bir deneyim sunar. Örneğin, bir uygulamanın arka planda bir işlemi tamamlaması gerekiyorsa ve kullanıcının işlemin tamamlanmasını beklemesi gerekiyorsa, kullanıcı arayüzü donabilir. Ancak iş parçacıkları sayesinde, arka planda işlem yapılabileceği için kullanıcının uygulama ile etkileşimi engellenmemiş olur.
İş parçacıkları ayrıca uygulamaların daha kararlı hale gelmesini sağlar. Çünkü bir thread, diğer thread tarafından yapılan hatalardan etkilenmez ve programın çalışması durmaz. Ayrıca iş parçacıkları, CPU kullanımını dengeler ve sistem kaynaklarını daha verimli bir şekilde kullanmamızı sağlar.
Obj-C'de Multithreading Nasıl Yapılır?
Obj-C, geliştiricilerin uygulama performansını artırmak için çoklu iş parçacığı kavramını kullanabileceği bir dil olarak öne çıkıyor. Burada, bu işlemi gerçekleştirmenin iki ana yöntemi olan Grand Central Dispatch (GCD) ve NSThread'in kullanımını ele alacağız.
GCD, performansı artırmak ve uygulama yanıt süresini iyileştirmek için popüler bir seçenektir. Yapısı, çalışan iş görevlerini "Dispatch Queues" olarak adlandırılan birbirinden ayrı birçok iş parçacığına dağıtmaktır. Bu sırada, hangi işlerin daha öncelikli olduğuna karar verir ve öncelikli olanları öncelikli iş parçacıklarına yerleştirir.
Dispatch Queues, FIFO (First In First Out) olarak çalışır. Bir iş görevi eklendiğinde, hatayı yakalamak için bir exception yapısı kullanılabilir. Ayrıca Dispatch Queues, hafif ve büyük yapıları destekler, bu da işlem zamanını etkiler.
GCD'de, Dispatch Queues'ların kullanımı şu adımları takip eder:
- Dispatch Queue oluşturma
- Çalıştırılacak işi Dispatch Queues'a eklenme
- İş parçacığı tamamlanana kadar bekleme, bitince temizleme
Dispatch Queue kullanırken en önemli avantaj, ön büroda yer alan işlemleri yönetebilme kabiliyetidir. Bu nedenle, uygulama performansı arttırılabilir.
Semaphore, Dispatch Queues için bir blokaj nesnesidir ve bir işlem diğerini beklettiğinde, bir Semaphore kullanarak blokajların önlenmesi sağlanabilir. Bu sayede öncelikli işlemler yönetilebilir ve uygulama performansı arttırılabilir.
NSThread, daha düşük seviyede çoklu iş parçacığı yapma seçeneği sunar ve bu nedenle daha karmaşık uygulamalar için uygundur. Bu seçenek, doğrudan Thread'leri oluşturmak ve yönetmek için kullanılabilir.
Burada, başarılı bir çoklu iş parçacığı kullanmak için Thread yönetiminde dikkat edilmesi gereken birkaç şey vardır:
- Thread'ler örneklenebilir ve bir method ile kullanılabilir.
- Bir Thread başlatılmadan önce, sonlandırıldığından emin olunmalıdır.
- Bir Thread çalıştırılmadan önce, diğer Thread'lerin çalışmasını bekleyen bir dizi izin verilebilir.
- Bir Thread'in çalışması sona erdiğinde, diğer Thread'lerin çalışmasına izin verilir.
Tüm bu teknikler, iyi performans ve uygulama yanıt süresi elde etmek için çoklu iş parçacığı kullanmanın önemli bir parçasıdır.
GCD Kullanımı
Obj-C multithreading işlemlerinde Grand Central Dispatch (GCD) teknolojisi kullanılarak çoklu iş parçacığı yapılabilir. GCD, arka plandaki işlemleri çoklu iş parçacıkları ile gerçekleştirmek için kullanılabilir. Bu teknolojinin kullanımı, uygulamanın daha hızlı çalışmasına ve uygulama performansının artmasına yardımcı olur.
GCD kullanarak, çoklu iş parçacığı yapmak oldukça kolaydır. Bunu yapmak için, işlemi yapılacak olan görevlerin listesini Dispatch Queues adı verilen bölümlere yerleştirmeniz gerekir. GCD, sırasıyla bu görevleri işleyecektir.
GCD, görevleri bir dizi öncelik sırasına göre ayırır ve herhangi bir zamanda yalnızca bir önceliği işler. Eğer bir öncelik sıralaması yoksa, GCD tüm görevleri eşit öncelikle işler. Ayrıca, GCD, Semaphore adı verilen bir teknoloji kullanarak bir işlemi bloke etmeden, diğer işlemlerin devam etmesini sağlar. Bu, uygulamanın daha hızlı çalışmasına yardımcı olur.
Genel olarak, Grand Central Dispatch (GCD) teknolojisi, çoklu iş parçacığı yaparak, iOS uygulamalarının daha hızlı ve daha verimli bir şekilde çalışmasına yardımcı olur.
Dispatch Queues
Obj-C'de çoklu iş parçacığı oluşturmak ve bu parçacıklar için sırayla işlemler gerçekleştirmek için Dispatch Queues kullanılabilir. Dispatch Queues, GCD (Grand Central Dispatch) kütüphanesi sayesinde uygulamalarda kullanılan bir paralel programlama tekniğidir. Bu teknik, daha önce yapılırken sırayla yürütülen işlemlerin, paralel olarak çalıştırılmasını sağlar ve işlem yükünü optimize eder.
Dispatch Queues kullanarak uygulama performansı artırılabilir ve daha hızlı çalışabilir. İşlemlerin belirli bir sıraya göre yapılması gerektiği durumlarda, serial dispatch queue kullanılabilir. Eşzamanlı işlemlerin paralel yapılması gerektiği durumlarda, concurrent dispatch queue kullanılabilir.
Dispatch Queues kullanımı, uygulama geliştiricilerine iki farklı yöntem sunar; async ve sync methodları. Bu methodlar arasında async methodu daha yaygın olarak kullanılır. Async methodu, dispatch queue'ya bir işlem gönderir ve hemen geri döner. Bu bir nevi işlemin arka tarafında yapılır ve uygulama akışı kesilmez. Sync methodu ise, işlem tamamlanmadan işlemi göndermiş olan iş parçacığı duraklatılır ve bekletilir. Bu sebeple, sync methodu uygulama akışında kullanılmaması önerilir.
Bir dispatch queue ile oluşturulan iş parçacıkları, sistem performansına göre otomatik olarak yönetilir. Orijinal kodu yazarken, iş parçacığında ne kadar işlem yapılacağına dikkat etmek önemlidir, çünkü çok fazla işlem, uygulamanın yavaşlamasına neden olabilir.
Semaphore
Semaphore, çoklu iş parçacığı yapılan uygulamalarda blokajların önlenmesinde kullanılan bir mekanizmadır. Obj-C'de Semaphore kullanarak kodun belirli bir adımda bloklanması, belirli bir adımda ise serbest bırakılması sağlanabilir.
Semaphore, bir adet sayısal değer tutar ve bu değer blokajların sayısını gösterir. Semaphore'un başlangıç değeri 1 ise, her bir iş parçacığı bu kaynağı sırayla kullanabilir. Örneğin, bir web hizmetine istek gönderen bir uygulama düşünelim. Çoklu iş parçacığı kullanarak bu işlemi gerçekleştirdiğimizde, birden fazla istek gelmesi durumunda Semaphore kullanarak her bir isteğin sırayla işleme alınmasını sağlayabiliriz.
Bir örnek daha vermek gerekirse, bir veritabanı işlemi yapılması gerektiğinde Semaphore kullanarak tek bir sorgu çalıştırılmasını ve diğer iş parçacıklarının sorgu çalışma işlemi bittiğinde sırayla devam etmesini sağlayabiliriz. Semaphore kullanırken önemli olan nokta, sayısının doğru şekilde ayarlanmasıdır. Aksi takdirde, uygulamanız yavaşlayabilir veya kilitlenebilir.
Özetlemek gerekirse, Semaphore kullanımı ile obj-C'de çoklu iş parçacığı uygulamalarında blokajları önleyebilir ve işlemleri sırayla yapabiliriz.
NSThread Kullanımı
Obj-C'de çoklu iş parçacığı yapmak için kullanabileceğimiz bir diğer teknik de NSThread kullanmaktır. NSThread, GCD'ye kıyasla daha düşük seviyeli bir kütüphanedir ve daha fazla kontrole ihtiyaç duyan senaryolarda tercih edilebilir.
NSThread kullanarak çoklu iş parçacığı yapmak için ilk adım, bir NSThread nesnesi oluşturmaktır. Her iş parçacığı için ayrı bir nesne oluşturmak, birbirini etkilemesini engelleyebilir ve daha kontrollü bir yapı sağlayabilir.
Bir NSThread nesnesi oluşturduktan sonra, ona bir selector atayarak işlem yapmasını sağlayabiliriz. Bir selector, adı verilen bir metodun adresidir. Bu metodun iş parçacığı içinde çalıştırılması için, nesnenin performSelectorInBackground:withObject: metodunu çağırmamız gerekir. Örneğin:
```objective-cNSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(myMethod:) object:nil];[thread start];```
Bu kod, myMethod adlı bir metodun iş parçacığı içinde çalıştırılmasını sağlayacaktır. Eğer metoda parametre geçmek istiyorsak, object parametresini kullanabiliriz.
NSThread ayrıca, iş parçacığı sona erdiğinde haber vermesi için birkaç yöntem de sağlar. Örneğin, [NSThread exit] metodunu kullanarak iş parçacığını sonlandırabiliriz. Bunun yanında, bir NSThread nesnesi için bir isCancelled() yöntemi de mevcuttur. Bu yöntem, iş parçacığı hedefi içinde döngülerin çalışmasını durdurmak için kullanılabilir.
NSThread kullanırken dikkat edilmesi gereken birkaç nokta vardır. Öncelikle, doğru miktarda işlem yapmak ve gereksiz işlem yükünden kaçınmak için işlek (main) işlem akışınızı engellememelisiniz. İkinci olarak, iş parçacıkları arasında veri uyumsuzluğu risklerini kontrol etmelisiniz. Bu, deadlock veya race condition gibi beklenmeyen hatalara neden olabilir. Son olarak, NSThread'in kullanımı, GCD'den daha karmaşık bir yapıdır. Bu nedenle, daha fazla hata riski veya düşük performans nedeniyle tercih edilmemesi gerekebilir.
NSThread kullanımı, çoklu iş parçacığı yapmak için özelleştirilmiş çözümler gerektiren senaryolarda tercih edilebilir. Daha fazla kontrole ihtiyaç duyan, senkronize işlemler için uygun bir seçenek olabilir. Ancak, doğru kullanılmazsa, bug veya hatalara neden olabilir. Bununla birlikte, uygun bir şekilde kullanıldığında, NSThread, Obj-C'de çoklu iş parçacığı yapmak için iyi bir seçenek olabilir.
Obj-C Multithreading'de Dikkat Edilmesi Gerekenler
Obj-C'de çoklu iş parçacığı yaparken, bazı sorunlarla karşılaşılabilrisiniz. Bunların en önemlisi, kritik bölgelerde aynı anda birden fazla iş parçacığının işlem yapmasıdır. Bu, hatalara neden olabilir ve sonuçta işlemlerin tamamlanmasını engelleyebilir.
Bu sorunların önlenmesi için, çoklu iş parçacığı projesinde mümkün olduğunca blokajları önlemek önemlidir. Blokajlar, diğer iş parçacıklarının beklemesine neden olabilir ve uygulamanın performansını düşürebilir. Ayrıca, çok sayıda iş parçacığının aynı anda çalışması, uygulamanın bellek kullanımını artırır ve istenmeyen sonuçlar doğurabilir.
Çoklu iş parçacığı yaparken, işlem yapılacak verilerin doğru şekilde paylaşıldığından emin olunmalıdır. Eğer aynı veri üzerinde birden fazla işlem yapılacaksa, senkronizasyon yöntemleri kullanılmalıdır. Bu yöntemler arasında, semafor, mutex ve condition variables gibi yöntemler yer alır.
- Semafor: Semafor, paralel işlemler arasında iletişimi kontrol etmek için kullanılan bir yöntemdir. Bir işlem, semaforu kullanarak belirli bir kaynak üzerinde blokaj oluşturabilir. Bu sayede, diğer işlemler kaynağı kullanamazlar ve beklemek zorunda kalırlar.
- Mutex: Mutex, birden fazla işlem veya iş parçacığı arasında birbirlerine erişimi kontrol etmek için kullanılan bir yöntemdir. Mutex, belirli bir kaynağı, sadece tek bir işlem veya iş parçacığı tarafından kullanılabilir hale getirir ve diğer işlemlerin kaynağa erişebilmesi için beklemesi gereklidir.
- Condition Variable: Condition variable, çoklu iş parçacıkları arasında belirli bir olayın gerçekleşmesini sağlamak için kullanılan bir yöntemdir. Bir işlem, bir condition variable'ı bekleyebilir ve diğer işlemler, bekleyebilir veya belirli bir olay gerçekleştikten sonra devam edebilir.
Ayrıca, çoklu iş parçacığı yaparken hafıza yönetimine dikkat edilmelidir. Bellek sızıntıları, performans sorunlarına neden olabileceği için, düzenli olarak bellek tahsisatı ve tahsisatı serbest bırakma işlemleri gerçekleştirilmelidir.
Obj-C'de çoklu iş parçacığı yaparken dikkat edilmesi gereken önemli hususlar bulunmaktadır. Bu hususlara dikkat ederek, hata oranını düşürebilir ve uygulamanın performansını optimize edebilirsiniz.