Previous
Next

JAVA - Thread kavramı ve Thread Dump

by Cem Kefeli 15. Mayıs 2015 05:50

Tüm java makalelerime buradan ulaşabilirsiniz...Java

Daha önce çok kanallı programlama nedir ve ne işe yarar türünden soruların cevabını bulabilmek amacıyla buradaki (Çok kanallı/Multi-Threaded programlama) yazımda daha çok konsept olarak ele almıştık thread kavramını. Bu yazıda ise bir java uygulaması ayakta ve çalışır durumdayken thread'ler ile ilgili başımıza gelebilecekler problemli senaryoları nasıl yorumlamamız gerektiği karşımıza çıkıyor olacak.

Uygulamada oluşturulan her bir thread'in tabiki uygulama sunucuda da bir karşılığı olmak durumunda. Yani bir yazılım içerisinde oluşturulan thread'lerden her birisi uygulama sunucusu tarafından da yönetilebilir ve takip edilebilir olmalı. Kurumsal uygulamaların çok çok büyük bir kısmı aynı anda birden çok iş yapabilecek şekilde dizayn ediliyorlar. Hal böyle olunca da birçok thread aynı anda çalışmak durumunda kalıyor. Aynı anda çalışan bu iş parçacıkları ise yaptıkları işlerin niteliğine göre farklı sürelerde işlerini tamamlayabiliyorlar. İşlerini tamamlayan thread'ler üzerine düşeni yapmış olmanın sevinciyle köşelerine çekiliyorlar ve başka thread'lere yer bırakıyorlar.

İşte tam bu aşamada gerçek hayatımıza geri dönecek olursak, thread'ler ile ilgili belki de en problematik durumun köşelerine çekilemeyen, bir nedenle işlerini tamamlayamayan kod parçacıkları olduğunu göreceğiz. Kod parçacığı diyorum çünkü problematik durumlar için bir kusur aramak gerekirse bunun kusurlusu thread mantığı ya da thread'in ta kendisi değildir. Thread nihayetinde içerisinde bulunan kod parçacıklarının işlevini yerine getiriyor. Asıl önemli olan, iş yapan kod parçacığının ne kadar kaliteli dizayn edildiğidir.

Gerçek hayattan bir sorun anını ele alalım. Örneğin bir iş parçacığı yaptığı işin bir bölümünde bir WEB servise istek yapıyor ve cevap bekliyor olsun. Burada biz cevap beklediğimiz için kendimize müşeri diyebiliriz. Herşey yolundayken, cevap beklenilen servis tıkır tıkır cevap veriyorken uygulamacının yani müşterinin hayatını kaotik olarak etkileyen pek birşey yoktur. Ama işler ters gitmeye başladığı ve cevap beklenilen servis cevap veremez hale geldiği zaman, siz de bir anda cevap veremez hale gelebilirsiniz, sizin de müşterilerininiz artık beklemeye başlar. Bir anda bakmışsınız servis alınan hat boyunca herkes birbirini bekliyor...

Java Thread Life CycleTam da "Biz acaba neyi bekliyoruz?" sorusuna cevaptır "Neden thread dump'a ihtiyacım var?" konusu. Uygulama thread'lerinin anlık bir görüntüsüdür, thread dump. O an hangi thread'ler aktif, hangi class'lar iş yapıyor, nerede bekleniyor sorularının yüzelsel olarak cevaplarını verebilir. Oluşan dump dosyasının içeriği ve formatı kullanılan JVM'in versiyonuna, sağlayıcısına göre değişecektir. Unix/Linux temelli sistemlerde basit bir şekilde "kill -3 <Process ID>" komutu yardımıyla oluşturulabilir. Oluşan dump içeriği genellikler 'out' loga yazılıyor olur ama yine uygulama sunucusuna ve JVM'e göre değişiklik gösterecektir. Örneğin Websphere için farklı bir dosya olarak profil altına atılacaktır.

Aldığınız dump dosyasını bir 'Thread Dump Editor' ile inceleyecek olursanız thread'lerin statülerinin yandaki şekilde gösterilenlerden birisi olduğunu görürsünüz. İsimleri yine JVM'den JVM'e değişebilir ama anlamları aynı olacaktır. Dump incelenirken asıl odaklanılması gereken 'Blocked' ya da 'Stuck' olarak bahsedilen bir süredir işini yapmaya çalışana ama bir türlü bitiremeyen thread'ler olmalıdır. 

IBM Installation Manager kurulumu

by Cem Kefeli 4. Şubat 2015 02:21

Sistemlerinize IBM Installation Manager (IM) kurarak Websphere ürününün kurulumunu ve kurulum sonrası oluşabilecek patch ihtiyaçlarını IM üzerinden yönetebilirsiniz. IM güncel versiyonu IBM download sayfalarında yer almaktadır. Kurulum aşamaları için hem görsel hem de gerekli örnek komutları içerecek şekilde aşağıdaki gibi bulabilirsiniz.

[websphere@localhost installations]$
[websphere@localhost installations]$ pwd
/u01/app/IBM/installations
[websphere@localhost installations]$
[websphere@localhost installations]$ ls -lrt
total 153496 
-rw-rw-r--. 1 websphere websphere 157177192 Dec 23 11:17 BASETRIAL.agent.installer.linux.gtk.x86.zip
[websphere@localhost installations]$
[websphere@localhost installations]$
[websphere@localhost installations]$ mkdir BASETRIAL.agent.installer.linux.gtk.x86
[websphere@localhost installations]$
[websphere@localhost installations]$ ls -lrt
total 153500
-rw-rw-r--. 1 websphere websphere 157177192 Dec 23 11:17 BASETRIAL.agent.installer.linux.gtk.x86.zip
drwxrwxr-x. 2 websphere websphere      4096 Dec 23 11:22 BASETRIAL.agent.installer.linux.gtk.x86
[websphere@localhost installations]$
[websphere@localhost installations]$ unzip BASETRIAL.agent.installer.linux.gtk.x86.zip -d BASETRIAL.agent.installer.linux.gtk.x86
[websphere@localhost installations]$ cd BASETRIAL.agent.installer.linux.gtk.x86
[websphere@localhost BASETRIAL.agent.installer.linux.gtk.x86]$ ls -lrt
total 588
-rwxr-xr-x.  1 websphere websphere  63050 Aug  9  2012 userinstc
-rwxr-xr-x.  1 websphere websphere  63050 Aug  9  2012 userinst
-rwxr-xr-x.  1 websphere websphere  63050 Aug  9  2012 installc
-rwxr-xr-x.  1 websphere websphere  63050 Aug  9  2012 install
-rwxr-xr-x.  1 websphere websphere  63050 Aug  9  2012 groupinstc
-rwxr-xr-x.  1 websphere websphere  63050 Aug  9  2012 groupinst
-rwxr-xr-x.  1 websphere websphere  10776 Sep 16  2014 readme.html
drwxr-xr-x.  2 websphere websphere   4096 Nov 26  2014 Offerings
drwxr-xr-x.  2 websphere websphere   4096 Nov 26  2014 features
drwxr-xr-x.  3 websphere websphere   4096 Nov 26  2014 jre_7.0.7001.20140909_1712
-rwxr-xr-x.  1 websphere websphere    232 Nov 26  2014 user-silent-install.ini
-rwxr-xr-x.  1 websphere websphere    178 Nov 26  2014 userinst.ini
-rwxr-xr-x.  1 websphere websphere    223 Nov 26  2014 userinstc.ini
drwxr-xr-x.  2 websphere websphere   4096 Nov 26  2014 tools
-rwxr-xr-x.  1 websphere websphere    225 Nov 26  2014 silent-install.ini
-rwxr-xr-x.  1 websphere websphere  10749 Nov 26  2014 repository.xml
-rwxr-xr-x.  1 websphere websphere    201 Nov 26  2014 repository.config
drwxr-xr-x. 11 websphere websphere 106496 Nov 26  2014 plugins
drwxr-xr-x.  2 websphere websphere   4096 Nov 26  2014 native
drwxr-xr-x.  2 websphere websphere   4096 Nov 26  2014 license
-rwxr-xr-x.  1 websphere websphere    174 Nov 26  2014 install.ini
-rwxr-xr-x.  1 websphere websphere    219 Nov 26  2014 installc.ini
-rwxr-xr-x.  1 websphere websphere    176 Nov 26  2014 groupinst.ini
-rwxr-xr-x.  1 websphere websphere    221 Nov 26  2014 groupinstc.ini
drwxr-xr-x. 13 websphere websphere   4096 Nov 26  2014 documentation
-rwxr-xr-x.  1 websphere websphere   2225 Nov 26  2014 consoleinst.sh
drwxr-xr-x.  3 websphere websphere   4096 Nov 26  2014 configuration
-rwxr-xr-x.  1 websphere websphere   1046 Feb 12  2015 install.xml
[websphere@localhost BASETRIAL.agent.installer.linux.gtk.x86]$
[websphere@localhost BASETRIAL.agent.installer.linux.gtk.x86]$
[websphere@localhost BASETRIAL.agent.installer.linux.gtk.x86]$ DISPLAY=172.24.36.86:0.0; export DISPLAY;
[websphere@localhost BASETRIAL.agent.installer.linux.gtk.x86]$ echo $DISPLAY;
172.24.36.86:0.0
[websphere@localhost BASETRIAL.agent.installer.linux.gtk.x86]$
[websphere@localhost BASETRIAL.agent.installer.linux.gtk.x86]$
[websphere@localhost BASETRIAL.agent.installer.linux.gtk.x86]$ ./userinst

IBM Installation ManagerFazlası...

Twitter'da 140 karakter sınırını aşmanın yolu: tweetizr

by Cem Kefeli 8. Aralık 2014 12:50

Twitter kullanıcıları bilirler ki her bir tweet en fazla 140 karakter içerebilir. Eğer siz de sıkı bir Twitter kullanıcısıysanız mutlaka bu karakter sınırıyla ilgili çeşitli yakınmalarınız olmuştur. Aslında bu durum Twitter'ın konseptinden kaynaklanıyor. Yani amaç kısa kısa mesaj vermek. Facebook'taki gibi paragraflar yazmak değil... Amaç daha kısa, ve daha öz... Bununla beraber Twitter '+' karakteriyle mesajları bağlamanızı da desteklemiyor değil. Mesela '+' karakteriyle bağlanmış mesajları tümden retweet edebiliyorsunuz. Yani bir yandan bir derece de olsa kullanıcıların hassasiyetini dikkate alıyor ama asıl konseptinden de vaz geçmiyor doğal olarak.

Geçtiğimiz günlerde kendi yapmış olduğum tweetizr isimli uygulamayı Google Play Store'da yayımlamaya başladım. Uygulama ismini tweet'leştirmek anlamına gelen ve kendi türettiğim tweetizr kelimesinden alıyor. Temel olarak sizin yerinize tweet'lerinizi parçalara ayrmaya yarayan kullanışlı ve basit arayüze sahip bir uygulama. Siz atmak istediğiniz tweet'i tek bir paragraf halinde yazıyorsunuz ve sonrasında uygulama size bu tweet'i gönderdiğinizde nasıl bir görüntü oluşacağı ile ilgili ön izleme sunuyor. Bu ön izleme ekranı size tweet'lerin sıralanış şeklini, bağlama şeklini düzenleme fırsatı veriyor. Eğer bir düzeltme yoksa doğrudan post edebiliyorsunuz. Bu arada uygulama kesinlikle ve kesinlikle kullanıcı adınız ve şifrenizle ilgilenmiyor. Siz kullanıcı adınızı ve şifrenizi twitter ekranlarınızda giriyorsunuz ve bu ekranlarda tweetizr'ı yetkilendiriyorsunuz. Uygulamayı bu şekilde design etmemin hem kullanıcılara daha fazla güven sunacağını düşündüm hem de zaten kullanıcıların kullanıcı adı ve şifre türünden bilgilerinin güvenliğini sağlamak gibi bir yük altına girmek istemedim.

Uygulama'nın şu an için yalnızca ücretsiz versiyonu mevcut ve her hangi bir reklam da içermiyor. Yalnızca %33 oranında bir ihtimalle göndermiş olduğunuz tweet'lerin en son mesajına "powered by tweetizr" ibaresi ekliyor. Bu metni de her mesajınıza değil, verdiğim orandaki gibi her üç mesajdan birisine denk gelirse ekliyor. Böylece çok sıkıcı bir reklam görüntüsü de oluşturmuyor. Bu ücretsiz versiyonda toplamda 5 tweet'e kadar mesaj atabiliyorsunuz. Pro versiyonda tweet sayısını 15 yapmayı planlıyorum fakat yine de limitsiz olmasını düşünmüyorum. Çünkü 15 tweet'i aşan mesajların çok fazla uzayabileceği ve anlamını yitireceğini düşünüyorum yukarıda bahsettiğim nedenlerden dolayı.

Aşağıda uygulamanın ekranlarına ait Google Play'e de koyduğum birkaç görüntü paylaşıyorum. Uygulamayı edinmek için Google Play'de "tweetizr" diye aratabilir ya da tweetizr.com adresini ziyaret edebilirsiniz. Son olarak kullanışlı olması dileğiyle uygulamanın ismini koymamda fikirleriyle destek olan İsmail Başoğlu'na teşekkür ederim...

tweetizr screenshot tweetizr screenshot tweetizr screenshot tweetizr screenshot
tweetizr screenshot tweetizr screenshot tweetizr screenshot

JAVA - Çok kanallı (Multi-Threaded) programlama

by Cem Kefeli 16. Haziran 2014 00:00

Tüm java makalelerime buradan ulaşabilirsiniz...Java

Yazdığım 15 kadar Java makalesinden sonra düşündüm ki Java'da çok kanallı programlamadan bahsetmemek büyük bir eksiklik olmuş bu yazı dizisi için. Şu sıralar üzerinde uğraştığım bir proje de bu durumu biraz tetikledi açıkçası. Hazır çok kanallı programlamaya (ki bundan sonra multi-threading diyeceğim...) derinlemesine inmişken bu konuya da yüzelsel olarak bir değinmek istedim.

Programlama dillerini iş yapan bir işçiye benzetirsek, tıpkı bir işçi gibi işlerini belirli bir sırayla yaptığını görürürüz. Yani bir program parçacığı çalışır, bir işi yapar, bititir, sonra bir diğer işe başlar, onu bititir, sonra bir yenisine başlar. Süreç bu şekilde kendisine verilen işler bitene kadar devam eder. Eğer yalnızca bir işçiniz varsa burada işçi için değil de iş süreci için bir çıkmaz oluşacağını hissetmişsinizdir. Tabi ki burada işin niteliği de önemlidir. Çünkü bir işçi yalnızca ve yalnızca kendisine verilen bir işi yerine getirir, işi bitmeden de bir diğer işi yapamaz. Peki ya bizim senkron bir şekilde yapılması gereken işlerimiz varsa ne olacak? Cevap basit aslında yeni işçiler almalıyız. İşte programlamada çoklu-işçiliği sağlayan multi-threaded yapılardır. Bu arada "Ne kadar senkron?" sorusunu aklınızın bir kenarına şimdilik not edin, ilerleyen dakikalarda inceleyeceğiz...

Programlama hayatından daha gerçekçi bir örnek vererek ilerleyelim;

Örneğin bir uygulama yazmak istiyoruz. Bu uygulama hem sürekli ekrana birşeyler yazacak hem de bir yandan ben klavyeden hangi metni girersem onu alıp aynen ekrana basacak. Yani iki iş parçacığından oluşuyor. Eğer multi-threaded bir yapı kullanmazsanız böyle bir uygulamayı gerçek anlamda oluşturamazsınız. Yapılacak işler birbiri ile çakışır, senkron değil de birbirini beklemek zorunda kalan iş parçacıkları oluşur.

Multi-Threaded Example-1  |  Gizle  |  Göster
package multithreaded.sample1;

/**
 *
 * @author Cem Kefeli
 */
public class MultiThreadedEx1 {
    public static void main(String[] args) {
        Thread_Read threadRead=new Thread_Read();
        Thread_Write threadWrite=new Thread_Write();
        threadRead.start();
        threadWrite.start();
    }
}
package multithreaded.sample1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 *
 * @author Cem Kefeli
 */
public class Thread_Read extends Thread {
    @Override
    public void run() {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String text="";
        
        while(true) {
            try {
                text = bufferedReader.readLine();
            } 
            catch (IOException Exc) {
                System.out.println(Exc);
            }
            System.out.println("Echo: "+text);
        }
    }
}
package multithreaded.sample1;

/**
 *
 * @author Cem Kefeli
 */
public class Thread_Write extends Thread {
    String text = "Thread example-1";
    
    @Override
    public void run() {
        while(true) {
            try {
                System.out.println(text);
                Thread.sleep(5000);
            } 
            catch (InterruptedException Exc) {
                System.out.println(Exc);
            }
        }
    }
}

Thread example-1
test
Echo: test
Thread example-1
deneme
Echo: deneme
Thread example-1
Thread example-1

Yukarıdaki örnek çok basit bir örnek, fakat görülüyor ki farklı işleri aynı anda yapabiliyoruz artık. Bu mantıkla yalnızca iki adet değil onlarca işi senkron bir şekilde yürütebiliriz. Bir işe başlamak için bir diğer işin bitmesini beklemek zorunda da değiliz böylece.

Yazının başında "Ne kadar senkron?" sorusunu park etmiştik hatırlarsanız, şimdi oraya geri dönelim. Elinizde 1 işçinin 3 saatte bitirebileceği bir iş ve 1 işçinin 5 saatte bitirebileceği ikinci bir iş var. Soru şu; eğer multi-threaded bir yapı kullanırsanız bu iki iş ne kadar zamanda biter, kullanmazsanız ne kadar zamanda biter? Bu arada yeri gelmişken de söylemek lazım Java'da her uygulama en az bir thread'den oluşur ki onun adı da main thread'dir. Yani thread'siz uygulama diye birşey yoktur, "single-thread" ve "multi-thread" kavramları vardır.

İkinci sorunun cevabı daha kolay. Bu iki işin toplam süresi yaklaşık 8 saat sürer diyebiliriz. Yani (toplam süre~=8 saat) denkliği bize gereken cevabı verir.

Ama birinci sorunun cevabı o kadar net değil. Şöyle düşünebiliriz; Bu işler eş zamanlı yapıldığına göre ikisine aynı anda başlasak ilki 3 saat sonra biter, birinci işçi boşa çıkar. İkinci iş ise 5 saatte biter ikinci işçi boşa çıkar. Toplamda da yaklaşık 5 saatte her iki iş de bitmiş olur. Bu söylem göreceli olarak doğru bir mantığa dayanıyor fakat programlama dünyasında eğer her işi bir CPU çekirdeğine yaptırabiliyorsanız geçerli. Eğer bizim tüm işlerimizi aynı CPU çekirdeği yapıyorsa geçersiz. Çünkü ortada toplam belirli miktarda iş var ve bu iş için harcanacak enerji var. Olmayan bir enerjiyi işe dönüştüremeyiz. Dolayısıyla ilk sorunun cevabı (5 saat<toplam süre<8 saat) şeklinde karşımıza çıkar. Örneğin 6 saat olabilir ama asla ve asla 5 saat olamayacaktır. Örneğin 5 saat 1 saniye olabilir ama asla ve asla 5 saat olmayacaktır!

Threadless vs. Multi ThreadingBu durumu daha net ortaya koyabilmek için yüklü matematiksel hesaplamalar yapan bir method (iş) yazdım. Bu işten CPU'ya 1 den başlayarak 50 defaya kadar yaptırdım, her bir iş sayısı için toplam işin ne kadar sürdüğünü hesaplattım. Grafikteki yatay eksen işten kaç defa yapıldığını adet cinsinden gösteriyor. Kırmızı bölüm multi-threaded yapı olmadan, yani aslında single-threaded, toplam işin 1 ile 50 arasında değişen sayısı için milisaniye cinsinden ne kadar sürdüğünü gösteriyor. Burada bizi şaşırtan bir durum yok. İşler peşpeşe yapılıyor ve bir iş yaklaşık 1,450 milisaniye (ms) sürüyor 50 defa yapılması da yaklaşık 72,750 ms sürüyor. Beklenen değer ve gerçekleşen değerler neredeyse birbirinin aynısı. Grafikten de görüleceği gibi kızmızı taralı alan çok belirgin ortaya çıkmıyor.

Fakat multi-threaded yapıda, yani mavi alan, yukarıda bahsettiğim sonuç çok net ortaya çıkıyor. normalde 50 işin aynı anda başlayıp eş zamanlı yapılması sonrasında 50 işin de 1450 ms sonra bitmesi beklenir. Fakat öyle olmuyor, 50 iş senkron bir şekilde toplam 28,500 ms'de bitiyor. Yani aslında her bir iş 28,500 ms saniye sürüyor ve her iş de aynı zamanda bitiyor. İşleri senkron yaptırmamız birim işin süresini uzatıyor. Çünkü her işi bir CPU çekildeğine yaptırmıyoruz, tek bir CPU çekirdeğiyle 50 işi aynı anda yapmaya çalışıyoruz. Grafikten de görüleceği gibi mavi taralı alan çok belirgin bir şekilde ortaya çıkıyor. Peki neden değer arada bir yerde kalıyor? Yani neden single-thread'den yine de az bir süre alıyor işlerin bitmesi. Çünkü multi-threaded yapı kullanarak CPU'nun idle-time değerini azaltıyoruz. Yani CPU'yu daha fazla yüklüyoruz.

Çok çekirdekli CPU'lar biliyorsunuz uzun zamandır kullanımda. Fakat eğer sizin uygulamanız çok çekirdekli bir mimariye uygun bir ortamda çalışmıyorsa çekirdeklerinizin sayısının bir anlamı yok demektir! Buraya çok fazla girmiyorum ama şunu bilmek gerekir ki ve bir başka söylemle çok çekirdekli bir işlemci ancak çok çekirdek üzerinde çalışmaya uygun bir yazılım ortamı ile anlam bulabilir.

Sonuç olarak; bu yazıda işin mantığını anlatmaya çalıştım, bir sonraki yazımda ise multi-threaed yapıların biraz daha detayına inmeyi bekliyorum. Faydalı olması dileğiyle...

Tüm java makalelerime buradan ulaşabilirsiniz...

Hakkımda...

Cem KEFELİ

Electronics and
Telecommunication Eng.
devamı...


Son yapılan yorumlar...

Comment RSS

Yasal bir uyarı...

Disclaimer"Bu web sitesinde görmüş olduğunuz bilgilerin, dokümanların ve diğer materyallerin kullanılmasından doğabilecek hiç bir sorumluluktan site sahibi sorumlu tutulamaz. Web sitesi içerisinde yer alan yazılar, yorumlar, resimler ve diğer tüm içerikler yalnızca sahibinin görüşünü yansıtmakta olup içeriğin sahibi kişilerin çalıştığı kurumları bağlayıcı hiç bir nitelik taşımamaktadır. Yapılan tüm alıntılar mutlaka kaynak gösterilerek verilmeye çalışılmaktadır. Web sitesi içerisinde bulunan ilgili materyaller, ilgili yasal kurumlar tarafından uygun görülmemesi durumda kaldırılacaktır."
General