Mars Keşif Aracı Pathfinder’daki İlginç Yazılım Problemi

Bu flood’da 1997 yılında Mars’a gönderilen ve kendini resetleyip duran Pathfinder adlı araştırma aracındaki yazılım problemini anlatacağım.

Öncelikle biraz altyapı: Gerçek zamanlı çalışan işletim sistemleri (Real Time OS) “Pre-emptive Priority Scheduling” adı verilen bir yöntemi kullanarak hangi prosesin CPU’yu kullanacağına karar verirler. Önceliği daha yüksek olan bir proses koşmak isterse ve o anda CPU’da önceliği düşük bir proses varsa işletim sistemi önceliği düşük olan prosesi CPU’dan alarak yüksek olan prosesi koşturmaya başlar çünkü gerçek zamanlı işletim sistemlerinde gecikme tahammülü olmayan kritik işlemlerin tam olarak istenen zamanda yapılması gerekliliği vardır.

Şimdi gelelim Mars’ta kendini resetleyen Pathfinder’a. Pathfinder’da koşan düşük öncelikli B prosesi X semaforunu alıp bazı işlemler yapmaya başlar fakat işini bitiremeden yüksek öncelikli A prosesi koşmak ister. CPU B’yi durdurup A’yı schedule eder ancak gelin görün ki A’nın da gerekli işlemi tutarlı yapabilmek için X semaforuna ihtiyacı vardır. A, X semaforunu almak ister ancak semafor B tarafından tutulmakta olduğu için alamaz. A prosesi işini yapamadığı için sürekli olarak koşmak ister fakat scheduler düşük öncelikli B’yi koşturamaz, B koşamadığı için de işini bitirip semaforu bırakamaz. Kritik A prosesinin uzun süredir çalışmadığını denetleyen watchdog timer ise belirli bir süre sonra Pathfinder’ın asıl işini yapamadığını düşünerek onu resetler. Sonunda Nasa’daki mühendisler sorunu uzaktan çözerler :-)

Sorunu çözerken kullandıkları yönteme gelelim şimdi. Semaforun bırakılması için B’yi koşturmaktan başka bir çare olmadığı için, B prosesini geçici olarak A’nın priority’sine çekerler. A prosesi, ayağa kalkıp ihtiyacı olan X semaforunun, önceliği düşük B prosesi tarafından tutulduğunu gördüğünde B prosesinin önceliği kendi seviyesine çıkarır. Aynı öncelik seviyesine sahip A ve B taskından B’ye CPU verilerek işini bitirip semaforu bırakması sağlanır, daha sonra önceliği orjinal haline çekilir. Bu yönteme de “Priority Inversion” adı verilir.