Asenkron Programlama



Benzer belgeler
Sunum İçeriği. Programlamaya Giriş

Görsel Programlama DERS 11. Görsel Programlama - Ders11/ 1

İşletim Sistemlerine Giriş

Önemli noktalar. Paradigma Nesnelere Giriş Mesajlar / Ara bağlantılar Bilgi Gizleme (Information Hiding ) Sınıflar(Classes) Kalıtım/Inheritance

İŞLETİM SİSTEMLERİ. (Operating Systems)

MAT213 BİLGİSAYAR PROGRAMLAMA I DERSİ Ders 1: Programlamaya Giriş

İş Parçacıkları (Threads)

Java Temel Özellikleri

Bilgisayarda Programlama. Temel Kavramlar

abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir;

İŞLETİM SİSTEMİ KATMANLARI (Çekirdek, kabuk ve diğer temel kavramlar) Bir işletim sisteminin yazılım tasarımında ele alınması gereken iki önemli konu

C# Programlama Dili. İlk programımız Tür dönüşümü Yorum ekleme Operatörler

NESNEYE YÖNELİK PROGRAMLAMA

Dağıtık Sistemler CS5001

ELN1001 BİLGİSAYAR PROGRAMLAMA I

Göstericiler (Pointers)

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

PROGRAMLAMAYA GİRİŞ. Öğr. Gör. Ayhan KOÇ. Kaynak: Algoritma Geliştirme ve Programlamaya Giriş, Dr. Fahri VATANSEVER, Seçkin Yay.

İŞLETİM SİSTEMLERİNE GİRİŞ - 2. Sistem, sistem kaynaklarını belli bir hiyerarşi içinde kullanıcının hizmetine

ALGORİTMA VE PROGRAMLAMA I

İş Parçacıkları Thread(s)

INPUTBOX KULLANIMI. Komut Düğmesine uygulanan algoritma örneği

İşletim Sistemlerine Giriş

AKINSOFT. Eofis NetworkAdmin. AKINSOFT EOfis NetworkAdmin Kurulumu Bilgi Notu. Doküman Versiyon : Tarih : Copyright 2008 AKINSOFT

Görsel Programlama DERS 01. Görsel Programlama - Ders01/ 1

İŞLETİM SİSTEMİ KATMANLARI (Çekirdek, Kabuk ve diğer temel kavramlar) Öğr.Gör. Dr. Dr. Şirin KARADENİZ

Toplama işlemi için bir ikili operatör olan artı işareti aynı zamanda tekli operatör olarak da kullanılabilir.

Üst Düzey Programlama

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

BİL-142 Bilgisayar Programlama II

İŞLETİM SİSTEMLERİ DÖNEMİÇİ SINAVI

BİL-141 Bilgisayar Programlama I (Java)

Multicore/Multithread Programlama

Bilgisayar İşletim Sistemleri BLG 312

HSancak Nesne Tabanlı Programlama I Ders Notları

FONKSİYONLAR. Gerçek hayattaki problemlerin çözümü için geliştirilen programlar çok büyük boyutlardadır.

BMS-302 İleri Web Programlama. İş Parçacığı (Thread) ve Soket (Socket) Programlama

OMNET Ağ Benzetim Yazılımı (Network Simulation Framework) BİL 372 Bilgisayar Ağları. GYTE - Bilgisayar Mühendisliği Bölümü

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Algoritmalar ve Programlama. Algoritma

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 10. Yrd.Doç.Dr.Hacer Karacan

SIMAN KULLANIM KILAVUZU

Dinamik Kodlama. [X] [X] Yeni Fonksiyon

Diziler İndisli Değişkenler

Bilgisayar Yazılımları

Yazılım Nedir? 2. Yazılımın Tarihçesi 3. Yazılım Grupları 4 Sistem Yazılımları 4 Kullanıcı Yazılımları 5. Yazılımın Önemi 6

Java 2 Standart Edition SDK Kurulum ve Java ya Giriş

// hataları işaret eden referans

Üst düzey dillerden biri ile yazılmış olan bir programı, makine diline çeviren programa derleyici denir. C++ da böyle bir derleyicidir.

Proses. Prosesler 2. İşletim Sistemleri

İŞ SIRALAMA. İş Sıralamanın Amaçları. İş Sıralama Türleri - 1. İş Sıralama. İş Sıralama Türleri - 2

İşletim Sistemlerine Giriş

Öğr. Gör. Serkan AKSU 1

HSancak Nesne Tabanlı Programlama I Ders Notları

VERİ YAPILARI VE PROGRAMLAMA (BTP104)

4. Bölüm Programlamaya Giriş

Programlama Dillerinde Kullanılan Veri Tipleri

Yrd. Doç. Dr. Caner ÖZCAN

Bilgisayar İşletim Sistemleri BLG 312

Klavyeden Basit Giriş/Çıkış İşlemleri

İsimler ve Kapsam. Hafta 4 Ders 2 BLG339 PROGRAMLAMA DİLLERİ KAVRAMI

Liskov Substitution Principle (LSP) Liskov un Yerine Gecme Prensibi KurumsalJava.com

PROSESLER. Proses. Proses

1.1. Yazılım Geliştirme Süreci

İçerik. Java da İşleçler, İşleçler. Aritmetik İşleçler - 1. Aritmetik İşleçler - 2. Geçen ders: Bu ders: BS-515 Nesneye Yönelik Programlama

Java da İşleçler, Ders #3 (4 Kasım 2009)

Sistem Nasıl Çalışıyor: Araç İzleme ve Filo Yönetim Sistemi

Ünite-3 Bilgisayar Yazılımı.

İşletim Sistemi. BTEP205 - İşletim Sistemleri

Bilgi ve İletişim Teknolojileri (JFM 102) Ders 10. LINUX OS (Programlama) BİLGİ & İLETİŞİM TEKNOLOJİLERİ GENEL BAKIŞ

Programın Akışının Denetimi. Bir arada yürütülmesi istenen deyimleri içeren bir yapıdır. Söz dizimi şöyledir:

BTP 207 İNTERNET PROGRAMCILIĞI I. Ders 9

İnternet Programcılığı

Windows'da çalışırken pek çok durumda bir işe başlamadan önce işletim sisteminin o işe ilişkin bilgileri depolayacağı bir alan yaratması gerekir.

İNTERNET EXPLORER AYARLARI 1. Başlat-Ayarlar-Denetim Masası menüsünden "İnternet Özellikleri" (Seçenekleri)'ni seçiniz. Resim. 1

BM-209 Nesne Yönelimli Programlama. Yrd. Doç. Dr. İbrahim Alper Doğru Gazi Üniversitesi Teknoloji Fakültesi Bilgisayar Mühendisliği Bölümü

Algoritma ve Akış Diyagramları

Mühendislik Fakültesi Elektrik-Elektronik Mühendisliği C Programlama 7. Bölüm Metot Tanımlama ve Kullanma

4- Turbo Pascal Bilgisayar Programlamada Kullanılan Şart Yapıları

Program Nedir? Program, bir problemin çözümü için herhangi bir programlama dilinin kuralları ile oluşturulmuş komut kümesidir.

Bil101 Bilgisayar Yazılımı I. M. Erdem ÇORAPÇIOĞLU Bilgisayar Yüksek Mühendisi

Java da İstemci Tarafı Uygulamalar

ALGORİTMA VE PROGRAMLAMA I

Bilgisayar Mimarisi Nedir?

İŞ SIRALAMA. İş Sıralama 6. İşletim Sistemleri

Bilgi ve İletişim Teknolojileri (JFM 102) Ders 7. LINUX OS (Sistem Yapısı) BİLGİ & İLETİŞİM TEKNOLOJİLERİ. LINUX Yapısı

BİLGİSAYAR AĞLARI Bilgisayar İletişimi Nedir? Veri İşleme Modelleri ve Ağ Gelişimi Merkezi İşleme

SAB 103 TEMEL BİLGİSAYAR KULLANIMI

İsimler ve Kapsam. 24 Şubat Programlama Dilleri - Pamukkale Üniversitesi 1

Arş.Gör.Muhammet Çağrı Gencer Bilgisayar Mühendisliği KTO Karatay Üniversitesi 2015

Yrd. Doç. Dr. Caner ÖZCAN

PARALEL HESAPLAMA ÇAĞRI GİDER ENES BİLGİN

ÜNİT E ÜNİTE GİRİŞ. Algoritma Mantığı. Algoritma Özellikleri PROGRAMLAMA TEMELLERİ ÜNİTE 3 ALGORİTMA

Arayüz Nedir? Arayüz Çeşitleri Arayüz Tasarım Yöntemleri Arayüz Tasarım Hataları. Ömer Faruk MIZIKACI

Çekirdek Nedir? Ne yapar?

Fatura Dosyalarını Yükleme ile ilgili Detaylar. 14 Temmuz 2014

Çözüm Bilgisayar. Çözüm SIRAMATİK

BİL-141 Bilgisayar Programlama I (Java)

Elbistan Meslek Yüksek Okulu Güz Yarıyılı

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

Transkript:

Asenkron Programlama Hazırlayan : Umut Rıza ERTÜRK 20122144 Tarih : 16-01-2006 Ekler: asenkronprogramlama_ornek.jar asenkronprogramlama_ornek_kaynak.jar - 0 -

Đndex Asenkron Programlama... - 0 - Đndex... - 1 - Tanım... - 2 - Đşletim Dizileri (threads)... - 4 - Monitor Kavramı ve Kullanımı... - 6 - Đşletim Dizileri (threads) ve Asenkron Görevler... - 9 - Bir Senkron Asenkron Programlama Karşılaştırması (Synchronous versus asynchronous programming)... - 11 - JAVA ĐLE PARALEL PROGRAMLAMA ÖRNEĞĐ... - 13 - Program Arayüzü-Tanımı:... - 14 - Programın Çalıştırılması ve Sonuçları... - 22 - Örnek 1... - 22 - Örnek 2... - 23 - Örnek 3... - 24 - Kullanılan programlar:... - 25 - Kullanılan Donanım:... - 25 - Kaynakça,... - 25 - Yararlanılan internet siteleri:... - 25 - Yararlanılan Kitap:... - 25 - - 1 -

Tanım Genel anlamıyla asenkron (asynchronous, okunuşu ay- SIHN-kro-nuhs; yunanca da asyn- olumsuzluk anlamında, chronous ise zaman anlamındadır); zamanlanmamış objeleri veya olayları ifade etmek için kullanılan sıfattır. Bu tanımı biraz daha belirgin bir hale getirecek olursak; zamanlanmamış demekle olay için oluşma anının obje içinse kullanılma/meydana gelme anının belli olmadığı ifade edilmeye çalışmaktadır. Bilgi teknolojilerinde ise asenkron sıfatı farklı çağrışımlar yapmaktadır. 1. Telekomünikasyon da birden çok network arasında veya bir network içinde, asenkron sinyal; başka bir sinyale göre farklı saat aralığında iletilen sinyal anlamındadır. Ancak bu bizim konumuz dışında olduğu için incelenmeyecektir. 2. Bilgisayar programları açısından ise asenkron işlem; diğer işlemlerden bağımsız zamanlamayla çalışan işlem anlamında kullanılmaktadır. Halbuki klasik programlama anlayışı olan senkron programlamaya göre bir işlem ancak bir başka işlemin sonucu veya yolu ile çalışabilmektedir. - 2 -

- 3 -

Yukarıdaki çizimlerde gösterilen a() ve b() farklı amaçlarla çalışan görevleri temsil etmektedir. Đlk örnekte b() işleminin çalışması tamamıyla a() işlemi tarafında çağrılma anına bağlıdır. Đkinci örnekteyse b() işlemi a() işleminden zamanlama gereksinimi duymadan çalışabilmekte ve sonlanabilmektedir. Bu noktada akla gelebilecek ilk soru a() ve b() işlevlerinin her ikisi birden tarafından kullanılan bir alanın kullanımının kontrolü ve tutarlılığının nasıl sağlanacağıdır. Senkron bir programlama anlayışı açısından bakıldığında sorun boyut değiştirmekte ve çözülmesi gereken sorun ortak kullanılan alanların her iki işlem için nasıl ortak kılınacağıdır. Bu sorunu çözmek amacıyla senkron işleyiş içinde bellek adresleri aktarımı yapılmakta ve bu sorun ortadan kalkmaktadır. Asenkron işleyiş içinde ise ortak kullanımda olan alanların işlemler arasında bir anlaşma şeklinde istenilen şekilde düzenlenmesi için kilit (lock) kavramı ortaya atılmıştır. Ancak bu anlayışında kendine göre çıkmazları bulunmaktadır. Buna en kolay örnek sonlandırıcı kilitlenme (dead lock) dir. Bu kilitlenmede iki görev birbirleri açısından kritik alanları kilitlemekte ve kilitlenmeye uğrayan bu görevler de bu kritik kaynakları açacak başka bir görev olmadığından zaman gecikmesi(time out) sonucu sonlandırılmaktadır. Bu tür kilitlenmelerden korunmak için farklı algoritmalar ortaya atılmıştır. Đşletim Dizileri (threads) Görev bir programın işletimine verilen addır. Kimi programlar, yerine getirdikleri işlev açısından koşut işletilebilecek kesimler içerir. Bu kesimlerin tek bir program içinde yer almaları ardı ardına işletilmelerini zorunlu kılar. Koşut işletilebilir her kesim için ayrı bir program öngörüp bunları koşut işletmek ve bu yolla işletimi hızlandırmak ve verilen hizmetin niteliğini arttırmak mümkünüdür. Ancak ortak bir amaca(işleve) dönük değişik kesimlerin ayrı programlar tarafından ele alınması, bu kesimlere ana bellekte işletim sistemi tarafından ayrı adres (kod ve veri) alanları ayrılması sonucunu doğurur ve söz konusu kesimlerin ortak verileri paylaşmalarını zorlaştırır. Bu paylaşım çoğunlukla bir programın adres evreninden diğer bir programın adres evrenine veri aktarma yoluyla gerçekleşir. Örneğin UNIX - 4 -

işletim sisteminde koşut çalışan iki ayrı programın(görevin) veri alışverişi, genelde bir adres evereninden diğer bir adres evrenine veri aktarımı yapan pipe ve fifo gibi kimi görevler arası veri iletişim araçları(sistem çağrıları) ile, işletim sistemi ve sistem kaynakları yönünden pahalı bir biçimde mümkün olabilmektedir. Bu durum aslında işletim sisteminin her görevi tek bir işletim dizi gibi görmesinden kaynaklanmaktadır. Tek bir program içinde birden çok koşut çalıştırılabilir işletim dizisi öngörülebilmesi durumunda bu dizilerin aynı adres evrenini paylaşması ve bu yolla veri alışverişinin kolaylaştırılması sağlanır. Bir program içinde yer alan koşut çalıştırılabilir kesimler işletim dizileri(threads) olarak adlandırılır. Bu bağlamda görev, ilgili işletim dizlerinin çalıştığı ortak bir işletim alanı olarak düşünülür. Đşletim sistemi, ana bellek, giriş/çıkış (kütükler) gibi sistem kaynaklarını görevler düzeyinde atar ve o düzeyde izler. Bir görev içinde tanımlı işletim dizileri söz konusu bu kaynakları paylaşırlar. Ancak işletim dizi olarak tanımlanmış her kesimin kendine özgü bir program sayacı bulunur. Bu yolla ana işlem birim(ler)ine ayrı ayrı anahtarlanarak koşut bir biçimde işletilebilirler. Bir göreve ilişkin işletim dizilerinin ana işlem birimine anahtarlanmaları görev anahtarlama ya göre daha dar kapsamlı dolayısıyla hızlı ve daha ucuz bir yol olan bağlam anahtarlama yoluyla gerçekleşir. Đşletim dizileri, aynı görevler gibi, işletimleri sırasında hazır, bekler, çalışır gibi durumlarda bulunurlar. Đşletim dizilerinin yönetimi genelde, kullanıcı evreninde yada işletim sistemi evereninde olmak üzere iki değişik biçimde gerçekleşir. Eğer yönetim kullanıcı evreninde ele alınıyorsa işletim sistemi işletim dizilerinin varlığından habersizdir. Bu durumda kullanıcı evreninde çalışan bir yönetim paketi bir görev içinde tanımlanmış değişik işletim dizilerinin yönetimini üstlenir. Bir işletim dizisi herhangi bir sebepten işletimi bıraktığında, aynı görev içinde tanımlı hangi işletim dizisinin işletime alınacağını, ilgili görevle birlikte işletimde bulunan söz konusu yönetim paketi belirler. Aynı yönetim paketi birden çok işletim dizisi içeren programlar tasarlanırken, programcılara işletim dizisi tanımlama, çalıştırma, - 5 -

durdurma, zamanuyumlama gibi işlevleri de sağlarlar. Başka bir değişle bu tür programlar tasarlanırken ilgili paketin tanım ve işlevleri kullanılır. POSIX P-Threads ve Mach C-Threds, günümüzde bu tür işletim dizisi yönetim paketlerine verilebilecek adlardır. Kimi modern işletim sistemleri, görevlerin yanı sıra görevler altında yer alan işletim dizlerinin yönetimini de üstlenir. Çok işletim dizili işlem (multi-thread), bu durumda işletim sisteminin bu amaçla sağladığı sistem çağrıları kullanılarak gerçekleştirilir. Windows NT böyle bir işletim sistemine verilebilecek en belirgin örnektir. Çok işletim dizili işlemin, kullanıcı evreni yönetim paketleriyle mi yoksa işletim sisteminin sağladığı araçlarla mı ele alınması gerektiği halen tartışılan bir konudur. Her iki yaklaşımın da kendine özgü üstünlükleri ve sakıncaları söz konusudur. Bununla birlikte UNIX gibi çok yaygın kullanımı olan işletim sistemlerinde çok işletim dizili işlem, yukarıda anılan kimi yönetim paketleriyle gerçekleştirmenin dışında da başkaca bir seçenek mevcut değildir. Monitor Kavramı ve Kullanımı Monitor, birlikte çalışan görevlerin, ortak kaynağa erişim yapan yordamlarının (kritik kesilmelerinin) toplandığı kümeye verilen addır. Görevlerin ortak kaynağa erişimlerini denetim altında tutmanın bir yolu da bunların, kritik kaynaklara merkezi bir denetim altında erişmelerini sağlamaktan geçer. Monitor kavramının temelinde bu ilke yatar. Birlikte çalışan görevler programlanırken ortak kaynağa erişim yapacak yordamlar özel bir kümede toplanır. Bu kümenin tüm görevlerce bilinen özel bir adı bulunur. Đşletim aşamasında bir görev ortak kaynağa erişmek istediğinde, ilgili yordamı bu kümeden çağırır. Programlama aşamasında bu küme özel bir tür olarak, monitor biçiminde tanımlandığından, derleme aşamasında bu kümenin başına, karşılıklı dışlamayı sağlayacak gerekli karşılıklı dışlamayı sağlayacak dışlama komutları derleyici tarafından eklenir. Bu yolla bu kümeden aynı anda birden çok görevin yordam çağrısına izin verilerek ortak kaynağa aynı anda ençok bir görevin erişim yapması sağlanır. Görevlerin monitor da yer alan bir yordamı - 6 -

çağırmaları monitora girmeleri olarak nitelenir. Bir görev monitor içindeki bir yordamın işletimini tümüyle tamamlamadan diğer bir görev monitor içinden yordam çağıramaz. Başka bir değişle bir görev monitorun içinde iken başka bir görev monitora giremez. Bu amaçla monitora ilişkin bir bekleme kuyruğu da öngörülür. Yukarıda verilen açıklamalardan da anlaşılacağı gibi monitor bir programlama dili yapısıdır. Monitorla ilgili önemli bir sorun, monitora birkez girmiş bir görevin burada, karşılıklı dışlama gereğinin dışında, başka bir nedenle beklemesi gerektiğinde bu beklemenin, diğer görevleri kilitlemeden nasıl gerçekleşeceği sorunudur. N tutanaklık bir yastık üzerinden iletişim yapan iki görevin, bu yastığa erişim yapan kesimlerinin üretici-tüketici adlı bir monitor içine konduğu düşünülebilir. Bu görevlerden üretici olanının, monitora girerek, yastık doluyken buraya yeni bir tutanak eklemeye kalkması durumunda beklemeye alınması gerekir. Bu görev gerekli önlemler alınmadan beklemeye alınırsa, hala monitor içinde göründüğünden tüketici görevin monitora girmesi engellenir. Tüketici görev monitora girip bir bir tutanak almadan üretici görevin bekleme durumu son bulamayacağından, kilitlenme olarak bilinen, görevlerin karşılıklı bekleşme durumu ortaya çıkar. Bu önemli sakıncayı ortadan kaldırmak için kimi koşullarda, bekleme durumundaki bir görev, halen monitor içinde iken, diğer bir görevin de monitora girişinin sağlanması gerekir. Bunun için monitorda, koşul(condition) adlı yeni bir değişken türü ile bunlar üzerinde işlem yapan wait ve signal adlı komutlar tanımlanır. Wait komutu kendisini çalıştıran görevi koşul değişkenine bağlı bekleme kuyruğuna koyar. Signal komutu ise koşul değişkenine bağlı kuyruktaki görevi hazır görev durumuna getirir. Görevler monitor içinde bekleme koşul değişkeniolarak tanımlarlar. Monitor içinde sınanan bir koşul değişkeni bekleme yapmayı gerektiriyorsa wait komutu çalıştırılarak bekleme durumuna geçilir. Wait komutu, aynı zamanda, varsa, monitora girmeyi bekleyen bir görevin monitora girmesini de sağlar. Bekleme durumundaki bir görevin hazır görev durumuna geçebilmesi, monitora bundan sonra giren görevlerden birinin, aynı koşul değişkenine ilişkin signal komutunu çalıştırmasıyla gerçekleşir. - 7 -

Birlikte çalışan görevler yönünden monitor, bölüşülen ortak kaynak için vardır. Bir sistemde birden çok ortak kaynak ve bunların çevresinde kümelenen birden çok birlikte çalışan görev bulunur. Koşut işlem, her görev kümesi için ayrı bir monitor tanımlanarak yürütülür. Monitor yaklaşımını kullanan sistemlerde, zamanuyumlanmaları gereken yordamlar belli kümeler içinde toplandıklarından, semaforlar yada işletim komutları kullanılarak gerçekleştirilenlere göre daha kolay anlaşılır ve bakılır yazılımların elde edilmesi sağlanır. Daha önce de blirtildiği üzere, monitor bir programla dili aracıdır. Bu aracı kullanan sistem programcıları programladıkları görevler arası ayrıntılı zamanuyulama eklerini öngörme zorunluluğundan kurtulurlar. Zire monitor kullanımına olanak veren programlama dillerinde görevler arası zamanuyumla işlevi, tanım gereği, derleyici ve sistem yazılımlarının yükümlülüğüne girer. Monitor kullanımını destekleyen üst düzey programla dillerine örnek, java dır. Java, programların işletim dizileri içermesine olanak vermekte ve bunların zamanuyumlanmasını monitor yaklaşımıyla ele almaktadır. Bu amaçla, üretici-tüketici nitelikli işletim dizi sınıfları içinde, paylaşılan özel nesneye erişim yapan yordamlar: synchronized void yordam1(){ synchronized void yordam2(){ biçiminde, synchronized nitelikli herhangi bir yordam ençok bir işletim dizisinin işletilmesi sağlanmaktadır. Bu işletim dizisi paylaşılan nesneyle ilgili synchronized nitelikli bir yordamın işletimini tümüyle tamamlamadan diğer bir işletim dizisi de, aynı nesneye ilişkin synchronized nitelikli başka bir yordamı işletmeye kalktığında, bu sonuncunun, otomatik olarak bekler duruma geçmesi sözkonusu olmaktadır. Zira java da her nesne için bir kilit(lock) belirtici öngörülmekte ve synchronized nitelikli bir yordam bir nesne üzerinde işlem yaparken bu nesne kilitlenerek diğer synchronized nitelikli yordamların erişimine kapalı tutulmaktadır. Kilit belirteci, bu niteliğiyle, paylaşılan nesnenin (zamanuyumlanması gereken) yordam kümesini belirlemekte ve monitor olarak anılmaktadır. - 8 -

Peki, Đşletim Dizileri ile Asenkron programlama anlayışı arasındaki fark nedir? Bu soruya yanıt vermek için aşağıda verilen.net te yazılmış program parçalarını irdelemek gerekecektir. Đşletim Dizileri (threads) ve Asenkron Görevler Đşletim dizileri genel olarak bir görevin arka planda çalışması istendiğinde kullanılır ve bu yeni görevlerin yaratımı, yönetimi ve yaşam döngüleri ana görev tarafından belirlenir, bu paralel programlama ile benzetilebilir. Diğer taraftan asenkron programlama daha çok istem cevap (request-response) şeklinde işlemektedir. Bu bağımsız bir görevdir ve ana işletim dizisi cevabın nasıl oluşacağını, çalışacağını veya ne zaman yollanacağını bilemez. Sadece cevabın tamamlandığını veya oylanması gerektiğini bilir. Bunun dışında Đşletim dizilerinden hiçbir farkı yoktur. Bir kod parçasıyla örneklemek gerekirse; private WorkerMethod( void ) { while(true) // ever { Console.WriteLine("Hala Çalışıyor..."); Thread.Sleep( 2000 ); Thread BackgroundThread = new Thread( new ThreadStart( WorkerMethod )); Console.WriteLine("Arka fon işletim dizgesi yaratıldı"); BackgroundThread.Start(); Console.WriteLine("Arka fon işletim dizgesi çalıştırıldı "); - 9 -

bu kodda arka fonda çalışmak üzere bir WorkerMethod tanımlanmış ve çalıştırılmıştır. Bu işletim dizisi çalışırken ekranda görünen formun yerini Mouse yardımıyla değiştirmeye çalıştığımızda çıktı penceresinde yarattığımız işletim dizisini kesen başka görevlerin devreye girdiğini görebiliriz. Buda bize bloklayıcı metot çağrılarını kullanmamızın yolunu açar. Örneğin Socket.Connect() işletim dizgisi Connect() çağrısı sonlanana kadar bloklanmıştır ve bu sizin programınız tarafından kontrol edilemez. Asenkron programlama yakın bir davranış biçimiyle beraber daha farklıdır. Örneğin bir.net sunucuya bağlanmak istediğimizi düşünelim; MySocketState MySocketState; Socket MySocket; MySocket.BeginConnect( ConnectCallback, MySocketState ); // ön plan çalışmasına devam et BeginConnect() çağrısı bloklamaz ve hemen ön plan işletim dizesi geri işlemeye devam eder. Bir yandan da arka fonda sizin için bir işletim dizisi çalışmaya devam eder. Ne zaman cevap gelirse o sizin yerinize callback metodunu çağırır. private void ConnectCallback( IAsyncResult AResult ) { Socket S = (Socket)AResult.AsyncState; Socket ClientSocket = S.EndConnect( AResult ); // işleme devam edilebilir ClientSocket.BeginReceive(...); Asenkron çağırma özelliğini tamamlamak için EndXXX() metodu çağrılmalıdır, burada bu metot EndConnect() olarak geçmektedir. Burada tanımlamanız gereken metotlar BeginXXX() ve EndXXX() metotlarıdır, ki bunlar işletim dizisi havuzunda çalışmakta olan arka fon görevlerdir. Bu işletim dizilerinin nasıl çalışacağı hakkında bir bilgiye ihtiyacınız yoktur, çünkü bunlar sistem tarafında belirlenir. Bu örnek için tavsiye edilen yöntem elbette asenkron yöntemdir, çünkü sistem - 10 -

kaynakları boş yere harcanmamakta, program işlem karmaşıklığından kurtulmaktadır. Şimdi senkron asenkron programlama ayrımına varabilmek için farklı bir örnek inceleyelim. Bir Senkron Asenkron Programlama Karşılaştırması (Synchronous versus asynchronous programming) Genel tanımıyla; Senkron programlarda görevler arası iletişim yastık alanları kullanılmadan yapılmakta ve görevler birbirlerini bilgi transferi bitene kadar beklemektedir. Asenkron programlarda görevler arası iletişim için kullanılan yastık alanları vardır ve bu alanların büyüklükleri kavramsal olarak sınırsız kabul edilir. Gönderici hiçbir zaman gönderdiğinin ardında beklemez, alıcı ise sadece yastık alanı boş ise bekler. Ortada birçok, asenkron mesajlaşma düzenlemesini kesin belirleyen protokoller vardır. Bazıları bir çift görev arasındaki adres düzenlemesi, bazıları ise çoklu görevler arasındaki düzenlemelerdir. Bununla beraber bir düzenleme çok kesin ve kolaylıkla yapılabilmektedir ( örneğin sebepsel düzenleme Causal Ordering (CO)), buna rağmen da asenkron programlama hiçbir zaman kolaylıkla yapılamaz, çünkü asenkron programlama açısından, dağıtılmış sistemlerde programlar için hız kısıdı ve etkili çözüm çok önemlidir. Aslında, asenkronizasyon birçok insana görünenden daha zordur. Çok çeşitli sistemler çok farklı noktalarda asenkronizasyon kullanırlar ve bunu çoğu zaman tam doğru bir dokümantasyon yapmadan, hangi modelin kullanıldığını anlatmadan, açık bir anlayış sergilemeden yaparlar. Örneğin GAY (grafik ara yüzü) kullanan uygulamalar, ara yüzlerinin biraz hızlı kullanımı sonucu kolaylıkla çökerler ve bunun sebebi çoğu kez tam olarak tespit edilemez. Bunda en büyük sebebin probleme yol açan - 11 -

sistemin tam olarak dökümante edilmemesi olduğu genel bir kanıdır. Çünkü doküman eksikliği sebebiyle sorunun tam olarak kalbine inilememektedir. Örnek verecek olursak DIVE nin kullanım talimatlarında şöyle bir bölüm geçmektedir; bir özelliğin bir değerinin tüm DB anında günlendiğinden emin olunamaz. Bu sebeple programlama yaparken en dikkat etmeniz gereken husus sıklıkla değişikliğe maruz kalan DB içerikleridir. Eğer DB i günleme işleminden daha hızlı bir şekilde günlemeye çalışırsanız bu eninde sonunda çıkmaz bir durumla karşı karşıya kalacaksınız anlamına gelmektedir. Bu paradoksal problem tüm noktadan-noktaya (peer-to-peer) iletişim kuran birimler arasında yaşanan ve kalıtımsal olarak geçen bir sorundur. Eğer bir veriyi bu şekilde çok hızlı bir şekilde günleme istiyorsanız DIVE bu iş için uygun bir platform olmayabilir DIVE nin bahsedilen durum için çözümü veriyi çok hızlı bir biçimde değiştirmemektir, aksi taktirde, program er yada geç normal olmayan bir biçimde sonlanacaktır. Burada aradaki farkı belirtilmek yerine asenkron program az yada çok bir biçimde senkron bir program gibi tanımlanmıştır. Peki gerçekten yapılan iş sırasıyla belirtilmiş midir? Bir düğümün güncellenmesi bir başka düğümü etkilerse ne olacak? Đnsanlar genelde iletişim modelini tam olarak anlamadan bu problemi atlar ve geçerler çünkü çoğunlukla çalışmayan parça sistemde hayati önem taşımaya bir noktada bulunmaktadır. Örneğin kullanıcı bir yerde Mouse a çok hızlı ardı ardına tıklar ve sonuçta hemen bir hata mesajı alır. Bu yüzden kullanıcılar ya hatanın kendisinden kaynaklandığını düşünür ya da bu küçük hatayla çok sık karşılaştıkları için bu konuyu es geçerler. Ancak bu düşünce tarzı, sorunla başa çıkılabilmesi için kabul edilebilir değildir. Bu soruna ilişkin bir çözüm gerekmeyen yerlerde asenkron modelin kullanılmaması, yerine senkron modelin kullanılmasıdır. Fakat bu iki modeli bir arada kullanmak pek kolay değildir. Aşağıda bu iletişim modelleri açıklanmaya çalışılacaktır. - 12 -

Görüldüğü gibi en genel bakış açısıyla iki programlama anlayışının da birbirlerine göre artıları ve eksileri bulunmakta, her iki anlayışın da kullanılması için kaçınılmaz sebepler bulunmaktadır. Biz araştırma konumuzun bundan sonraki kısımlarında asenkron programlama anlayışı üzerinde duracak, zaman zaman da senkron programla anlayışı ile kıyaslamalar yapılacaktır. Fakat unutulmamalıdır ki mantıksal anlamda her yöntemin kullanılması için kendilerine göre kaçınılmaz noktalar vardır ve günümüze kadar evrimleşerek gelen bu anlayışlar daima bir bütün olarak programlama anlayışında kullanılmışlar ve kullanılacaklardır. JAVA ĐLE PARALEL PROGRAMLAMA ÖRNEĞĐ Gerçekleştirmeye çalışacağımız programla örneği ile java da paralel programlama mantığına anlatmaya çalışacağız. Verilecek örnek çok temeldir. Ancak java da paralel programlama yapacak bir kişinin kesinlikle bilinmesi gereken çok temel bilgiler içermektedir. Yapacağımız örnekte geçecek olan bazı teknik terimler şunlardır; synchronized : daha önce de anlatıldığı gibi, kritik kaynağa erişmede kitlenmesi istenen yordam yada nesnelerin bu anahtar kelime sayesinde kilitlenmeleri java da mümkündür. Synchronized anahtar kelimesi ile bir blok kitleneceği gibi bir metod da kilitlenebilir. Örneğin; synchronized(toplam){ sayac++; toplam.arttir (arritmamiktari); settext(); sleep(uyumasuresi); - 13 -

Yukardaki örnekte toplam adındaki obje (referans) diğer objelerin kullanımına kapatılmıştır. Diğer bir kullanım şekli de: private synchronized void senkronislem(){ synchronized(toplam){ sayac++; toplam.arttir (arritmamiktari); settext(); sleep(uyumasuresi); Şeklindedir, bunun anlamı ise bu metod kesiminin çalışması aşamasında diğer kesilmeye uğramamasıdır. wait() metodu Object ten kalıtımla gelen bir metoddur ve parametresiz olarak yazıldığında, işletilmekte olduğu objeyi bekleme konumuna getirerek objenin çalıştığı monitor a başka objelerin de girmesini sağlar. sleep() bu fonksiyon da tıpkı wait() gibidir ancak wait-notify ikilisi kullanılabilirken sleep-notify ikilisinin kullanımı sonuç vermez. Bunun anlamı sleep() komutuyla beklemeye alınan bir thread bu süreden daha fazla süre de uykuda kalabilir. Ayrıca sleep() metodu Thread den kalıtarak geçer. notify(), notifyall() metodları da Object le kalıtarak gelen metodlardır, bunlar wait() in aksine bulunduğu monitordeki kitli olan thread leri açmaya yarar. notifyall() monitordeki tüm thread leri serbest bırakır, bu durumda monitore bir sonra anahtarlanacak thread herhengi bir thread olabilir. Program Arayüzü-Tanımı: Program geliştirme platformu:netbeans ide 5.0.2 beta verison Kullanılan Java versiyoun: java version "1.5.0_06" - 14 -

Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05) Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode, sharing) Đşlemci: AMD Athlon XP+ 2500@2200Mhz Class diagram : Class diagram dan da anlaşılacağı gibi görsel arayüzümüz Ekran adlı sınıfta tanımlanırken, kullanacağımız Thread ler olan s1 ve s2 ise Sayici sinifinin birer nesnesidir. Ayrıca Sayici sınıfının içinde yer alan toplam static nesnesi ise Toplam sınıfından olan basit bir nesnedir. toplam static nesnesi s1 ve s2 nesneleri için kritik kaynak niteliğindedir. Program çok basit bir ilkeyle çalışır. Her thread (s1 ve s2) kendilerine verilen artış miktarına göre toplam static nesnesi içinde olan toplam:double değerini arttır yada azaltırlar. Yaptıkları her arttırma yada azaltma sonunda kendilerine verilen JTextField leri ve bahsedilen toplam nesnesini günlerler. - 15 -

Ekranın sol tarafındaki değerler s1 için sağ tarafındakiler ise s2 threadleri için kullanılırlar. Yukardaki şekilde gözüken sayaç 1 ve sayaç 2 alanları yazılabilir alanlar değildirler ve her bir thread için başlangıç değerleri 0 dır. Bu alanlara yazılacak değer class diagramda Sayici sınıfının bir niteliği olan sayac değeridir. - 16 -

Şekilde yer alan artırma miktarı alanı ise sadece başlata basmadan önce yazılabilir bir alandır. sayaç 1 s1 in her devreye girişinde ekranın sol tarafındaki artırma miktarı kadar arttırılır. Bu işlem aynı şekilde toplam için de yapılır. Yani s1 veya s2 her devreye girişinde hem kendi içlerindeki sayaçları artış miktarına göre arttırırlar hemde toplam içindeki toplam değerini artış miktarına göre arttırırlar. Şekilde görünen JSplitter lar ise threadlerin sayı saymadaki hızlarını belirlemek için kullanılırlar. Bunun anlamı threadlerin ne kadar süre uyumaları gerektiği bu kaydırıcılarla belirlenebilir. Kaydırıcılar program çalışmaya başladıktan sonra da değiştirilebilir. Class digramda Sayici içindeki uyumasuresi, jsplitterların değerleri değiştikçe günenirler bu sayede dinamik bir yapı elde edilmiş olunur. Bununla ilgili kod kesimi aşağıdaki gibidir: Public class Sayici{ private void islem() throws InterruptedException{ sayac++; toplam.arttir (arritmamiktari); settext(); sleep(uyumasuresi); - 17 -

Şekilde görünen öncelik seçici düğmeler ise threadlerin (s1 ve s2) önceliklerini belirlemede kullanılırlar. Program varsayılan şekilde başlatıldığında bu sekmelerin değiştirilmesinin hiçbir işe yaramadığını kolaylıkla görebiliriz. Çünkü threadlere uyumaları için verilen sürede işlemciyi kullanmadıkları düşünüldüğünde, her bir thread için bir toplama ya da çıkarma işlemi yapmak çok kısa süreceğinden, böyle bir durumda öncelik sıralaması gerekmeksizin threadler işlemlerini verilen sürelerde kolaylıkla bitirebileceklerdir. Öncelik belirlemesi sekmelerini işe yarar şekillerde kullanabilmek için yapılması gereken işlem, önceden bahsedilen sayma hızını 0 a getirmektir. Sayma hızının 1/0 a getirilmesi demek işlemler için yeterli sürenin threadlere verilmemesi anlamına gelmektedir. Böyle bir durumda ana işlem birimine anahtarlanabilmek için öncelik önem kazanır ve thread in ana işlem birimine anahtarlanma süresini bu öncelik belirler. Ancak programlama aşamasında karşılaşılan en önemli sorun testler sırasında bilgisayarın kilitlenme derecesine gelmesi ve gui içinde kullanılan JTextField objelerinin zaman zaman yanlış değerlerle set edilmesi idi. Bu sorunları aşmak için aşağıdaki kod kesimi kalınitalik alanlar sonradan eklenerek elde edildi - 18 -

public synchronized void settext () { try { synchronized(texttf){ texttf.settext (sayac+""); sleep(1); synchronized(toplamtf){ toplamtf.settext(sayici.toplam.ver ()+""); sleep(1); catch (InterruptedException ex) { ex.printstacktrace(); Bu kod kesiminde amaç tamamen görsel arayüze kendini toparlayabilmesi için süre tanımaktır. Yukarda görülen şekildeki senkronize sekmesi iki thread için de kritik olan toplam objesinin kilitlenerek kullanılıp kullanılmayacağını belirler. Bu sekme işaretli ise toplam objesi, sekmenin işertli olduğu thread içinde kilitlenir. Bunu sağlaya bilmek için objelerin içinde senkron:boolean adından bir nitelik bulunur. Bu nitelik thread içindeki run fonksiyonunda - 19 -

kritik kaynağın kilitlenip kilitlenmemesine göre iki farklı metoddan birini çağırır. Bu amaçla aşağıdaki kod kesimi yazılmıştır: private synchronized void senkronislem() throws InterruptedException{ synchronized(toplam){ sayac+=arritmamiktari; toplam.arttir (arritmamiktari); settext(); sleep(uyumasuresi); private void islem() throws InterruptedException{ sayac+=arritmamiktari; toplam.arttir (arritmamiktari); settext(); sleep(uyumasuresi); public void run() { try { while(true){ if(senkron) senkronislem(); else islem(); catch(interruptedexception e){ Yukardaki koddan da anlaşılabileceği gibi, eğer senkron mod çalışmakta ise toplam objesi kilitlenir. Son olarak bahsedilmesi gereken sekme duraklama süresi kesimidir. Buradaki JSplitter dur düğmesine basıldığında uyumanın ne kadar süreceğini belirler. - 20 -

Programla ilgili bahsedilmesi gereken son kesim konsol çıktı kısmıdır. S1 veya s2 de dur a basıldığı anda o thread duraklama süresi kadar beklemeye geçecektir. Peki duraklamayan thread o süre içinde ne kadar saymıştır sorusuna cevap bulamak için böyle bir yöntem benimsenmiştir. - 21 -

Programın Çalıştırılması ve Sonuçları Örnek 1 S1: S2: Arttırma miktarı : 1 Arttırma miktarı : -1 Sayma hızı : 0 Sayma hızı : 0 Öncelik : Az Öncelik : Normal Senkronize :değil Senkronize :değil Program bu değerler ile günlendiğinde bir - iki saniye sonra oluşan çıktı; sayaç 1 = 307, sayaç 2 =-454, toplam sayaç = -148 Görüldüğü gibi sonuç öncelik farkı nedeniyle thread 2 ye doğru kaymıştır. Ayrıca toplam sayaç = sayaç 1 + sayaç 2 olması gerekirken 307+-454=-147 dir. Sonucun böyle farklı olmasındaki sebep yazılan program içinde toplam ve sonuç değerlerinin aynı anda günlenememesi yani görüntü arabiriminin göreli yavaşlığından kaynaklanabilmektedir. Ayrıca kritik kaynak olan toplam ın kilitlenmemiş olması ise olası bir başka etkendir. - 22 -

Örnek 2 S1: S2: Arttırma miktarı : 1 Arttırma miktarı : -1 Sayma hızı : 0 Sayma hızı : 0 Öncelik : Az Öncelik : Normal Senkronize :evet Senkronize :evet Program bu değerler ile günlendiğinde üç-dört saniye sonra oluşan çıktı; sayaç 1 = 425, sayaç 2 =-427, toplam sayaç = -1 Önceliğinin yüksek olmasına rağmen toplam sayacının değerinin 0±5 olması dikkat çeki olduğu kadar synchronized ın ne işe yaradığınıda ortaya koymaktadır. Ortak (kritik) kaynak olan toplam kilitlendiği için s1 ve s2 threadi karşı taraf serbest bırakmadan toplam a erişemedikleri için öncelikleri yüksek olsa bile toplam ı değiştirememektedirler. Ayrıca burada işlemcinin veriminin düştüğü de gözlemlenmiştir. Đlk örneğe göre daha uzun sürmesine karşın işlemci hemen hemen aynı miktarda bu threadlere anahtarlanmıştır. Burada yapılabilecek başka bir deneme de duraklama süresini 1 gibi yüksek bir değere getirerek, örneğin s1 de dur a basmaktır. Bunun sonucnda oluşan çıktı: s1 uyu s1 uyan s1 uyanana kadar; sayac 1: 1 tane saydi sayac 2: -254 tane saydi şeklinde olmuştur. - 23 -

Örnek 3 S1: S2: Arttırma miktarı : 1 Arttırma miktarı : -1 Sayma hızı : 0.05 Sayma hızı : 0.5 Öncelik : normal Öncelik : Normal Senkronize :evet Senkronize :evet Program bu değerler ile günlendiğinde altı saniye sonra oluşan çıktı; sayaç 1 = 12, sayaç 2 =-12, toplam sayaç = 0 şeklinde olmuştur. S1 in 6 saniyede tek başına sayması gereken miktar 120 iken sadece 12 tane saymasındaki sebep yine kritik kaynak olan toplam ın kilitlenmesidir. Her ne kadar s1 s2 nin yarım saniyelik uykusundan ötürü boş kalsa da, s2 nin uykuya girerken toplam kritik kesimini de kitlemesi s1 in bu kritik kesime ulaşamamsına dolayısıyla toplamı arttıramamasına, bunun sonucu olarak da o kad satırında beklemesine (toplamı günleme satırı) yol açmıştır. -SON- - 24 -

Kullanılan programlar: Windows XP sp2 Netbeans ide 5.0.2 beta java version "1.5.0_06" Java(TM) Eclipse 3.1 Office 2003 Mozilla firefox Macromedia Firewroks Screenshot utility Kullanılan Donanım: Asus a7v600 Amd athlon xp+ 2500@2200Mhz 1GB ddr ram Nvidia 6600GT TDH Klavye Mouse Samsung 793 df monitor Philips cdwriter Kaynakça, Yararlanılan internet siteleri: o http://www.seslisozluk.com o http://mindprod.com/jgloss o http://www.idevelopment.info/data/programming/java/th reads o http://www.cs.clemson.edu/~cs428/resources/java/tutor ial/jtthreadex.html o http://www.javaworld.com/javaworld/jw-04-1996/jw-04- threads.html o http://wwwhome.cs.utwente.nl/~schooten/syncasync.html o http://msdn.microsoft.com/library/default.asp?url=/li brary/enus/cpguide/html/cpconasynchronousprogramming.asp o http://www.javaworld.com/javaworld/jw-04-1996/jw-04- threads-p2.html Yararlanılan Kitap: o Bilgisayar Đşletim Sistemleri : Prof. Dr. Ali SAATÇĐ - 25 -