Evet arkadaşlar, şimdi semaforlarla çalışacağımız API'leri tartışacağız.
Semaforlarla çalışmak için öncelikle H için başlık dosyasını dahil etmeniz ve semaforları
kullanmak için bu beş API'yi kullanmamız gerekir.
Değil mi?
Yani API'ler kendi kendini açıklayıcı niteliktedir.
Bir veri türü kullanarak bir semafor değişkeni bildirebileceğinizi görebilirsiniz.
Sam Underscore T Right.
Ve programınızda semafor üzerinde herhangi bir işlem yapmadan önce semaforu başlatmanız gerekir,
değil mi?
İlk argüman, başlattığınız semafor değişkeninin adresidir.
İş parçacıklarının senkronizasyonu için semaforu kullanmak istiyorsanız ikinci argümanı her zaman sıfır olarak geçebilirsiniz.
Süreçlerin senkronizasyonu için semaforu kullanmak istiyorsanız, buraya sıfır dışında herhangi
bir değer geçmeniz gerekir.
Değil mi?
Bu dersin devamında iş parçacıkları yerine süreçleri senkronize etmek için semaforların nasıl kullanılacağını
göreceğiz.
Doğru.
Bu nedenle, Sigma Force'un aynı makinede çalışan birden fazla iş parçacığının senkronizasyonu için de kullanılabileceğini
ve semaforların aynı sürecin iş parçacıkları olan birden fazla iş parçacığının senkronizasyonu için de kullanılabileceğini unutmayın.
Üçüncü bağımsız değişken ise semaforu başlattığınız ilk izin numarası veya izin sayacı
değeridir.
Değil mi?
Yani bu pozitif bir değer olmalıdır.
Ve sonra aynı await ve semafor API'lerini zaten tartışmıştık.
Semaforun tüm işlevselliği bu iki API'ye dayanır.
Bu Sam Wait ve Sam Post.
Değil mi?
Ve programımızda semaforu kullanmayı bitirdiğimizde, bu API'yi kullanarak semaforu yok
edebiliriz.
Değil mi?
Kısa bir süre sonra semaforları kullanan bir program yazarken bu beş API'nin tümünü kullanacağız.
Şimdi bu iki API'yi kullanarak Semafor'un gerçekte nasıl çalıştığını anlamaya çalışalım.
Yani Semafor Bekleme ve Semafor.
Gönder.
Bu iki API, semaforun tüm işlevselliğini oluşturur.
Şimdi weight ve post API'lerinin bir semafor üzerinde nasıl çalıştığını anlayalım.
Yani sağ taraftaki yeşil kutuyu bir kod parçası olarak görselleştirebilirsiniz.
Ve yeşil kutunun içindeki bu küçük sarı kutu kritik bir bölüm, değil mi?
Bir semafor değişkeni aldık ve onu n genel değeri ile başlattık.
Örneğimiz için N değerinin üç olduğunu varsayalım, değil mi?
Genel olarak, kritik bölümü SIM wait ve SIM post API'leri arasına sıkıştırarak semaforu
kullanırız.
Doğru.
Diyagramda kritik bir bölümümüz olduğunu ve bu kritik bölümün semaforların wait ve post API'leri
arasına sıkıştırıldığını görebilirsiniz.
Semaforun değerini üç değeriyle başlattığımız için, niyetimiz kritik bölümde eşzamanlı
olarak üçten fazla iş parçacığının çalışmaması gerektiği anlamına gelir.
Doğru.
Kritik bölüme girmesine ve bu bölümde çalışmasına izin verilen iş parçacığı sayısı en fazla üç olabilir.
Bir olabilir, iki olabilir ya da üç olabilir ama üçten fazla olamaz.
Doğru.
Bu, semaforun işlevselliğidir.
Şimdi süreçte üç iş parçacığımız olduğunu varsayalım, iş parçacığı, T1 iş parçacığı, T2 ve T3.
Değil mi?
Ve kritik bölümü uygulamaya doğru geliyorlar.
Doğru.
Böylece kritik bölüme girmeden önce aynı ağırlıkla karşılaştılar.
Diyelim ki T1 iş parçacığı önce bazı ağırlıkları yürütüyor, değil mi?
Böylece semaforun değeri 3'ten 2'ye düşecektir.
Kural, iş parçacığı aynı ağırlığı yürütür yürütmez semaforun izin sayacının değerini koşulsuz olarak
azaltacağını söyler.
Yani burada semaforun değerini koşulsuz olarak 3'ten 2'ye düşürdük.
Doğru.
Ve izin, sayaç değeri sıfırdan küçük olmadığından, T1 iş parçacığının kritik bölüme girebileceği
ve yürütebileceği anlamına gelir.
Bundan sonra, iş parçacığının aynı ağırlığı yürüteceğini varsayalım.
Değil mi?
Böylece N değeri 2'den 1'e düşecektir.
Ve N değeri hala sıfırdan büyük olduğu için, T2 tehdidi de kritik bölümde çalışacak
bir yol bulacaktır.
Benzer şekilde, T3 tehdidi izin sayacının değerini 1'den 0'a düşürecek ve T3 tehdidi de kritik
bölüme girip yürütme yapabilecektir.
Dolayısıyla, bu noktada semaforun değeri sıfıra düşürülmüştür.
Şimdi bir süreliğine.
T1, T2 ve T3 iş parçacığı kritik bölümde çalışmaya devam ederse.
Ve dördüncü iş parçacığının geldiğini ve dördüncü iş parçacığının da aynı beklemeye girdiğini varsayalım.
Doğru.
Böylece semafor sayacının değerini 0'dan -1'e düşürecektir.
Doğru.
Ve ikinci kural, izin sayacı değerinin sıfırdan daha aza düşmesi durumunda, çağıran iş parçacığının engelleneceğini
söylediğinden.
Yani burada çağıran iş parçacığı T4'tür, bu nedenle T4 iş parçacığı engellenmiştir.
Doğru.
Ve bu noktada, semafor sayacının değeri eksi birdir.
Sam Weight API bu şekilde çalışır.
Şimdi Sam post API'nin nasıl çalıştığını tartışalım.
Şimdi birinci iş parçacığının kritik bölümdeki yürütmesini tamamladığını ve kritik bölümün dışına çıkma eğiliminde
olduğunu varsayalım.
Dolayısıyla kritik bölümden çıkmadan önce t1 iş parçacığının API'yi çalıştırması gerekir.
Sam postası.
Doğru.
Yani ilk kural, semaforun izin sayacının değerinin koşulsuz olarak artırılacağını söyler.
Bu, n değerinin sıfır olacağı anlamına gelir.
Değil mi?
İkinci kural ise aynı ağırlıkta bloke edilen iş parçacıklarına sinyal gönderir.
Eğer varsa.
Doğru.
Dolayısıyla, aynı ağırlık API'sinde engellenen iş parçacığı vardır.
Bu nedenle t bir iş parçacığı bir sinyal üretecektir.
Doğru.
Böylece bir sinyal üretecektir.
Diyelim ki sinyal üretildi ve iplik t bu kritik bölümden çıkabildi.
Doğru.
Bu sinyal, işletim sistemi tarafından semafor üzerinde engellenmiş durumda olan herhangi bir iş parçacığına iletilecektir.
Doğru.
Ve sinyal iş parçacığı için iş parçacığına iletilir iletilmez, T4 API'leri tekrar çalıştıracak ve bekleyecektir.
Doğru.
Tehdit, T4 bu sinyali tüketecek ve kritik bölüme giriş yapacaktır.
Doğru.
Sandviç üzerinde zaten engellenmiş olan tehdit, izin sayacına dokunmadan sinyali
aldığında, o iş parçacığı kritik bölüme girer.
Semafor sayacının değeri sıfır olarak kalır.
Doğru.
Yani şu anda elimizde bir konu başlığı yok.
Biri kritik bölümü yürütüyor, Birinci iş parçacığı zaten kritik bölümün dışında ve kritik bölümün
içinde.
T2, T3 ve T4 iş parçacığı çalışmaktadır ve bu noktada semafor sayacının değeri sıfırdır.
Ve bu noktada, bu sorun bildiriminin anlık görüntüsü göz önüne alındığında, izin sayacının değerinin
durumu haklı çıkardığını görebilirsiniz.
Kritik bölümün dışında bekleyen bir iş parçacığı yoktur ve kritik bölüm tam kapasitesiyle
yürütülmektedir.
Bu nedenle, semafor sayacının değeri sıfırdır.
Bir süre sonra, D2 iş parçacığı kritik bölümdeki işini bitirirse, kritik bölümden
çıkmaya çalışacak ve aynı gönderiyi yürütecektir.
Yani yine, izin sayacının değerini koşulsuz olarak artırın ve izin sayacının değeri
bir olacaktır.
Ve bu noktada aynı ağırlık API'sinde engellenen iki numaralı kurala göre herhangi bir tehdit olmadığından,
t2 iş parçacığı tarafından herhangi bir sinyal üretilmeyecek, böylece T2 iş parçacığı herhangi bir
sinyal üretmeden bu kritik bölümden çıkacak ve semafor sayacının değeri 0'dan
1'e yükselecektir.
Doğru.
Benzer şekilde, t üç tehdidinin yanı sıra t dört tehdidinin de kritik bölümdeki çalışmalarını tamamladığını
ve her ikisinin de örnekleri teker teker yürüttüğünü varsayalım.
Böylece n değeri 1'den 2'ye ve ardından 2'den 3'e artırılır.
Doğru.
Ve bu tehditlerin her ikisi de herhangi bir sinyal üretmeden kritik bölümden çıkacaktır çünkü
Samvit API'sinde engellenmiş durumda olan bir tehdit yoktur.
Doğru.
Böylece semafor sayaç değerinin orijinal değerine geri döndüğünü görebilirsiniz.
Bu üç.
Bu örnek sayesinde Semafor'un kritik bölümde en fazla n iş parçacığının çalışmasına izin verdiğini
görebilirsiniz.
Kritik bölümde üçten fazla iş parçacığının yürütülmesine asla izin vermedi.
Doğru.
Ve eğer bu örneği n bire eşit olduğu için çalıştırırsak, semaforumuzun mutex ile aynı şekilde çalıştığını göreceksiniz.
Değil mi?
Semaforumuz kritik bölümde en fazla bir iş parçacığının çalışmasına izin verecektir, ki aynı şeyin muteksler
kullanılarak da elde edildiğini zaten biliyoruz.
Ancak tek fark, semaforun farklı bir iş parçacığı tarafından blokajının kaldırılabilmesidir, oysa muteks bir iş parçacığı tarafından
kilitlendikten sonra aynı iş parçacığı tarafından kilidinin açılması gerekir.
T ama bu doğru değil.
Semaforlar söz konusu olduğunda, t one iş parçacığı sam wait api'sini çalıştırırsa, t one iş parçacığının sam post
api'sini çalıştırması gerekmez.
Sistemde başka bir iplik var mı?
Diyelim ki t iki iş parçacığı sam post api'yi çağırabilir.
Doğru.
İşte ikili semafor ve muteksler arasındaki fark budur.
Bu örnekte bile, kritik bölümde çalışan iş parçacıklarından herhangi biri işi bittiğinde
bu kritik bölümden çıkabilir ve aynı görevi çağırabilir.
Değil mi?
Bu da aynı görevin çağrılmasının belirsiz olduğu anlamına gelir.
İş parçacıklarının kritik bölümden hangi sırada çıktığına bağlı olarak herhangi bir sırada yürütülebilir.
Bu yüzden lütfen ikili semaforlar ve muteks arasındaki bu farka dikkat edin.
Şimdi semaforları kullanarak kısa bir program yazalım.