<?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>Yıldırım -- İşadamı &#187; sync</title>
	<atom:link href="http://yildirim.isadamlari.org/tag/sync/feed" rel="self" type="application/rss+xml" />
	<link>http://yildirim.isadamlari.org</link>
	<description>M. Salih YILDIRIM'ın Kişisel Karalamacı</description>
	<lastBuildDate>Sun, 21 Feb 2010 15:12:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>İşletim Sistemleri Ek.1 &#8211; İşlem Senkronizasyonu</title>
		<link>http://yildirim.isadamlari.org/2009/isletim-sistemleri-ek-1-islem-senkronizasyonu.html</link>
		<comments>http://yildirim.isadamlari.org/2009/isletim-sistemleri-ek-1-islem-senkronizasyonu.html#comments</comments>
		<pubDate>Thu, 09 Jul 2009 14:34:18 +0000</pubDate>
		<dc:creator>yildirim</dc:creator>
				<category><![CDATA[gezegen]]></category>
		<category><![CDATA[İşletim Sistemleri]]></category>
		<category><![CDATA[bsd]]></category>
		<category><![CDATA[critical section]]></category>
		<category><![CDATA[deadlock]]></category>
		<category><![CDATA[gezegen_arch]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mutex]]></category>
		<category><![CDATA[os]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[semafor]]></category>
		<category><![CDATA[semaphore]]></category>
		<category><![CDATA[sync]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://yildirim.isadamlari.org/?p=346</guid>
		<description><![CDATA[Process Management (işlem yönetimi) kısmını anlatmayı bitirdikten sonra biraz daha detaylı bilgi vermek istedim. Buraya kadar anlattıklarım genel bilgilerdi, fakat bu yazı biraz daha derin bilgiler içermektedir. Meraklı olanlar veya işlemlerin nasıl çalıştırıldığı hakkında detaylı bilgi almak isteyenler bu yazıyı okuyabilirler.
Bu yazıdan sonra terimleri Türkçeleştirmemeye karar verdiğimi de belirtmek isterim. Bu yüzden her ingilizce terimi [...]]]></description>
			<content:encoded><![CDATA[<p>Process Management (işlem yönetimi) kısmını anlatmayı bitirdikten sonra biraz daha detaylı bilgi vermek istedim. Buraya kadar anlattıklarım genel bilgilerdi, fakat bu yazı biraz daha derin bilgiler içermektedir. Meraklı olanlar veya işlemlerin nasıl çalıştırıldığı hakkında detaylı bilgi almak isteyenler bu yazıyı okuyabilirler.</p>
<p>Bu yazıdan sonra terimleri Türkçeleştirmemeye karar verdiğimi de belirtmek isterim. Bu yüzden her ingilizce terimi içeren bir sözlük yazıya dahil edilecektir.</p>
<p><span style="font-weight: bold;">Sözlük:</span></p>
<ul>
<li><span style="font-weight: bold;">Utilization:</span> İşlemcinin, işlem yaptığı süre, bu sürenin yüksek olması, donanımdan maksimum verim alındığını gösterir.</li>
<li><span style="font-weight: bold;">Throughput:</span> Birim zamanda bitirilen işlem sayısıdır. Örnek: iş/saniye</li>
<li><span style="font-weight: bold;">Service Time:</span> Servis süresi, bir cihazın, gelen isteği çözümlemesi için geçen süre.</li>
<li><span style="font-weight: bold;">Queueing Time:</span> Kuyruk süresi, alınacak hizmet için kuyrukta beklenen süre.</li>
<li><span style="font-weight: bold;">Response Time:</span> Yanıt süresi, kullanıcı işlemine sistemin verdiği tepki süresidir.</li>
</ul>
<p><span style="font-weight: bold;">Üretici ve Tüketici Problemine Derinlemesine Bakış:</span></p>
<p>Daha önce üretici ve tüketici probleminden (producer and consumer problem) bahsetmiştim. Bu bölümde daha detaylı kodlar vererek derinlemesine inceleyip, işlemler arası senkronizasyonu anlamaya çalışacağız.</p>
<p>Üretici, veri üreten uygulamaya verilen isimdir. Bu uygulamanın görevi belli veri türünde veri üretmektir. Kullanılan veri yapılarını tanımlayalım.</p>
<pre lang="c">#define BUFFER_SIZE 10

typedef struct {
	DATA 	data;
} item;

item	buffer[BUFFER_SIZE];
int	in=0;		//Yeni girdinin buffer'daki lokasyonu
int	out=0;		//Tüketilecek verinin buffer'daki lokasyonu
int	counter=0;	//Buffer'da kaç odanın kulllanıldığı</pre>
<p><strong>Üretici:</strong><br />
Üretici işlem, tüketici işlemin tüketmesi için işlem üretir. Ancak burada önemli olan bounded (sınırlı) buffer&#8217;ı aşmayacak kadar veri üretmektir. Kodunu inceleyelim.</p>
<pre lang="c">item    NextProduced;

while (TRUE)
{
    while (counter == BUFFER_SIZE);
    buffer[in] = Nextproduced;
    in = (in+1) % BUFFER_SIZE;
    counter++;    //Bu kısma birazdan değineceğiz, bu satır çok önemli...
}</pre>
<p><strong>Tüketici:</strong></p>
<pre lang="c">item    NextConsumed;

while (TRUE)
{
    while (counter == 0);
    NextConsumed = buffer[out];
    out = (out + 1) % BUFFER_SIZE;
    counter--;
}</pre>
<p><img class="alignnone size-full wp-image-363" title="buffer" src="http://yildirim.isadamlari.org/wp-content/uploads//2009/07/buffer.png" alt="buffer" width="537" height="204" /></p>
<p>Burada producer kodundaki &#8216;counter++;&#8217; kodu çok önemli. Bu kodun assembly karşılığını yazacak olursak:</p>
<pre lang="asm">MOV AX, Counter
INC AX
MOV Counter, AX</pre>
<p>şeklinde olacaktır. Bu durumda eğer üretici işlemi çalışırken, preemption mekanizması devreye girerse ve &#8220;MOV Counter, AX&#8221; işlemi çalışmadan Context switching gerçekleşirse, ve context switch olduktan sonra producer işlemi çalışırsa, bu durumda counter değeri bir eksik olarak hesaplanacaktır.  Bu da buffer overflow&#8217;a (buffer taşması) neden olabilir. Tehlikeli bir durumdur.</p>
<p>Bu durumda critical section&#8217;dan (kritik bölge) bahsedebiliriz.</p>
<p><strong>Critical Section:</strong> Kodun herhangi bir yerinde context switching olup olmamasına göre işlemin sonucu değişebiliyorsa, ve bu işlemin sonucu önemliyse, bu bölgede context switching olmaması istenir. Bu bölgeye <strong>critical section</strong> denir. Bu bölgede aynı anda bir kod parçası çalışabilir. Başka bir kod parçası çalışamaz.</p>
<p>Bir critical section aşağıdaki bölgelerden oluşur.</p>
<ul>
<li><strong>Entry Section:</strong> Kodun critical section&#8217;a girmek için istekte bulunduğu bölümdür.</li>
<li><strong>Critical Section:</strong> Aynı anda yalnızca bir kod parçasının çalıştığı bölgedir.</li>
<li><strong>Exit Section:</strong> Critical Section&#8217;dan çıkış yapılan bölümdür. Buradan sonra ayrılmış alanları diğer işlemler kullanabilir.</li>
<li><strong>Remainder Section: </strong> Critical Section&#8217;dan sonraki kod parçalarıdır.</li>
<p><strong>Critical Section Şu Üç Özelliği Sağlamalıdır:</strong></p>
<li><strong>Mutual Exclusion (MUTEX):</strong> Birden fazla işlen critical section&#8217;da aynı anda çalıştırılmamalıdır.</li>
<li><strong>Progress:</strong> Eğer critical section&#8217;da hiç bir işlem yoksa ve bunların hiç birisi remainder section da değilse, hangi işlemin critical section&#8217;a gireceğine sınırlı sürede karar verilmelidir.</li>
<li><strong>Bounded Wait:</strong> Critical Section&#8217;a girmek isteyen bütün işlemler eninde sonunda critical section&#8217;a girmelidir.</li>
</ul>
<p><strong>Critical Section Kod Örneği:</strong></p>
<pre lang="c">do
{
	while (turn !=i );
	/*CRITICAL SECTION*/
	turn = j;
	/* REMAINDER SECTION */
} while (TRUE);</pre>
<p>NOT: Buradaki kod parçalarıda &#8220;i&#8221; çalışmakta olan process&#8217;i, &#8220;j&#8221; ise sırada bekleyen process&#8217;i ifade eder.</p>
<ul>
<li> <strong>ALGORITMA 1:</strong></li>
</ul>
<pre lang="c">do
{
	while (turn !=i );
	/*CRITICAL SECTION*/
	turn = j;
	/* REMAINDER SECTION */
} while (TRUE);</pre>
<p>Bu kod parçasında çalışan process, çalışmasını bitirdikten sonra diğer process&#8217;in critical section a girebilmesi için turn değişkenine, diğer process&#8217;in id&#8217;sini atar. Bu durumda 2 den fazla process&#8217;in aynı critical section&#8217;a giremeyecek olması bir yana, diğer taraftan &#8220;progress ve bounded wait&#8221; özellikleri sağlanmaz. Çünkü 1. process, sırayı 2. process&#8217;e devreder ama sıra 2. process&#8217;dan önce tekrar 1. process&#8217;e gelebilir.</p>
<ul>
<li> <strong>ALGORITMA 2:</strong>Bu algoritmada her process&#8217;e ait birer bayrak (flag) vardır. Bu flag critical section&#8217;da olup olmadığını gösterir. Critical Section&#8217;a girmek için diğer process&#8217;lerin flag leri kontrol edilmelidir.</li>
</ul>
<p><strong>Paylaşılan Değişkenler:</strong></p>
<pre lang="c">boolean flag[2]=false;</pre>
<p>Şimdi algoritmaya bakalım.</p>
<pre lang="c">do
{
        flag[i] = TRUE;
        while (flag[j]);
        /* CRITICAL SECTION */
        flag[i] = FALSE;
        /* REMAINDER SECTION */
} while (TRUE);</pre>
<p>Bu algoriyı inceleyecek olursak, iki process &#8216;de critical section da değilken, process lerden bir tanesi critical section&#8217;a girmek isterse ilk önce flag değişkeni TRUE olacaktır. Tam bu sırada context switching gerçekleşir ve 2. process de critical section&#8217;a girmek üzere flag değişkenini TRUE yaparsa, bu durumda 1. koşul sağlanmaz ve DEADLOCK oluşur. DEADLOCK kavramını bu yazının ilerleyen bölümlerinde açıklayacağız ama kısaca bahsetmek gerekirse, bu örnekte bir paylaşılan alandaki veriyi birden fazla process&#8217;in beklemesi ve hiç birisinin alamaması durumu olarak karşımıza çıkar.</p>
<ul>
<li><strong>ALGORITMA 3: </strong> Bu algoritmada, her bir process critical section&#8217;a girmek için istek flag&#8217;ini işaretler daha sonra diğer process&#8217;in critical section&#8217;a girmesi için flag&#8217;i değiştirir. Algoritması ile daha iyi anlaşılacaktır.</li>
</ul>
<p><strong>Paylaşılan Değişkenler:</strong></p>
<pre lang="c">boolean flag[2];
flag[0]=FALSE;
flag[1]=FALSE;</pre>
<p><strong>Kod:</strong></p>
<pre lang="c">do
{
        flag[i]=TRUE;
        turn = j;
        while (flag[j] &amp;&amp; turn == j);
        /* CRITICAL SECTION */
        flag[i] = FALSE;
        /* REMAINDER SECTION */
} while (TRUE);</pre>
<p>Bu algoritmayı incelediğimizde deadlock oluşmadığını görüyoruz. Ancak 1. şartı da sağlamıyor. Çünkü, bir process&#8217;in critical section&#8217;a girebilmesinin şartı, diğer process&#8217;in &#8220;ENTER SECTION&#8221;a gelmesini gerektiriyor. Bu da zaman kaybı anlamına geliyor.</p>
<p><strong>BU SORUNLARIN ÇÖZÜMLERİ:</strong></p>
<p>Bu sorunların çözümü donanımsal olarak mümkün olabiliyor. Bu çözümler bazı özelliklerin sağlanmasını gerektirir.<br />
Bu özellikler:</p>
<ul>
<li>bölünemez instruction&#8217;lar (assembly kod satırları)</li>
<li>atomik load, store ve test instruction&#8217;ları, eğer store ve test işlemi eşzamanlı olursa, test işlemi, bir register (yazmaç) ın eski değerini de, yeni değerini de alabilir.</li>
<li>İki farklı atomik instruction, eğer eşzamanlı çalıştırılsa bile sıralı çalışıyor gibi davranmalıdır.</li>
</ul>
<p><strong>Donanımsal Çözümler:</strong></p>
<ul>
<li><strong>Kesmeleri İptal Etmek (Disabling Interrupts): </strong> Bu yöntemde critical section&#8217;a girildiğinde donanımsal kesmeler iptal edilir, işlemci context switching yapmak için kesme kullandığından, kesmeler geçici bir süreliğine iptal edilirse, context switching gerçekleşmez. Böylece yukarda belirtilen sorunlar oluşmaz. Ancak bunun başka bir sorunu vardır. Bu da, critical section&#8217;a giren process kendi isteği ile critical section&#8217;dan ayrılmazsa preemption yapılamaması olarak kendini gösterir. Bu durumda tüm yönetim işletim sisteminin elinden alınır ve eğer critical section&#8217;daki işlem bir şekilde critical section&#8217;dan çıkmazsa tüm bilgisayar yanıt vermeyi durdurur.</li>
<li><strong><br />
Atomik Test and Set:</strong> Eğer bir mutex&#8217;in değeri atomik olarak test edilip değer atanırsa, ve sadece bu işlem atomik olursa, bunun için işlemcide özel instruction bulunursa, bu işlem sırasında context switching olmaz. Daha önceki örneklerde bu işlemin en az 3 instruction ile yapıldığını gördük ve bu işlemler sırasında context switching olabiliyordu.</li>
</ul>
<h2>Semaphore (Semafor):</h2>
<p>Semaforlar, mutex&#8217;den daha karmaşık yapıları modellemek için kullanılırlar. Djikstra tarafından geliştirilmiştir. Bir critical section&#8217;a sadece istenen process&#8217;lerin erişebilmesini garanti eden atomik yapıda fonksiyonlardan ve korunan değişkenden oluşur. Semaforlar binary (ikili) veya counting (sayaç) semaphore olarak ikiye ayrılır. Binary semaphore, mutex&#8217;e çok benzerken, counting semaphore bir critical section&#8217;a belli sayıya kadar process&#8217;in ulaşmasını sağlayan yapıdır.</p>
<p><strong>Race Condition:</strong> Birden fazla process aynı critical section&#8217;a erişemk istiyorsa ve bu process&#8217;lerin sırası önemliyle, bir process&#8217;in bu alana önce ulaşması race condition&#8217;a neden olabilir. Daha önce bahsettiğimiz enter section&#8217;daki context switching, race condition&#8217;a örnektir.</p>
<pre lang="c">P(Semaphore s)                      // Kaynağı Almak
{
  wait until s &gt; 0, then s := s-1;
  /* Test işlemi ve değerin azaltılması işlemi, RACE CONDITION oluşmaması için atomik yapıda olmalıdır. */
}

V(Semaphore s)  // Kaynağı Serbest Bırakmak
{
  s := s+1;   /* Atomik Olmalıdır. */
}

Init(Semaphore s, Integer v)
{
  s := v;
}</pre>
<p>Burada kaynak ayırmak için s değerinin 0&#8242;dan büyük olması gerekir. Eğer 0&#8242;a eşitse, Busy Wait (Meşgul Bekleme) yapar. Bu durumda bir döngü sürekli çalışır ancak bir iş yapmaz. Sadece Critical Section&#8217;a giriş için onay bekler. Eğer Aynı anda birden fazla process&#8217;in bir critical section&#8217;a erişebilmesi isteniyorsa bu durumda Counting Semaphore kullanılır. Bu semaphore da &#8220;Init&#8221; fonksiyonuna en fazla kaç process&#8217;in aynı anda çalışması isteniyorsa o sayı argüman olarak verilebilir. Atomik olduğu için DeadLock ları engellemek daha kolaydır. Ayrıca birden fazla process&#8217;in aynı critical section&#8217;a girebilmesi gibi bir esneklik sağlar. Tabii bu durumda race condition oluşabilir. Race condition sonucu etkilemiyorsa tercih edilmelidir.</p>
]]></content:encoded>
			<wfw:commentRss>http://yildirim.isadamlari.org/2009/isletim-sistemleri-ek-1-islem-senkronizasyonu.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
