Çok Çekirdekli Sistemlerin Yazılım Kalitesi Üzerine Etkileri Effects of MultiCore Systems on Software Quality Tolga, Ovatman Bilgisayar Mühendisliği Bölümü İstanbul Teknik Üniversitesi, İstanbul ovatman@itu.edu.tr Feza, Buzluca Bilgisayar Mühendisliği Bölümü İstanbul Teknik Üniversitesi, İstanbul buzluca@itu.edu.tr Özet Çok çekirdekli işlemcilerin ortaya çıkması ile birlikte paralel yazılımlar, yüksek başarımlı hesaplama alanının yanında uygulama yazılımları alanında da kullanılmaya başlanacaktır. Paralel çalışmayı temel alan donanımların günümüz yazılım mühendisliği ilkeleri ve nesneye dayalı programlama gibi kavramlar temel alınarak üretilen yazılımlarla birlikte kullanılması yeni zorluklar ortaya çıkaracak ve yazılım kalitesi ölçütlerinde de farklılaşmaya neden olacaktır. Bu çalışmada donanımda oluşan bu değişimin yazılım dünyası üzerine etkileri ve bu etkiler karşısında yapılması gerekenler, nesneye dayalı yazılımlar çerçevesinde incelenmiş; günümüz yazılımlarının çok çekirdekli platformlara uyarlanması, çok çekirdekli platformlar için yazılım tasarımında dikkat edilmesi gerekenler ve paralel yazılımların kalite ölçütleri üzerine yapılabilecek çalışmalara değinilmiştir. Abstract With the emergence of multicore processors, parallel software is beginning to be used in the domain of application software in addition to high performance computing software. The use of parallel processing hardware with current software engineering techniques and principles, like object oriented programming, will surely produce new challenges in area and change the way we look at quality criterions. In this work, the effects of this change in hardware and possible practices on dealing with the effects are discussed from the object oriented software perspective. Discussions include adaptation of current software to multicore platforms, important points when designing software for multicore systems and possible research on quality criterions of parallel software. başvurulan konulardan biridir. Paralel bilgi işlemeyi sağlamanın en çok kullanılan yolu birden çok işlemciye sahip bilgisayar sistemlerinin kullanılmasıdır. Birkaç yıl öncesine kadar çok işlemcili sistemler yüksek başarımlı hesaplamada kullanılan, birden fazla fiziksel işlemcinin özel donanımlar ve yazılımlar kullanılarak aynı anda işletilmesine dayanırdı. Çok çekirdekli işlemciler olarak da anılan, kırmık düzeyinde çok işlemcili sistemler (Chip level multiprocessors-cmp), tek bir fiziksel kırmık içerisine birden fazla işlemcinin yerleştirilmesiyle oluşturulmuşlardır. Bu tarz işlemcilerde farklı mimariler kullanılmakla birlikte, Şekil 1 de de görüldüğü gibi kendi cep belleğine(cache memory) ve ortak bir cep belleğe sahip iki işlem biriminin bir arada bulunması son yıllarda tercih edilen bir donanım çeşididir. Çok çekirdekli işlemcilerin en basit haliyle gelişmeye başladığı günümüzde çift çekirdekli işlemciler çok görevli işletim sistemlerinde gerektiği performansı sağladıkları için programlama ortamının değişmesine büyük oranda ihtiyaç duyulmadı. Gelecekte çekirdek sayısının artmasıyla çok görevli işletim sistemlerinde dahi performans eksikliği hissedilmeye başlanacaktır. Bunun nedeni kullanıcının hiçbir zaman elde bulunan işlemci sayısı kadar görev üretemeyecek olmasıdır ve bu durumun sonucu olarak işlemcilerin bir kısmı tam performansla kullanılamayacaktır. MİB Çekirdeği ve 1. Düzey cep bellekler MİB Çekirdeği ve 1. Düzey cep bellekler 1. Giriş Paralel bilgi işleme, bilgisayar teknolojisinin kullanılmaya başlandığı ilk yıllardan itibaren gündemde olan ve yüksek başarımlı hesaplamada en sık Veri yolu arayüzü ve 2. Düzey cep belekler
Şekil 1: Tipik bir çift çekirdekli işlemci mimarisi Birçok çekirdekli hesaplama (manycore computing) denilen onlarca çekirdek içeren işlemcilerin kullanıldığı aşamada paralelleştirilebilir programlama öğelerinin günümüzdekinden çok daha etkin biçimde belirlenmesi ve yazılımların yeni platformlara göre tasarlanması gerekmektedir. Microsoft un ManyCore[1] zirvesinde de tartışıldığı üzere bu konuyla ilgili yeterince çalışma yapılmamıştır ve gelecekte önemli sorunlarla karşılaşılması sonucunda programlama sürecinin büyük değişimlere uğraması beklenmektedir. Çok çekirdekli işlemciler kendileriyle birlikte paralel programlamaya yeni modeller getirmemiş, çoğunlukla bu tür işlemcilerde OpenMP ya da MPI gibi bilinen paralel programlama modellerinin kullanılması tavsiye edilmiştir. Çok çekirdekli işlemciler için ortaya atılmış bir programlama modeli bir istisna haricinde henüz literatürde bulunmamaktadır. Ease[2] ismindeki bu programlama modeli, çok çekirdekli sistemlerin ortaya çıkmasından daha önce oluşturulmuş bir modeldir. Bu model, çok çekirdekli işlemciler için tasarlanmış olmaktan ziyade bu ortama uygulanabilir bir modeldir. Görüldüğü üzere donanım dünyasında ortaya çıkan bu değişime yazılım dünyası tarafından henüz tatminkar bir cevap gelmemiştir. Bu nedenle yakın gelecekte yazılım dünyasının donanımdaki bu yeni yönelişe ayak uydurmaya başlaması beklenmektedir. Donanımsal gelişimlerin yazılımı etkilemesi ve bazı yazılım kavramlarının zaman içinde öneminin artması geçmişte eşine rastlanan durumlardır. Örneğin nesneye dayalı ve bileşen tabalı yazılım geliştirme yöntemlerinin önem kazanması, donanım alanında yaşanan gelişmelerle mümkün olmuştur. Programlama sürecinde yaşanacak değişimler daha önceleri ön planda değerlendirilmeyen, yazılımların paralel ortamlardaki kalite ölçütlerinin daha yoğun bir biçimde ele alınmasına neden olacaktır. Günümüzde yaygın biçimde kullanılan nesneye dayalı yazılım mühendisliği prensiplerinin paralel ortamlar için gözden geçirilmesi ve geçerliliklerinin sınanması gerekmektedir. Ayrıca günümüzde kullanılan kalite değerlendirme ölçütlerinin de paralel çalışmayla olan ilişkisi önem kazanacak konulardandır. Bu çalışmada, yukarıda sözü edilen yazılım dünyasında beklenen bu değişimin yazılım kalitesi üzerine etkileri tartışılacak ve bu etkileri en etkin biçimde ele alabilmek için yapılması gereken çalışmalar üzerine fikir yürütülecektir. Çalışmanın bölümleri şu şekilde özetlenebilir. İlk bölümde çok çekirdekli işlemci teknolojisiyle ilgili kısa bir bilgi verilerek bu teknolojinin gelecekte ortaya çıkartacağı problemler hakkında kısaca görüş belirtilmiştir. İkinci bölümde paralel sistemlerde öne çıkacak yazılım kalitesi kıstasları sıralanacaktır. Üçüncü bölüm, paralel yazılımlarda kaliteyi arttırabilmek için yapılması gereken çalışmaları içermektedir. Sonuç bölümünde ise çalışma boyunca yürütülen fikirler üzerine çok çekirdekli sistemler için üretilecek yazılımların kalitesini korumak ve sağlamak amacıyla yapılacak araştırma çalışmaları için bir yol haritası çizilecektir. 2. Çok çekirdekli Sistemlerde Nesneye Dayalı Yazılım Kalitesi Yazılım kalitesi, kavram olarak, terimin kullanıldığı ortamdan ortama değişen farklı tanımlara sahiptir. Bunlar arasında en üretken (generic) yapılmış tanımlardan biri Gerald Weinberg in Kalite bir kişi için katma değer olarak görülebilecek her şeydir tanımıdır[3]. Bu tanım kaliteyi değerlendireceklerin ve bu kişilerin kullanacağı değerlerin belirlenmesi gerekliliğini doğurur. Çok çekirdekli sistemlerin yazılımların üzerinde çalışacağı platform olarak kullanılmaya başlanması birçok yeni değer ortaya çıkartacağı gibi eskiden değer olarak görülen bazı kavramların da değişimine neden olacaktır. ISO 9126 standardına göre[4] 6 temel kalite karakteristiği bulunur: Fonksiyonellik Güvenilirlik Kullanılırlık Verimlilik Bakıma elverişlilik (Maintainability) Taşınırlık (Portability) Çok çekirdekli işlemcilerden önce de paralel yazılımların kalitesi üzerine çalışmalar yapılıyordu. Çok çekirdekli işlemcilerin son kullanıcılar tarafından satın alınabilir hale gelmesiyle önceleri daha çok bilimsel hesaplamaya yönelik, modern yazılım mühendisliği tekniklerini çok fazla kullanmayan çalışmalar, çok çekirdekli platformlar için üretilen uygulama yazılımları için fazla anlam taşımamaktadır. Genel kullanım yazılımlar için paralel yazılım geliştirmenin gelişmesiyle birlikte nesneye dayalı yazılım geliştirme için de kalite kavramının değişeceği açıktır. Bu iki dünyanın birleşmesiyle birlikte güvenilirlik, verimlilik, bakıma elverişlilik ve taşınırlık kalite karakteristikleri öne çıkacaktır. Nesneye dayalı yazılımların paralel donanımlarda kullanımının artmasından en çok etkilenecek kalite karakteristiği güvenilirliktir. Bunun nedeni paralellikle birlikte yazılımların çalışma zamanında önem kazanan
zaman alanının ortaya çıkardığı kararsızlık(nondeterminism) durumlarıdır. Yazılımın çalışırken göstereceği alternatif çalışma biçimleri zaman içinde yazılım modüllerin çalıştırılma sıralarına ve eşgüdümlerine bağımlı hale gelecektir. Bunun sonucu olarak yazılımın doğru olarak sonlandığı çalışma zamanı alternatifleri, zaman alanının sürece eklenmesiyle birlikte, geçmişe oranla çok daha karmaşık hale gelecektir. Güvenilirlik, sağlanması oldukça güçleşen bir kalite karakteristiği olmakla birlikte verimlilik paralelleştirme kavramının ana amacı olarak önemini arttıracaktır. Amdahl a göre bütün programlar paralellik kavramını aynı oranda kullanmazlar. Bu noktada paralelleştirmenin amacı eklenen işlem gücüne karşılık en yüksek verimi alabilmektir. Bu noktada yazılım tasarımı sürecinde yazılımın ne kadar parçalandığı ve kullanılan tasarım ilkelerinin paralelliğe etkisinin bilinmesi önem kazanmaktadır. Verimlilik ve güvenilirlik daha çok çalışma zamanı(dolayısıyla kullanıcıya dönük) kalite karakterleri olmakla birlikte, bakıma elverişlilik ve taşınırlık daha çok yazılım geliştirme sürecine yönelik karakteristiklerindendir. Yazılımın geliştirilmesi esnasında zaten yeterince zor kavranan paralelleştirme kavramının bakım sürecinde yeni sorunlar doğurması kaçınılmazdır. Paralelleştirme açısından taşınırlık kavramı çok boyutlu bir kalite karakteristiğidir. Bir yandan taşınabilirlik eski yazılımların etkinliğini koruyacak bir biçimde çok çekirdekli platformlara aktarılabilmesi anlamına gelirken diğer yandan paralel yazılımların farklı işlemci mimarilerinden ve programlama modellerinden bağımsız olarak üretilebilmesi durumu söz konusudur. Nesneye dayalı yazılımların paralel sistemlerde kullanılması konusundaki en eski çabalardan biri paralel yazılım tasarımında kullanılabilecek nesneye dayalı modelleme teknikleri konusundadır. Parse projesi dâhilinde I. Gorton işlem çizgelerine(process graphs) dayalı bir yöntem önermişlerdir[5]. Bu çalışmada ayrıca zamanlı iletişim yollarının ve tampon(buffer) belleklerin sistemlerde kullanımını göstermekte elle çizilen basit çizenekler kullanılmıştır. Bu çalışmadan bir yıl sonra UML geliştirilmeye başlamış ve nesneye dayalı yazılım modellemenin resmi olmayan standardı haline gelmiştir. Bu noktada işlem çizgelerine gerek kalmamış ve benzer çalışmalar UML ile yapılmaya başlanmıştır. Örneğin, Yücesan,E. nin çalışmasında, dağıtılmış ve paralel uygulamalarda performans modellemesine olanak verecek UML eklentileri tasarlanmıştır[6]. Sadece modelleme alanında çalışmalar yapılmamış MPI nın nesneye dayalı paralel ortamlara uygulanması[7] ve yeni programlama modellerin oluşturulması[8] konusunda çalışmalar yapılmıştır. Baudel in çalışmasında Nesneye Dayalı bir SPMD(tek işlem-çok veri) modeli ProActive nesneleri kullanılarak önerilmiştir. Aktif nesneler[9], nesneye dayalı paralel programlamanın en iyi tanımlanmış ve etkileyici örneklerinden biridir. Bu nesnelerde metotların çalıştırılması metot çağrısından ayrılmış, böylece eş zamanlı çalışma yetenekleri geliştirilmiş ve nesnelere erişimde eşgüdüm basitleştirilmiştir. Bu daha çok nesneye dayalı paralel yazılımlarda kullanılabilecek bir tasarım kalıbı olarak görülebilir. Bunun gibi birçok kalıp[10] zaman içinde ortaya çıkmıştır, fakat özellikle paylaşılan bellek kullanan çok çekirdekli işlemcili platformlara özel tasarım kalıplarının oluşturulması gerekmektedir. Nesneye dayalı yazılım mühendisliği ile paralel sistemlerin çok çekirdekli işlemciler perspektifinde bir araya getirilmesinin gerekliliği açıktır. Unutulmaması gereken, nesneye dayalı yazılım geliştirme gibi birçok kavramın, kullanımlarının yaygınlaşmasından çok önceleri bilindiği ve ortaya çıkan donanımsal gelişmeler sonucunda yaygınlaşmasının yaşandığıdır. Bu nedenle bir başka donanımsal evrimin yaşandığı günümüzde elimizde bulunan yazılım kalite ölçütlerinin yeni platformlardaki özelliklerinin incelenmesinde ve gerekli düzenlemelerin yapılmasında yarar vardır. 3. Paralel Sistemlerde Nesneye Dayalı Yazılım Kalitesinin Arttırılması Çok çekirdekli işlemcilerin yaygınlaşmasının ardından yazılıma yönelik üzerinde iyileştirme yapılabilecek alanlar aşağıdaki gibi sıralanabilir: Derleyici ve aracı katman Programlama Dilleri ve Modelleme Aracı yazılımlar ve yazılım kütüphaneleri Yardımcı uygulamalar Bu alanlardan ara katmanlar ve derleyiciler ile yazılım modelleri öne çıkmaktadır. Bu iki alanda çalışılması durumunda çok çekirdekli sistemlerin etkileri daha etkin biçimde ele alınacaktır. Üstelik tasarım alanında yapılacak iyileştirmeler yazılım üretim sürecinde daha erken aşamalarda gerçekleştirilmiş olacaktır. Ara katman ve derleyiciler üzerine yapılacak iyileştirmeler ise yazılım üreticisinden bağımsızlık sağlayacaktır. Bu iki alanın yazılımların çok çekirdekli işlemcilere uyarlanması konusunda en etkili ve önemli rollere sahip olacakları açıktır. Öte yandan yazılımın tasarlanması ve üretilmesi aşamaları birbiriyle iç içedir ve birinde
yapılan değişiklik diğerini de tetikleyecektir. Bu nedenle iki konuda yapılan çalışmaların birbiriyle eş zamanlı yürümesi daha verimli olacaktır. Yapılabilecek iyileştirmeler yazılım geliştirici tarafından gerçekleştirilebileceği gibi işletim sistemi, sanal makineler gibi ara katman yazılımları tarafından otomatik olarak da gerçekleştirilebilir. Yazılımcının paralelleştirme kavramıyla gereğinden fazla ilgilenmesi istenmeyen bir durum olsa da gerektiği noktalarda yazılım modeli ve/veya yazılımın kendisi üzerinde yapacağı ek açıklama (annotation)lar ile derleyiciye ve çalışma zamanına yönelik yönlendirmeler yapabilir. Nesneye dayalı yazılımların tasarım aşamasının ardından oluşturduğu karakteristiğin belirlenmesi ile yazılım tasarımcılarının çok çekirdekli sistemlerde koşacak yazılımların tasarımı konusunda, rehberliğinde hareket edebilecekleri bir disiplin oluşturmaları sağlanabilir. Diğer taraftan gerçekleştirilmesi yeğlenecek olan, gerek derleyici gerek ara katmanların derleme ve çalışma zamanında yapacakları tasarım ve yazılım metrikleri ölçümleriyle paralel çalışma hakkında fikir edinmesidir. Yapılan iyileştirmeler paralelleştiren derleyicilerin gerçekleştirdiği sıradüzensel yazılımların paralel hale dönüştürülme işleminden ziyade günümüzde iplik bazında yapılan zamanlama planlarının nesne bazında gerçekleştirilmesini sağlamaktır. Yazılım dünyası paralel platforma kaydıkça yaşayacağı sorunlar aslında çok çekirdekli sistemlerden önce ortaya çıkmaya başlamışlardır. Örneğin yazılım dünyasında büyük etki yaratan Gamma ve arkadaşlarının tasarım kalıpları[12] isimli çalışmasında bulunan tekil sınıf (Singleton) kalıbında paralel erişimle ilgili bir sorunun ortaya çıktığı görülmüştür. Şekil 2 de ortaya çıktığı ilk hali görülen Java dilinde yazılmış tasarım kalıbı, yazılımlarda kullanılan bir sınıftan tek bir nesne üretilebilmesi ve nesneye erişmek isteyen istemcilere getinstance() metodu ile bu tek sınıfın temin edilmesi prensibi ile çalışmaktadır. Fakat zaman içinde tekil nesneye paralel erişim yapıldığında getinstance() metodunun içerisindeki if koşulunun sınanması esnasında çalışmasının kesilmesi durumunda tekil nesnenin çalışması etkilenecek ve günümüz yazılımlarında sıkça kullanılan bu kalıp hatalı çalışarak yazılım kalitesinin düşmesine sebebiyet verecektir. Tekil nesne kalıbındaki bu problem için zaman içinde çözüm üretilmiş ve sorunlu metodun eş zamanlı erişime uygun şekilde kritik bölge olarak tanımlanmasıyla sorunun ortadan kalktığı görülmüştür. Bu çözüm kalıbın içine uyarlanmış ve tasarım kalıbı bu yeni şekliyle kullanılmaya başlanmıştır. class Singleton { private static Singleton instance; private Singleton() { } public static Singleton getinstance() { if (instance == null) instance = new Singleton(); return instance; } } Şekil 2: Tekil nesne örüntüsünü gerçekleyen bir Java programı Yukarıda açıklanan problemden yola çıkarak yapılacak ana çalışma alanı olarak günümüz yazılımlarının paralel ortamlara aktarılmasıyla ortaya çıkabilecek sorunlar, yazılım kalitesi bağlamında incelenmeli, sorunların günümüzde kullanılan yazılım metrikleriyle ölçülebilirliği ve yazılım kalitesine etkileri biçimsel olarak ölçülmelidir. Edinilen kazanımlar doğrultusunda paralel platformlar için sıfırdan tasarlanan yazılımlarda kalite unsurları gözden geçirilmeli ve yeni kalite unsurlarının bulunması yönünde çalışmalar yapılmalıdır. 3.1. Nesneye Dayalı Yazılımların Çok Çekirdekli Sistemlere Taşınması Günümüze kadar yazılımların paralel dünyaya taşınması yolunda yapılan çalışmalar paralelleştiren derleyiciler (paralellizing compiler) tarafından yapılıyordu. Nesneye dayalı olmayan yazılımlar için pek başarılı olmadığı bilinen bu tür yazılımların genelde yaptığı iyileştirmeler loop unrolling denilen döngülerin bölünüp parçalanarak farklı işlemciler tarafından yürütülmesi gibi iyileştirmelerin uygulanmasını öngörüyordu. Nesneye dayalı yazılımlarda ise bu tür iyileştirmeler, yazılımların üretilmesindeki düşünce tarzının ve dolayısıyla kullanılan yapısallığın farklı olması nedeniyle etkinliğini yitirir. Önceki bölümlerde saydığımız nedenlerden dolayı zaman içerisinde paralel sanal makineler gibi paralel çalışmaya dayanan ara katman yazılımlarının yaygınlaşacağı öngörülmektedir. Bu noktada, kullanılan ara katman yazılımlarının nesneye dayalı yazılımları çok çekirdekli sistemlerde çalıştırırken önem verecekleri noktaların belirlenmesi üzerinde durulması gerekir. Dağıtık sistemler için bilinen nesne dağıtımı problemi[11], çok çekirdekli sistemlerdeki çekirdek sayısı arttıkça yeniden karşımıza çıkacaktır. Paylaşımlı bellek kullanımı ve iletişim süresinin çok küçük olması gibi farklar yapılan çalışmaların gözden geçirilmesini gerektirmektedir. Aynı zamanda önceki bölümde belirtildiği gibi iplik düzeyi paralellik(threadlevel parallelism) zamanla etkinliğini yitireceğinden
nesne düzeyi paralellik(object-level parallelism) konusu öne çıkacaktır. Mevcut tasarım kalıpları[12] temel alınarak günümüzde kullanılan yazılımların taşıdıkları karakteristiklerin belirlenerek, bu karakteristiklerin paralel ortamlardaki davranışı üzerine yapılacak çalışmalar bu konuda anlam kazanacaktır. Bu amaçla günümüz yazılımlarının ortak karakteristiği olarak görülebilecek tasarım kalıplarının, paralel ortamlardaki davranışları incelenmesi ve tasarım kalıplarındaki sınıfların taşıdıkları sorumluluklara göre gruplandırılıp bu grupların paralel çalışmadaki davranışlarının incelenmesi gerekmektedir. Buradan yola çıkarak günümüzde kullanılan yazılımları oluşturan bileşenlerin görevleri ve sağladıkları temel servisler incelenip, ara katman tasarımcılarının paralel ortamlarda yazılım karakteristiğine uygun iyileştirmeler yapmaları sağlanabilir. Örneğin yukarıda da anılan tekil sınıflar gibi, yazılımlarda bulunan aracı, kontrolcü, önyüz nesneleri gibi farklı yapıların, ara katman tarafından eş zamanlı güdüm konusunda nasıl yönetilmesi ve nesne dağıtımlarının nasıl yapılması gerektiğine yönelik çalışmalar yapılması anlamlı olacaktır. 3.2. Çok Çekirdekli Platformlarda Koşan Nesneye Dayalı Yazılımların Kalite Kriterleri Bölüm 2.1 deki çalışmalar sonucu edinilen genel bilginin biçimsel biçimde ölçülmesine dayalı çalışmalar varılan sonuçların bilimsel tabana oturtulması açısından önemlidir. Bu bağlamda yazılım tasarımlarında günümüzde kullanılan yazılım metriklerinin[13] çok çekirdekli platformlardaki etkilerinin sınanması gerçekleştirilmelidir. Bu metriklerin çok çekirdekli platformlardaki yazılım kalitesi üzerine yapılacak çalışmalarla birlikte Bölüm 2.1 de belirlenen noktaların metriklerle olan ilgisi belirlenerek günümüz yazılım metriklerinin yeterli ve yetersiz kaldığı noktalar ortaya çıkartılmalıdır. Bu sayede yazılımın tasarım safhasında yapılan biçimsel ölçümlerle, çok çekirdekli çalışma ortamında dikkat edilmesi gereken noktalar ortaya çıkartılarak bu ölçütlerin nesne dağılımına ve paralelleştirilmeye etkileri incelenebilir. Örneğin günümüzde çokça kullanılan bağımlılık (coupling) ölçütlerinin nesne dağılımlarında büyük etkisinin olacağı öngörülebilir. Birbirine daha bağımlı sınıfların nesnelerinin aynı işlemcide çalıştırılarak ileti trafiğinin düşürülmesi yapılacak iyileştirmelerden biri olabilir. Bunun gibi, yazılım içerisinde birçok sınıfla bağımlılığı bulunan denetçi gibi nesnelerin metotlarına ayrılarak ya da kopyaları çıkartılarak işlemcilerde dağıtılmış bir şekilde çalışması uygun olabilir. Bu aşamada yapılacak bir başka çalışma ise var olan yetersiz yazılım metriklerinin paralel yazılımlara uyarlanmasıdır. Örneğin döngüsel karmaşıklık[14] (cyclomatic complexity) metriği buyruksal yazılımlar üzerinde kullanılan etkin bir metriktir fakat paralel programlama için gözden geçirilmesi gerekmektedir. Literatürde döngüsel karmaşıklığın nesneye dayalı yazılımlar için gözden geçirilmesi gibi çalışmalar da bulunmaktadır[15]. Özetle bu tarz çalışmalarla Bölüm 2.1 de belirlenen genel ilkelerin yazılım metrikleriyle biçimsel olarak ifade edilmesi gerçekleştirilebilir. 3.3. Paralel Nesneye Dayalı Yazılımların Tasarımlarının Geliştirilmesi Olası bir başka tür çalışma ise var olan yazılımlardan çok paralel ortamlar için yeni baştan geliştirilen yazılımların kalitesi üzerine yapılabilir. Bu noktada ilk iki aşamada edinilen bilgiler ışığında yazılımın daha tasarlanma aşamasında çok işlemcili platforma uygun bir şekilde oluşturulması için başta UML olmak üzere yazılım tasarım araçlarına yapılması gereken eklentiler ve kullanılabilecek yeni metriklerin oluşturulması üzerine çalışmalar yürütülecektir. Paralel tasarımlara özgü yapıların UML ye uyarlanması yönünde daha önceden yapılan çalışmalar vardır fakat bunlar genellikte stereotype lar gibi var olan UML yapıları kullanılarak paralel ortamların ne derece modellenebileceği üzerinedir. Son safhada yapılması düşünülen çalışma yazılım modelinin oluşturulması sırasında tasarımcının öngördüğü çok çekirdekli çalışma ortamında önemli rol oynayacak yapıların belirtilebilmesi üzerinedir. Bu tür yapılar örneğin sınıf çizeneklerinde nesnelerinin özellikle dağıtılması istenen ya da özellikle dağıtılmadan tek bir kaynakta kalması istenen sınıfların belirtilmesi olabilir. Diğer yandan iletişim çizeneklerinde paralel çalışabilecek metot çağrılarının ve senkronize olması gereken çağrıların belirtilmesini sağlayacak yapıların oluşturulması da bir başka örnektir. Yazılım tasarım alanına zaman eklendiğinde oluşabilecek sonsuz farklı işletim seçeneğinin indirgenmesi ve modellerin biçimsel modelleme ile güvenilirliğinin arttırılması da oluşturulacak yeni model öğelerinde bulundurulması tercih edilebilecek seçeneklerdendir. Çalışma sonunda Bölüm 2.1 de yapılan, yazılımın çalışma zamanına yönelik iyileştirmeler ve Bölüm 2.2 de yapılan bu iyileştirmeleri tetikleyecek tasarım özelliklerinin metrikler yardımıyla algılanması yardımıyla saptanan tasarım özelliklerinin modellenebilmesi için gerekli yapılar geliştirilebilir. 4. Sonuç Donanım dünyasında yaşanan gelişmelerle birlikte yazılım dünyası ile donanım dünyası arasında bir farkın oluşmaya başladığı görülmektedir. Yazılım dünyasının,
yeni bir mimari ile geliştirilmeye başlayan donanımları en etkin biçimde kullanması için yazılımlarda ve yazılımları süren ara katman üzerinde bir takım değişikliklerin yapılması gerekmektedir. Donanımsal değişikliklerle birlikte ortaya çıkan paralelleşme kavramı, nesneye dayalı yazılımların tasarlanma, geliştirilme ve çalışma zamanları üzerinde etkisini gösterecektir. Bu etkiler yazılım dünyasının, yazılım kalitesini belirleme ölçütleri üzerinde değişiklikler yaratacağı gibi yeni kalite ölçütlerinin oluşmasında da öncü olacaktır. Yapılan incelemelerin sonucunda yazılımın yaşam süreci içinde çeşitli noktalarda kalitenin arttırılmasına yönelik yapılabilecek çeşitli iyileştirmeler üzerine fikir yürütülmüş ve yapılabilecek çalışmalar ortaya konmuştur. Günümüzde kullanılan yazılımların çok çekirdekli sistemler üzerinde davranışının ve günümüzde kullanılan kalite ölçütlerinin bu tip sistemlerdeki belirleyiciliğinin araştırılması çok çekirdekli sistemlerde kullanılacak yazılımların kaliteleri üzerine yapılacak çalışmalarda atılacak ilk adımlardan olacaktır. Bu sayede çok çekirdekli sistemlere geçiş aşamasında, günümüz yazılımlarının karakteristiği ve yazılım ölçütlerinin eksik ve yetersiz kaldığı alanlar belirlenebilir. Bu da sıfırdan üretilen yazılımlar için oluşturulacak nesneye dayalı paralel yazılım geliştirme standartlarının ve disiplinin kalite odaklı bir biçimde oluşturulmasını mümkün kılacaktır. Concurrent Programming. Proc.Pattern Languages of Programs. [10] Mattson, Timothy G., Sanders, Beverly A. and Massingill, Berna L. Patterns for Parallel Programming. s.l. : Addison-Wesley Professional. [11] Caromel, D. and Henrio, Ludovic., 2004. A Theory of Distributed Objects. s.l. : Springer. [12] Gamma, Erich, et al., 1994. Design Patterns: Elements of Reusable Object-Oriented Software. s.l. : Addison- Wesley Professional. [13] Chidamber, S. and Kemerer, C., 1994. A Metrics Suite for Object Oriented Design. IEEE Transactions on Software Engineering, Vol. 20, pp. 476-493. [14] McCabe, Thomas J. 4, December 1976. A Complexity Metric. IEEE Transactions on Software Engineering, Vols. SE-2. [15] Swapan Bhattacharya, Ananya Kanjilal: Code Based Analysis for Object-Oriented Systems. J. Comput. Sci. Technol. 21(6): 965-972 (2006) 5. Kaynaklar [1] ManyCore Computing Wokshop. [Online] http://science.officeisp.net/manycorecomputingworksho p07/default.aspx. [2] Zenith, S. E., 1990. Programming in Ease: Semiotic Definition of the language. New Haven, Connecticut : Yale University. [3] Weinberg, Gerald M., 1991. Quality Software Management: Systems Thinking. s.l. : Dorset House Publishing Company. [4] ISO STANDARTLARI KATALOĞU. [Çevrim içi] http://www.iso.org/iso/iso_catalogue.htm. [5] Gorton, I., Gray, J. P. and Jelly, I. 2, 1995. Object-based modeling of parallel programs. IEEE Parallel & Distributed Technology: Systems & Applications, Vol. 3, pp. 52-63. [6] Yücesan, E., Pllana, S. and Fahringer, T. December 8-11, 2002. UML Based Modeling of Performance Oriented Parallel and Distributed Applications. Proceedings of the 2002 Winter Simulation Conference. [7] Carpenter, B., et al. 11, 2000. MPJ: MPI-like message passing for Java. Concurrency: Practice and Experience, Vol. 12, pp. 1019-1038. [8] Mintchev, S. and Getov, V. 1997. Towards portable message passing in Java: Binding MPI. Recent Advances in PVM and MPI, ser. LNCS. 1332. [9] Lavender, R. Greg and Schmidt, Douglas C. 1995. Active Object: an Object Behavioral Pattern for