Yıllık arşivler: 2009

OpenMP

Son yıllarda bilgisayar mimarisinde çok çekirdekli yapıya geçilmiştir. Böylelikle bilgisayarımız aynı anda birden fazla işi yapabilecek duruma gelmiştir. Donanım olarak bu mimarinin kullanılabilmesi için tabiî ki yazılımlar gerekmektedir. Sadece paralel programlama ile hazırlanmış programlar birden fazla çekirdeği aynı program için kullanma imkanı sunmaktadır. Böylelikle program parçalara ayrılarak çekirdeklerde eş zamanlı olarak çalıştırılır. Bu yöntemle günlerce sürecek büyük hesaplamaların yapıldığı programlar saatler içerisinde halledilebilir hale gelmiştir. Ayrıca paralel programlama sadece multicore ve tek bilgisayar üzerinde kullanılmamaktadır, bununla birlikte bir ağ üzerinde birleştirilmiş ve birbiriyle iletişim halinde olan birden fazla bilgisayarla da paralel programlama yapılabilir. Böylelikle ağ üzerinde dağıtık halde bulunan bilgisayarların bellekleri ortak olarak kullanılabilir. Yapılan işlem tüm bilgisayarlara paylaştırılarak işlem sonucunu normalden çok daha kısa sürede elde edebiliriz. OpenMP paralel programlama işini kolaylaştıran bir API’dir. Çalışma prensibi, paralel işletilmesi gereken kısımlarda dallanır, paralel çalışıp işlem bitince tekrar birleşmesi şeklinde olur. Buna Fork-Join Model denir. OpenMP Api’sinin her platforma göre derleyicisi bulunmaktadır. Ayrıca C++,C ve Fortran ile kullanılabilir.

Neden ‘Software’ dendi?

1950’li yıllarda donanım (hardware) ile bir bilgisayarın birbirine sabitlenmiş, lehimlenmiş kısımları kastediliyordu. Belleğinde program saklayan ilk bilgisayarlarda bu belleği paneller temsil ediyordu. Yazılım (software) yani program, ilk başlarda panelli bilgisayarlarda,kabloların  bu panellerdeki uygun deliklere elle yerleştirilerek makinenin yapacağı işleme yön verilmesiyle yapılırdı. Bu kablolar panellere sabitlenerek yada lehimlenerek tutturulmadığı, yuvadan istenildiği an çıkartılabildiği için buna İngilizce’de sabitlenerek tutturulan donanımın zıddı olarak, gevşek bir şekilde tutturulan hırdavat manasına gelen ‘software’ (yazılım) adı verildi.

Kaynak: Anı ve Fotoğraflarla Bilişim Tarihimiz – Akdoğan Özkan 

Pipeline İşlemci Mimarisi

Pipeline işlemci mimarisine genel olarak değinmek istiyorum. İşlemcinin paralel olarak işlem yapabilmesini sağlayan tekniktir. İşlemcinin komutu alması, çözmesi ve işleme sokması gibi aşamalar düşünüldüğünde, bir komutun işleme alınmasıyla işlemin tamamlanıp farklı bir komuta geçilene kadarki sürede sadece o komutla ilgilendiğini görürüz. Farklı bölümler kendi işlerini yaptıktan sonra diğer bölümlerin de işlerini yapmasını beklemektedir. Bu da çok fazla zaman kaybına neden olmaktadır. Bu sebeple Pipeline Mimarisi düşünülmüştür. Bu mimariyi bir örnekle açıklayacak olursak, günümüzde fabrikalarda üretim aşamasında çokça kullanılan üretim bantlarını göz önüne alalım. Bu bantlar hareket ettikçe malzemeler bekleyen işçilerin önüne gelir, her işçi kendi yapacağı işi kısa sürede yapar ve bir sonraki ürünün önüne gelmesini bekler. Bu yapıyla zamandan büyük oranda tasarruf edilerek üretimde verimlilik sağlanmış olur.

Üretim bandındaki yapıyı komutların işlenmesine benzetelim. Diyelim komutu fetch etmek t1 süre, çözmek t2 süre, icra etmek ise t3 süre alsın. Böylelikle t = t1 + t2 + t3 sürede sadece bir işlem yapılacaktır. Pipeline mimarisine uyarladığımızda ise t1 süresinde komut fetch edildikten sonra komutun çözülmesinde geçildiği andan sonraki komut fetch edilmeye başlanacaktır. Böylelikle t1 ,t2 ve t3 sürelerinin eşit olduğunu farzettiğimiz taktirde t1 = t2 = t3 = t olur ve zamandan üç kat tasarruf etmiş oluruz. Bu değerlerin eşit olmadığı taktirde ise bu üç değerin birbirine yakın olması en verimli sonucu verecektir. Aradaki farkın açılmasında ise bir komutun işlenme süresi artacaktır. Modern bilgisayarlarda bu işlemlerin her biri bir clock palsinde gerçekleşmektedir. Yani Pipeline’sız olarak 3 clock palsinde bir işlem yapılırken, Pipeline Mimarisi ile her clockta bir işlem gerçekleşmektedir (başlangıçtan üç clock palsi sonrasından itibaren). Yukarıda sadece üç aşamadan bahsettim ama bu aşamalar fetch, decode, execute, memory ve write back olarak beşe kadar çıkabilmektedir.

Avantajları:

  • Zaman tasarrufu sayesinde işlem hacmi artar.
  • ALU tasarımı daha hızlıdır.

Dezavantajları :

  • Dallanma işlemleri en büyük problemleridir. Dallanılacak yerin önceden bilinememesi performansı düşürür. Atlama komutu çalışmadan sonraki komutun ne olacağı bilinemez.
  • ALU tasarımı daha karmaşıktır.
  • Pipelined bir sistemin yönerge gecikmesi(latency), pipelined olmayana göre biraz daha fazladır.
  • Bu da sisteme ekstra flip-floplar eklenmesinden kaynaklanır.
  • Pipelined bir sistemin işlemci performansını ölçmek daha zordur ve performans daha değişkendir.

Von Neumann Mimarisi

Şu anda kullandığımız bilgisayarların mimarisinin de temelini oluşturan mimaridir. Bu mimarinin sahibi ise John Von Neumann’dır. Neumann 1903-1955 yılları arasında yaşamış Amerikalı matematik ve bilgisayar bilimcisidir. Lisansını kimya üzerine bitirmiştir. Doktorası ise matematik üzerinedir. Ünlü oyunlar teorisi de ona aittir. II. Dünya Savaşı yıllarında Eniac adlı ilk bilgisayarlardan olan hesaplayıcıyı üretmiştir.

Eniac’ı programlamak için delikli kartlar kullanılıyordu. Bu da normal olarak işlemlerin uzun süre almasına neden oluyordu. Bu olay Neumann’ın saklı programlama yani stored program adlı yapıyı düşünmesini sağladı. Bu yapı da programlama olayı daha esnek olacak ve bilgisayarın içerisinde saklanacaktır. Tabi bu düşünceyi gerçekleştirmek için bazı birimlere ihtiyaç olacaktır. Bu birimler yukarıda saklama işini yapabilecek bellek , işlemleri yapacak olan CPU ve kullanıcıdan bilgi alıp kullanıcıya bilgi veren I/O portlarıdır.

Bu mimarinin eskiye göre en büyük avantajı esnek olmasıdır. Daha önce bir bilgisayarı yapılma amacı dışında kullanmak için yeniden programlamak gerekiyordu. Avantajları olduğu gibi tabii ki bu mimarinin dezavantajları da vardır. En büyük dezavantajı ise hatalardır. Esnek olmayan yapıya göre düzenlenen bir program doğru olarak yazılıp çalıştırıldıktan sonra hiç hata vermeden istediğimiz kadar çalıştırabiliriz. Ama kullanıcıya göre esnek olan ve kullanıcıdan veri alan , o verilere göre sonuç veren programlarda, kullanıcıdan alınan değere hata çıkma ihtimali eskiye oranla yüksektir.

Bu mimaride yapılan işlem Assembly Dersi’nde gördüğümüz yapıdır aslında. Program işaret edilen bellekteki veriyi alır daha sonra ne yapacağına dair kodu alır,işlem gerçekleşir.Bu olay kodlar tamamlanana kadar devam edip gider.Aslında bu yapı bu sebepten dolayı programı yavaşlatır.Bu da en önemli dezavantajlarından biridir.Ama kabul etmeliyiz ki bir yerden fayda görürken elbette ki bunun bir bedeli olacaktır.Bedeli de bu dezavantajlardır. İşlemci ile bellek arası veri taşıma hızının, bellek hızına göre düşük olması işlemcinin büyük bir süre verinin gelmesini beklemesini gerektirir. Günümüzde işlemci ile bellek erişim hızının arasındaki farkın açılmasıyla bu sorun daha da açık olarak fark edilmektedir ve çözüm aramaktadır.

C# Olay tetikleme

Bilindiği üzere kullanığımız componentlerin olayları var. Örneğin Button nesnesinin click eventi butona tıkladığımızda yapılacak işleri yapar. Bazı zamanlarda aynı işi başka yerde yapmak zorunda kalabiliriz. Aynı metodu tekrar yazacağımıza butonun click eventine çağırabiliriz. Farzedelim bir nesne üzerinde çalışıyoruz ve Button1’in click olayında yapılacak işi yapmamız gerekti, aşağıdaki kodla bunu halledebiliriz.

Button1_Click(Page,e);

Koddaki Page kısmı Button’un sender’ı, üzerinde çalıştığımız nesne. ‘e’ ise EventHandler’ı.

SQL tablodaki iki alanı tek alan olarak alma

SQL’de alanlar arasında belli işlemler yaparak kullanmak, kullanmak zorunda olana kadar aklıma gelmemişti. Yapacağım işlem ad ve soyad adında iki farklı alanı bir alan gibi gÖstermekti. Aşağıdaki kodla bu işlemi gerçekleştirdim.

select ID,(Adi +' '+ Soyadi) as isim from PERSONEL

Burada PERSONEL tablosundan ID ve isim olarak iki alan alınıyor. İsim alanı normalde tabloda yok, Adi ve Soyadi alanlarının birleştirilmesiyle oluşturuldu ve iki alan arasında bir karakter boşluk bulunmaktadır.

Etme – Mevlana – Mevlana’nın Şems’e Özlemi

Duydum ki bizi bırakmaya azmediyorsun, etme.
Başka bir yar, başka bir dosta meylediyorsun, etme.

Sen yadeller dünyasında ne arıyorsun yabancı?
Hangi hasta gönüllüyü kastediyorsun, etme.

Çalma bizi, bizden bizi, gitme o ellere doğru.
Çalınmış başkalarına nazar ediyorsun, etme.

Ey ay, felek harab olmuş, altüst olmuş senin için…
Bizi öyle harab, öyle altüst ediyorsun, etme.

Ey, makamı var ve yokun üzerinde olan kişi,
Sen varlık sahasını öyle terk ediyorsun, etme.

Sen yüz çevirecek olsan, ay kapkara olur gamdan.
Ayın da evini yıkmayı kastediyorsun, etme.

Bizim dudağımız kurur sen kuruyacak olsan.
Gözlerimizi öyle yaş dolu ediyorsun, etme.

Aşıklarla başa çıkacak gücün yoksa eğer;
Aşka öyleyse ne diye hayret ediyorsun, etme.

Ey, cennetin cehennemin elinde oldugu kişi,
Bize cenneti öyle cehennem ediyorsun, etme.

Şekerliğinin içinde zehir zarar vermez bize,
O zehiri o şekerle sen bir ediyorsun, etme.

Bizi sevindiriyorsun, huzurumuz kaçar öyle.
Huzurumu bozuyorsun, sen mahvediyorsun, etme.

Harama bulaşan gözüm, güzelliğinin hırsızı.
Ey hırsızlığa da değen hırsızlık ediyorsun, etme.

İsyan et ey arkadaşım, söz söyleyecek an değil.
Aşkın baygınlığıyla ne meşk ediyorsun, etme.

Mevlana Celaleddin Rumi

md5 Hash Fonksiyonu

Geçenlerde şifrelemeyle alakalı birkaç makale okudum. Md5 hash fonksiyonu da bu amaçla kullanılıyor. Tek yönlü olması, yani md5 sonucu elinizde olan bir veriye erişmenizin imkansıza yakın olması ilgimi çekti. Ben de ufak bir araştıma yaptım. Öğrendiklerimi paylaşmak istiyorum. Öncelikle md5 bir şifreleme yöntemi değil, hash fonksiyodur. Hash fonksiyonları ise bilindiği üzere bir veri topluluğundan verileri ayrı ayrı temsil edebilecek maksimum eşitsizlikte id çıkarma işlemidir. Peki bu fonksiyonun ismi neden md5? Çünkü bunun md4, md2, md gibi versiyonları da var. Bu son versiyon MIT’de profesör olan Ron Rivest tarafından, 1991 yılında md4 versiyonu geliştirilerek yapılmıştır. Md kısmının açılımı ‘Message Digest’ tır. Peki bunun karşılığı nedir derseniz, Türkçe’ye çevirince çok da anlamlı olmuyor açıkçası. Yani md5 fonksiyonunun temeli Message Digest Algoritması’na dayanmaktadır. Bu algoritmanın amacı ise değişik uzunluklardaki verileri işleyip, sabit uzunlukta veri elde etmektir. Md5 hash fonksiyonunda da işlenen veri 128 bit veriye dÖnüştürülür. Bu da 32 adet hexadecimal karakter yapmaktadır. Mantığına baktığımızda bu fonksiyonu sonsuz tane veri girdirebiliriz ama sonucunda hep 32 hex karakter çıkacağına göre, bazı verilerin md5 dönüşümleri aynı olacaktır. Olasılık çok küçük olsa da,farklı veriler için aynı sonuçları verecek olması güvenlik açısından biraz sıkıntı oluşturabilir. Ama bu sıkıntı da birkaç küçük işlemle giderilebilir. Açıkçası bu fonksiyonun algoritmasını tamamiyle öğrenmedim ama ilgilenenler internetten ulaşabilirler. Yakında bloğuma bu konuyla alakalı küçük bir eklenti yapmayı da düşünüyorum.