Okullar için Robotik ve Mühendislik · anaokulundan liseye

Bölüm 9 · Yazılımın içi · Ders 44

Kilitlenme ve yarış durumu

İki iş parçacığı, iki kilit: program neden bazen durur ya da yanlış sayar?

Veri. Robotta iki iş parçacığı aynı anda çalışıyor: motor sürücüsü (M) ve sensör okuyucusu (S). İkisi de ortak bir komut sayacını artırıyor ve ikisi de iki paylaşılan kaynağa dokunuyor: A = motor veri yolu, B = sensör tamponu. Hangi iş parçacığının ne zaman çalışacağına işletim sistemi karar verir; biz bu araya girme sırasını bir tohumla canlandırıyoruz.

M önce A’yı, S önce B’yi kilitler: ters sırakilitlenme (ters sıra) · tohum 7
1 / 23
kilitlenme.pypython
  1. import numpy as np
  2. rng = np.random.default_rng(3) # araya girme sırası
  3. def prog(a, b): # önce a, sonra b kilidi
  4. body = [("lock", a), ("lock", b), ("read",), ("write",)]
  5. return (body + [("unlock", b), ("unlock", a)]) * 3
  6. th = {"M": prog("A", "B"), "S": prog("B", "A")} # ters sıra!
  7. pc, owner, reg, counter = {"M": 0, "S": 0}, {}, {}, 0
  8. def ready(t): # çalışabilir mi?
  9. if pc[t] == len(th[t]): return False
  10. op = th[t][pc[t]]
  11. return op[0] != "lock" or owner.get(op[1]) in (None, t) # kilit boşsa
  12. while run := [t for t in th if ready(t)]:
  13. t = run[rng.integers(len(run))] # zamanlayıcı seçer
  14. op = th[t][pc[t]]; pc[t] += 1
  15. if op[0] == "lock": owner[op[1]] = t
  16. if op[0] == "unlock": del owner[op[1]]
  17. if op[0] == "read": reg[t] = counter # oku
  18. if op[0] == "write": counter = reg[t] + 1 # yaz
  19. if all(pc[t] == len(th[t]) for t in th):
  20. print("bitti, sayaç", counter)
  21. else:
  22. print("KİLİTLENME:", owner, "sayaç", counter) # herkes bekliyor

Sahnedeki her sayı, aynı algoritmanın tarayıcında yapılan gerçek çalıştırmasından gelir (sabit tohum, her seferinde aynı sonuç). Python kodunu kendi bilgisayarında çalıştırırsan rastgele başlangıçlar farklı olacağı için sayılar biraz değişebilir.

Bu dersin kodu verisini kendi içinde üretir; indirilecek dosya yok. Kodu yine de aşağıda tarayıcında çalıştırabilirsin.

Kodu tarayıcıda çalıştırPython · NumPy · matplotlib · Pyodide

Python ve NumPy bu sayfada, tarayıcında çalışır (Pyodide). Kodu değiştirip yeniden çalıştırabilirsin; dersin veri setleri çalışma klasöründe hazır. Kod matplotlib kullanırsa grafikler çıktının altında görünür, yazdığı dosyalar (ör. egitim_gecmisi.csv) indirilebilir.

kilitlenme.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. Yarış: 'sayaç += 1' aslında iki adımdır: oku, sonra yaz. İkisi de 3 okur, ikisi de 4 yazar: bir artırma kaybolur. Hata yalnız bazı araya girme sıralarında olur; bu yüzden 'rastgele' bozulur.
  2. Kilitlenme: M önce A'yı, S önce B'yi alır. Sonra M B'yi, S A'yı bekler. Bekleme grafiğinde döngü oluşur (M → B → S → A → M): hata yok, istisna yok, program yalnızca ilerlemez.
  3. Düzeltme: herkes kilitleri aynı sırayla alır (önce A, sonra B); döngü oluşamaz. Sayaç için ise kilit ya da atomik işlem (tek adımda oku-artır-yaz) kullanılır.
  4. Şunu dene: senaryo 1’de tohumu değiştir; bazı tohumlarda iş biter, yaklaşık yarısında kilitlenir. Senaryo 0’da da bazı tohumlar 10’u bulur, bazıları bulamaz. Senaryo 2’de hiçbir tohum kilitlenmez ve sayaç her zaman 6’dır.

Neden önemli

Robot yazılımı doğası gereği eşzamanlıdır: ROS 2'nin çok iş parçacıklı yürütücüsü, sürücü iş parçacıkları, kesme (interrupt) işleyicileri ve RTOS görevleri. Bu hatalar testte nadiren görünür, sahada bir gün robotu dondurur. Sabit kilit sırası, kilitleri kısa tutmak, atomik sayaçlar ve kilitsiz kuyruklar en yaygın çözümlerdir.

ESOF 323, 11. hafta: robotlarda derin öğrenme →
Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç