2010-12-03 15 views

cevap

2

Aşağıda göreceğiniz gibi teorik bekleyen koşulu sınırlanmış molası verebilir

Cevap. Pratik olarak, hangi zamanlama algoritmasının kullanıldığına bağlıdır.

wait() ve signal() ilkel klasik uygulama gibidir:

//primitive 
wait(semaphore* S) 
{ 
    S->value--; 
    if (S->value < 0) 
    { 
     add this process to S->list; 
     block(); 
    } 
} 

//primitive 
signal(semaphore* S) 
{ 
    S->value++; 
    if (S->value <= 0) 
    { 
     remove a process P from S->list; 
     wakeup(P); 
    } 
} 

bir süreç wait() çağırır ve test "eğer", bir bekleme listesine kendisini koyacağız başarısız olduğunda. Aynı semaforda birden fazla işlem engellenirse, hepsi bu listeye konurlar (veya bir şekilde hayal edebileceğiniz gibi birbirine bağlıdırlar). Başka bir işlem kritik bölümden ayrılır ve sinyal() çağırırsa, bekleme listesindeki bir işlem uyanmak üzere seçilir, tekrar CPU için rekabet etmeye hazırdır. Ancak, bekleme listesinden hangi süreci seçeceğine karar veren programcıdır. Zamanlama, örneğin bir LIFO (ilk giren en son) tarzında uygulanmışsa, bazı işlemlerin açılmasının mümkün olması mümkündür. Eğer/uygular doğru semaforu kullanır rağmen

Örnek

T1: thread 1 calls wait(), enters critical section 
T2: thread 2 calls wait(), blocked in waiting list 
T3: thread 3 calls wait(), blocked in waiting list 
T4: thread 1 leaves critical section, calls signal() 
T5: scheduler wakes up thread 3 
T6: thread 3 enters critical section 
T7: thread 4 calls wait(), blocked in waiting list 
T8: thread 3 leaves critical section, calls signal() 
T9: scheduler wakes up thread 4 
.. 

Gördüğünüz gibi, iplik 2 sınırsız bekleme süresi, yeni süreçlerin sürekli girerek neden hatta muhtemelen açlık vardır.

İlgili konular