WEBVTT

00:00.770 --> 00:06.190
Evet arkadaşlar, şimdi semaforlarla çalışacağımız API'leri tartışacağız.

00:06.200 --> 00:12.470
Semaforlarla çalışmak için öncelikle H için başlık dosyasını dahil etmeniz ve semaforları

00:12.470 --> 00:16.520
kullanmak için bu beş API'yi kullanmamız gerekir.

00:16.640 --> 00:17.420
Değil mi?

00:17.940 --> 00:20.640
Yani API'ler kendi kendini açıklayıcı niteliktedir.

00:20.670 --> 00:24.920
Bir veri türü kullanarak bir semafor değişkeni bildirebileceğinizi görebilirsiniz.

00:24.930 --> 00:27.120
Sam Underscore T Right.

00:27.120 --> 00:32.700
Ve programınızda semafor üzerinde herhangi bir işlem yapmadan önce semaforu başlatmanız gerekir,

00:32.700 --> 00:33.480
değil mi?

00:33.600 --> 00:37.800
İlk argüman, başlattığınız semafor değişkeninin adresidir.

00:37.830 --> 00:45.150
İş parçacıklarının senkronizasyonu için semaforu kullanmak istiyorsanız ikinci argümanı her zaman sıfır olarak geçebilirsiniz.

00:45.240 --> 00:51.900
Süreçlerin senkronizasyonu için semaforu kullanmak istiyorsanız, buraya sıfır dışında herhangi

00:51.900 --> 00:54.090
bir değer geçmeniz gerekir.

00:54.090 --> 00:54.840
Değil mi?

00:54.990 --> 01:01.650
Bu dersin devamında iş parçacıkları yerine süreçleri senkronize etmek için semaforların nasıl kullanılacağını

01:01.650 --> 01:03.510
göreceğiz.

01:03.540 --> 01:04.290
Doğru.

01:05.020 --> 01:10.450
Bu nedenle, Sigma Force'un aynı makinede çalışan birden fazla iş parçacığının senkronizasyonu için de kullanılabileceğini

01:10.450 --> 01:17.710
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.

01:17.710 --> 01:24.190
Üçüncü bağımsız değişken ise semaforu başlattığınız ilk izin numarası veya izin sayacı

01:24.190 --> 01:25.180
değeridir.

01:25.210 --> 01:25.930
Değil mi?

01:25.930 --> 01:28.510
Yani bu pozitif bir değer olmalıdır.

01:28.870 --> 01:33.100
Ve sonra aynı await ve semafor API'lerini zaten tartışmıştık.

01:33.130 --> 01:37.300
Semaforun tüm işlevselliği bu iki API'ye dayanır.

01:37.300 --> 01:39.370
Bu Sam Wait ve Sam Post.

01:39.370 --> 01:40.120
Değil mi?

01:40.480 --> 01:46.570
Ve programımızda semaforu kullanmayı bitirdiğimizde, bu API'yi kullanarak semaforu yok

01:46.570 --> 01:47.440
edebiliriz.

01:47.470 --> 01:48.220
Değil mi?

01:49.000 --> 01:55.510
Kısa bir süre sonra semaforları kullanan bir program yazarken bu beş API'nin tümünü kullanacağız.

01:57.910 --> 02:02.890
Şimdi bu iki API'yi kullanarak Semafor'un gerçekte nasıl çalıştığını anlamaya çalışalım.

02:02.890 --> 02:05.380
Yani Semafor Bekleme ve Semafor.

02:05.380 --> 02:06.130
Gönder.

02:06.790 --> 02:10.480
Bu iki API, semaforun tüm işlevselliğini oluşturur.

02:12.120 --> 02:17.490
Şimdi weight ve post API'lerinin bir semafor üzerinde nasıl çalıştığını anlayalım.

02:17.820 --> 02:22.500
Yani sağ taraftaki yeşil kutuyu bir kod parçası olarak görselleştirebilirsiniz.

02:22.500 --> 02:28.440
Ve yeşil kutunun içindeki bu küçük sarı kutu kritik bir bölüm, değil mi?

02:28.470 --> 02:34.230
Bir semafor değişkeni aldık ve onu n genel değeri ile başlattık.

02:34.230 --> 02:38.790
Örneğimiz için N değerinin üç olduğunu varsayalım, değil mi?

02:39.490 --> 02:45.730
Genel olarak, kritik bölümü SIM wait ve SIM post API'leri arasına sıkıştırarak semaforu

02:45.730 --> 02:47.080
kullanırız.

02:47.110 --> 02:47.830
Doğru.

02:47.830 --> 02:53.770
Diyagramda kritik bir bölümümüz olduğunu ve bu kritik bölümün semaforların wait ve post API'leri

02:53.770 --> 02:57.190
arasına sıkıştırıldığını görebilirsiniz.

02:58.540 --> 03:04.720
Semaforun değerini üç değeriyle başlattığımız için, niyetimiz kritik bölümde eşzamanlı

03:04.720 --> 03:11.140
olarak üçten fazla iş parçacığının çalışmaması gerektiği anlamına gelir.

03:11.140 --> 03:11.710
Doğru.

03:11.740 --> 03:17.920
Kritik bölüme girmesine ve bu bölümde çalışmasına izin verilen iş parçacığı sayısı en fazla üç olabilir.

03:17.950 --> 03:22.420
Bir olabilir, iki olabilir ya da üç olabilir ama üçten fazla olamaz.

03:22.450 --> 03:23.140
Doğru.

03:23.170 --> 03:25.360
Bu, semaforun işlevselliğidir.

03:26.190 --> 03:32.520
Şimdi süreçte üç iş parçacığımız olduğunu varsayalım, iş parçacığı, T1 iş parçacığı, T2 ve T3.

03:32.520 --> 03:33.270
Değil mi?

03:33.270 --> 03:37.230
Ve kritik bölümü uygulamaya doğru geliyorlar.

03:37.350 --> 03:38.150
Doğru.

03:38.160 --> 03:42.990
Böylece kritik bölüme girmeden önce aynı ağırlıkla karşılaştılar.

03:42.990 --> 03:48.060
Diyelim ki T1 iş parçacığı önce bazı ağırlıkları yürütüyor, değil mi?

03:48.060 --> 03:52.260
Böylece semaforun değeri 3'ten 2'ye düşecektir.

03:52.290 --> 03:59.580
Kural, iş parçacığı aynı ağırlığı yürütür yürütmez semaforun izin sayacının değerini koşulsuz olarak

03:59.580 --> 04:01.590
azaltacağını söyler.

04:01.620 --> 04:07.440
Yani burada semaforun değerini koşulsuz olarak 3'ten 2'ye düşürdük.

04:07.470 --> 04:08.340
Doğru.

04:08.340 --> 04:15.390
Ve izin, sayaç değeri sıfırdan küçük olmadığından, T1 iş parçacığının kritik bölüme girebileceği

04:15.390 --> 04:17.910
ve yürütebileceği anlamına gelir.

04:18.980 --> 04:23.510
Bundan sonra, iş parçacığının aynı ağırlığı yürüteceğini varsayalım.

04:23.630 --> 04:24.460
Değil mi?

04:24.470 --> 04:28.430
Böylece N değeri 2'den 1'e düşecektir.

04:28.430 --> 04:35.780
Ve N değeri hala sıfırdan büyük olduğu için, T2 tehdidi de kritik bölümde çalışacak

04:35.780 --> 04:37.880
bir yol bulacaktır.

04:38.030 --> 04:45.170
Benzer şekilde, T3 tehdidi izin sayacının değerini 1'den 0'a düşürecek ve T3 tehdidi de kritik

04:45.170 --> 04:48.260
bölüme girip yürütme yapabilecektir.

04:48.290 --> 04:52.520
Dolayısıyla, bu noktada semaforun değeri sıfıra düşürülmüştür.

04:55.080 --> 04:56.340
Şimdi bir süreliğine.

04:56.340 --> 05:01.170
T1, T2 ve T3 iş parçacığı kritik bölümde çalışmaya devam ederse.

05:01.170 --> 05:08.280
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.

05:08.310 --> 05:09.060
Doğru.

05:09.060 --> 05:13.890
Böylece semafor sayacının değerini 0'dan -1'e düşürecektir.

05:14.040 --> 05:14.880
Doğru.

05:14.880 --> 05:21.600
Ve ikinci kural, izin sayacı değerinin sıfırdan daha aza düşmesi durumunda, çağıran iş parçacığının engelleneceğini

05:21.600 --> 05:23.430
söylediğinden.

05:23.580 --> 05:28.260
Yani burada çağıran iş parçacığı T4'tür, bu nedenle T4 iş parçacığı engellenmiştir.

05:29.480 --> 05:30.170
Doğru.

05:30.350 --> 05:34.760
Ve bu noktada, semafor sayacının değeri eksi birdir.

05:35.610 --> 05:39.040
Sam Weight API bu şekilde çalışır.

05:39.060 --> 05:42.130
Şimdi Sam post API'nin nasıl çalıştığını tartışalım.

05:42.150 --> 05:48.960
Ş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

05:48.960 --> 05:50.710
olduğunu varsayalım.

05:50.730 --> 05:56.040
Dolayısıyla kritik bölümden çıkmadan önce t1 iş parçacığının API'yi çalıştırması gerekir.

05:56.070 --> 05:57.120
Sam postası.

05:57.150 --> 05:57.970
Doğru.

05:57.990 --> 06:04.050
Yani ilk kural, semaforun izin sayacının değerinin koşulsuz olarak artırılacağını söyler.

06:04.200 --> 06:07.380
Bu, n değerinin sıfır olacağı anlamına gelir.

06:07.590 --> 06:08.400
Değil mi?

06:10.100 --> 06:15.830
İkinci kural ise aynı ağırlıkta bloke edilen iş parçacıklarına sinyal gönderir.

06:16.310 --> 06:18.020
Eğer varsa.

06:18.020 --> 06:18.790
Doğru.

06:18.800 --> 06:22.910
Dolayısıyla, aynı ağırlık API'sinde engellenen iş parçacığı vardır.

06:22.940 --> 06:26.710
Bu nedenle t bir iş parçacığı bir sinyal üretecektir.

06:26.720 --> 06:27.500
Doğru.

06:27.500 --> 06:29.180
Böylece bir sinyal üretecektir.

06:29.180 --> 06:36.320
Diyelim ki sinyal üretildi ve iplik t bu kritik bölümden çıkabildi.

06:36.930 --> 06:37.560
Doğru.

06:37.680 --> 06:46.070
Bu sinyal, işletim sistemi tarafından semafor üzerinde engellenmiş durumda olan herhangi bir iş parçacığına iletilecektir.

06:46.080 --> 06:46.970
Doğru.

06:46.980 --> 06:55.650
Ve sinyal iş parçacığı için iş parçacığına iletilir iletilmez, T4 API'leri tekrar çalıştıracak ve bekleyecektir.

06:56.040 --> 06:56.820
Doğru.

06:57.640 --> 07:04.150
Tehdit, T4 bu sinyali tüketecek ve kritik bölüme giriş yapacaktır.

07:04.270 --> 07:04.970
Doğru.

07:04.990 --> 07:11.500
Sandviç üzerinde zaten engellenmiş olan tehdit, izin sayacına dokunmadan sinyali

07:11.500 --> 07:15.720
aldığında, o iş parçacığı kritik bölüme girer.

07:15.730 --> 07:19.540
Semafor sayacının değeri sıfır olarak kalır.

07:19.690 --> 07:20.440
Doğru.

07:21.700 --> 07:24.030
Yani şu anda elimizde bir konu başlığı yok.

07:24.250 --> 07:30.580
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

07:30.580 --> 07:31.480
içinde.

07:31.480 --> 07:38.740
T2, T3 ve T4 iş parçacığı çalışmaktadır ve bu noktada semafor sayacının değeri sıfırdır.

07:38.740 --> 07:45.160
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

07:45.160 --> 07:48.010
durumu haklı çıkardığını görebilirsiniz.

07:48.400 --> 07:54.610
Kritik bölümün dışında bekleyen bir iş parçacığı yoktur ve kritik bölüm tam kapasitesiyle

07:54.610 --> 07:57.130
yürütülmektedir.

07:57.130 --> 08:00.220
Bu nedenle, semafor sayacının değeri sıfırdır.

08:01.310 --> 08:07.880
Bir süre sonra, D2 iş parçacığı kritik bölümdeki işini bitirirse, kritik bölümden

08:07.880 --> 08:12.200
çıkmaya çalışacak ve aynı gönderiyi yürütecektir.

08:12.200 --> 08:18.080
Yani yine, izin sayacının değerini koşulsuz olarak artırın ve izin sayacının değeri

08:18.080 --> 08:19.160
bir olacaktır.

08:19.160 --> 08:25.850
Ve bu noktada aynı ağırlık API'sinde engellenen iki numaralı kurala göre herhangi bir tehdit olmadığından,

08:25.850 --> 08:32.390
t2 iş parçacığı tarafından herhangi bir sinyal üretilmeyecek, böylece T2 iş parçacığı herhangi bir

08:32.390 --> 08:37.460
sinyal üretmeden bu kritik bölümden çıkacak ve semafor sayacının değeri 0'dan

08:37.460 --> 08:39.530
1'e yükselecektir.

08:40.350 --> 08:41.000
Doğru.

08:41.400 --> 08:47.910
Benzer şekilde, t üç tehdidinin yanı sıra t dört tehdidinin de kritik bölümdeki çalışmalarını tamamladığını

08:47.910 --> 08:52.940
ve her ikisinin de örnekleri teker teker yürüttüğünü varsayalım.

08:52.950 --> 08:58.950
Böylece n değeri 1'den 2'ye ve ardından 2'den 3'e artırılır.

08:59.040 --> 08:59.820
Doğru.

08:59.820 --> 09:06.900
Ve bu tehditlerin her ikisi de herhangi bir sinyal üretmeden kritik bölümden çıkacaktır çünkü

09:06.900 --> 09:11.790
Samvit API'sinde engellenmiş durumda olan bir tehdit yoktur.

09:12.030 --> 09:12.840
Doğru.

09:14.900 --> 09:19.430
Böylece semafor sayaç değerinin orijinal değerine geri döndüğünü görebilirsiniz.

09:19.430 --> 09:20.420
Bu üç.

09:20.720 --> 09:26.450
Bu örnek sayesinde Semafor'un kritik bölümde en fazla n iş parçacığının çalışmasına izin verdiğini

09:26.450 --> 09:27.590
görebilirsiniz.

09:27.590 --> 09:32.720
Kritik bölümde üçten fazla iş parçacığının yürütülmesine asla izin vermedi.

09:32.720 --> 09:33.530
Doğru.

09:33.530 --> 09:42.890
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.

09:42.890 --> 09:43.700
Değil mi?

09:43.880 --> 09:50.630
Semaforumuz kritik bölümde en fazla bir iş parçacığının çalışmasına izin verecektir, ki aynı şeyin muteksler

09:50.630 --> 09:54.530
kullanılarak da elde edildiğini zaten biliyoruz.

09:54.530 --> 10:02.090
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

10:02.120 --> 10:06.860
kilitlendikten sonra aynı iş parçacığı tarafından kilidinin açılması gerekir.

10:06.890 --> 10:08.750
T ama bu doğru değil.

10:08.750 --> 10:17.300
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

10:17.330 --> 10:19.940
api'sini çalıştırması gerekmez.

10:20.080 --> 10:21.980
Sistemde başka bir iplik var mı?

10:21.980 --> 10:26.150
Diyelim ki t iki iş parçacığı sam post api'yi çağırabilir.

10:26.360 --> 10:27.140
Doğru.

10:29.110 --> 10:33.240
İşte ikili semafor ve muteksler arasındaki fark budur.

10:33.250 --> 10:39.400
Bu örnekte bile, kritik bölümde çalışan iş parçacıklarından herhangi biri işi bittiğinde

10:39.400 --> 10:44.490
bu kritik bölümden çıkabilir ve aynı görevi çağırabilir.

10:44.500 --> 10:45.190
Değil mi?

10:45.190 --> 10:50.200
Bu da aynı görevin çağrılmasının belirsiz olduğu anlamına gelir.

10:50.230 --> 10:57.790
İş 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.

10:58.810 --> 11:03.430
Bu yüzden lütfen ikili semaforlar ve muteks arasındaki bu farka dikkat edin.

11:04.260 --> 11:07.770
Şimdi semaforları kullanarak kısa bir program yazalım.
