7 puan yazan GN⁺ 2023-08-14 | 1 yorum | WhatsApp'ta paylaş
  • You’re the OS, oyuncunun işletim sistemi rolünü üstlenerek CPU çekirdeklerini, süreçleri, bellek sayfalarını ve takas alanını yönettiği, kullanıcının sistemi yeniden başlatmasını engellemeye çalıştığı bir oyun
  • Temel akış, boşta bekleyen süreçleri CPU’ya atamak ve aktif süreçleri kaldırmak üzerine kurulu; uzun süre ihmal edilen süreçler starvation aşamalarından geçerek sonlandırılıyor
  • Zaman ilerledikçe süreç sayısı ve bellek baskısı artıyor; diskteki sayfaları RAM’e geri döndürme şeklindeki bellek takasını da doğrudan yönetmek gerekiyor
  • Uygulama Python/Pygame tabanlı; pygbag ile WebAssembly derlemesi oluşturularak tarayıcıda da çalıştırılabilir hâle getirilmiş
  • Kesin bir işletim sistemi simülasyonu olmasa da, varsayımlar açıkça belirtildiğinde süreç zamanlama ve RAM yetersizliği durumlarını anlatmak için kullanılabilir

İşletim sistemi olduğunuz bir oyun fikri

  • Oyun, oyuncunun bir işletim sistemi olup CPU çekirdeklerini, süreçleri, bellek sayfalarını ve takas alanını yönettiği fikrinden yola çıkıyor
  • Amaç, kullanıcının sistemin fazla yavaş olduğunu hissetmemesi için süreçlere CPU zamanı ayırmak ve gerektiğinde bellek sayfalarını takas etmek
  • Basit bir 2D oyuna uygun olması için tam bir oyun motoru yerine Pygame seçilmiş
    • Python’ı yeniden kullanmak istemek de seçim nedenlerinden biriymiş
    • Pygame, pygbag üzerinden WebAssembly’ye derlenebildiği için tarayıcıda çalıştırma açısından avantajlı
  • Geliştirme süresi, 8 aya yayılmış birkaç haftalık dağınık bir çalışma olmuş

Süreç zamanlama ve oyunun bitiş koşulları

  • Oyunun temel etkileşimi süreç ve CPU yönetimi
    • Boşta bekleyen bir sürece tıklayınca kullanılabilir bir CPU’ya atanıyor
    • Aktif bir sürece tıklayınca ilgili CPU’dan kaldırılıyor
  • Boşta bekleyen süreçler zamanla renk ve emojiyle gösterilen 6 aşamalı bir starvation düzeyinden geçiyor
    • Son aşamada çok uzun kalırsa kullanıcı o süreci sonlandırıyor
    • 10 süreç sonlandırılınca kullanıcı, işletim sistemi olan oyuncuyu yeniden başlatıyor ve oyun bitiyor
  • Uzun süre hayatta kalmak için her sürecin tüm starvation aşamalarından geçmeden önce yeterli CPU zamanı alması gerekiyor

I/O ve bellek takası

  • Aktif süreçler, I/O olayını beklerken blocked durumuna geçebiliyor
    • Blocked süreçler CPU zamanını boşa harcadığı için CPU’dan kaldırmak daha iyi
    • I/O olayları, olay gerçekleştiğinde şekli değişen bir düğmeye tıklanarak işleniyor
  • Zaman geçtikçe daha fazla süreç ortaya çıkıyor ve zorluk artıyor
  • Bir noktadan sonra tüm süreçlerin kullandığı bellek RAM’den fazla hâle geliyor ve RAM ile disk arasında sayfa takası gerekiyor
    • Aktif bir süreç diskteki bir sayfaya erişmeye çalışırsa süreç ve ilgili sayfa yanıp sönüyor
    • Bu işarete bakarak gerekli sayfayı takas etmek gerekiyor
  • Diskteki bir sayfayı bekleyen süreç, o sayfa RAM’e dönene kadar blocked durumda kalıyor
    • Blocked durumu çok uzun sürerse süreç starvation aşamalarından geçmeye devam edip sonunda sonlandırılabiliyor

Zorluk ve özel ayarlar

  • Oyunda birden çok zorluk seviyesi var
  • Zorluk; CPU sayısını, RAM kapasitesini, başlangıçta var olan süreç sayısını ve I/O olayı olasılığı gibi değerleri etkiliyor
  • Özel modda bu ayarlar ayrı ayrı değiştirilebiliyor

Eğitsel değer ve sınırlar

  • Bu oyun her şeyden önce bir oyun; gerçekçilikten çok oynanabilirlik öncelenerek tasarlanmış
  • Gerçek işletim sistemini birebir yansıtmayan yönleri var
    • Oyuncunun gerçek bir bilgisayar kadar hızlı tepki vermesi beklenmiyor
    • Süreçler, gerçek hayattaki tipik süreçlere göre çok daha az bellek sayfası kullanıyor
    • Kullanıcının sürekli sınırsız yeni süreç çalıştırdığı yapı, zorluğu artırmaya yönelik bir oyun mekaniği
  • Eğitim amacıyla yapılmış olmasa da, birebir doğru bir tasvir olmadığı açıkça belirtilirse işletim sistemi ilkelerini tanıtmak için değerli olabilir
    • Süreç zamanlama ve bellek takası için örnek olarak kullanılabilir
    • Daha fazla CPU çekirdeğine sahip olmanın ne anlama geldiğini ve RAM yetersiz olduğunda neler yaşandığını gösterebilir

WebAssembly derleme ve dağıtım

  • WebAssembly derlemesi, pygame-web belgeleri sayesinde beklenenden kolay olmuş
    • Ana adımlar pygbag kurulumu ve belgelerde belirtilen kod değişikliklerini uygulamak
  • En büyük sorun, emoji render etmek için kullanılan pygame-emojis kütüphanesinin pygbag ile birlikte çalışmamasıymış
    • Bunun yerine OpenMoji üzerinden SVG dosyaları indirilmiş
    • GIMP ile boyutları ayarlanıp PNG olarak dışa aktarılmış ve kullanılmış
  • Tarayıcı sürümü, temel olarak masaüstü sürümüyle aynı oranı koruyup tarayıcı viewport’una göre yeniden boyutlanıyor
    • Masaüstü sürümü daha küçük bir pencere boyutu kullanırsa ekran uzatılmış görünebilir
    • Oyun retro tarzda olduğu için pikselleşme ciddi rahatsızlık vermemiş
  • Oyun itch.io üzerinden tarayıcıda oynanabiliyor
  • Kaynak kod GitHub üzerinde yayımlanmış

1 yorum

 
GN⁺ 2023-08-14
Hacker News yorumları
  • Harika olabilecek bir fikir olarak aklıma birleştirme oyunu geliyor. Temelde dairesel yerleşimli bir Tetris; sık kullanılan veri bloklarını dıştaki izlere, eski dosyaları ya da arşiv dosyası türlerini içteki izlere gönderdikçe daha çok puan kazanıyorsun.
    Eskiden grafik arayüzlü birleştirme araçlarının sihirli gibi hareket etmesini izlemeyi severdim; bir birleştirme oyunu çıksa gerçekten denemek isterim.

    • Wilmot's Warehouse aslında tam da böyle bir oyun.
      Üstten bakışlı 2D bir oyun ve büyük, boş bir depoda tek başınasın. Belirli aralıklarla bir kamyon arkaya çeşitli eşyalar bırakıyor; öndeki tezgahta ise birkaç kişi belirli eşyalar istiyor. Yapman gereken, istekleri olabildiğince hızlı karşılayabilmek için depodaki eşyaları yerleştirmek. Renge, işleve, ada ya da sana uyan başka bir yönteme göre düzenleyebilirsin.
      Oyun ilerledikçe kamyon daha çeşitli eşyalar getiriyor; bunların çoğu genellikle birden fazla kategoriye giriyor ve istekler de giderek karmaşıklaşıyor. En sonda, tüm oyun boyunca deponun nasıl değiştiğini bir time-lapse olarak gösteriyor; böylece stratejinin zaman içinde nasıl evrildiğini görebiliyorsun.
      Oldukça iyi yapılmış ve sade. Aslında HN yorumlarında geliştiricilerinden biri sayesinde öğrendim.
    • https://defrag.lolalabs.com/
    • https://classic.csunplugged.org/activities/community-activit... de var; https://www.itgsnews.com/the-defragmentation-game-lesson-pla... da bakmaya değer.
      https://boardgamegeek.com/boardgame/376284/defrag
      https://www.defraggame.com
      Eskiden bunlardan daha doğrudan bir benzetim gibi olan birkaç eski oyun daha oynadığımı hatırlıyorum, ama başkası bulabilir mi bilmiyorum.
    • Elektronik ürünler yaparken PCB yönlendirme ve yerleşimi konusunda da benzer bir his almıştım.
    • Bahsi yükseltelim: oyundaki kurbanlık olarak gerçek bir sürücü kullandıralım.
  • Ender's Game gibi, en üst düzey oyuncuların farkında olmadan bir yerlerdeki kritik altyapının belleğini ayırdığını hayal etmek güzel olurdu.

    • Severance havası var.
    • “Kaydınızı tamamlamak için bu görselde dur levhası olup olmadığını söyleyin. Lütfen acele edin, otonom aracımızın buna ihtiyacı var.”
      https://xkcd.com/1897/
  • Bu web sitesini yarım cümle okur okumaz tamamen ikna oldum.
    Böyle bir problemi anlamanın en iyi yollarından biri bu. “Artık bellek yöneticisi sensin. Bol şans.”
    Fikir gerçekten çok iyi. Sevimli bir görsellikle restoran işletme simülasyonu gibi de yapılabilir bence. Yalnız restoran bilgisayar, müşteriler de kaynaklar olur.
    Human Resource Machine de bu açıdan harikaydı. Bir noktada “Dur, az önce ben bir bağlı liste mi yaptım?” diye düşündüğümü hatırlıyorum.

    • Human Resource Machine gerçekten çok iyi. Eşim o oyunu ve devam oyununu bitirdikten sonra kariyerini kodlamaya çevirmeye kadar gitti.
  • Aslında insan hayatının bir tür işletim sistemine yakın olduğunu düşünüyorum. Her gün görevler, kaynaklar, girdi/çıktı, depolama, önbellek ve durumla uğraşarak yaşıyoruz.
    Gösterge paneli işletim sisteminin vazgeçilmez aracıdır; insan ölçeğinde bunun karşılığı banka, yapılacaklar listesi, takvim, gelen kutusu gibi şeylerdir. Bu yüzden pek çok “kişisel gelişim” kavramı, işletim sistemlerinin en iyi uygulamalarına temiz biçimde çevrilebilir. Örneğin tahsis yönetimi için FIFO veya LIFO, kilitlenmeleri kırmak için önceden planlama, paralelliği yönetme, tam zamanında çöp toplama gibi.

    • Önerdiğim kitap Algorithms to Live By biraz aklıma geliyor.
      [0] https://algorithmstoliveby.com/
    • İnsanlar beyni teknolojiye benzetmeyi sıkça sever.
      Örneğin dişlilerin ileri teknoloji olduğu zamanlarda, düşünme eylemini dişlilerin hareketine benzeterek kafasının içinde dişlilerin döndüğünü hayal eden insanlar vardı. Çizgi filmler gibi yerlerde bu ifadeyi hâlâ ara sıra görüyoruz sanırım.
    • İşletim sistemi dediğimiz şeye daha yakın olan şey otonom sinir sistemi olabilir. Islak donanımın düşük seviyeli işleyişini soyutluyor.
      https://en.m.wikipedia.org/wiki/Autonomic_nervous_system
    • Medeniyet dağıtık bir işletim sistemidir! Joscha Bach'tan duydum.
    • Mastürbasyona denk gelen işletim sistemi benzetmesi ne olurdu? Önbelleği boşaltmak mı?
  • Bu arada bu, 30 Eylül'de HN'ye konmuştu ama hiç ilgi görmedi; paylaşan kişi de kendi yorumunu sildi.
    O zaman da yazmıştım: gerçekten iyi bir konsept. Seviyeler eklenirse güzel olur. Örneğin ilginç bir ürünün içindeki mikrodenetleyici, akıllı telefon, bir SaaS şirketinin yük dengeleyicisi ya da API sunucusu gibi seviyelere ayrılırsa kavramlar tek tek tanıtılabilir. Böylece üniversite düzeyinde bir işletim sistemleri dersine dönüşür.
    Otomasyon için biraz programlama eklenip işletim sistemi önbellek algoritmalarına kadar derine inilse iyi olur. LRU iyidir. Liseden mezun olmadan önce bitirebilmiş olmayı isteyeceğim türden bir ders olurdu.
    https://news.ycombinator.com/item?id=36938032

  • Harika bir fikir ama benim için fazla zor. Normal modda bile oyun başladıktan 20 saniye sonra çılgınca tıklamaya başlıyorum; takılmış süreçleri döngüye alsam da kırmızı süreçler birikiyor.
    Bazı süreçler, giriş/çıkış olayı bir türlü gelmediği için öldü. Kolay mod da aynı gibi, hatta belki daha zor. Belleğin sorun olduğu noktaya bile gelemiyorum; bu hızda gelmek de istemem.
    Yaşlanmış olabilirim ve işletim sistemi olmanın stresli olduğunu anlıyorum ama işim zaten stresli. Bir iş daha istemiyorum.
    Başta kolay başlayıp giderek yükselen, ama konfor alanımın hemen dışında kalacak kadar daha hoşgörülü bir tempo olursa çok eğlenceli bir oyun olabilir.

    • Giriş/çıkış olayını beklerken bir türlü gelmeyip sürecin ölmesiyle aynı sorunu yaşadım. Ölen süreçlerin hepsi o durumda öldü. Bu olduğunda engellemenin bir yolu yok gibi görünüyor.
    • Bilgisayarlar, tekrar eden işleri korkmadan bizim yerimize yapsın diye var zaten :)
  • Bu tür oyunların güçlü bir geleceği var.
    Unity veya Unreal gibi oyun motorlarının sağlayabileceği kapsamın ötesinde yenilik yapan oyunlar, tasarım gereği günümüzde çıkanlara kıyasla başarı ihtimali daha yüksek bir yöne gidiyor.
    Motor kullanıcılarının dokunamayacağı kadar alanın dışında kalan aşırı inek işi oyunlar yaparsanız farklı bir ligde olursunuz. Oyun berbat görünse de eğlenceli ve kullanılabilir olması yeterli.
    Bağımsız oyun, 5 yıl önceki anlamıyla bağımsız oyun olarak öldü. Artık yeni bağımsız oyun bu. GG. Bu arada iki veya daha fazla ticari oyun çıkarmış başarısız bir bağımsız geliştiriciyim.
    Zachtronics'in durması üzücü. Onlar her zaman öndeydi.

    • Bir şeyi kaçırıyor olabilirim ama aynı tür oyunlar onlarca yıldır popülerliğini sürdürüyor gibi görünüyor. Bu oyunların başarı ihtimalinin daha düşük hale gelip gelmediğini de, “işletim sistemi sensin!”in daha başarılı olma ihtimalinin daha yüksek olup olmadığını da bilmiyorum.
      Ayrıca bu oyun Unity ile de yapılabilir gibi duruyor.
    • Bunun Unity veya Unreal ile yapılamaması için hiçbir neden yok. Hesaplama sınırları içinde o motorlarla kelimenin tam anlamıyla her şeyi yapabilirsiniz.
    • Bu oyun hangi açıdan Unity'nin sağlayabileceği kapsamın ötesine geçiyor?
    • “Başarı” ile ne kastedildiğine bağlı. Kâr etmek anlamındaysa muhtemelen hayır. Pazarın istediği şeye göre optimize edilmiş motorların desteklediği akıştan çok uzağa düşen oyunların, o akışın içindekilere göre daha sık başarısız olma olasılığı yüksek.
      “Beklenmedik bir sıçrama yapıp oyunların yönünü değiştiren bir hit olmak” anlamındaysa, iki tarafta da olasılık son derece düşük; ama kalıpların dışındaki bir oyunun bu olasılığı daha yüksek olabilir.
      Home run olasılığı daha yüksek, ama strike out olasılığı da daha yüksek; tek vuruşluk isabet yapma olasılığı daha düşük.
    • Ne demek istediğini pek anlamıyorum. İnek işi oyunlar her zaman vardı ve fazla inek işi oldukları için genellikle büyük başarı elde edemezler.
      Son yıllarda da birkaç teknik inek işi oyun vardı ama hit denebilecek bir şey yoktu. Muhtemelen kendi oyununu yapabilirsin, ama izleyici kitlesi doğası gereği küçük olduğundan başarının üst sınırı da sınırlı. Bunun ileride değişeceğini de sanmıyorum.
      Hatta tersinin olması daha olası. Genç nesiller daha az inekleşiyor ve düşük seviye konularla teknolojilerden daha da uzaklaşıyor gibi.
  • Oyun yüksek kullanım oranlarında zorlaştıkça, dönüm noktalarına veya performans hedeflerine ulaşarak kazanılan token'larla küçük tekrar eden işleri otomatikleştiren yükseltmeleri “satın” alabilmek gerekir. Universal Paperclips gibi.
    Sonra basit otomasyonu bozan patolojik iş yükleri atılır ve kullanıcının bunları elle çözmesi gerekir. Kullanıcı biraz daha iyi otomasyon satın alır, ama sonra yine biraz daha patolojik bir iş yüküne takılır. Böylece oyun ilerleme döngüsü tamamlanır.

    • Bir bellek ayırıcı satın alabilmek güzel olurdu. Kendi yazdığın bir seçeneğin de olması iyi olurdu.
  • Yakında işletim sistemi işleri otomatikleştirebilmek için bir betik dili sunar herhalde, değil mi?
    Ha, anladım...

    • Bir C yorumlayıcısı kullanıp Linux kodunu doğrudan kopyalayalım... ya da tam tersini yapalım.
  • Çok havalı. Geçen hafta paylaşılan oyunu hatırlattı. Defcon ile ilgili miydi? İşlem kodları içeren Tetris blokları gibi karelerin düştüğü, kullanıcının en büyük sayıyı “skor” bellek yazmacına karıştıran Rube Goldberg tarzı diziler yerleştirmesi gereken bir oyundu.