Petersons algoritması - Petersons algorithm - Wikipedia

Peterson algoritması (veya Peterson çözümü) bir eşzamanlı programlama algoritma için Karşılıklı dışlama bu, iki veya daha fazla işlemin tek kullanımlık bir kaynağı çakışma olmadan paylaşmasına, yalnızca paylaşılan belleği kullanarak iletişim. Tarafından formüle edilmiştir Gary L. Peterson 1981'de.[1] Peterson'un orijinal formülasyonu yalnızca iki işlemle çalışırken, algoritma ikiden fazlası için genelleştirilebilir.[2]

Algoritma

Algoritma iki değişken kullanır, bayrak ve dönüş. Bir bayrak [n] değeri doğru işlemin n girmek istiyor kritik Bölüm. Kritik bölüme giriş, P1 kritik bölümüne girmek istemiyorsa veya P1 ayarlayarak P0'a öncelik verdiyse, P0 işlemi için verilir. dönüş -e 0.

Peterson Algoritması
bool bayrak[2] = {yanlış, yanlış};int dönüş;
P0:      bayrak[0] = doğru;P0_gate: dönüş = 1;         süre (bayrak[1] == doğru && dönüş == 1)         {             // meşgul bekle         }         // kritik Bölüm         ...         // kritik bölümün sonu         bayrak[0] = yanlış;
P1:      bayrak[1] = doğru;P1_gate: dönüş = 0;         süre (bayrak[0] == doğru && dönüş == 0)         {             // meşgul bekle         }         // kritik Bölüm         ...         // kritik bölümün sonu         bayrak[1] = yanlış;

Algoritma, değişkenlerde değişiklik olması koşuluyla kritik bölüm problemini çözmek için üç temel kriteri karşılar. dönüş, bayrak [0], ve bayrak [1] anında ve atomik olarak yayılır. While koşulu, ön ödeme ile bile çalışır.[1]

Üç kriter karşılıklı dışlama, ilerleme ve sınırlı beklemedir.[3]

Dan beri dönüş iki değerden birini alabilir, tek bir bit ile değiştirilebilir, yani algoritma yalnızca üç bit bellek gerektirir.[4]:22

Karşılıklı dışlama

P0 ve P1 asla aynı anda kritik bölümde olamaz: P0 kritik bölümündeyse, o zaman bayrak [0] doğru. Ek olarak bayrak [1] dır-dir yanlış (P1'in kritik bölümünden ayrıldığı anlamına gelir) veya dönüş dır-dir 0 (P1 şu anda kritik bölüme girmeye çalışıyor, ancak nezaketle bekliyor) veya P1 etikette P1_gate (ayarladıktan sonra kritik bölümüne girmeye çalışıyor bayrak [1] -e doğru ama ayarlamadan önce dönüş -e 0 ve meşgul bekliyor). Dolayısıyla, her iki süreç de kritik bölümlerindeyse, devletin tatmin etmesi gerektiği sonucuna varırız. bayrak [0] ve bayrak [1] ve turn = 0 ve turn = 1. Hiçbir devlet ikisini birden tatmin edemez turn = 0 ve turn = 1, bu nedenle her iki sürecin de kritik bölümlerinde olduğu bir durum olamaz. (Bu, içinde titizlikle yapılan bir argümanı anlatır.[5])

İlerleme

İlerleme şu şekilde tanımlanır: Kritik bölümünde herhangi bir işlem yürütülmüyorsa ve bazı süreçler kritik bölümlerine girmek istiyorsa, yalnızca kalan bölümlerinde yürütülmeyen işlemler hangi sürecin gireceğine karar vermeye katılabilir. sonraki kritik bölümü. Bir işlem veya iş parçacığı için kalan bölümlerin kodun kritik bölümle ilgili olmayan parçaları olduğunu unutmayın. Bu seçim süresiz olarak ertelenemez.[3] Diğer süreç, kritik bölümüne girmek istediğini söyleyecek şekilde bayrağını ayarladıysa, süreç kritik bölüme hemen yeniden giremez.

Sınırlı bekleme

Sınırlı bekleme veya sınırlı baypas , bir işlemin kritik bölüme girme isteğini gösterdikten sonra başka bir işlem tarafından kaç kez atlandığı, sistemdeki işlem sayısının bir işlevi ile sınırlandırıldığı anlamına gelir.[3][4]:11 Peterson'un algoritmasında, bir süreç kritik bölüme giriş için asla bir turdan fazla beklemez.

Filtre algoritması: Peterson'un ikiden fazla süreç için algoritması

Filtre algoritması Peterson'un algoritmasını genelleştirir. N > 2 süreçler.[6] Bir Boole bayrağı yerine, işlem başına tek bir yazıcı / çoklu okuyucu (SWMR) atomikinde depolanan bir tamsayı değişkeni gerektirir. Kayıt ol, ve N−1 benzer kayıtlarda ek değişkenler. Kayıtlar şu şekilde temsil edilebilir: sözde kod gibi diziler:

düzey: N tamsayı dizisi son_to_enter: N − 1 tamsayı dizisi

seviye değişkenler en fazla değerleri alır N−1her biri kritik bölümden önce ayrı bir "bekleme odasını" temsil ediyor.[6] Süreçler bir odadan diğerine ilerler ve odada biter N−1 kritik bölüm hangisidir. Özellikle, bir kilit elde etmek için işlem ben yürütür[4]:22

i ← İşlemHayıriçinitibaren 0 -e N − 1 özel    seviye [i] ← ℓ last_to_enter [ℓ] ← i süre last_to_enter [ℓ] = i ve k ≠ i vardır, öyle ki [k] seviyesi ≥ ℓ Bekle

Kritik bölümden çıktıktan sonra kilidi açmak için, ben setleri seviye [i] -1.

Bu algoritmanın karşılıklı dışlamaya ulaştığı şu şekilde kanıtlanabilir. İşlem ben daha yüksek seviyeli bir işlem olmadığında iç döngüden çıkar seviye [i], böylece bir sonraki bekleme odası ücretsizdir; ya da ne zaman i ≠ last_to_enter [ℓ], böylece bekleme odasına başka bir süreç katıldı. Sıfır seviyesinde, o zaman, hepsi olsa bile N süreçler aynı anda bekleme odasına sıfır girecekti, en fazla N−1 bir sonraki odaya geçecek, son odaya giren son odaya girecek. Benzer şekilde, bir sonraki seviyede, N−2 devam edecek vb. son aşamaya kadar, sadece bir işlemin bekleme odasından çıkmasına ve kritik bölüme girmesine izin verilir ve karşılıklı dışlama sağlanır.[4]:22–24

Algoritmanın açlıktan yoksun olduğu da gösterilebilir, bu da döngüye giren tüm işlemlerin sonunda ondan çıktığı anlamına gelir (süresiz olarak kritik bölümde kalmadıkları varsayılarak). İspat, N−1 aşağı doğru. Bir süreç N−1 kritik bölümdedir ve varsayım gereği ondan çıkacaktır. Tüm alt seviyelerde bir süreç için imkansız ben her iki süreçten beri sonsuza kadar beklemek j bekleme odasına girecek, ayar last_to_enter [ℓ] ← j ve "özgürleştiren" ben; ya da bu asla olmaz ama sonra tüm süreçler j Bekleme odalarında bulunanlar da daha yüksek seviyelerde olmalı ve tümevarım hipotezine göre, sonunda döngüyü bitirecekler ve seviyelerini sıfırlayacaklar, böylece herkes için kben, seviye [k] <ℓ ve ben döngüden tekrar çıkar.[4]:24–25

Açlık özgürlüğü aslında en yüksek canlılık algoritmanın verdiği garanti; İki işlemli Peterson algoritmasının aksine, filtre algoritması sınırlı beklemeyi garanti etmez.[4]:25–26

Not

Çalışırken donanım düzeyine göre, Peterson'ın algoritması atomik erişim sağlamak için tipik olarak gerekli değildir. Bazı işlemcilerin özel talimatları vardır, örneğin test et ve ayarla veya karşılaştır ve değiştir, bellek veriyolunu kilitleyerek, içinde karşılıklı dışlama sağlamak için kullanılabilir. SMP sistemleri.

Çoğu modern CPU, yürütme verimliliğini artırmak için bellek erişimlerini yeniden sıralar (bkz. bellek sıralaması yeniden sıralama türleri için izin verilir). Bu tür işlemciler her zaman, tipik olarak bir bellek erişim akışında siparişi zorlamak için bir yol sağlar. hafıza engeli talimat. Peterson ve ilgili algoritmaların bellek erişimlerini yeniden düzenleyen işlemciler üzerinde uygulanması, genellikle bu tür işlemlerin doğru şekilde çalışarak sıralı işlemlerin yanlış bir sırada gerçekleşmesini engellemesini gerektirir. Bellek erişimlerinin yeniden sıralanmasının, talimatları yeniden sıralamayan işlemcilerde bile (örneğin, PowerPC işlemci Xbox 360 ).[kaynak belirtilmeli ]

Bu tür CPU'ların çoğunda bir çeşit garantili atomik operasyon, gibi XCHG açık x86 işlemciler ve load-link / store-conditional açık Alfa, MIPS, PowerPC ve diğer mimariler. Bu talimatların amacı, senkronizasyon ilkellerini saf paylaşılan bellek yaklaşımlarıyla yapılabilecek olandan daha verimli bir şekilde oluşturmak için bir yol sağlamaktır.

Ayrıca bakınız

Dipnotlar

  1. ^ a b G. L. Peterson: "Karşılıklı Dışlama Problemiyle İlgili Mitler", Bilgi İşlem Mektupları 12(3) 1981, 115–116
  2. ^ Tartışıldığı gibi İşletim Sistemleri İncelemesi, Ocak 1990 ("Karşılıklı Dışlama Algoritmasının Kanıtı", M Hofri).
  3. ^ a b c Silberschatz. İşletim Sistemleri Kavramları: Yedinci Baskı. John Wiley ve Sons, 2005., Sayfa 194
  4. ^ a b c d e f Raynal, Michel (2012). Eşzamanlı Programlama: Algoritmalar, İlkeler ve Temeller. Springer Science & Business Media. ISBN  3642320279.
  5. ^ F. B. Schneider. Eş Zamanlı Programlama Üzerine, Sringer Verlag, 1997, Sayfa 185–196
  6. ^ a b Herlihy, Maurice; Shavit, Nir (2012). Çok İşlemcili Programlama Sanatı. Elsevier. s. 28–31. ISBN  9780123977953.

Dış bağlantılar