Concurrency
• Bağımsız olarakyürütülen görevlerin
kompozisyonu
Parallelism
• Yakın ilişkili işlemlerin aynı anda yürütülmesi
6.
CPU
• Verileri işleyenve yazılım komutlarını
gerçekleştiren donanım
• Her bir çekirdeğin bir clock-cycle’ında aynı
anda sadece bir işlem gerçekleştirebilir.
7.
Thread (İş Parçacığı)
•“Bir işin eş zamanlı olarak işlenen her bir
bölümüdür.” - Wikipedia
• Uygulama çalıştığında işletim sistemi belli
sayıda thread ayırır (Thread pool)
• Main thread ve GCD threads
Concurrency
• Tek çekirdekliCPU’lu cihazlarda birden fazla işlemin eş
zamanlı olarak gerçekleştirilmesi
• Bir çekirdekte aynı anda bir işlem?
• İşlemler aynı anda gerçekleşiyormuş izlenimi verir.
• Bir işlem bitmeden, diğerini başlatır. (time-slicing)
• İşlemler arasında önceliklerine göre geçiş yapar.
(context switch)
Parallelism
• Çok çekirdekliCPU’lu cihazlarda birden fazla
işlemin aynı anda gerçekleştirilmesi
• Bir işlem, alt parçalara ayrılıp her bir
çekirdekte aynı anda işlenebilir.
• Parallelism, çok çekirdekli CPU donanımına
ihtiyaç duyar.
15.
• 5 kişinin1 yatağı aynı anda yapması
• Her bir kişinin kendi yataklarını yapması
Hangisini yapılandırmak daha komplekstir?
16.
Concurrency
• Birden fazlaşeyle aynı anda başa çıkılması
• Yapılandırmaya odaklanır.
Parallelism
• Birden fazla şeyin aynı anda yapılması
• Execution ile alakalıdır.
GCD
• Closure’ları işlemeyeizin veren Queue-Based
API
• iOS, MacOS, WatchOS ve TvOS’ta
kullanabilir.
• Thread’lerin üstüne inşa edilmiş soyut
yapılar; Dispatch Queue ve Run Loop
Sync ve AsyncExecution
• Sync: Bir işlem bitene kadar, diğer işlemler
bekler.
• Async: Bir işlem execute edildiğinde sonucu
hemen döner ve işlemin bitmesini
beklemeden diğeri başlar.
Serial Queue
• Aynıanda sadece bir işlem gerçekleşir
• İşlemler FIFO sırasına göre işler.
49.
Serial Queue
let serialQueue= DispatchQueue(label: "customSerialQueue")
for i in 0...3 {
serialQueue.sync {
sleep(UInt32(3-i))
print(i)
}
}
print("NSIstanbul")
50.
Serial Queue
let serialQueue= DispatchQueue(label: "customSerialQueue")
for i in 0...3 {
serialQueue.sync {
sleep(UInt32(3-i))
print(i)
}
}
print("NSIstanbul")
// Prints
0
1
2
3
NSIstanbul
51.
Serial Queue
let serialQueue= DispatchQueue(label: "customSerialQueue")
for i in 0...3 {
serialQueue.async {
sleep(UInt32(3-i))
print(i)
}
}
print("NSIstanbul")
52.
Serial Queue
let serialQueue= DispatchQueue(label: "customSerialQueue")
for i in 0...3 {
serialQueue.async {
sleep(UInt32(3-i))
print(i)
}
}
print("NSIstanbul")
// Prints
NSIstanbul
0
1
2
3
53.
Concurrent Queue
• İşlemlereFIFO sırasına göre başlanır fakat ne zaman
biteceği belli değildir.
• Bir işleme başlamak için diğer işlemin bitmesini beklemez.
54.
Concurrent Queue
let concurrentQueue= DispatchQueue(label:“customConcurrentQueue”,
attributes: .concurrent)
for i in 0...3 {
concurrentQueue.async {
sleep(UInt32(3-i))
print(i)
}
}
print("NSIstanbul")
55.
Concurrent Queue
let concurrentQueue= DispatchQueue(label:“customConcurrentQueue”,
attributes: .concurrent)
for i in 0...3 {
concurrentQueue.async {
sleep(UInt32(3-i))
print(i)
}
}
print("NSIstanbul")
// Prints
NSIstanbul
3
2
1
0
56.
Concurrent Queue
let concurrentQueue= DispatchQueue(label:“customConcurrentQueue”,
attributes: .concurrent)
for i in 0...3 {
concurrentQueue.sync {
sleep(UInt32(3-i))
print(i)
}
}
print("NSIstanbul")
57.
Concurrent Queue
let concurrentQueue= DispatchQueue(label:“customConcurrentQueue”,
attributes: .concurrent)
for i in 0...3 {
concurrentQueue.sync {
sleep(UInt32(3-i))
print(i)
}
}
print("NSIstanbul")
// Prints
0
1
2
3
NSIstanbul
Main Queue
• Uygulamaçalıştığında otomatik olarak
oluşan özel bir queue
• İşlemleri ard arda (serially) gerçekleştirir.
• İşlemleri her zaman Main thread’te çalıştırır.
• UI işlemleri her zaman Main thread’te
yapılmalıdır.
60.
Main Queue
for iin 0...3 {
DispatchQueue.main.async {
sleep(UInt32(3-i))
print(i)
}
}
print("NSIstanbul")
61.
Main Queue
for iin 0...3 {
DispatchQueue.main.async {
sleep(UInt32(3-i))
print(i)
}
}
print("NSIstanbul")
// Prints
NSIstanbul
0
1
2
3
62.
Main Queue
for iin 0...3 {
DispatchQueue.main.sync {
sleep(UInt32(3-i))
print(i)
}
}
print("NSIstanbul")
63.
Main Queue
for iin 0...3 {
DispatchQueue.main.sync {
sleep(UInt32(3-i))
print(i)
}
}
print("NSIstanbul")
// Runtime Error
error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION
(code=EXC_I386_INVOP, subcode=0x0).
64.
1. Sync queueMain Queue’yu bloklar.
2. Kod bloğu işlemini bitirene kadar, Main
Queue’nun thread’ini bloklar.
3. Kod bloğu çalışmayı sonsuza kadar bekler
çünkü çalışması gereken thread bloklanmıştır.
DispatchQueue.main.sync {}
dispatch_sync; kod bloklarını çalıştırmaz
sadece sıraya alır. Çalıştırma işlemi
gelecek zamanda gerçekleşir.
65.
Global Queue’lar
• İşletimsistemi bize bir takım concurrent global
queue’lar sağlar.
• Genellikle arka planda gerçekleştirmek istediğimiz,
UI ile alakalı olmayan işler için kullanırız.
• Yapacağınız işlemin önemine, yüküne ve ne kadar
uzun süreceğine göre global queue seçimi yapılır.
• Quality of Service (QoS)
66.
Quality of ServiceClasses
UI
User Interactive
IN
User Initiated
UT
Utility
BG
Background
67.
Quality of ServiceClasses
• CPU görev önceliklendirmesi
• CPU etkin kullanımı
• I/O önceliği
• Her cihaza/platforma özgün konfigürasyonlar
68.
Quality of ServiceClasses
User Interactive
User Initiated
Utility
Background
Main thread, animasyonlar
Hızlı sonuçlar
Uzun süren işler
Kullanıcı tarafında önemsiz işler
69.
Quality of ServiceClasses
User Interactive
User Initiated
Utility
Background
UI’yı güncellerken aktif bir şekilde kullanılacak mı?
Hızlı sonuçlar
Uzun süren işler
Kullanıcı tarafında önemsiz işler
70.
Quality of ServiceClasses
User Interactive
User Initiated
Utility
Background
UI’yı güncellerken aktif bir şekilde kullanılacak mı?
Kullanıcının etkileşime devam etmesi için gerekli mi?
Uzun süren işler
Kullanıcı tarafında önemsiz işler
71.
Quality of ServiceClasses
User Interactive
User Initiated
Utility
Background
UI’yı güncellerken aktif bir şekilde kullanılacak mı?
Kullanıcının etkileşime devam etmesi için gerekli mi?
Kullanıcı bu işlemin gerçekleştiğinin farkında mı?
Kullanıcı tarafında önemsiz işler
72.
Quality of ServiceClasses
User Interactive
User Initiated
Utility
Background
UI’yı güncellerken aktif bir şekilde kullanılacak mı?
Kullanıcının etkileşime devam etmesi için gerekli mi?
Kullanıcı bu işlemin gerçekleştiğinin farkında mı?
Kullanıcı işlemin farkında değil mi?
Grouping
Database
Dispatch Queue
Data Transform
DispatchQueue
Networking
Dispatch Queue
User Interface
Main Queue
Dispatch Group
let group = DispatchGroup()
queue.async(group: group).async {...}
2
queue2.async(group: group).async {...}
92.
Grouping
Database
Dispatch Queue
Data Transform
DispatchQueue
Networking
Dispatch Queue
User Interface
Main Queue
Dispatch Group
let group = DispatchGroup()
queue.async(group: group).async {...}
3
queue2.async(group: group).async {...}
queue3.async(group: group).async {...}
93.
Grouping
Database
Dispatch Queue
Data Transform
DispatchQueue
Networking
Dispatch Queue
User Interface
Main Queue
Dispatch Group
let group = DispatchGroup()
queue.async(group: group).async {...}
3
queue2.async(group: group).async {...}
queue3.async(group: group).async {...}
group.notify(queue: .main) {...}
94.
Grouping
Database
Dispatch Queue
Data Transform
DispatchQueue
Networking
Dispatch Queue
User Interface
Main Queue
Dispatch Group
let group = DispatchGroup()
2
queue2.async(group: group).async {...}
queue3.async(group: group).async {...}
group.notify(queue: .main) {...}
95.
Grouping
Database
Dispatch Queue
Data Transform
DispatchQueue
Networking
Dispatch Queue
User Interface
Main Queue
Dispatch Group
let group = DispatchGroup()
1
queue3.async(group: group).async {...}
group.notify(queue: .main) {...}