<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bilgisayar Kavramları &#187; Sistem Programlama (System Programming)</title>
	<atom:link href="http://www.bilgisayarkavramlari.com/category/sistem-programlama-system-programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bilgisayarkavramlari.com</link>
	<description>www.bilgisayarkavramlari.com</description>
	<lastBuildDate>Sun, 29 Jan 2012 21:38:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Turing Makinesi (Turing Machine)</title>
		<link>http://www.bilgisayarkavramlari.com/2009/06/27/turing-makinesi-turing-machine/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/06/27/turing-makinesi-turing-machine/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 13:55:12 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[Automata (otomatlar, özdevinirler)]]></category>
		<category><![CDATA[Bilgisayar Kavramları]]></category>
		<category><![CDATA[Bilgisayar Standartları]]></category>
		<category><![CDATA[Derleyiciler]]></category>
		<category><![CDATA[Doğal Dil İşleme (NLP)]]></category>
		<category><![CDATA[Donanım ( Hardware )]]></category>
		<category><![CDATA[Dosya Organizasyonu (File Organisation)]]></category>
		<category><![CDATA[işletim sistemleri]]></category>
		<category><![CDATA[Mantık Devreleri (Logic Circuits)]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[Sistem Programlama (System Programming)]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[Turing]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/?p=2681</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinin önemli bir kısmını oluşturan otomatlar (Automata) ve Algoritma Analizi (Algorithm analysis) çalıştırmalarının altındaki dil bilimin en temel taşlarından birisidir.1936 yılında Alan Turing tarafından ortaya atılan makine tasarımı günümüzde pekçok teori ve standardın belirlenmesinde önemli rol oynar. Turing Makinesinin Tanımı Basitçe bir kafadan (head) ve bir de teyp bandından [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bilgisayar bilimlerinin önemli bir kısmını oluşturan <a href="http://www.bilgisayarkavramlari.com/category/automata-otomatlar/">otomatlar (Automata) </a>ve <a href="http://www.bilgisayarkavramlari.com/category/algoritma-analizi-teory-of-algorithms/">Algoritma Analizi (Algorithm analysis) </a>çalıştırmalarının altındaki dil bilimin en temel taşlarından birisidir.1936 yılında Alan Turing tarafından ortaya atılan makine tasarımı günümüzde pekçok teori ve standardın belirlenmesinde önemli rol oynar.</p>
<p><strong>Turing Makinesinin Tanımı</strong></p>
<p>Basitçe bir kafadan (head) ve bir de teyp bandından (tape) oluşan bir makinedir.</p>
<p><img class="alignnone size-full wp-image-2683" title="turingtape" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/06/turingtape.jpg" alt="turingtape" width="425" height="148" /></p>
<p>Makinede yapılabilecek işlemler</p>
<ul>
<li>Yazmak</li>
<li>Okumak</li>
<li>Bandı ileri sarmak</li>
<li>Bandı geri sarmak</li>
</ul>
<p>şeklinde sıralanabilir.</p>
<p><strong>Chomsky hiyerarşisi ve Turing Makinesi</strong></p>
<p>Bütün teori bu basit dört işlem üzerine kurulmuştur ve sadece yukarıdaki bu işlemleri kullanarak bir işin yapılıp yapılamayacağı veya bir dilin bu basit 4 işleme indirgenip indirgenemeyeceğine göre diller ve işlemler tasnif edilmiştir.</p>
<p><img class="alignnone size-full wp-image-2682" title="turingkumesi" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/06/turingkumesi.jpg" alt="turingkumesi" width="496" height="359" /></p>
<p>Bu sınıflandırma yukarıdaki venn şeması ile gösterilmiştir. Aynı zamanda <a href="http://www.bilgisayarkavramlari.com/2009/06/27/chomsky-hiyerarsisi-chomsky-hierarchy/">chomsky hiyerarşisi (chomsky hierarchy)</a> için 1. seviye (type-1) olan ve Turing makinesi ile kabul edilebilen diller bütün tip-2 ve tip-3 dilleri yani içerk bağımsız dilleri ve düzenli dilleri kapsamaktadır. Ayrıca ilave olarak içerik bağımsız dillerin işleyemediği (üretemediği veya parçalayamadığı (parse) ) a<sup>n</sup>b<sup>n</sup>c<sup>n</sup> şeklindeki kelimeleri de işleyebilmektedir.  Düzenli ifadelerin işleyememesi konusunda bilgi için <a href="http://www.bilgisayarkavramlari.com/2009/03/22/duzenli-ifadelerde-pompalama-onsavi-pumping-lemma-for-regular-expressions/">düzenli ifadelerde pompalama savı (pumping lemma in regular expressions)</a> ve <a href="http://www.bilgisayarkavramlari.com/2009/03/22/icerik-bagimsiz-gramerler-icin-pompalama-onsavi-pumping-lemma-for-context-free-grammers/">içerik bağımsız dillerin işlemeyemesi için de içerik bağımsız dillerde pompalama savı (pumping lemma for CFG)</a> başlıklı yazıları okuyabilirsiniz.</p>
<p><strong>Turing Makinesinin Akademik Tanımı</strong></p>
<p>Turing makineleri literatürde akademik olarak aşağıdaki şekilde tanımlanır:</p>
<p><img class="alignnone size-full wp-image-2685" title="turing_akademik" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/06/turing_akademik.jpg" alt="turing_akademik" width="167" height="24" /></p>
<p>Burada M ile gösterilen makinenin parçaları aşağıda listelenmiştir:</p>
<p>Q sembolü sonlu sayıdaki durumların <a href="http://www.bilgisayarkavramlari.com/2009/06/24/kume-teorisi-set-theory/">kümesidir</a>. Yani makinenin işleme sırasında aldığı durumardır.</p>
<p>Γ sembolü dilde bulunan bütün harfleri içeren alfabeyi gösterir. Örneğin ikilik tabandaki sayılar ile işlem yapılıyorsa {0,1} şeklinde kabul edilir.</p>
<p>Σ sembolü ile makineye verilecek girdiler (input)<a href="http://www.bilgisayarkavramlari.com/2009/06/24/kume-teorisi-set-theory/"> kümesi</a> gösterilir. Girdi <a href="http://www.bilgisayarkavramlari.com/2009/06/24/kume-teorisi-set-theory/">kümesi</a> dildeki harfler dışında bir sembol taşıyamayacağı için Σ <span class="b">⊆ </span>Γ demek doğru olur.</p>
<p>δ sembolü dilde bulunan ve makinenin çalışması sırasında kullanacağı geçişleri (transitions) tutmaktadır.</p>
<p><span class="b">◊ sembolü teyp bandı üzerindeki boşlukları ifade etmektedir. Yani teyp üzerinde hiçbir bilgi yokken bu sembol okunur.<br />
</span></p>
<p>q<sub>0</sub> sembolü makinenin başlangıç durumunu (state) tutmaktadır ve dolayısıyla q<sub>0</sub> <span class="b">⊆</span> Q olmak zorundadır.</p>
<p>F sembolü makinenin bitiş durumunu (state) tutmaktadır ve yine F <span class="b">⊆ Q olmak zorundadır. </span></p>
<p><strong><span class="b">Örnek Turing Makinesi</span></strong></p>
<p><span class="b">Yukarıdaki sembolleri kullanarak örnek bir Turing makinesini aşağıdaki şekilde inşa edebiliriz. </span></p>
<p><span class="b">Örneğin basit bir kelime olan a* <a href="http://www.bilgisayarkavramlari.com/2007/04/14/regular-expression-regexp-duzenli-deyimler-ifadeler/">düzenli ifadesini (regular expression)</a> Turing makinesi ile gösterelim ve bize verilen aaa şeklindeki 3 a yı makinemizin kabul edip etmediğine bakalım. </span></p>
<p><span class="b">Tanım itibariyle makinemizi aşağıdaki şekilde tanımlayalım:</span></p>
<p>M = { {q<sub>0</sub>,q<sub>1</sub>} , { a } , { a,x } , { q<sub>0</sub> a→a R q<sub>0</sub> , q<sub>0</sub> x→x L q<sub>1</sub>} , q<sub>0</sub> , x , q<sub>1</sub> }</p>
<p>Yukarıdaki bu makineyi yorumlayacak olursak:</p>
<p>Q değeri olarak   {q<sub>0</sub>,q<sub>1</sub>} verilmiştir. Yani makinemizin ik idurumu olacaktır.</p>
<p>Γ değeri olarak { a,x } verilmiştir. Yani makinemizdeki kullanılan semboller a ve x&#8217;ten ibarettir.</p>
<p>Σ değeri olara {a} verilmiştir. Yani makinemize sadece a girdisi kabul edilmektedir.</p>
<p>δ değeri olarak iki geçiş verilmiştir { q<sub>0</sub> a→a R q<sub>0</sub> , q<sub>0</sub> x→x L q<sub>1</sub>} buraadki R sağa sarma L ise sola sarmadır ve görüleceği üzere Q değerindeki durumlar arasındaki geçişleri tutmaktadır.</p>
<p><span class="b">◊ değeri olarak x sembolü verilmiştir. Buradan x sembolünün aslında boş sembolü olduğu ve bantta hiçbir değer yokken okunan değer olduğu anlaşılmaktadır.<br />
</span></p>
<p>q<sub>0</sub> ile makinenin başlangıç durumundaki hali belirtilmiştir.</p>
<p>F değeri olarak q<sub>1</sub> değeri verilmiştir. Demek ki makinemiz q<sub>1</sub> durumuna geldiğinde bitmektedir (halt) ve bu duruma gelmesi halinde bu duruma kadar olan girdileri kabul etmiş olur<span class="b">. </span></p>
<p>Yukarıdaki bu tanımı görsel olarak göstermek de mümkündür:</p>
<p><img class="alignnone size-full wp-image-2686" title="turingornek" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/06/turingornek.jpg" alt="turingornek" width="432" height="225" /></p>
<p><strong><span class="b"><br />
</span></strong></p>
<p><span class="b">Yukarıdaki bu temsili resimde verilen turing makinesi çizilmiştir.</span></p>
<p><span class="b">Makinemizin örnek çalışmasını ve bant durumunu adım adım inceleyelim. </span></p>
<p><span class="b">Birinci adımda bandımızda aaa (3 adet a) yazılı olduğunu kabul edelim ve makinemizin bu aaa değerini kabul edip etmeyeceğini adım adım görelim. Zaten istediğimiz de aaa değerini kabul eden bir makine yapabilmekti.</span></p>
<p><span class="b"><img class="alignnone size-full wp-image-2687" title="turing1" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/06/turing1.jpg" alt="turing1" width="487" height="412" /></span></p>
<p><span class="b">Yukarıdaki ilk durumda bant üzerinde beklenen ve kabul edilip edilmeyeceği merak edilen değerimiz bulunuyor. Makinemizin kafasının okuduğu değer a sembolü. Makinemizin geçiş tasarımına göre q<sub>0</sub> halinde başlıyoruz ve a geldiğinde teybi sağa sarıp yine q<sub>0</sub> durumunda kalmamız gerekiyor.</span></p>
<p><span class="b"><br />
</span></p>
<p><span class="b"><img class="alignnone size-full wp-image-2689" title="turing21" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/06/turing21.jpg" alt="turing21" width="509" height="407" /></span></p>
<p>Yeni durumda kafamızın okuduğu değer banttaki 2. a harfi ve bu durumda yine <span class="b">q<sub>0</sub> </span> durumundayken teybi sağa sarıp yine <span class="b">q<sub>0</sub> </span> durumunda kalmamız tasarlanmış<span class="b"> </span></p>
<p><span class="b"><img class="alignnone size-full wp-image-2690" title="turing3" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/06/turing3.jpg" alt="turing3" width="515" height="380" /></span></p>
<p>3. durumda kafamızın okuduğu değer yine a sembolü olmakta ve daha önceki 2 duruma benzer şekilde <span class="b">q<sub>0</sub> </span> durumundayken a sembolü okumanın sonucu olarak teybi sağa sarıp <span class="b">q<sub>0</sub> </span>durumunda sabit kalıyoruz.</p>
<p><span class="b"><img class="alignnone size-full wp-image-2691" title="turing4" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/06/turing4.jpg" alt="turing4" width="487" height="364" /></span></p>
<p>4. adımda teypten okuduğumuz değer boşluk sembolü x oluyor. Bu değer makinemizin tasarımında <span class="b">q<sub>1</sub> </span><span class="b"> </span>durumuna gitmemiz olarak tasarlanmış ve teybe sola sarma emri veriyoruz.</p>
<p><span class="b"><img class="alignnone size-full wp-image-2692" title="turing5" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/06/turing5.jpg" alt="turing5" width="586" height="322" /></span></p>
<p><span class="b">Makinenin son durumunda </span><span class="b">q<sub>1</sub> </span><span class="b"> durumu makinenin kabul ve bitiş durumu olarak tasarlanmıştı ( makinenin tasarımındaki F kümesi) dolayısıyla çalışmamız burada sonlanmış ve giriş olarak aaa girdisini kabul etmiş oluyoruz.</span></p>
<p><strong><span class="b">2. Örnek</span></strong></p>
<p><span class="b">Hasan Bey&#8217;in sorusu üzerine bir örnek makine daha ekleme ihtiyacı zuhur etti. Makinemiz {a,b} sembolleri için çalışsın ve ilk durum olarak bandın en solunda başlayarak bantta bulunan sembolleri silmek için tasarlansın. Bu tasarımı aşağıdaki temsili resimde görülen otomat ile yapabiliriz:</span></p>
<p><span class="b"><img class="alignnone" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/turing_silici.jpg" alt="" width="454" height="123" /></span></p>
<p><span class="b">Görüldüğü üzere makinemizde 4 durum bulunuyor, bunlardan en sağda olan h durumu bitişi (halt) temsil ediyor. Şimdi bu makinenin bir misal olarak &#8220;aabb&#8221; yazılı bir bantta silme işlemini nasıl yaptığını adım adım izah etmeye çalışalım. </span></p>
<p><span class="b">Aşağıda, makinenin her adımda nasıl davranacağı bant üzerinde gösterilmiş ve altında açıklanmıştır. Sarı renge boyalı olan kutular, kafanın o anda üzerinde durduğu bant konumunu temsil etmektedir.<br />
</span></p>
<p><span class="b"><img class="alignnone" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/turing_silici_adimlar.jpg" alt="" width="374" height="590" /></span></p>
<p><span class="b">Netice olarak Hasan Bey&#8217;in sorusuna temel teşkil eden ve örneğin q1 üzerindeki döngülerden birisi olan b/a,R geçişi, banttan b okunduğunda banta a değerini yaz manasındadır.</span></p>
<p><span class="b">Yine bu yazıya yapılan yorumlarda sorulan bir sorunun cevabını aşağıdaki bağlantıda çözdüm. Soru, eşit a ve b içeren Turing makinesinin tasarımı idi, bağlantıya tıklayarak okuyabilirsiniz. </span></p>
<p><a href="http://www.bilgisayarkavramlari.com/2010/11/19/esit-a-ve-b-bulunduran-turing-makinesi-ornegi/">http://www.bilgisayarkavramlari.com/2010/11/19/esit-a-ve-b-bulunduran-turing-makinesi-ornegi/</a></p>

<p class="sayac_bilgi">1,677 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/06/27/turing-makinesi-turing-machine/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>MPI (Message Passing Interface , Mesaj Geçirme Arayüzü)</title>
		<link>http://www.bilgisayarkavramlari.com/2009/04/29/mpi-message-passing-interface-mesaj-gecirme-arayuzu/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/04/29/mpi-message-passing-interface-mesaj-gecirme-arayuzu/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 20:04:41 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[Sistem Programlama (System Programming)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2009/04/29/mpi-message-passing-interface-mesaj-gecirme-arayuzu/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde, paralel programlama amacıyla kullanılan bir platformun ismidir. Çok çeşitli işletim sistemlerinde ve çok çeşitli dillerde paralel uygulama geliştirmeye olanak sağlar. Ancak temel çıkış sistemi Linux ve temel programlama dili olarak C dili kabul edilebilir. İçerik 1. Paralel Programlamaya Giriş 2 MPI Kurulumu 3. MPI ile paralel program geliştirilmesi [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bilgisayar bilimlerinde, paralel programlama amacıyla kullanılan bir platformun ismidir. Çok çeşitli işletim sistemlerinde ve çok çeşitli dillerde paralel uygulama geliştirmeye olanak sağlar. Ancak temel çıkış sistemi Linux ve temel programlama dili olarak C dili kabul edilebilir.</p>
<p class="shutter">İçerik<br />
<a href="#giris">1. Paralel Programlamaya Giriş</a><br />
2 <a href="#kurulum">MPI Kurulumu</a><br />
3. <a href="#programlama"><span class="shutter">MPI ile paralel program geliştirilmesi</span></a><br />
<a href="#calistir">4. MPI kodunun çalıştırılması</a></p>
<p>Buna karşılık windows, Unix gibi işletim sistemleri ve <a href="http://www.bilgisayarkavramlari.com/category/java/">JAVA</a>, C++, C# gibi programlama dillerinde de oldukça yoğun kullanıcıları bulunmaktadır. Ayrıca nadirde olsa bu sayılanlar dışındaki işletim sistemi ve programlama dillerinde geliştirme yapanlar bulunur.</p>
<p>Bu yazının amacı okuyucuya basit paralel programlama yaklaşımını kazandırmak, basit bir MPI kurulumu gerçekleştirme ve üzerinde basit bir uygulama çalıştıracak seviyeye getirmektir.</p>
<p><strong><a name="giris"></a>Paralel Programlamaya Giriş</strong></p>
<p>MPI temel olarak birden fazla bilgisayarın üzerinde aynı programın çalıştırılması ve bu çalıştırma sırasında programların birbiri ile iletişime geçerek birbirinden veri transfer etmesine dayanır.</p>
<p>Temel olarak paralel programlamanın amacı bir bilgisayarda çok uzun sürede işlenen bir işi birden fazla bilgisayara bölerek aynı anda işletmek ve sonucu geri birleştirmektir (Bir anlamda algoritma analizindeki parçala fethet (divide and conquere) yaklaşımı olarak görülebilir)</p>
<p>Örneğin paralel programlama dünyasının en temel problemi olan matrix çarpımını ele alalım. Matrix çarpımı paralel programlamanın Merhaba Dünya (Hello World) uygulaması olarak düşünülebilir ve bu ortamda yazılan en basit program olarak görülebilir.</p>
<p>Matris boyutu büyüdükçe bir bilgisayardaki işlem süresi de uzar. Matrix parçalara bölünerek farklı bilgisayarlarda çarpılırsa bu durumda işlem süresi bölünerek büyür. Yani örneğin bir <a href="http://www.bilgisayarkavramlari.com/2010/04/02/matris-carpimi-matrix-multiplication/">matrisin bir bilgisayarda çarpılması</a> 1 saat alıyorsa 10 bilgisayarda 6 dakikaya yakın bir süre alır.</p>
<p>Paralel programlama ve paralal işleme (prallel processing) konusunda unutulmaması gereken bir nokta verinin ağ üzerinde bilgisayarlara dağıtılma zamanıdır. Dolayısıyla bir problemin bilgisayarlara dağıtılması her zaman süreyi bilgisayar sayısına bölmez. Hatta problem çok küçükse ve paralel yapılmaya çalışılıyorsa bu durumda ağ üzerindeki iletim süresi problemin çözüm süresini uzatabilir bile.</p>
<p>Ayrıca paralel programlama sırasında, problemin bilgisayarlara nasıl bölündüğü de oldukça önemlidir. Şayet problem birbirinden bağımsız parçalara bölünebiliyor ve birleştirmek veya bölmek için ayrıca işlem zaman almıyorsa bu durumda işleme süresi, topalam sürenin bilgisayara bölünmüş haline yakındır.</p>
<p>Ancak şayet problem bölündükten sonra diğer parçalardan bilgilere ihtiyaç duyuyorsa veya diğer bilgisayarların işlediği bilgileri bekliyorsa veya problemin bölünmesi veya birleştirilmesi çok fazla zaman alıyorsa bu durumda da zamanın tek bilgisayarla işlenen zamana yaklaştığını hatta ağ üzerine kaybedilen vakitten dolayı geçtiğini bile görebiliriz.</p>
<p>Yukarıda açıkladığım bu temel paralel programlama mantığının aslında MPI ile hiç ilgisi yoktur. MPI sadece yukarıda açıkladığım bu yaklaşımın programcı tarafından kodlanmasına yardımcı olur. Ancak yine de MPI kullanımını anlatmadan önce kısaca paralel programlama hakkında bilgi vermek istedim.</p>
<p>Şimdi MPI kurulumuna ve kullanılması konularına bakabiliriz.</p>
<p><strong><a name="kurulum"></a>MPI kurulumu</strong></p>
<p>Daha önce de bahsedildiği üzere MPI kullanımı için çok farklı dil ve çok farklı ortam seçenekleri bulunmaktadır. Bu yazı kapsamında windows işletim sistemi üzerinde kullanılabilen MPICH2 paketi tanıltılacaktır.</p>
<p>MPICH2 paketi argonna üniversitesinde geliştirilen ve windows üzerine oldukça fazla kullanıcısı bulunan bir pakettir. Hatta bu paket esas alınarak daha kolay kullanım sağlayan farklı paketler de geliştirilmiştir.</p>
<p>MPICH2 paketini http://www.mcs.anl.gov/research/projects/mpich2/ adresinden indirebilirsiniz. Bilgisayar mimarinize uygun paketin indirdikten sonra aşağıdakine benzer bir kurulum ekranı belirir:</p>
<p><img class="alignnone size-full wp-image-1902" title="mpich1" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/04/mpich1.jpg" alt="" width="500" height="403" /></p>
<p>Bu ekranda krımızı daire içerisindeki Next düğmesine basılarak bir sonraki adıma geçilir:</p>
<p><img class="alignnone size-full wp-image-1903" title="mpich2" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/04/mpich2.jpg" alt="" width="500" height="400" /></p>
<p>Yukarıda MPICH2 kurulumu hakkında genel bilgiler içeren ekrandan Next düğmesi ile devam edilir:</p>
<p><img class="alignnone size-full wp-image-1904" title="mpich3" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/04/mpich3.jpg" alt="" width="500" height="403" /></p>
<p>Yukarıdaki bu adımda lisans sözleşmesini kabul edip Next düğmesine basılır:</p>
<p><img class="alignnone size-full wp-image-1905" title="mpich4" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/04/mpich4.jpg" alt="" width="500" height="399" /></p>
<p>Yukarıdaki ekranda, ileride kullanacağımız şifreyi giriyoruz. Bu şifre kendiliğinden &#8220;behappy&#8221; olarak geliyor. İstenirse bu şekilde bırakılabilir ancak bunun bir günvelik açığı olduğu unutulmamalı. Şifremizi girdikten sonra Next düğmesi ile devam ediliyor:</p>
<p><img class="alignnone size-full wp-image-1906" title="mpich5" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/04/mpich5.jpg" alt="" width="500" height="405" /></p>
<p>Yukarıdaki kurulum bilgileri ekranında, MPICH2&#8242;nin kurulmasını istediğimiz dizini belirtiyoruz. Ayrıca kullanıcı hakkı olarak sadece aktif kullanıcı veya bütün windows kullancıları için kurulumdan birisini seçiyoruz.</p>
<p>Dilenirse bu aşamada &#8220;Disk Cost&#8221; düğmesi ile de kurulum yapılabilecek diskler ve bu disklerde kurulumun kaplayacağı yer hakkında bilgi alınabilir.</p>
<p>Son olarak aşağıdaki ekrana Next Düğmesi ile geçiyoruz</p>
<p><img class="alignnone size-full wp-image-1907" title="mpich6" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/04/mpich6.jpg" alt="" width="500" height="404" /></p>
<p>Yukarıdaki bu son ekran MPICH2&#8242;nin kuruluma hazır olduğunu ve Next düğmesi ile kurulumun başlayacağını belirtiyor.</p>
<p>Next düğmesine basıyoruz ve kurulum başlıyor. Kurulum sırasında bir ilerleme çubuğu ile kurulum devam eder. Ayrıca bir iki kere konsolu açıp bazı komutlar çalıştırır. Bu işlemler sırasında en önemli adımlardan birisi de ateş duvarında (firewall) yetki verilmesi aşamasıdır. Şayet bir ateş duvarınız bulunuyorsa, yeni kurduğumuz bu program için yetkilendirme yapmanız gerekir. Örneğin bu ekran Windows Vista için aşağıdaki şekilde görülür ve Engellemeyi Kaldır seçeneği seçilmelidir.</p>
<p><img class="alignnone size-full wp-image-1908" title="mpich_firewall" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/04/mpich_firewall.jpg" alt="" width="498" height="333" /></p>
<p>Yukarıdaki ateş duvarı hakkı verildikten sonra MPICH2 kurulumu tamamlanır ve aşağıdaki şekilde kurulumun bittiğini belirten ekran görüntülenir:</p>
<p><img class="alignnone size-full wp-image-1909" title="mpich7" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/04/mpich7.jpg" alt="" width="500" height="401" /></p>
<p>Şayet kurulum başarıyla tamamlanırsa Başlat menüsünün altına MPICH2 grubu eklenir.</p>
<p>MPICH2&#8242;nin çalıştırılması için kurulum dizini altında bulunan bin isimli dizine girilmesi ve içerisindeki mpiexec komutunun çalıştırılması yeterlidir. Tabi mpiexec ile çalıştırmak için öncelikle bir de MPI ortamına uygun kodun yazılması gerekir.</p>
<p><img class="alignnone size-full wp-image-1910" title="mpiexec" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2009/04/mpiexec.jpg" alt="" width="500" height="245" /></p>
<p>Yukarıdaki şekilde kurulumu gerçekleştirdikten sonra MPI ile kod yazmaya başlayabiliriz.</p>
<p><strong><a name="programlama"></a>MPI ile paralel program geliştirilmesi</strong></p>
<p>Bu bölümde basit bir matrix çarpım programını yazacağız. Amacımız programın paralel olarak çalışmasıdır. Öncelike matris çarpımı yapan bu kod için gerekli kütüphaneleri kodumuzdan çağıralım:</p>
<pre>#include &lt;stdio.h&gt;
#include "mpi.h"</pre>
<p>Şayet mpi kurulumunuz başarılı olduysa mpi.h dosyasının çağrılmasında bir problem olmamalıdır. Ancak kodumuzu çalıştırırken ilave olarak <a href="http://www.bilgisayarkavramlari.com/2008/01/03/baglayici-linker/">bağlayıcıya (linker)</a> bu kütüphaneyi tanıtmamız gerektiğini unutmayalım.</p>
<pre>#define MASTER 0		/* taskid of first task */
#define FROM_MASTER 1		/* setting a message type */
#define FROM_WORKER 2		/* setting a message type */</pre>
<p>Yukarıdai kodumuz kapsamında master (ana bilgisayarımız ve kodumuzu derleyip çalıştırdığımız bilgisayar olarak kabul ediyoruz) ve worker (işçi bilgisayarlar, yani programın üzerine dağıtıldığı ve sadece işlemci gücünden faydalandığımız bilgisayarlar) bilgisayarlar arasındaki mesajlaşma için kullanılan değişkenleri tanımlıyoruz. Bu değişken değerleri mesaj geçirilirken birer sinyal olarak kullanılacak ve mesajın kimden geldiğini belirtecektir.</p>
<pre>MPI_Status status;</pre>
<p>MPI_Status tipinden tanımlanan yukarıdaki değişken ise mesajlaşma sırasında sistemin durumu hakkındaki bilgileri tutarak gerektiğinde durum tespiti yapmamızı sağlar. Bu değişken de mesaj gönderme ve alma sırasında kullanılacaktır.</p>
<pre>main(int argc, char **argv)
{
int numtasks,			/* number of tasks in partition */
    taskid,			/* a task identifier */
    numworkers,			/* number of worker tasks */</pre>
<p>C dilinde geliştirdiğimiz programımızda main fonksiyonu ile koda başlıyoruz. tanımlanan numtasks değişkeni kaç <a href="http://www.bilgisayarkavramlari.com/2007/11/18/islem-process/">işlem (process) </a>çalıştığını tutacak.</p>
<p>MPI ile işimizi bilgisayarlara dağıtabildiğimiz gibi bir bilgisayar üzerinde de birden fazla <a href="http://www.bilgisayarkavramlari.com/2007/11/18/islem-process/">iş (process)</a> çalıştırmamız mümkündür. Dolayısyla örneğin 10 bilgisayarın bulunduğu bir ortamda her bilgisayarda 3&#8242;er iş çalıştırılırsa bu durumda toplam 30 iş çalışmış olur. Yani programımız sanki 30 farklı bilgisayarda çalışıyormuş gibi davranmak zorundadır.</p>
<p>Yukarıdaki taskid değişkenini hangi <a href="http://www.bilgisayarkavramlari.com/2007/11/18/islem-process/">iş (process) </a>olduğumuzu tutmak için kullanacağız. Daha önce de belirttiğimiz üzere birden fazla bilgisayar (yada işlemde) programımız kopyalanır. Yani aslında bütün bilgisayarlarda aynı kod çalışır. Çalışan kodun farkı veya yapılan işin farkını belirtebilmek için öncelikle kim olduğumuzu (hangi process olduğumuzu) bilmeliyiz. İşte bu taskid değişkenindeki bilgiyi yine MPI fonksiyonlarından alacağız ve programımız hangi işlem olduğuna göre farklı davranacak (matrisin hangi bölümünü çarptığımızı buradan öğrenceğiz.</p>
<p>numworkers değişkeni ise mevcut sistemde toplam kaç<a href="http://www.bilgisayarkavramlari.com/2007/11/18/islem-process/"> iş (process)</a> olduğunu tutacak. Bu bilgi de MPI fonksiyonları ile elde edilen bir bilgi olacak.</p>
<pre>MPI_Init(&amp;argc, &amp;argv);
MPI_Comm_rank(MPI_COMM_WORLD, &amp;taskid);
MPI_Comm_size(MPI_COMM_WORLD, &amp;numtasks);
numworkers = numtasks-1;</pre>
<p>Yukarıda ilk defa MPI fonksiyonlarını kullandık. MPI_Init fonksiyonu sistemi ilklendirir (initialize). Burada dikkat edilirse main fonksiyonunun parametreleri aynen geçirilmiştir. Bu parametreler <a href="http://www.bilgisayarkavramlari.com/2008/11/07/c-ve-komut-satiri-c-console-parameters/">konsoldan okunan program parametreleridir (console parameters)</a>.</p>
<p>Yukarıdaki ikinci fonksiyonda (MPI_Comm_rank) oluşturulan paralel dünyamızdan (ki bu dünya MPI kurulumu ile oluşturulmaktadır) taskid değişkenine rank (seviye) bilgisi okunmaktadır. Yani kısacası kaç numaralı iş (process) olduğumuz bu fonksiyondan <a href="http://www.bilgisayarkavramlari.com/2009/01/12/atif-ile-cagirma-call-by-reference/">atıf  ile çağırılarak (call by reference)</a> öğrenilmiştir.</p>
<p>Benzer şekilde sistemdeki iş (process) sayısı da MPI_Comm_size fonksiyonu ile öğrenilmiştir. Bu sayı kurulumumuzdaki toplam işin miktarını vermektedir.</p>
<p>Hemen altında numworkers değişkeni numtasks değişkeninden 1 eksik olarak ayarlanmıştır. Bunun sebebi ana işin (process) toplam çalışan sayısından çıkarılmasıdır. Yani bütün işleri dağıtan ve sistemden bilgileri toplayan, bizim kullanıcı olarak doğrudan iletişimde olduğumuz ve hesaplama işini yapmayacak olan ana iş (master process) toplam işçi sayısıyndan çıkarılmıştır. Çünkü birazdan matrisi parçalara ayırıp işçilere (slaves) yollarken ve matrisin kaç parçaya bölüneceğine karar verirken bu sayının içerisinde ana işin bulunmaması gerekmektedir.</p>
<pre>if (taskid == MASTER) {</pre>
<p>Yukarıdaki if ile mevcut işin (process) ana iş olup olmadığını kontrol ediyoruz. Benzer şekilde</p>
<pre>if (taskid &gt; MASTER) {</pre>
<p>Yukarıdaki satır ile de diğer işlerin (process) durumu belirtilir. Burada ilk değişken tanımlarımızı hatırlayacak olursak MASTER değişkeninin değeri 1 olarak tanımlanmıştı. Yani şayet bizim taskid değerimiz 1 &#8216;ise ana işlem (master process) diğer bütün durumlarda da çalışan (slave) olmuş oluyoruz.</p>
<p>Kodun tamamı aşağıda verilmiştir:</p>
<pre>#include &lt;stdio.h&gt;
#include "mpi.h"
#define NRA 62 			/* number of rows in matrix A */
#define NCA 15			/* number of columns in matrix A */
#define NCB 7   		/* number of columns in matrix B */
#define MASTER 0		/* taskid of first task */
#define FROM_MASTER 1		/* setting a message type */
#define FROM_WORKER 2		/* setting a message type */

MPI_Status status;
main(int argc, char **argv)
{
int numtasks,			/* number of tasks in partition */
    taskid,			/* a task identifier */
    numworkers,			/* number of worker tasks */
    source,			/* task id of message source */
    dest,			/* task id of message destination */
    nbytes,			/* number of bytes in message */
    mtype,			/* message type */
    intsize,			/* size of an integer in bytes */
    dbsize,			/* size of a double float in bytes */
    rows,                      	/* rows of matrix A sent to each worker */
    averow, extra, offset,      /* used to determine rows sent to each worker */
    i, j, k,			/* misc */
    count;
double a[NRA][NCA], 		/* matrix A to be multiplied */
       b[NCA][NCB],      	/* matrix B to be multiplied */
       c[NRA][NCB];		/* result matrix C */

intsize = sizeof(int);
dbsize = sizeof(double);

MPI_Init(&amp;argc, &amp;argv);
MPI_Comm_rank(MPI_COMM_WORLD, &amp;taskid);
MPI_Comm_size(MPI_COMM_WORLD, &amp;numtasks);
numworkers = numtasks-1;

/**************************** master task ************************************/
if (taskid == MASTER) {
  printf("Number of worker tasks = %d\n",numworkers);
  for (i=0; i&lt;NRA; i++)
    for (j=0; j&lt;NCA; j++)
      a[i][j]= i+j;
  for (i=0; i&lt;NCA; i++)
    for (j=0; j&lt;NCB; j++)
      b[i][j]= i*j;

  /* send matrix data to the worker tasks */
  averow = NRA/numworkers;
  extra = NRA%numworkers;
  offset = 0;
  mtype = FROM_MASTER;
  for (dest=1; dest&lt;=numworkers; dest++) {
    rows = (dest &lt;= extra) ? averow+1 : averow;
    printf("   sending %d rows to task %d\n",rows,dest);
    MPI_Send(&amp;offset, 1, MPI_INT, dest, mtype, MPI_COMM_WORLD);
    MPI_Send(&amp;rows, 1, MPI_INT, dest, mtype, MPI_COMM_WORLD);
    count = rows*NCA;
    MPI_Send(&amp;a[offset][0], count, MPI_DOUBLE, dest, mtype, MPI_COMM_WORLD);
    count = NCA*NCB;
    MPI_Send(&amp;b, count, MPI_DOUBLE, dest, mtype, MPI_COMM_WORLD);

    offset = offset + rows;
    }

  /* wait for results from all worker tasks */
  mtype = FROM_WORKER;
  for (i=1; i&lt;=numworkers; i++)	{
    source = i;
    MPI_Recv(&amp;offset, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &amp;status);
    MPI_Recv(&amp;rows, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &amp;status);
    count = rows*NCB;
    MPI_Recv(&amp;c[offset][0], count, MPI_DOUBLE, source, mtype, MPI_COMM_WORLD,
               &amp;status);

    }

  /* print results */
  printf("Here is the result matrix\n");
  for (i=0; i&lt;NRA; i++) {
    printf("\n");
    for (j=0; j&lt;NCB; j++)
      printf("%6.2f   ", c[i][j]);
    }
  printf ("\n");

  }  /* end of master section */

/**************************** worker task ************************************/
if (taskid &gt; MASTER) {
  mtype = FROM_MASTER;
  source = MASTER;
  printf ("Master =%d, mtype=%d\n", source, mtype);
  MPI_Recv(&amp;offset, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &amp;status);
  printf ("offset =%d\n", offset);
  MPI_Recv(&amp;rows, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &amp;status);
  printf ("row =%d\n", rows);
  count = rows*NCA;
  MPI_Recv(&amp;a, count, MPI_DOUBLE, source, mtype, MPI_COMM_WORLD, &amp;status);
  printf ("a[0][0] =%e\n", a[0][0]);
  count = NCA*NCB;
  MPI_Recv(&amp;b, count, MPI_DOUBLE, source, mtype, MPI_COMM_WORLD, &amp;status);
  printf ("b=\n");
  for (k=0; k&lt;NCB; k++)
    for (i=0; i&lt;rows; i++) {
      c[i][k] = 0.0;
      for (j=0; j&lt;NCA; j++)
        c[i][k] = c[i][k] + a[i][j] * b[j][k];
      }

  mtype = FROM_WORKER;
  printf ("after computer\n");
  MPI_Send(&amp;offset, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD);
  MPI_Send(&amp;rows, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD);
  MPI_Send(&amp;c, rows*NCB, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD);
  printf ("after send\n");

  }  /* end of worker */
  MPI_Finalize();
} /* of main */</pre>
<p>Yukarıdaki kod Dev-CPP ortamında mingw <a href="http://www.bilgisayarkavramlari.com/2008/01/03/derleyici-compiler/">derleyicisi (compiler)</a> ile test edilmiştir. Ayrıca kodun çalışması için aşağıdaki bölümü okuyabilirsiniz.</p>
<p><strong><a name="calistir"></a>MPI kodunun çalıştırılması</strong></p>
<p>Kodun çalıştırılması için yukarıda anlatıldığı gibi bir MPICH2 kurulumunun yapıldığını kabul ediyoruz. Ayrıca kodumuzu derlemek için Dev-CPP kullanacağız. Ancak kodlama hakkında tecrübesi olan bir okuyucu dilediği başka bir <a href="http://www.bilgisayarkavramlari.com/2008/01/03/derleyici-compiler/">derleyici (compiler) </a>kullanarak devam edebilir.</p>

<p class="sayac_bilgi">314 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/04/29/mpi-message-passing-interface-mesaj-gecirme-arayuzu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Meşguliyet (Utilization, Kullanım)</title>
		<link>http://www.bilgisayarkavramlari.com/2009/04/19/mesguliyet-utilization-kullanim/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/04/19/mesguliyet-utilization-kullanim/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 18:01:24 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[Bilgisayar Standartları]]></category>
		<category><![CDATA[işletim sistemleri]]></category>
		<category><![CDATA[Sistem Programlama (System Programming)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2009/04/19/mesguliyet-utilization-kullanim/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde sıra (queue) teorisinde, sıradaki bir varlığın ne kadar meşgul edildiğini ölçmeye ve bu ölçüme göre kararlar vermeye verilen isimdir. İstatistiksel olarak ρ sembolü ile gösterilir ve şayet ρ değeri 1&#8242;den büyükse sıranın uzadığı, 1&#8242;e eşitse sıranın ne kısalıp ne de uzadığı ve şayet 1&#8242;den küçükse sıranın kısaldığı veya [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bilgisayar bilimlerinde <a href="http://www.bilgisayarkavramlari.com/2008/04/16/sira-queue/">sıra (queue) teorisinde</a>, sıradaki bir varlığın ne kadar meşgul edildiğini ölçmeye ve bu ölçüme göre kararlar vermeye verilen isimdir.</p>
<p>İstatistiksel olarak ρ sembolü ile gösterilir ve şayet ρ değeri 1&#8242;den büyükse sıranın uzadığı, 1&#8242;e eşitse sıranın ne kısalıp ne de uzadığı ve şayet 1&#8242;den küçükse sıranın kısaldığı veya sırada kimse kalmadığı sonucu çıkarılır.</p>
<p>Burada ρ değerinin hesaplanması için aşağıdaki formül kullanılabilir:</p>
<p>ρ = λ / μ</p>
<p>Yukarıdaki formülde λ değeri sıraya gelen varlıkların oranını, μ değeri ise sistemin bu sıradaki varlıklara hizmet verme oranını göstermektedir. Yani basitçe sıraya girenler ve sıradan çıkanların oranı olarak düşünülebilir. Daha basit bir ifadeyle talep/arz oranı olarak düşünülebilir.</p>
<p>Basit bir örnek üzerinden anlatmak gerekirse örneğin bir bankada bulunan banka görevlileri ortalama olarak bir müşteriye 1 dakikada hizmet veriyor olsun. Saatte 50 müşterinin geldiği bir bankada meşguliyet aşağıdaki şekilde hesaplanabilir:</p>
<p>Öncelikle arz ve talebi aynı birimlere getirmek gerekir. Yani bankanın arz ettiği hizmet değeri müşteri/saat şeklindeyken, bankanın talep değeri müşteri/saat cinsinden. Bu durumda bankanın arz değerini de müşteri/saat cinsine çevirelim.</p>
<p>Basit bir hesapla 1 dakikada bir müşteriye hizmet verilen bir bankada saatte 60 müşteriye hizmet verilir. Öyleyse bu bankanın meşguliyet oranı (utilization):</p>
<p>ρ = λ / μ</p>
<p>λ = 50</p>
<p>μ = 60</p>
<p>için ρ = 50 / 60</p>
<p>= 0.83</p>
<p>olarak bulunur. Bu durumda bankanın müşterilerine zamanında hizmet verebileceğini ve müşterilerin sıra beklemeyeceğini veya bir sıra varsa zamanla azalacağını yorumlayabiliriz.</p>

<p class="sayac_bilgi">68 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/04/19/mesguliyet-utilization-kullanim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Atomluluk (Atomicity)</title>
		<link>http://www.bilgisayarkavramlari.com/2009/03/30/atomluluk-atomicity/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/03/30/atomluluk-atomicity/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 13:03:53 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[Automata (otomatlar, özdevinirler)]]></category>
		<category><![CDATA[bilgisayar felsefesi]]></category>
		<category><![CDATA[Bilgisayar Kavramları]]></category>
		<category><![CDATA[Derleyiciler]]></category>
		<category><![CDATA[Donanım ( Hardware )]]></category>
		<category><![CDATA[Dosya Organizasyonu (File Organisation)]]></category>
		<category><![CDATA[işletim sistemleri]]></category>
		<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Mantık Devreleri (Logic Circuits)]]></category>
		<category><![CDATA[Nesne Yönelimli Programlama]]></category>
		<category><![CDATA[Network(Ağ)]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[Sistem Programlama (System Programming)]]></category>
		<category><![CDATA[Temel Bilimler]]></category>
		<category><![CDATA[Veri Güvenliği(Cryptography)]]></category>
		<category><![CDATA[Veri Sıkıştırma (Data Compression)]]></category>
		<category><![CDATA[Veri Tabanı (Database)]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[yapay zeka (artificial intelligence)]]></category>
		<category><![CDATA[Yazılım Mühendisliği (Software Engineering)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2009/03/30/atomluluk-atomicity/</guid>
		<description><![CDATA[Yazan: Şadi Evren ŞEKER Latince bölünemez anlamına gelen atom kökünden üretilen bu kelime, bilgisayar bilimlerinde çeşitli alanlarda bir bilginin veya bir varlığın bölünemediğini ifade eder. Örneğin programlama dillerinde bir dilin atomic (bölünemez) en küçük üyesi bu anlama gelmektedir. Mesela C dilinde her satır (statement) atomic (bölünemez) bir varlıktır. Benzer şekilde bir verinin bölünemezliğini ifade etmek [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan: Şadi Evren ŞEKER</p>
<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:HyphenationZone>21</w:HyphenationZone> <w:PunctuationKerning /> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>TR</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val="&#45;-" /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--> <!--[if gte mso 10]><br />
<mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin-top:0cm; 	mso-para-margin-right:0cm; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0cm; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"Times New Roman"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin;} --></p>
<p><!--[endif]--></p>
<p class="MsoNormal">Latince bölünemez anlamına gelen atom kökünden üretilen bu kelime, bilgisayar bilimlerinde çeşitli alanlarda bir bilginin veya bir varlığın bölünemediğini ifade eder.</p>
<p class="MsoNormal">Örneğin programlama dillerinde bir dilin atomic (bölünemez) en küçük üyesi bu anlama gelmektedir. Mesela C dilinde her satır (statement) atomic (bölünemez) bir varlıktır.</p>
<p class="MsoNormal">Benzer şekilde bir verinin bölünemezliğini ifade etmek için de veri tabanı, veri güvenliği veya veri iletimi konularında kullanılabilir.</p>
<p class="MsoNormal">Örneğin veri tabanında bir işlemin (transaction) tamamlanmasının bölünemez olması gerekir. Yani basit bir örnekle bir para transferi bir hesabın değerinin artması ve diğer hesabın değerinin azalmasıdır (havale yapılan kaynak hesaptan havale yapılan hedef hesaba doğru paranın yer değiştirmesi) bu sıradaki işlemlerin bölünmeden tamamlanması (atomic olması) gerekir ve bir hesaptan para eksildikten sonra, diğer hesapa para eklenmeden araya başka işlem giremez.</p>
<p class="MsoNormal">Benzer şekilde işletim sistemi tasarımı, paralel programlama gibi konularda da bir işlemin atomic olması araya başka işlemlerin girmemesi anlamına gelir.</p>
<p class="MsoNormal">Örneğin sistem tasarımında kullanılan check and set fonksiyonu önce bir değişkeni kontrol edip sonra değerini değiştirmektedir. Bir değişkenin değeri kontrol edildikten sonra içerisine değer atanmadan farklı işlemler araya girerse bu sırada problem yaşanması mümkündür. Pekçok işlemci tasarımında buna benzer fonksiyonlar sunulmaktadır.</p>
<p class="MsoNormal">Genel olarak bölünemezlik (atomicity) geliştirilen ortamda daha düşük seviyeli kontroller ile sağlanır. Örneğin işletim sistemlerinde kullanılan<a href="http://www.bilgisayarkavramlari.com/2009/03/30/semafor-semaphore-flama-isaret/"> semafor’lar (semaphores)</a>, kilitler (locks), koşullu değişkenler (conditional variables) ve monitörler (monitors) bunlar örnektir ve işletim sisteminde bir işlemin yapılması öncesinde bölünmezlik sağlayabilirler.</p>
<p class="MsoNormal">Kullanılan ortama göre farklı yöntemlerle benzer bölünmezlikler geliştirilebilir. Örneğin veritabanı programlama sırasında koşul (condition) veya kilit (lock) kullanımı bölünmezliği sağlayabilir.</p>

<p class="sayac_bilgi">174 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/03/30/atomluluk-atomicity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C ile Zaman İşlemleri</title>
		<link>http://www.bilgisayarkavramlari.com/2009/01/01/c-ile-zaman-islemleri/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/01/01/c-ile-zaman-islemleri/#comments</comments>
		<pubDate>Thu, 01 Jan 2009 18:41:56 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[işletim sistemleri]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[Sistem Programlama (System Programming)]]></category>
		<category><![CDATA[difftime]]></category>
		<category><![CDATA[time]]></category>
		<category><![CDATA[time_T]]></category>
		<category><![CDATA[zaman]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2009/01/01/c-ile-zaman-islemleri/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER C dilinde mevcut zamanı almak ve işlemek mümkündür. Bunun için time.h dosyasının içerisinde bulunan fonksiyonlar kullanılabilir. Ayrıca time.h dosyasında bulunan time_t oluşumu (struct) zaman tutmak için geliştirilmiştir ve zamanı oluşturan alt unsurları da içerir. Örneğin şu andaki zamanı ekrana basmak için aşağıdaki kod kullanılabilir: struct timeval tv;   time_t curtime; [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>C dilinde mevcut zamanı almak ve işlemek mümkündür. Bunun için time.h dosyasının içerisinde bulunan fonksiyonlar kullanılabilir. Ayrıca time.h dosyasında bulunan time_t<a href="http://www.bilgisayarkavramlari.com/2007/11/08/olusum-composition-ve-struct-yapilar/"> oluşumu (struct) </a>zaman tutmak için geliştirilmiştir ve zamanı oluşturan alt unsurları da içerir.</p>
<p>Örneğin şu andaki zamanı ekrana basmak için aşağıdaki kod kullanılabilir:</p>
<pre>  struct timeval tv;
  time_t curtime;
  gettimeofday(&amp;tv, NULL);
  curtime=tv.tv_sec;
  printf("%m-%d-%Y  %T.",localtime(&amp;curtime));</pre>
<p>Örneğin bir kullanıcıdan yazı okuyan ve ne kadar zamanda okuduğunu ekrana basan kod aşağıdaki şekilde yazılabilir:</p>
<pre><span class="prep">#include &lt;stdio.h&gt;
#include &lt;time.h&gt;
#include &lt;conio.h&gt;
int main ()
{
  time_t start,end;
  time (&amp;start);
  printf ("Bir tuşa basınız");
  getch();
  time (&amp;end);
  printf ("Tuşa basmanız %.2lfsaniye sürdü.\n", </span><span class="prep">difftime (end,start)</span><span class="prep">);
  return 0;
}

</span></pre>
<p>Yukarıdaki time_t yapısı oldukça kullanışlı olmasına karşılık mikro saniye gibi düşük zamanları algılamakta yetersizdir. Bunun için biraz daha detaylı çalışan timeeval yapısından ve gettimeofday fonksiyonundan faydalanılabilir:</p>
<pre>struct timeval starttv, endtv;</pre>
<pre>struct timezone starttz, endtz;gettimeofday(&amp;starttv, &amp;starttz);</pre>
<pre>for (i=0;i&lt;100;i++)</pre>
<pre>   for(j=0;j&lt;256;j++)</pre>
<pre>      for(k=0;k&lt;10;k++)</pre>
<pre>         printf("deneme") ;</pre>
<pre>gettimeofday(&amp;endtv, &amp;endtz);</pre>
<pre>float fark1=getdiff(endtv, starttv);</pre>
<p>Örneğin yukarıdaki kodda iç içe 3 döngü içerisinde ekrana deneme yazdırılıyor (toplam 100x256x10 tane) bu işlemin aldığı vakti ölçmek için gettimeofday fonksiyonundan faydalanılmış ve en sonunda da fark hesaplanmış. Burada eksik olan getdiff fonksiyonu aşağıdaki şekilde yazılabilir:</p>
<pre>float getdiff(struct timeval endtv, struct timeval starttv)
{
   float diff=0;
   diff=(endtv.tv_sec-starttv.tv_sec)*1000000+
   (endtv.tv_usec-starttv.tv_usec);
   return diff;
}
</pre>
<p>Serper Bey&#8217;in sorusu üzerine ekliyorum, büyültmek için resme tıklayabilirsiniz:<br />
<a href="http://www.bilgisayarkavramlari.com/wp-content/uploads/zaman1.jpg"><img class="alignnone size-medium wp-image-4402" title="zaman" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/zaman1-300x165.jpg" alt="" width="300" height="165" /></a></p>
<p><strong>Dev-CPP üzerinde zaman işlemleri</strong></p>
<p>Yukarıdaki, linux kodlarından farklı olarak Dev-CPP kullanmak isteyenler clock sınıfından yararlanabilir.</p>
<p>Kod basitçe zamanı clock() fonksiyonu ile okur ve dört işleme tabi tutar. Buradaki değişken tipi ise clock_t cinsindendir.</p>
<p>clock_t start, end;</p>
<p>start=clock();</p>
<p>&#8230;. işlemler &#8230;&#8230;</p>
<p>end = clock();</p>
<p>printf(&#8220;fark: %f&#8221;,end-start);</p>
<p>şeklinde yazılan kod başarılı bir şekilde çalışma süresini ölçer. Elbette bu işlemler sırasında sys/time.h kütüphanesi include edilmelidir.</p>

<p class="sayac_bilgi">805 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/01/01/c-ile-zaman-islemleri/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>YACC</title>
		<link>http://www.bilgisayarkavramlari.com/2008/12/12/yacc/</link>
		<comments>http://www.bilgisayarkavramlari.com/2008/12/12/yacc/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 17:46:58 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Automata (otomatlar, özdevinirler)]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[Sistem Programlama (System Programming)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2008/12/12/yacc/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER YACC, bilgisayara bilimlerinin önemli dallarından birisi olan dil tasarımı ve dil geliştirilmesi sırasında (compiler teory) sıkça kullanılan bir kod üretici programdır. YACC basitçe dildeki sözdizim (syntax) tasarımı için kullanılır ve tasarladığımız dildeki kelimelerin sıralamasının istediğimiz şekilde girilip girilmediğini kontrol eder. Aynı zamanda sıralamadaki her kelimenin anlamını da yacc marifetiyle belirleyebiliriz. [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>YACC, bilgisayara bilimlerinin önemli dallarından birisi olan dil tasarımı ve dil geliştirilmesi sırasında (compiler teory) sıkça kullanılan bir kod üretici programdır. YACC basitçe dildeki sözdizim (syntax) tasarımı için kullanılır ve tasarladığımız dildeki kelimelerin sıralamasının istediğimiz şekilde girilip girilmediğini kontrol eder. Aynı zamanda sıralamadaki her kelimenin anlamını da yacc marifetiyle belirleyebiliriz.</p>
<p>YACC temel olarak<a href="http://www.bilgisayarkavramlari.com/2008/12/09/backus-normal-form-bnf/"> BNF (Backus Normal Form) </a>kullanarak cümle dizimini belirtmektedir.</p>
<p><a href="http://www.bilgisayarkavramlari.com/2008/12/12/lex/">LEX</a> ile birlikte kullanıldığıdan bir dil tasarımının neredeyse yarısı olan lexical (kelime) ve syntax (cümle) analizi tamamlanmış olur. Bundan sonra dildeki her kelime ve cümle diziliminin anlamını (semantic) kodlamak kalır.</p>
<p>YACC neredeyse tamamen aynı olan açık kaynak kodlu bison isimli paket ile de kurulabilir.</p>
<p>Aşağıda örnek bir yacc dosyası verilmiştir. Bu dosyayı inceleyerek yacc&#8217;ın kullanımını anlamaya çalışalım:</p>
<pre>%{ // tanımlamam yapılan ilk bölüm
    #include &lt;stdio.h&gt;
    int yylex(void);
    void yyerror(char *);
%}

%token INTEGER

%% // BNF yapısındaki ikinci bölüm

program:
        program expr '\n'         { printf("%d\n", $2); }
        |
        ;

expr:
        INTEGER
        | expr '+' expr           { $$ = $1 + $3; }
        | expr '-' expr           { $$ = $1 - $3; }
        ;

%%
// fonksiyon içeriklerinin bulunduğu son bölüm
void yyerror(char *s) {
    fprintf(stderr, "%s\n", s);
}

int main(void) {
    yyparse();
    return 0;
}</pre>
<p>Dosyamız LEX&#8217;e benzer şekilde 3 bölümden oluşmaktadır. İlk bölümde kodumuza dahil edilecek kütüphaneleri ve fonksiyon prototiplerini tanımlıyoruz.</p>
<p>ikinci bölümde BNF yapısı benzeri bir şekilde dilimizdeki sözdizim tanımlanıyor.</p>
<p>üçüncü ve son bölümde fonksiyon tanımları ve main fonksiyonu bulunmaktadır.</p>
<p>Yukarıdaki dosyada yapılan işlemleri aşağıda anlatalım:</p>
<p>YACC dosyasında %token ve %type olarak iki farklı tanım yapılabilmektedir. %token tanımı lex&#8217;den gelen bir sabit bilgiyi taşımak için kullanılır. %type ise yacc içerisinde tanımlanan devamlıları (nonterminal) ifade etmek için kullanılır.</p>
<p>Genelde bir kural olmamasına karşılık BNF yapısındaki sonlular (terminal) büyük harfle ve devamlılar (nonterminal) küçük harf ile yazılırlar. (dosyamızın C kodu üreteceğini ve gerek yacc gerek lex gerek se C dilinin büyükküçük harfe duyarlı (case sensitive) olduğunu unutmayınız)</p>
<p>yyerror fonksiyonu yacc tarafından girilen değeri kontrol ederken bir dizilim hatası bulunması (syntax error) çağrılan fonksiyondur.</p>
<p>main fonksiyonu aynen üretilen koda kopyalanmakta ve ilk çalışan C fonksiyonumuzdur.</p>
<p>BNF yapısının yanında bulunan ve küme parantezleri arasında (curved brackets) bulunan kodda ise aşağıdaki terimler kullanılabilir:</p>
<p>$$ -&gt; bu devamlıdan (nonterminal) dönecek olan değerdir.</p>
<p>$1 -&gt; BNF yapımızdaki ilk parametredir. Örneğin aşağıdaki satırı ele alalım:</p>
<pre> | expr '+' expr           { $$ = $1 + $3; }</pre>
<p>Bu satırda ilk sembol veya anlamında | sembolüdür. Bu sembolün amacı bir expr tanımlanırken ihtimallerden birisi olmasıdır. Ardından expr sembolü ilk sembol &#8216;+&#8217; ikinci sembol ve ikinci expr sembolü ise 3. semboldür. Dolayısıyla sırasıyla :</p>
<p>$1= expr</p>
<p>$2= &#8216;+&#8217;</p>
<p>$3 = expr</p>
<p>anlamına gelmektedir.</p>
<p>Bu satırın bulunması durumunda yapılacak işlem ilk expr karşılık gelen değer ile ikinci expr karşılık gelen değerin sayısal olarak toplanması ve sonuç olarak $$ marifeti ile döndürülmesidir.</p>

<p class="sayac_bilgi">283 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2008/12/12/yacc/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>LEX</title>
		<link>http://www.bilgisayarkavramlari.com/2008/12/12/lex/</link>
		<comments>http://www.bilgisayarkavramlari.com/2008/12/12/lex/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 17:10:36 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Automata (otomatlar, özdevinirler)]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[Sistem Programlama (System Programming)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2008/12/12/lex/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde programlama dillerinin tasarımı ve geliştirilmesi sırasında kullanılan ve dildeki kelimelerin analizine (lexical analysis) yarayan kod üretme programıdır. Yani lex için hazırlanmış bir dosyayı lex programından geçirdikten sonra size C dilinde bir kod çıkar. Bu kodu C dilinde derledikten (compile) sonra çalışan bir programınız olur. Veya tercihen bu çıktıyı [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bilgisayar bilimlerinde programlama dillerinin tasarımı ve geliştirilmesi sırasında kullanılan ve dildeki kelimelerin analizine (lexical analysis) yarayan kod üretme programıdır. Yani lex için hazırlanmış bir dosyayı lex programından geçirdikten sonra size C dilinde bir kod çıkar. Bu kodu C dilinde<a href="http://www.bilgisayarkavramlari.com/2008/01/03/derleyici-compiler/"> derledikten (compile) </a>sonra çalışan bir programınız olur. Veya tercihen bu çıktıyı <a href="http://www.bilgisayarkavramlari.com/2008/12/12/yacc/">yacc programına</a> alt yapı oluşturmak için de kullanabilirsiniz.</p>
<p>LEX programının ismi inigilizcedeki lexical analyzer kelimesinden gelir. Kelime bilimi anlamına gelen <a href="http://www.bilgisayarkavramlari.com/2009/05/04/kelimebilimsel-bakis-lexical-aspect/">Lexical kelimesinin</a> ilk 3 harfinden kısaltılmıştır. LEX programının linux üzerinde çalışan ve yaygın bir sürümü flex ismindedir. flex programı da lex gibi çalışmaktadır ve hemen hemen aynı parametre ve özelliklerle kullanılabilir.</p>
<p>LEX dosyalarının 3 ana bölümü bulunur. İlk bölümde fonksiyon ve değişke tanımlamaları ve projeye dahil edilecek (include) kütüphaneler tanımlanır.</p>
<p>ikinci bölümde LEX dosyamızın omurgasını oluşturan <a href="http://www.bilgisayarkavramlari.com/2007/04/14/regular-expression-regexp-duzenli-deyimler-ifadeler/">düzenli deyimler ( regular expression )</a> kısmı yer alır. Burada her ihtimal için ayrı bir regular expression tanımlanarak ilgili regular expression&#8217;a girilmesi durumunda ne yapılacağı kodlanır.</p>
<p>Son bölümde ise fonksiyon içerikleri yer alır.</p>
<p>Aşağıda basit bir lex dosyasının içeriği verilmiştir:</p>
<pre>%{ // yukarıda anlatılan ilk bölüm tanımlamalar yapılıyor
    #include "y.tab.h"
    #include &lt;stdlib.h&gt;
    void yyerror(char *);
%}

// ikinci bölüm regular expressionlar
%%

[0-9]+      {
                yylval = atoi(yytext);
                return INTEGER;
            }

[-+\n]      { return *yytext; }

[ \t]       ;       /* skip whitespace */

.           yyerror("Unknown character");

%%
// son bölüm fonksiyon içerikleri
int yywrap(void) {
    return 1;
}</pre>
<p>Yukarıdaki bu dosya daha önce de anlatıldığı üzere 3 parçadan oluşmaktadır. Koddaki <a href="http://www.bilgisayarkavramlari.com/2007/04/14/regular-expression-regexp-duzenli-deyimler-ifadeler/">düzenli deyimler( regular expression)</a> kısaca aşağıda açıklanmıştır:</p>
<ul>
<li> [0-9]+ 0 ile 9 arasındaki sayılar (yani 0 1 2 3 4 5 6 7 8 9 sayılarından en az bir yada istenildiği kadar çok</li>
<li>[-+\n] sembol olarak &#8220;+&#8221;, &#8220;-&#8221; veya &#8220;\n&#8221; sembolleri (yani artı eksi veya satır sonu (enter tuşu))</li>
<li>[ \t] sembol olara &#8221; &#8221; veya &#8220;\t&#8221; yani boşluk karakteri (space) veya tab karakteri</li>
<li>. geri kalan bütün karakterler. LEX dosyasında üstte yazılı olan düzenli deyimlerin önceliği var ve . sembolü herşeyi kapsar dolayısıyla yukarıdakilerden birisine girmezse buraya girer.</li>
</ul>
<p>Yukarıdaki düzenli deyimler için yapılan işlemler küme parantezleri arasında (curved brackets) yazılmaktadır. Bu alanlarda yazılanları da tanıyalım:</p>
<p>yylval değişkeni lex tarafından döndürülen değerdir. Bu değer dahil edilen y.tab.h dosyasında tanımlanır ve bu değişkene değer atanarak lex&#8217;den örneğin yacc&#8217;a veri geçişi sağlanır.</p>
<p>yytext değişkeni ilgili düzenli deyime (Regular expression) giren terimleri alır. Örneğin lex çalışırken 123 gibi bir girdi aldı diyelim. Bu girdi ilk düzenli deyime girecek (çünkü 123 sayısal değerleri [0-9] aralığına uyan 3 sembolden oluşuyor ve bu sembollerin 3 kere tekrarlanması bu düzenli deyim tarafından algılanır). Bu deyim girdikten sonra yapılan iş gelen metin değerini (yytext ki burada &#8220;123&#8243; dizgisi (String) oluyor) atoi fonksiyonu ile integer tipine çevirir. Bu çevrilen değer yylval değişkenine atanarak yacc&#8217;a geçirilmektedir.</p>

<p class="sayac_bilgi">207 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2008/12/12/lex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parçalama Ağacı (Parse Tree)</title>
		<link>http://www.bilgisayarkavramlari.com/2008/12/09/parcalama-agaci-parse-tree/</link>
		<comments>http://www.bilgisayarkavramlari.com/2008/12/09/parcalama-agaci-parse-tree/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 13:56:48 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Automata (otomatlar, özdevinirler)]]></category>
		<category><![CDATA[Bilgisayar Kavramları]]></category>
		<category><![CDATA[Doğal Dil İşleme (NLP)]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[Sistem Programlama (System Programming)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2008/12/09/parcalama-agaci-parse-tree/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Parçalam işlemi  (parsing) bilgisayar bilimlerinde çeşitli amaçlar için kullanılmaktadır. Özellikle de dil ile ilgili işlemlerin hemen hepsinde ihtiyaç duyulan bir işlemdir. Örneğin bir programlama dilinde yazılan komutların algılanması için öncelikle kelimeleirn parçalanması (parse) gerekir. Benzer şekilde dopal dil işleme (natural language processing) işlemlerinde de doğal dilde bulunan kelimelerin algılanması bir [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Parçalam işlemi  (parsing) bilgisayar bilimlerinde çeşitli amaçlar için kullanılmaktadır. Özellikle de dil ile ilgili işlemlerin hemen hepsinde ihtiyaç duyulan bir işlemdir. Örneğin bir programlama dilinde yazılan komutların algılanması için öncelikle kelimeleirn parçalanması (parse) gerekir. Benzer şekilde dopal dil işleme (natural language processing) işlemlerinde de doğal dilde bulunan kelimelerin algılanması bir parçalamadan (ek ve köklerin ayrılmasından) sonra gerçekleşmektedir.</p>
<p>Çeşitli sebeplerle kullanılan parçalama ağaçları basitçe verilen bir dilbilgisine (grammer) göre verilen cümlenin (veya kelimenin) nasıl parçalandığını şekilsel olarak gösteren ağaçlardır:</p>
<p>Örneğin aşağıda <a href="http://www.bilgisayarkavramlari.com/2008/12/09/backus-normal-form-bnf/">BNF yapısında </a>verilmiş dili ele alalım:</p>
<p>&lt;dil&gt;::=&lt;işlem&gt;</p>
<p>&lt;işlem&gt; ::= &lt;işlem&gt; + &lt;terim&gt; | &lt;işlem&gt; &#8211; &lt;terim&gt; | &lt;terim&gt;</p>
<p>&lt;terim&gt; ::= &lt;terim&gt; * &lt;unsur&gt; | &lt;terim&gt; / &lt;unsur&gt; | &lt;unsur&gt;</p>
<p>&lt;unsur&gt; ::= <strong>sayı</strong> | <strong>( </strong>&lt;işlem&gt; <strong>)</strong></p>
<p>&lt;sayı&gt; ::= 1|2|3&#8230;|9|0</p>
<p class="MsoNormal">Bu dilde aşağıdaki örneğin nasıl parçalandığını inceleyelim:</p>
<p class="MsoNormal">4+8*(2-3)</p>
<p class="MsoNormal">Bu dilde tanımlı olan yukarıdaki işlemin parçalama ağacı aşağıdaki şekildedir:</p>
<p class="MsoNormal"><img class="alignnone size-full wp-image-1392" title="parcalama_agaci" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2008/12/parcalama_agaci.jpg" alt="" width="404" height="360" /></p>
<p class="MsoNormal">yukarıdaki şekilde devamlı (nonterminal) terimlerden sonuncu (terminal) terimlere kadar bir BNF dilinin nasıl açıldığı gösterilmiştir.</p>

<p class="sayac_bilgi">284 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2008/12/09/parcalama-agaci-parse-tree/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Backus Normal Form (BNF)</title>
		<link>http://www.bilgisayarkavramlari.com/2008/12/09/backus-normal-form-bnf/</link>
		<comments>http://www.bilgisayarkavramlari.com/2008/12/09/backus-normal-form-bnf/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 11:18:15 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[Automata (otomatlar, özdevinirler)]]></category>
		<category><![CDATA[Derleyiciler]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[Sistem Programlama (System Programming)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2008/12/09/backus-normal-form-bnf/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerilnde genellikle bir dil tanımlamada ve bu dilin gramerini (Dil bilgisini) belirlemekte kullanılan gösterim biçimidir. Basitçe dil bir dil tanımında başlayarak Terminal (sonuncu) ve Non-Terminal (Devamlı) terimler kullanarak tanılmanmaktadır. Örneğin aşağıda basit bir örneği verilmiştir: &#60;dil&#62; ::= &#60;harf&#62;&#124;&#60;imla&#62; &#60;harf&#62; ::= a&#124;b&#124;&#8230;&#124;z &#60;imla&#62; ::= .&#124; &#124;,&#124;? Yukarıda bir dil tanımı [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bilgisayar bilimlerilnde genellikle bir dil tanımlamada ve bu dilin gramerini (Dil bilgisini) belirlemekte kullanılan gösterim biçimidir.</p>
<p>Basitçe dil bir dil tanımında başlayarak Terminal (sonuncu) ve Non-Terminal (Devamlı) terimler kullanarak tanılmanmaktadır.</p>
<p>Örneğin aşağıda basit bir örneği verilmiştir:</p>
<p>&lt;dil&gt; ::= &lt;harf&gt;|&lt;imla&gt;</p>
<p>&lt;harf&gt; ::= a|b|&#8230;|z</p>
<p>&lt;imla&gt; ::= .| |,|?</p>
<p>Yukarıda bir dil tanımı yapılmış ve bu dilde harf veya imlalar bulunduğu söylenmiştir. Buna göre dilimizdeki harfler a&#8217;dan z&#8217;ye kadar olup imla işaretleri de &#8220;. ,?&#8221; işaretleridir.  Bir ifadenin (nonterminal veya terminal) alabileceği alternatifler | işareti ile ayrılır. Yani harf ya &#8220;a&#8221;, ya &#8220;b&#8221; ya&#8230; şeklinde sayılan alternatiflerden birisi olabilir demektir. (aralarında <a href="http://www.bilgisayarkavramlari.com/2007/11/29/veya-kapisi-or-gate/">veya (or) </a>bağlantısı varmış gibi düşünülebilir)</p>
<p>Yukarıda da görüldüğü üzere BNF gösteriminde nonterminal&#8217;ler (devamlılar) &lt;&gt; işaretleri arasında belirtilmektedir.</p>
<p>Yukarıdaki dilimize aşağıdakine benzer bir ek yapılırsa:</p>
<p>&lt;dil&gt; ::= <strong>&lt;harf&gt;&lt;dil&gt;</strong> |&lt;harf&gt;|&lt;imla&gt;</p>
<p>&lt;harf&gt; ::= a|b|&#8230;|z</p>
<p>&lt;imla&gt; ::= .| |,|?</p>
<p>Yukarıda fark edilsin diye koyu gösterilen ek marifetiyle dilimizde bir dögü elde edilmiş ve bu sayede dilimizdeki harfler istenildiği kadar tekrar edilmiştir. Yani ilk örnekte dilimizde sadece tek bir harf veya tek bir imla işareti bulunabilirken yeni eklentimiz ile dilimizde istediğimiz kadar harf bulunudurabiliriz. Elbette bu durumun bir harf veya imla ile bitmesi gerekmektedir.</p>
<p>BNF ayrıca döngü miktarını belirlemek için de {}<sub>i</sub><sup>j</sup> sembollerini kullanır. Bu gösterim i&#8217;den j&#8217;ye kadar tekralanacağı anlamındadır:</p>

<p class="sayac_bilgi">192 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2008/12/09/backus-normal-form-bnf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Harici Parçalar (External Fragments)</title>
		<link>http://www.bilgisayarkavramlari.com/2008/12/03/harici-parcalar-external-fragments/</link>
		<comments>http://www.bilgisayarkavramlari.com/2008/12/03/harici-parcalar-external-fragments/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 10:06:58 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Bilgisayar Kavramları]]></category>
		<category><![CDATA[işletim sistemleri]]></category>
		<category><![CDATA[Sistem Programlama (System Programming)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2008/12/03/harici-parcalar-external-fragments/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Hafıza yönetimi sırasında kullanılan kıtalama (bölütleme, segmentation) hafızadaki her işleme tam olarak istediği kadar yer ayırmaya çalışır. Bu yaklaşımda, işlemler arasında oluşabilecek boşluklara verilen isim harici parçalar (dış parçalar, external fragments)&#8217;dir. Her işleme ihtiyaç duyduğu kadar yer ayırmak ilk başta daha verimli gibi görülse de bu çözümde de boşluklar ve [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p><a href="http://www.bilgisayarkavramlari.com/2008/12/03/hafiza-yonetimi-memory-management/">Hafıza yönetimi </a>sırasında kullanılan kıtalama (bölütleme, segmentation) hafızadaki her işleme tam olarak istediği kadar yer ayırmaya çalışır. Bu yaklaşımda, işlemler arasında oluşabilecek boşluklara verilen isim harici parçalar (dış parçalar, external fragments)&#8217;dir.</p>
<p>Her işleme ihtiyaç duyduğu kadar yer ayırmak ilk başta daha verimli gibi görülse de bu çözümde de boşluklar ve hafıza israfı söz konusudur. <a href="http://www.bilgisayarkavramlari.com/2009/05/31/sayfalama-paging/">Sayflama (Paging)</a> yaklaşımında slotların içine olan boşluklara iç parça (internal fragment) ismi verilirken <a href="http://www.bilgisayarkavramlari.com/2008/12/03/kitalamak-bolutlemek-segmentation/">kıtalama (segmentation)</a> sırasında oluşan boşluklara dış parça (external fragment) ismi verilir. Bu boşluklar aşağıdaki şekilde oluşur.</p>
<p><img class="alignnone size-full wp-image-1355" title="kitalama_segmentation" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2008/12/kitalama_segmentation.jpg" alt="" width="232" height="263" /></p>
<p>Yukarıdaki şekilde görüldüğü üzere sırasıyla 1, 2 ve 3. işlemler gelmiş hafızada gösterilen alanlar bu işlemlere ayrılmıştır. Şimdi bu işlemlerden örneğin 2. işlemin çalışıp bittiğini düşünelim. Bunun anlamı 2. işlem hafızadan kaldırılacak demektir.</p>
<p>2. işlem hafızadan kaldırıldıktan sonra oluşan tablo aşağıdaki şekildedir:</p>
<p><img class="alignnone size-full wp-image-1356" title="bolutlemek" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2008/12/bolutlemek.jpg" alt="" width="234" height="263" /></p>
<p>Yukarıda da görüldüğü üzere 400 ile 500 arasındaki hafıza alanı boşalmıştır. Buradaki boşluk verimsiz bir boşluktur bunun sebebi 100 boyutunda başka bir işlem gelmediği sürece bu alan kullanılamaz. Hele bir de aşağıdaki gibi örneğin 75 boyutunda bir işlem gelirse arada kalan 25 birimlik boşluğun kullanılabilirliği oldukça azalır.</p>
<p><img class="alignnone size-full wp-image-1357" title="segmentation" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2008/12/segmentation.jpg" alt="" width="306" height="263" /></p>
<p>işte bu alanlara bilgisayar bilimlerinde verilen isim harici parça (external fragment)&#8217;dir.</p>

<p class="sayac_bilgi">142 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2008/12/03/harici-parcalar-external-fragments/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

