tasarladı. Wheeler'ın seçicisi, sabit bir durum sokulduğunda bunu saptayıp özel bir çıktı hazırlayan ek bir eşlik devresi içerir. Tasarıya göre, eşlik eden devreler bir seçme olayının baş- latılmasından hemen sonra saati dur- durur; özel bir çıktının seçmenin ger- çekleştirildiği bildirmesiyle seçme dev- resi saati yeniden çalıştırır. Bu durum- da seçme başarısızlığı mümkün değil- dir. Ancak bunun da riski vardır: Özel çıktının hazırlanmasının ne kadar za- man alacağı önceden kestirilemez. Bu çıktının hazırlanıp saatin tekrar çalış- tırılmaya başlaması normalde çok az bir zaman alır. Ancak, birkaç kara- rın alınması bazı sistemlerin kaldırma gücünü aşacak kadar uzun gelebilir. Seitz, ayrıca saati bulunmayan, kendinden zamanlamalı devreler adı verilen bir devre türünü de betimler. Kendinden zamanlamalı devrelerin elemanları taleplerin ve kabul edilmiş sinyallerin alınıp verilmesiyle birbiri- ni harekete geçirir: Her eleman ancak önceki talebin alınmasından sonra ye- ni bir talep öne sürer. Bunlar iç bağ- lantı adını alan ve Weeler'ın devresi- ne benzeyen eleman seçme işinde kul- lanılır. İç bağlantı bir karar verince- ye dek beklemek zorundadır. Eleman- lar arası sinyal alışverişinde saatli dev- relerden daha fazla enerji harcandı- ğından kedinden zamanlamalı devre- ler yüksek performanslı bilgisayar için pek elverişli değildir. Ancak daha em- niyetli oluşları, paralel bilgisayarlar- da kullanımlarını gitgide daha çekici kılmaktadır. Seçiciler ve iç bağlantı- lar aynı zamanda “karşılıklı dışlama”' devreleri adını da alırlar. Saatle ölçül- meyen girdilerle iç saatin eşleştirilme- sinde kullanılan devrelere örnektirler. Girdilerin saatle aynı anda değişme- sini idare edebilmek için eşleştiriciler- de seçicilerin bulunması gerekir. Bu nedenle, seçme başarısızlığı aynı za- manda eşleştirme başarısızlığı adını da alır. Seçme başarısızlığının, yazılım değil donanım tasarımcılarının kavraması ve çözümlenmesi gereken bir sorun olduğu sanılabilir. Bunun gerçekle hiçbir ilişkisi yoktur. Ortak datadan paralel işlerde yararlanacağında, paralel bilgisayar programlayıcıları sürekli olarak seçme başarısızlıklarına çözüm bulma sorunuyla karşı karşıyadır. Findhoven Teknik Yüksek Okulu'- ndan Edsger Dijkstra 1965'te paralel işlemcilerin kontrol edilmesi için ya- pılan girişimlerin yol açtığı yazılım so- runlarını öngören bir çalışma yayım- ladı (Dijkstra 1985). O zamandan bu yana, bütünüyle bu konuya ilişkin ki- taplar yayımlanmıştır; bazı modern programlama dilleri de soruna ilişkin sentakslar içermektedir. Dijkstra sorunu şöyle dile getirir: Bir tek ortak belleğe bağlı N işlemci- den oluşan bir bilgisayarı alın. Her iş- lemci kendi programını yürütür. Her program, tüm işlemcilerin ulaşabildiği detayı inceleyen ve değiştiren bir kod bölümü içerir. İki işlemcinin ortak de- taya aynı anda varmasını önlemek ge- rekir, yoksa birbirlerine karışarak tu- tarsız sonuçlar çıkarırlar. Demek ki, öyle giriş (enter) çıkış (exit) protokol- leri geliştirmek gerekiyor ki, işlemci- lerin çalışma hızı sağlayacak analitik hızı ne olursa olsun, programların önemli kod bölümlerinin belleğe ay- nı anda ulaşmaları önlenebilsin ve çı- kış protokollerinin aynı olması ve hangi işlemcilerin bunları kullanaca- ğina dair hiçbir bilgi içermemeleri ge- rekir. Basit bir örnek Dijkstra'nın önle- / meye çalıştığı soruna açıklık getirecek. Ticari bankalarda, otomatik vezne makinası programlarında fonları he- saptan hesaba aktaran vezne makinası programlarında, fonları hesaba akta- ran bir altprogram bulunur. X liranın A hesabından B hesabına aktarılma- sı “A-AX; B-B1X” program cümleleriyle ifade edilebilir. Uygula- ma aşamasında A 4 B toplamı oldu- ğu gibi korunarak, hesapların duru- munun (A -4 B)'den (A-X, B1t X)e çevrilmesi beklenir. Şimdi, ben A'dan B'ye 1000 liralık bir transfer yapar- ken, karımın da (başka bir vezne ma- kinasında) B'den A'ya 400 lira trans- fer ettiğini varsayalım. İşlemlerimizi hangi sırayla yaparsak yapalım, he- saplarımızın sonuçta alacağı durum (A-600,B * 600) olacaktır. Ancak iki işlemcimizin bu ifadeler için makina kodunu aynı anda uygulanabileceği- ni düşünürsek o zaman şunlar olabi- lir: Benim işlemcimin A-1000 yazma- sından sonra, B 4 1000 yazmasından ise önce, karımın işlemcisi devreye gi- rerse ne olacak? A hesabına -4--400 eklenecek ve hesap, A-1000-4- 400 4 A- 600 olacaktır. B'de ise yalnızca karı- mın yaptığı transfer kaydedilecek, ya- ni B-400 durumunda kalacaktır. De- mek ki, sorun şöyle de ifade edilebi- lir: Detayı inceleyen ve değiştiren kod kısmının bölünemez olması gerekiyor. Bu sorunu çözümlerken bellek dona- nımının, bir defada yanlız bir işlem- cinin belleğe ulaşmasına fırsat veren seçiciler içermesinden yararlanır. Programlayıcı açısından bu, sayısal değişkenlerin yazılma ve okunmasının bölünemez bir işlem olduğu anlamı- na gelir. Dijkstra, ortak sayısal değiş- kenleri işlemciler arasında sinyal ola- rak kullanan, GİRİŞ(ENTER) ve ÇI- KIŞ(EXIT), iki programın nasıl yazı- labileceğini göstermiştir. Bu program- ların, içerdikleri tüm analitik kısım- ların birbirlerini karşılıklı olarak dış- lamasını garanti ettikleri kesinlikle ka- nıtlanmıştır. Ayrıca bu çözümün an- lamsız olmadığını, çünkü bir işlemci- nin belli bir analitik kısmı serbest bı- rakmasından sonraki sınırlı süre için- de bir başkasını GİRİŞ işlemini ta- mamlayacağını göstermiştir. Dijkstra'nın programları karmaşık ve anlaşılması güçtü. Ancak, bu prog- ramların çözümlediği seçme sorunla- rının ciddiyeti kolayca anlaşılabiliyor- 25