2014-12-19 4 views
6

Über diese Sample-Semaphore-Implementierungen (für SMP-Systeme), verstehe ich das Test-and-Set ist für multiprocessor atomic checks erforderlich. Sobald wir jedoch die atomaren Überprüfungen hinzugefügt haben, sind die disable interrupts nicht mehr redundant? Die Deaktivierungsunterbrechungen bieten jedenfalls nur Atomizität über einen Prozessor. Der Zusatz zur Semaphor-Warteschlange muss ebenfalls geschützt werden.Semaphore-Implementierung: Warum sind deaktivierende Interrupts zusammen mit Test-und-Set erforderlich?

class semaphore { 
private int t; 
private int count; 
private queue q; 

public semaphore(int init) 
{ 
    t = 0; 
    count = init; 
    q = new queue(); 
} 

public void P() 
{ 
    Disable interrupts; 
    while (TAS(t) != 0) { /* just spin */ }; 
    if (count > 0) { 
     count--; 
     t = 0; 
     Enable interrupts; 
     return; 
    } 
    Add process to q; 
    t = 0; 
    Enable interrupts; 
    Redispatch; 
} 

public V() 
{ 
    Disable interrupts; 
    while (TAS(t) != 0) { /* just spin */ }; 
    if (q == empty) { 
     count++; 
    } else { 
     Remove first process from q; 
     Wake it up; 
    } 
    t = 0; 
    Enable interrupts; 
} 

}

+1

Dies ist Hausaufgabe Frage Stack Overflow die Hausaufgaben zu machen. Siehe "_Warum müssen wir noch Interrupts deaktivieren, zusätzlich zu Test und Set? _" In http://pages.cs.wisc.edu/~bart/537/lecturenotes/s10.html wo der Code herkommt (sehr wahrscheinlich). Die Frage erfüllt derzeit nicht http://stackoverflow.com/help/on-topic: "_Fragen, die nach Hausaufgaben fragen, müssen eine Zusammenfassung der bisherigen Arbeit enthalten, um das Problem zu lösen, und eine Beschreibung der Schwierigkeit du hast es gelöst_ " – xmojmr

+0

Danke, @xmojmr - ich habe gerade darüber nachgedacht, das zu beantworten. Jetzt wird es runter/nah. –

+2

Diese Frage scheint off-topic zu sein, da es sich um eine Hausaufgaben-Dump handelt. –

Antwort

7

Es stimmt zwar, dass Drehen auf einer Prozessor-Interrupts ausgeschaltet ist unzureichend Atom-Speicherzugriff in einem Multi-Prozessor-System zu gewährleisten (weil, wie Sie erwähnen, Threads auf anderen Prozessoren können weiterhin gemeinsam genutzten Ressourcen zugreifen), schalten wir Interrupts für einen Teil der Multiprozessor-Semaphor-Implementierung aus, weil wir nicht entplaned werden wollen, während wir einen Test und einen Satz durchführen.

Wenn ein Thread, der den Test und den Satz enthält, entplaned ist, können keine anderen Threads irgendetwas mit dem Semaphor tun (weil seine Zählung durch diesen Test und Satz geschützt ist), den der Thread verwendet hat, während er schläft (das ist nicht gut). Um zu garantieren, dass dies nicht geschieht, schalten wir Interrupts bei unserem Prozessor aus, während wir Test und Set verwenden.

+0

Anne - ersten Dank für die Beantwortung dieser Frage (es war fast tot). Ihre Antwort macht vollkommen Sinn. Um wirklich pedantisch zu sein, selbst wenn ein Thread in den Ruhezustand versetzt wurde, bevor t = 0 gesetzt wurde (Entsperren des Spinlocks), drehen sich die anderen Threads weiter, wenn sie versuchen, auf den Semaphor zuzugreifen. Das ist wirklich schlecht für die Leistung, da es zu vergeudeten Zyklen führt, aber es ist immer noch eine korrekte (wenn auch schreckliche) Lösung, da kein Staat aufgrund irgendwelcher Rassenbedingungen korrumpiert ist. Bitte korrigieren Sie mich, wenn ich falsch liege. Das Deaktivieren von Interrupts ist für die Leistung und nicht für die Korrektheit entscheidend. – user110036

+1

Sie haben Recht - Unterbrechungen würden keine Synchronisationsprobleme verursachen, es würde nur zu einer schlechten Leistung führen. –

+0

Ehrfürchtig. Danke für die Antwort und Klarstellung :) – user110036