CS207
йлдлийн системҮ
Лекц 8
Уншигч-Бичигч
Синхрончлолыг дэмждэг хэл дүү
А. Х дэр, Э. М нхс хү ө ү
http://www.elearn.sict.edu.mn/
Lec 8.29/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Тасалдал хорих аргаар хийсэн цоожны ил сайнүү
хэрэгж лэлтүү
• Гол санаа: цоожны хувьсагч зарлаад солбилцолыг
з вх н энэ хувьсагч дээр йлдэл хийх едө ө ү ү
хэрэгж лэх.үү
int value = FREE;
Acquire() {
disable interrupts;
if (value == BUSY) {
put thread on wait queue;
Go to sleep();
// Enable interrupts?
} else {
value = BUSY;
}
enable interrupts;
}
Release() {
disable interrupts;
if (anyone on wait queue) {
take thread off wait queue
Place on ready queue;
} else {
value = FREE;
}
enable interrupts;
}
Lec 8.39/27/10 Kubiatowicz CS162 ©UCB Fall 2010
test&set ашиглсан ил сайн цоожүү
• Бид нар test&set ашиглан завг й-х лээлтг й цоож хийж чадахү ү ү
уу?
– Б рэн бол чадахг й, гэхдээ багасгаж чаднаү ү !
– Санаа нь: З вх н цоожны утгыг атомаар шалгахад завг йө ө ү
х лээлт хийхү
Release() {
// Short busy-wait time
while (test&set(guard));
if anyone on wait queue {
take thread off wait queue
Place on ready queue;
} else {
value = FREE;
}
guard = 0;
int guard = 0;
int value = FREE;
Acquire() {
// Short busy-wait time
while (test&set(guard));
if (value == BUSY) {
put thread on wait queue;
go to sleep() & guard = 0;
} else {
value = BUSY;
guard = 0;
}
}
Lec 8.49/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Value=2Value=1Value=0
Семафор нь б хэл тоотой адилханү
• Семафор нь б хэл тоотой адилхан, гэхдээү
– С р г утга авахг йө ө ү
– З вх нө ө P, V гэсэн 2 йлдэл хийдэг. Анхны утгаү
олгохоос р р утга унших болон бичих йлдэлөө өө ү
хийхг й.ү
– йлдл д нь атом байна.Ү үү
» Хоёр P йлдэл нь утгыг тэгээс бага болгож чадахг й.ү ү
» нтэй адилаарҮү P-гээр унтах гэж байгаа хуулбар V-гээс
ирэх сэрээх дохиог алдахг й. Энэ 2 йлдэл яг зэрэгү ү
явагдсан ч ялгааг й.ү
• Семафор нь т м р замтай т ст й.ө ө ө ө
– Анхны утга нь 2 той тэнц семафорүү :
Value=1Value=0Value=2
Lec 8.59/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Агуулга
• Синхрончлолын хийсвэрлэл
– Монитор болон н хц лт хувьсагчө ө
• Уншигч-Бичигчийн асуудал ба т ний шийдэлүү
• Синхрончлолыг дэмждэг хэл дүү
Note: Some slides and/or pictures in the following are
adapted from slides ©2005 Silberschatz, Galvin, and Gagne
Note: Some slides and/or pictures in the following are
adapted from slides ©2005 Silberschatz, Galvin, and Gagne.
Many slides generated from my lecture notes by Kubiatowicz.
Lec 8.69/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Т гсг лл г буферийн б тэн шийдэлө ө ө ү
Semaphore fullBuffer = 0; // Initially, no coke
Semaphore emptyBuffers = numBuffers;
// Initially, num empty slots
Semaphore mutex = 1; // No one using machine
Producer(item) {
emptyBuffers.P(); // Wait until space
mutex.P(); // Wait until buffer free
Enqueue(item);
mutex.V();
fullBuffers.V(); // Tell consumers there is
// more coke
}
Consumer() {
fullBuffers.P(); // Check if there’s a coke
mutex.P(); // Wait until machine free
item = Dequeue();
mutex.V();
emptyBuffers.V(); // tell producer need more
return item;
}
Lec 8.79/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Шийдлийн талаарх хэлэлц лэгүү
• Яагаад тэгш хэмтэй биш байна вэ?
– йлдвэрлэгчҮ : emptyBuffer.P(), fullBuffer.V()
– Хэрэглэгч: fullBuffer.P(), emptyBuffer.V()
• P-ийн дараалал чухал уу?
– Тийм! Учир нь т гжрэлээсү
Producer(item) {
mutex.P(); // Wait until buffer free
emptyBuffers.P(); // Could wait forever!
Enqueue(item);
mutex.V();
fullBuffers.V(); // Tell consumers more coke
}
• V-ийн дараалал чухал уу?
– г йҮ ү , энэ нь т л вл лтийн р ашигт н л лжө ө ө ү ө өө
магадг йү
• Хэрэв 2 йлдвэрлэгч 2 хэрэглэгчтэй бол яах вэү ?
– Бид нар ямар нэг з йл рчл х хэрэгтэй юуү өө ө ?
Lec 8.89/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Монитор болон н хц лт хувьсагчө ө
• Семафор бол том дэвшил юм. З вх н уншихө ө
бичих йлдлээр т гсг л г дараалал хийх гээд з.ү ө ө ө ү
– Семафор нь хоёрдмол зорилготой:
» Солбилцол болон т л вл лтийн хязгаарлалтан дээрө ө ө
хэрэглэгддэг.
» Жишээ: P-гийн байрыг сольсноор т гсг л г буферө ө ө
т гжрэлд орно гэдэг шууд харагдахг й. З в гэдгийгү ү ө
яаж батлах вэ?
• З в санааө : Солбилцол дээр т гжээ хэрэглээдү
т л вл лтийн хязгаарлалт дээр н хц лтө ө ө ө ө
хувьсагчид хэрэглэе.
• Тодорхойлолт: Монитор: Дундын г гд л рууө ө ө
паралелиар хийх хандалтыг удирдах нэг цоож, 0
болон олон н хц лт хувьсагчидө ө
– Жава гэх мэтийн програмчлалын хэл дээр байдаг.
– Бусад хэлн д цоож болон н хц лт хувьсагчдыгүү ө ө
хослуулж хэрэглэнэ.
Lec 8.99/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Энгийн мониторын жишээ
• Синхрончлогдсон дараалал (хязгаарг йү ):
Lock lock;
Condition dataready;
Queue queue;
AddToQueue(item) {
lock.Acquire(); // Get Lock
queue.enqueue(item); // Add item
dataready.signal(); // Signal any waiters
lock.Release(); // Release Lock
}
RemoveFromQueue() {
lock.Acquire(); // Get Lock
while (queue.isEmpty()) {
dataready.wait(&lock); // If nothing, sleep
}
item = queue.dequeue(); // Get next item
lock.Release(); // Release Lock
return(item);
}
• Мониторын сонирхолтой биш
– Н хц лт хувьсагч ашиглахг й цоож ашиглаж байнаө ө ү
– Хэрэглэгчийг ажиллахг й ед нь унтуулж чадахг йү ү ү
Lec 8.109/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Н хц лт хувьсагчө ө
• RemoveFromQueue() - ийг дараалалд ямар нэг элемент орж
иртэл х лээдэг байхаар яаж рчл х вэү өө ө ?
– Дараалалд байгаа элементийн тоог семафорт хадгална.
Гэхдээ алдаа гарч магадг йү !
• Н хц лт хувьсагчө ө : эгзэгтэй муж дотор ямар нэг з йл болохыгү
х лээж байгаү a хуулбаруудын дараалал
– Гол санаа: эгзэгтэй муж дотор унтах едээ цоожийг атомаарү
ч л л хийг з вш рнө өө ө ө өө ө
– Семафортой харьцуулахад: эгзэгтэй муж дотор х лээжү
чадахг йү
• йлдэлҮ :
– Wait(&lock): Цоожийг атомаар ч л л д унтана, буцажө өө өө
ирэхийн мн цоожоо буцааж авнаө ө .
– Signal(): Х лээж байгаа хуулбар байвал нэгийг сэрээнэү
– Broadcast(): Х лээж байгаа б х хуулбарыг сэрээнэү ү
• Д рэмү : Н хц лт хувьсагч дээр йлдэл хийж байхдаа цоожооө ө ү
ч л л хг йө өө ө ү !
– Birrell – ийн г лэл дээр цоожны гаднаас сигнал йлдлийгө үү ү
хийж байгаа гэхдээ энэ бол оновчлол юм.
Lec 8.119/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Мониторын б тэн жишээү (н хц лт хувьсагчтайө ө )
• Хязгаарг й синхрончлогдсон дараалалү
Lock lock;
Condition dataready;
Queue queue;
AddToQueue(item) {
lock.Acquire(); // Get Lock
queue.enqueue(item); // Add item
dataready.signal(); // Signal any waiters
lock.Release(); // Release Lock
}
RemoveFromQueue() {
lock.Acquire(); // Get Lock
while (queue.isEmpty()) {
dataready.wait(&lock); // If nothing, sleep
}
item = queue.dequeue(); // Get next item
lock.Release(); // Release Lock
return(item);
}
Lec 8.129/27/10 Kubiatowicz CS162 ©UCB Fall 2010
• compare&swap (&address, reg1, reg2) { /* 68000 */
if (reg1 == M[address]) {
M[address] = reg2;
return success;
} else {
return failure;
}
}
Холбоост жагсаалт руу атомаар нэмэх функц:
addToQueue(&object) {
do { // repeat until no conflict
ld r1, M[root] // Get ptr to current head
st r1, M[object] // Save link in new object
} until (compare&swap(&root,r1,object));
}
Compare болн Swap дараалалд ашиглах
root next next
next
New
Object
Lec 8.139/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Уншигч/Бичигчийн асуудал
• Сэдэл: Дундын г гдлийн сангө ө ( СӨ )авч зьеү
– Хоёр т рлийн хэрэглэгч байнаө :
» Уншигч – г гдлийн санг хэзээ ч рчл хг йө ө өө ө ү
» Бичигч – г гдлийн санг уншина, рчилнө ө өө ө
– г гдлийн сан дээр ер нхий нэг цоож тавих ньӨ ө ө
хангалттай юу?
» Нэгэн зэрэг хэдэнч уншигч хандаж болно
» Нэгэн зэрэг нэг бичигч бичнэ
R
R
R
W
Lec 8.149/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Уншигч/Бичигчийн ндсэн шийдэлү
• З в шийдлийн хязгаарлалтуудө :
– Бичигч байхг й ед уншигч С руу хандаж чаднаү ү Ө
– Бичигч болон уншигчид байхг й ед уншигч С руу хандажү ү Ө
чадна
– Т лвийн хувьсагчийг нэгэн зэрэг нэг хуулбар удирдажө
чадна
• Шийдлийн ндсэн б тэцү ү :
– Reader()
Бичигч байхгүй болтол хүлээнэ
ӨС руу хандана
Хүлээж байгаа бичигч байвал сэрээнэ
– Writer()
Идэвхитэй уншигч эсвэл бичигч байхгүй болтол
хүлээнэ
ӨС руу хандана
Хүлээж байгаа уншигч болон бичигч байвал сэрээнэ
– Т лвийн хувьсагчө (“lock” нэртэй цоожоор хамгаалагдсан):
» int AR: Number of active readers; initially = 0
» int WR: Number of waiting readers; initially = 0
» int AW: Number of active writers; initially = 0
» int WW: Number of waiting writers; initially = 0
» Condition okToRead = NIL
» Conditioin okToWrite = NIL
Lec 8.159/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Уншигчийн код
Reader() {
// First check self into system
lock.Acquire();
while ((AW + WW) > 0) { // Is it safe to read?
WR++; // No. Writers exist
okToRead.wait(&lock); // Sleep on cond var
WR--; // No longer waiting
}
AR++; // Now we are active!
lock.release();
// Perform actual read-only access
AccessDatabase(ReadOnly);
// Now, check out of system
lock.Acquire();
AR--; // No longer active
if (AR == 0 && WW > 0) // No other active readers
okToWrite.signal(); // Wake up one writer
lock.Release();
}
Lec 8.169/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Writer() {
// First check self into system
lock.Acquire();
while ((AW + AR) > 0) { // Is it safe to write?
WW++; // No. Active users exist
okToWrite.wait(&lock); // Sleep on cond var
WW--; // No longer waiting
}
AW++; // Now we are active!
lock.release();
// Perform actual read/write access
AccessDatabase(ReadWrite);
// Now, check out of system
lock.Acquire();
AW--; // No longer active
if (WW > 0){ // Give priority to writers
okToWrite.signal(); // Wake up one writer
} else if (WR > 0) { // Otherwise, wake reader
okToRead.broadcast(); // Wake all readers
}
lock.Release();
}
Бичигчийн код
Lec 8.179/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Уншигч/Бичигчийн шийдлийн загварчлал
• Доорх йлдл дийн дарааллыг авч зьеү үү ү
– R1, R2, W1, R3
• Уншигч б р орохдоо доорхийг шалганаү
while ((AW + WW) > 0) { // Is it safe to read?
WR++; // No. Writers exist
okToRead.wait(&lock); // Sleep on cond var
WR--; // No longer waiting
}
AR++; // Now we are active!
• Эхлээд R1 ирнэ:
AR = 1, WR = 0, AW = 0, WW = 0
• Дараа нь R2 ирнэ:
AR = 2, WR = 0, AW = 0, WW = 0
• Одоо, уншигчид С руу ханданаӨ
– Тохиолдол: Цоожнууд ч л тэйө өө
– З вх нө ө AR нь 0 биш байна
Lec 8.189/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Загварчлал(2)
• Дараа нь W1 ирнэ:
while ((AW + AR) > 0) { // Is it safe to write?
WW++; // No. Active users exist
okToWrite.wait(&lock); // Sleep on cond var
WW--; // No longer waiting
}
AW++;
• Уншигчдаас болоод эхэлж чадахг й тиймээсү
унтана:
AR = 2, WR = 0, AW = 0, WW = 1
• Эцэст нь R3 ирнэ:
AR = 2, WR = 1, AW = 0, WW = 1
• Одоо R2 нь R1 ээс мн дууснаө ө :
AR = 1, WR = 1, AW = 0, WW = 1
• С лд ньүү , эхний 2 уншигчийн с лийнх ньүү (R1)
дуусаад бичигчийг сэрээнэ:
if (AR == 0 && WW > 0) // No other active readers
okToWrite.signal(); // Wake up one writer
Lec 8.199/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Загварчлал(3)
• Бичигч сэрээд:
AR = 0, WR = 1, AW = 1, WW = 0
• Дараа нь бичигч ажиллаж дуусна:
if (WW > 0){ // Give priority to writers
okToWrite.signal(); // Wake up one writer
} else if (WR > 0) { // Otherwise, wake reader
okToRead.broadcast(); // Wake all readers
}
– Бичигч уншигчийг сэрээхэд:
AR = 1, WR = 0, AW = 0, WW = 0
• Уншигч дуусахад програм дуусна
Lec 8.209/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Асуулт
• Уншигчид гачигдаж болох уу? Reader() – ийн кодын эхний
хэсгийг авч зьеү :
while ((AW + WW) > 0) { // Is it safe to read?
WR++; // No. Writers exist
okToRead.wait(&lock); // Sleep on cond var
WR--; // No longer waiting
}
AR++; // Now we are active!
• Уншигчийн т гсг лд байгаа н хц л шалгах йлдлийг хасвалө ө ө ө ү
юу болох вэ?
AR--; // No longer active
if (AR == 0 && WW > 0) // No other active readers
okToWrite.signal(); // Wake up one writer
• Дараа нь signal() – ийг broadcast() болговол яах вэ?
AR--; // No longer active
okToWrite.broadcast(); // Wake up one writer
• Эцэст нь бид нар 2 тусдаа н хц лт хувьсагч ашиглахын орондө ө
нэг хувьсагч ашиглавал яах вэ? ( “okToContinue” гэж нэрлэе)
– Уншигч болон бичигчийг энэ хувьсагч унтуулна
– signal() – ийн оронд broadcast() – ийг ашиглах ёстой
Lec 8.219/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Семафороор мониторыг байгуулж болох уу?
• Цоожлох нь хялбар юм: Mutex – ийг хэрэглэнэ
• Н хц лт хувьсагчдийг ийм байдлаар хэрэгж лж чадах ууө ө үү ?
Wait() { semaphore.P(); }
Signal() { semaphore.V(); }
– Ажиллахг йү : Wait() нь цоожоо эзэмшээд унтаж магадг йү
• Энэ нь арай дээр үү?
Wait(Lock lock) {
lock.Release();
semaphore.P();
lock.Acquire();
}
Signal() { semaphore.V(); }
– Н хц лт хувьсагчид т хг й байдаг семафор т хтэйө ө үү ү үү
байдаг:
» Хуулбар сигнал йлдэл хийхэд хэнч х лээгээг йү ү ү
байвал яах вэ? NO-OP
» Хуулбар х лээвэл яах вэү ? Thread Waits
» Хуулбар V йлдэл хийхэд хэнч х лээгээг й байхадү ү ү
яах вэ? Increment
» Хуулбар P йлдэл хийхэд яах вэү ? Decrement and
continue
Lec 8.229/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Семафороор мониторыг байгуулах ( ргэлжлэлү )
• мн х оролдлогын асуудалӨ ө :
– P V хоёрын байрыг сольж болно
– Н хц лт хувьсагчдын байрыг сольж БОЛОХГ Йө ө Ү
• Доорхоор асуудлыг шийдэж болох уу?
Wait(Lock lock) {
lock.Release();
semaphore.P();
lock.Acquire();
}
Signal() {
if semaphore queue is not empty
semaphore.V();
}
– Семафорын дарааллын агуулгыг харах нь зохимжг йү
юм
– Н цийн т л х рс лд нөө ө өө ө ө өө – цоож ч л л гдснийө өө ө
дараа, х лээж байгаа хуулбарү semaphore.P() – г
биел лэхийн мн сигнал йлдэл хийсэн хуулбарүү ө ө ү
орж ирж болно
• нийг з в байдлаар шийдэх боломжтойҮү ө
– Hoare т л вл лтийн шийдлийг носноос уншө ө ө
– Mesa т л вл лт нь ил хялбарө ө ө үү
Lec 8.239/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Монитортын д гнэлтү
• Монитор нь програмын логикийг харуулдаг
– Шаардлагатай бол х лээнэү
– Ямар нэгэн рчл лт гарахад дохио гд г учирөө ө ө ө
х лээж байгаа ямарч хуулбар процесс цаашү
ргэлжилнэү
• Мониторд суурилсан програмын ндсэн б тэцү ү
lock
while (need to wait) {
condvar.wait();
}
unlock
do something so no need to wait
lock
condvar.signal();
unlock
Check and/or update
state variables
Wait if necessary
Check and/or update
state variables
Lec 8.249/27/10 Kubiatowicz CS162 ©UCB Fall 2010
С хэлний синхрончлолын дэмжлэг
• C хэл: Синхрончлол нь шууд утгатай байдаг
– Эгзэгтэй мужаас гарах кодын б х замийг мэдэхү
эсэхээ баталгаажуул
int Rtn() {
lock.acquire();
…
if (exception) {
lock.release();
return errReturnCode;
}
…
lock.release();
return OK;
}
– setjmp/longjmp аас болгоомжил!
» Функцээс гарах глобал срэлт хийж магадг йү ү
» Дээрх жишээнд E функц нь longjmp – ийг дуудаад B
функц руу очино
» С функц нь lock.acquire – ийг хийдэг бол асуудал
снэүү !
Proc A
Proc B
Calls setjmp
Proc C
lock.acquire
Proc D
Proc E
Calls longjmp
Stackgrowth
Lec 8.259/27/10 Kubiatowicz CS162 ©UCB Fall 2010
С++ хэлний синхрончлолын дэмжлэг
• C++ шиг онцгой тохиолдолтой хэл дүү
– Онцгой тохиолдолтой хэл д асуудалтай байдагүү
(цоожоо ч л л лг йгээр глобал гарах йлдлийгө өө ө ү ү
хялбар хийж болдог)
– Доорхийг авч зьеү :
void Rtn() {
lock.acquire();
…
DoFoo();
…
lock.release();
}
void DoFoo() {
…
if (exception) throw errException;
…
}
– DoFoo() функц доторх онцгой тохиолдол нь цоожийг
ч л л лг йгээр гарнаө өө ө ү
Lec 8.269/27/10 Kubiatowicz CS162 ©UCB Fall 2010
C++ Language Support for Synchronization (con’t)
• Эгзэгтэй муж дах б х онцгой тохилдлуудыг барьж авах ёстойү
– Онцгой тохиолдолоо барьж аваад, цоожоо ч л л дө өө өө , онцгой
тохиолдолоо сгэнэүү :
void Rtn() {
lock.acquire();
try {
…
DoFoo();
…
} catch (…) { // catch exception
lock.release(); // release lock
throw; // re-throw the exception
}
lock.release();
}
void DoFoo() {
…
if (exception) throw errException;
…
}
– Ил сайн шийдэлүү : авто_ptr<T> - тэй хэрэгслийг ашигла. C++
ном унш.
» Exit функцээс хамааралг йгээр цоожийг ч л лж дахинү ө өө
хуваарилах боломжтой
Lec 8.279/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Жава хэлний синхрончлолын дэмжлэг
• Жава нь хуулбар болон хуулбарын синхрончлолыг
илэрхий дэмждэг
• Bank Account example:
class Account {
private int balance;
// object constructor
public Account (int initialBalance) {
balance = initialBalance;
}
public synchronized int getBalance() {
return balance;
}
public synchronized void deposit(int amount) {
balance += amount;
}
}
– Обьект болгон рийн цоожтой байна. Цоож ньөө
synchronized арга руу ороход болон гарахад
автоматаар эзэмшигдэх ба ч л л гд нө өө ө ө ө.
Lec 8.289/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Жава хэлний синхрончлолын дэмжлэг ( ргэлжлэлү )
• Жава хэлний synchronized йлдэлү :
synchronized (object) {
…
}
– Жава обьект болгон рийн гэсэн цоожтой байдагөө
учраас энэ йлдлийн бие р ороход болон гарахадү үү
обьектийн цоож нь эзэмшигдэх болон ч л л гд нө өө ө ө ө
– Онцгой тохиолдолтой хамт хэрэглэгдэж болно:
synchronized (object) {
…
DoFoo();
…
}
void DoFoo() {
throw errException;
}
Lec 8.299/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Жава хэлний синхрончлолын дэмжлэг ( ргэлжлэлү )
• Жавагийн обьект болгон цоожноос гадна нэг н хц лт хувьсагчтайө ө
байна
– Синхрончлогдсон арга болон блок дотор хэрхэн х лээх йлдэлү ү
хийх вэ:
» void wait(long timeout); // Wait for timeout
» void wait(long timeout, int nanoseconds); //variant
» void wait();
– Синхрончлогдсон арга болон блок дотроос хэрхэн сигнал йлдэлү
хийх вэ:
» void notify(); // wakes up oldest waiter
» void notifyAll(); // like broadcast, wakes everyone
– Н хц лт хувьсагчид нь хязгаарлагдмал хугацаанд х лээж чаднаө ө ү .
Энэ нь онцгой тохиолдлыг боловсруулахад хэрэгтэй юм:
t1 = time.now();
while (!ATMRequest()) {
wait (CHECKPERIOD);
t2 = time.new();
if (t2 – t1 > LONG_TIME) checkMachine();
}
– Жавагийн б хү VM ижил байдагг йү !
» Т л вл лтийн бодлого нь ялгаатай, заавал зэрэглэлтэй байхө ө ө
албаг йү !
Lec 8.309/27/10 Kubiatowicz CS162 ©UCB Fall 2010
Summary
• Semaphores: Like integers with restricted interface
– Two operations:
» P(): Wait if zero; decrement when becomes non-zero
» V(): Increment and wake a sleeping task (if exists)
» Can initialize value to any non-negative value
– Use separate semaphore for each constraint
• Monitors: A lock plus one or more condition variables
– Always acquire lock before accessing shared data
– Use condition variables to wait inside critical section
» Three Operations: Wait(), Signal(), and Broadcast()
• Readers/Writers
– Readers can access database when no writers
– Writers can access database when no readers
– Only one thread manipulates state variables at a time
• Language support for synchronization:
– Java provides synchronized keyword and one condition-
variable per object (with wait() and notify())

Lec08 readerwriter

  • 1.
    CS207 йлдлийн системҮ Лекц 8 Уншигч-Бичигч Синхрончлолыгдэмждэг хэл дүү А. Х дэр, Э. М нхс хү ө ү http://www.elearn.sict.edu.mn/
  • 2.
    Lec 8.29/27/10 KubiatowiczCS162 ©UCB Fall 2010 Тасалдал хорих аргаар хийсэн цоожны ил сайнүү хэрэгж лэлтүү • Гол санаа: цоожны хувьсагч зарлаад солбилцолыг з вх н энэ хувьсагч дээр йлдэл хийх едө ө ү ү хэрэгж лэх.үү int value = FREE; Acquire() { disable interrupts; if (value == BUSY) { put thread on wait queue; Go to sleep(); // Enable interrupts? } else { value = BUSY; } enable interrupts; } Release() { disable interrupts; if (anyone on wait queue) { take thread off wait queue Place on ready queue; } else { value = FREE; } enable interrupts; }
  • 3.
    Lec 8.39/27/10 KubiatowiczCS162 ©UCB Fall 2010 test&set ашиглсан ил сайн цоожүү • Бид нар test&set ашиглан завг й-х лээлтг й цоож хийж чадахү ү ү уу? – Б рэн бол чадахг й, гэхдээ багасгаж чаднаү ү ! – Санаа нь: З вх н цоожны утгыг атомаар шалгахад завг йө ө ү х лээлт хийхү Release() { // Short busy-wait time while (test&set(guard)); if anyone on wait queue { take thread off wait queue Place on ready queue; } else { value = FREE; } guard = 0; int guard = 0; int value = FREE; Acquire() { // Short busy-wait time while (test&set(guard)); if (value == BUSY) { put thread on wait queue; go to sleep() & guard = 0; } else { value = BUSY; guard = 0; } }
  • 4.
    Lec 8.49/27/10 KubiatowiczCS162 ©UCB Fall 2010 Value=2Value=1Value=0 Семафор нь б хэл тоотой адилханү • Семафор нь б хэл тоотой адилхан, гэхдээү – С р г утга авахг йө ө ү – З вх нө ө P, V гэсэн 2 йлдэл хийдэг. Анхны утгаү олгохоос р р утга унших болон бичих йлдэлөө өө ү хийхг й.ү – йлдл д нь атом байна.Ү үү » Хоёр P йлдэл нь утгыг тэгээс бага болгож чадахг й.ү ү » нтэй адилаарҮү P-гээр унтах гэж байгаа хуулбар V-гээс ирэх сэрээх дохиог алдахг й. Энэ 2 йлдэл яг зэрэгү ү явагдсан ч ялгааг й.ү • Семафор нь т м р замтай т ст й.ө ө ө ө – Анхны утга нь 2 той тэнц семафорүү : Value=1Value=0Value=2
  • 5.
    Lec 8.59/27/10 KubiatowiczCS162 ©UCB Fall 2010 Агуулга • Синхрончлолын хийсвэрлэл – Монитор болон н хц лт хувьсагчө ө • Уншигч-Бичигчийн асуудал ба т ний шийдэлүү • Синхрончлолыг дэмждэг хэл дүү Note: Some slides and/or pictures in the following are adapted from slides ©2005 Silberschatz, Galvin, and Gagne Note: Some slides and/or pictures in the following are adapted from slides ©2005 Silberschatz, Galvin, and Gagne. Many slides generated from my lecture notes by Kubiatowicz.
  • 6.
    Lec 8.69/27/10 KubiatowiczCS162 ©UCB Fall 2010 Т гсг лл г буферийн б тэн шийдэлө ө ө ү Semaphore fullBuffer = 0; // Initially, no coke Semaphore emptyBuffers = numBuffers; // Initially, num empty slots Semaphore mutex = 1; // No one using machine Producer(item) { emptyBuffers.P(); // Wait until space mutex.P(); // Wait until buffer free Enqueue(item); mutex.V(); fullBuffers.V(); // Tell consumers there is // more coke } Consumer() { fullBuffers.P(); // Check if there’s a coke mutex.P(); // Wait until machine free item = Dequeue(); mutex.V(); emptyBuffers.V(); // tell producer need more return item; }
  • 7.
    Lec 8.79/27/10 KubiatowiczCS162 ©UCB Fall 2010 Шийдлийн талаарх хэлэлц лэгүү • Яагаад тэгш хэмтэй биш байна вэ? – йлдвэрлэгчҮ : emptyBuffer.P(), fullBuffer.V() – Хэрэглэгч: fullBuffer.P(), emptyBuffer.V() • P-ийн дараалал чухал уу? – Тийм! Учир нь т гжрэлээсү Producer(item) { mutex.P(); // Wait until buffer free emptyBuffers.P(); // Could wait forever! Enqueue(item); mutex.V(); fullBuffers.V(); // Tell consumers more coke } • V-ийн дараалал чухал уу? – г йҮ ү , энэ нь т л вл лтийн р ашигт н л лжө ө ө ү ө өө магадг йү • Хэрэв 2 йлдвэрлэгч 2 хэрэглэгчтэй бол яах вэү ? – Бид нар ямар нэг з йл рчл х хэрэгтэй юуү өө ө ?
  • 8.
    Lec 8.89/27/10 KubiatowiczCS162 ©UCB Fall 2010 Монитор болон н хц лт хувьсагчө ө • Семафор бол том дэвшил юм. З вх н уншихө ө бичих йлдлээр т гсг л г дараалал хийх гээд з.ү ө ө ө ү – Семафор нь хоёрдмол зорилготой: » Солбилцол болон т л вл лтийн хязгаарлалтан дээрө ө ө хэрэглэгддэг. » Жишээ: P-гийн байрыг сольсноор т гсг л г буферө ө ө т гжрэлд орно гэдэг шууд харагдахг й. З в гэдгийгү ү ө яаж батлах вэ? • З в санааө : Солбилцол дээр т гжээ хэрэглээдү т л вл лтийн хязгаарлалт дээр н хц лтө ө ө ө ө хувьсагчид хэрэглэе. • Тодорхойлолт: Монитор: Дундын г гд л рууө ө ө паралелиар хийх хандалтыг удирдах нэг цоож, 0 болон олон н хц лт хувьсагчидө ө – Жава гэх мэтийн програмчлалын хэл дээр байдаг. – Бусад хэлн д цоож болон н хц лт хувьсагчдыгүү ө ө хослуулж хэрэглэнэ.
  • 9.
    Lec 8.99/27/10 KubiatowiczCS162 ©UCB Fall 2010 Энгийн мониторын жишээ • Синхрончлогдсон дараалал (хязгаарг йү ): Lock lock; Condition dataready; Queue queue; AddToQueue(item) { lock.Acquire(); // Get Lock queue.enqueue(item); // Add item dataready.signal(); // Signal any waiters lock.Release(); // Release Lock } RemoveFromQueue() { lock.Acquire(); // Get Lock while (queue.isEmpty()) { dataready.wait(&lock); // If nothing, sleep } item = queue.dequeue(); // Get next item lock.Release(); // Release Lock return(item); } • Мониторын сонирхолтой биш – Н хц лт хувьсагч ашиглахг й цоож ашиглаж байнаө ө ү – Хэрэглэгчийг ажиллахг й ед нь унтуулж чадахг йү ү ү
  • 10.
    Lec 8.109/27/10 KubiatowiczCS162 ©UCB Fall 2010 Н хц лт хувьсагчө ө • RemoveFromQueue() - ийг дараалалд ямар нэг элемент орж иртэл х лээдэг байхаар яаж рчл х вэү өө ө ? – Дараалалд байгаа элементийн тоог семафорт хадгална. Гэхдээ алдаа гарч магадг йү ! • Н хц лт хувьсагчө ө : эгзэгтэй муж дотор ямар нэг з йл болохыгү х лээж байгаү a хуулбаруудын дараалал – Гол санаа: эгзэгтэй муж дотор унтах едээ цоожийг атомаарү ч л л хийг з вш рнө өө ө ө өө ө – Семафортой харьцуулахад: эгзэгтэй муж дотор х лээжү чадахг йү • йлдэлҮ : – Wait(&lock): Цоожийг атомаар ч л л д унтана, буцажө өө өө ирэхийн мн цоожоо буцааж авнаө ө . – Signal(): Х лээж байгаа хуулбар байвал нэгийг сэрээнэү – Broadcast(): Х лээж байгаа б х хуулбарыг сэрээнэү ү • Д рэмү : Н хц лт хувьсагч дээр йлдэл хийж байхдаа цоожооө ө ү ч л л хг йө өө ө ү ! – Birrell – ийн г лэл дээр цоожны гаднаас сигнал йлдлийгө үү ү хийж байгаа гэхдээ энэ бол оновчлол юм.
  • 11.
    Lec 8.119/27/10 KubiatowiczCS162 ©UCB Fall 2010 Мониторын б тэн жишээү (н хц лт хувьсагчтайө ө ) • Хязгаарг й синхрончлогдсон дараалалү Lock lock; Condition dataready; Queue queue; AddToQueue(item) { lock.Acquire(); // Get Lock queue.enqueue(item); // Add item dataready.signal(); // Signal any waiters lock.Release(); // Release Lock } RemoveFromQueue() { lock.Acquire(); // Get Lock while (queue.isEmpty()) { dataready.wait(&lock); // If nothing, sleep } item = queue.dequeue(); // Get next item lock.Release(); // Release Lock return(item); }
  • 12.
    Lec 8.129/27/10 KubiatowiczCS162 ©UCB Fall 2010 • compare&swap (&address, reg1, reg2) { /* 68000 */ if (reg1 == M[address]) { M[address] = reg2; return success; } else { return failure; } } Холбоост жагсаалт руу атомаар нэмэх функц: addToQueue(&object) { do { // repeat until no conflict ld r1, M[root] // Get ptr to current head st r1, M[object] // Save link in new object } until (compare&swap(&root,r1,object)); } Compare болн Swap дараалалд ашиглах root next next next New Object
  • 13.
    Lec 8.139/27/10 KubiatowiczCS162 ©UCB Fall 2010 Уншигч/Бичигчийн асуудал • Сэдэл: Дундын г гдлийн сангө ө ( СӨ )авч зьеү – Хоёр т рлийн хэрэглэгч байнаө : » Уншигч – г гдлийн санг хэзээ ч рчл хг йө ө өө ө ү » Бичигч – г гдлийн санг уншина, рчилнө ө өө ө – г гдлийн сан дээр ер нхий нэг цоож тавих ньӨ ө ө хангалттай юу? » Нэгэн зэрэг хэдэнч уншигч хандаж болно » Нэгэн зэрэг нэг бичигч бичнэ R R R W
  • 14.
    Lec 8.149/27/10 KubiatowiczCS162 ©UCB Fall 2010 Уншигч/Бичигчийн ндсэн шийдэлү • З в шийдлийн хязгаарлалтуудө : – Бичигч байхг й ед уншигч С руу хандаж чаднаү ү Ө – Бичигч болон уншигчид байхг й ед уншигч С руу хандажү ү Ө чадна – Т лвийн хувьсагчийг нэгэн зэрэг нэг хуулбар удирдажө чадна • Шийдлийн ндсэн б тэцү ү : – Reader() Бичигч байхгүй болтол хүлээнэ ӨС руу хандана Хүлээж байгаа бичигч байвал сэрээнэ – Writer() Идэвхитэй уншигч эсвэл бичигч байхгүй болтол хүлээнэ ӨС руу хандана Хүлээж байгаа уншигч болон бичигч байвал сэрээнэ – Т лвийн хувьсагчө (“lock” нэртэй цоожоор хамгаалагдсан): » int AR: Number of active readers; initially = 0 » int WR: Number of waiting readers; initially = 0 » int AW: Number of active writers; initially = 0 » int WW: Number of waiting writers; initially = 0 » Condition okToRead = NIL » Conditioin okToWrite = NIL
  • 15.
    Lec 8.159/27/10 KubiatowiczCS162 ©UCB Fall 2010 Уншигчийн код Reader() { // First check self into system lock.Acquire(); while ((AW + WW) > 0) { // Is it safe to read? WR++; // No. Writers exist okToRead.wait(&lock); // Sleep on cond var WR--; // No longer waiting } AR++; // Now we are active! lock.release(); // Perform actual read-only access AccessDatabase(ReadOnly); // Now, check out of system lock.Acquire(); AR--; // No longer active if (AR == 0 && WW > 0) // No other active readers okToWrite.signal(); // Wake up one writer lock.Release(); }
  • 16.
    Lec 8.169/27/10 KubiatowiczCS162 ©UCB Fall 2010 Writer() { // First check self into system lock.Acquire(); while ((AW + AR) > 0) { // Is it safe to write? WW++; // No. Active users exist okToWrite.wait(&lock); // Sleep on cond var WW--; // No longer waiting } AW++; // Now we are active! lock.release(); // Perform actual read/write access AccessDatabase(ReadWrite); // Now, check out of system lock.Acquire(); AW--; // No longer active if (WW > 0){ // Give priority to writers okToWrite.signal(); // Wake up one writer } else if (WR > 0) { // Otherwise, wake reader okToRead.broadcast(); // Wake all readers } lock.Release(); } Бичигчийн код
  • 17.
    Lec 8.179/27/10 KubiatowiczCS162 ©UCB Fall 2010 Уншигч/Бичигчийн шийдлийн загварчлал • Доорх йлдл дийн дарааллыг авч зьеү үү ү – R1, R2, W1, R3 • Уншигч б р орохдоо доорхийг шалганаү while ((AW + WW) > 0) { // Is it safe to read? WR++; // No. Writers exist okToRead.wait(&lock); // Sleep on cond var WR--; // No longer waiting } AR++; // Now we are active! • Эхлээд R1 ирнэ: AR = 1, WR = 0, AW = 0, WW = 0 • Дараа нь R2 ирнэ: AR = 2, WR = 0, AW = 0, WW = 0 • Одоо, уншигчид С руу ханданаӨ – Тохиолдол: Цоожнууд ч л тэйө өө – З вх нө ө AR нь 0 биш байна
  • 18.
    Lec 8.189/27/10 KubiatowiczCS162 ©UCB Fall 2010 Загварчлал(2) • Дараа нь W1 ирнэ: while ((AW + AR) > 0) { // Is it safe to write? WW++; // No. Active users exist okToWrite.wait(&lock); // Sleep on cond var WW--; // No longer waiting } AW++; • Уншигчдаас болоод эхэлж чадахг й тиймээсү унтана: AR = 2, WR = 0, AW = 0, WW = 1 • Эцэст нь R3 ирнэ: AR = 2, WR = 1, AW = 0, WW = 1 • Одоо R2 нь R1 ээс мн дууснаө ө : AR = 1, WR = 1, AW = 0, WW = 1 • С лд ньүү , эхний 2 уншигчийн с лийнх ньүү (R1) дуусаад бичигчийг сэрээнэ: if (AR == 0 && WW > 0) // No other active readers okToWrite.signal(); // Wake up one writer
  • 19.
    Lec 8.199/27/10 KubiatowiczCS162 ©UCB Fall 2010 Загварчлал(3) • Бичигч сэрээд: AR = 0, WR = 1, AW = 1, WW = 0 • Дараа нь бичигч ажиллаж дуусна: if (WW > 0){ // Give priority to writers okToWrite.signal(); // Wake up one writer } else if (WR > 0) { // Otherwise, wake reader okToRead.broadcast(); // Wake all readers } – Бичигч уншигчийг сэрээхэд: AR = 1, WR = 0, AW = 0, WW = 0 • Уншигч дуусахад програм дуусна
  • 20.
    Lec 8.209/27/10 KubiatowiczCS162 ©UCB Fall 2010 Асуулт • Уншигчид гачигдаж болох уу? Reader() – ийн кодын эхний хэсгийг авч зьеү : while ((AW + WW) > 0) { // Is it safe to read? WR++; // No. Writers exist okToRead.wait(&lock); // Sleep on cond var WR--; // No longer waiting } AR++; // Now we are active! • Уншигчийн т гсг лд байгаа н хц л шалгах йлдлийг хасвалө ө ө ө ү юу болох вэ? AR--; // No longer active if (AR == 0 && WW > 0) // No other active readers okToWrite.signal(); // Wake up one writer • Дараа нь signal() – ийг broadcast() болговол яах вэ? AR--; // No longer active okToWrite.broadcast(); // Wake up one writer • Эцэст нь бид нар 2 тусдаа н хц лт хувьсагч ашиглахын орондө ө нэг хувьсагч ашиглавал яах вэ? ( “okToContinue” гэж нэрлэе) – Уншигч болон бичигчийг энэ хувьсагч унтуулна – signal() – ийн оронд broadcast() – ийг ашиглах ёстой
  • 21.
    Lec 8.219/27/10 KubiatowiczCS162 ©UCB Fall 2010 Семафороор мониторыг байгуулж болох уу? • Цоожлох нь хялбар юм: Mutex – ийг хэрэглэнэ • Н хц лт хувьсагчдийг ийм байдлаар хэрэгж лж чадах ууө ө үү ? Wait() { semaphore.P(); } Signal() { semaphore.V(); } – Ажиллахг йү : Wait() нь цоожоо эзэмшээд унтаж магадг йү • Энэ нь арай дээр үү? Wait(Lock lock) { lock.Release(); semaphore.P(); lock.Acquire(); } Signal() { semaphore.V(); } – Н хц лт хувьсагчид т хг й байдаг семафор т хтэйө ө үү ү үү байдаг: » Хуулбар сигнал йлдэл хийхэд хэнч х лээгээг йү ү ү байвал яах вэ? NO-OP » Хуулбар х лээвэл яах вэү ? Thread Waits » Хуулбар V йлдэл хийхэд хэнч х лээгээг й байхадү ү ү яах вэ? Increment » Хуулбар P йлдэл хийхэд яах вэү ? Decrement and continue
  • 22.
    Lec 8.229/27/10 KubiatowiczCS162 ©UCB Fall 2010 Семафороор мониторыг байгуулах ( ргэлжлэлү ) • мн х оролдлогын асуудалӨ ө : – P V хоёрын байрыг сольж болно – Н хц лт хувьсагчдын байрыг сольж БОЛОХГ Йө ө Ү • Доорхоор асуудлыг шийдэж болох уу? Wait(Lock lock) { lock.Release(); semaphore.P(); lock.Acquire(); } Signal() { if semaphore queue is not empty semaphore.V(); } – Семафорын дарааллын агуулгыг харах нь зохимжг йү юм – Н цийн т л х рс лд нөө ө өө ө ө өө – цоож ч л л гдснийө өө ө дараа, х лээж байгаа хуулбарү semaphore.P() – г биел лэхийн мн сигнал йлдэл хийсэн хуулбарүү ө ө ү орж ирж болно • нийг з в байдлаар шийдэх боломжтойҮү ө – Hoare т л вл лтийн шийдлийг носноос уншө ө ө – Mesa т л вл лт нь ил хялбарө ө ө үү
  • 23.
    Lec 8.239/27/10 KubiatowiczCS162 ©UCB Fall 2010 Монитортын д гнэлтү • Монитор нь програмын логикийг харуулдаг – Шаардлагатай бол х лээнэү – Ямар нэгэн рчл лт гарахад дохио гд г учирөө ө ө ө х лээж байгаа ямарч хуулбар процесс цаашү ргэлжилнэү • Мониторд суурилсан програмын ндсэн б тэцү ү lock while (need to wait) { condvar.wait(); } unlock do something so no need to wait lock condvar.signal(); unlock Check and/or update state variables Wait if necessary Check and/or update state variables
  • 24.
    Lec 8.249/27/10 KubiatowiczCS162 ©UCB Fall 2010 С хэлний синхрончлолын дэмжлэг • C хэл: Синхрончлол нь шууд утгатай байдаг – Эгзэгтэй мужаас гарах кодын б х замийг мэдэхү эсэхээ баталгаажуул int Rtn() { lock.acquire(); … if (exception) { lock.release(); return errReturnCode; } … lock.release(); return OK; } – setjmp/longjmp аас болгоомжил! » Функцээс гарах глобал срэлт хийж магадг йү ү » Дээрх жишээнд E функц нь longjmp – ийг дуудаад B функц руу очино » С функц нь lock.acquire – ийг хийдэг бол асуудал снэүү ! Proc A Proc B Calls setjmp Proc C lock.acquire Proc D Proc E Calls longjmp Stackgrowth
  • 25.
    Lec 8.259/27/10 KubiatowiczCS162 ©UCB Fall 2010 С++ хэлний синхрончлолын дэмжлэг • C++ шиг онцгой тохиолдолтой хэл дүү – Онцгой тохиолдолтой хэл д асуудалтай байдагүү (цоожоо ч л л лг йгээр глобал гарах йлдлийгө өө ө ү ү хялбар хийж болдог) – Доорхийг авч зьеү : void Rtn() { lock.acquire(); … DoFoo(); … lock.release(); } void DoFoo() { … if (exception) throw errException; … } – DoFoo() функц доторх онцгой тохиолдол нь цоожийг ч л л лг йгээр гарнаө өө ө ү
  • 26.
    Lec 8.269/27/10 KubiatowiczCS162 ©UCB Fall 2010 C++ Language Support for Synchronization (con’t) • Эгзэгтэй муж дах б х онцгой тохилдлуудыг барьж авах ёстойү – Онцгой тохиолдолоо барьж аваад, цоожоо ч л л дө өө өө , онцгой тохиолдолоо сгэнэүү : void Rtn() { lock.acquire(); try { … DoFoo(); … } catch (…) { // catch exception lock.release(); // release lock throw; // re-throw the exception } lock.release(); } void DoFoo() { … if (exception) throw errException; … } – Ил сайн шийдэлүү : авто_ptr<T> - тэй хэрэгслийг ашигла. C++ ном унш. » Exit функцээс хамааралг йгээр цоожийг ч л лж дахинү ө өө хуваарилах боломжтой
  • 27.
    Lec 8.279/27/10 KubiatowiczCS162 ©UCB Fall 2010 Жава хэлний синхрончлолын дэмжлэг • Жава нь хуулбар болон хуулбарын синхрончлолыг илэрхий дэмждэг • Bank Account example: class Account { private int balance; // object constructor public Account (int initialBalance) { balance = initialBalance; } public synchronized int getBalance() { return balance; } public synchronized void deposit(int amount) { balance += amount; } } – Обьект болгон рийн цоожтой байна. Цоож ньөө synchronized арга руу ороход болон гарахад автоматаар эзэмшигдэх ба ч л л гд нө өө ө ө ө.
  • 28.
    Lec 8.289/27/10 KubiatowiczCS162 ©UCB Fall 2010 Жава хэлний синхрончлолын дэмжлэг ( ргэлжлэлү ) • Жава хэлний synchronized йлдэлү : synchronized (object) { … } – Жава обьект болгон рийн гэсэн цоожтой байдагөө учраас энэ йлдлийн бие р ороход болон гарахадү үү обьектийн цоож нь эзэмшигдэх болон ч л л гд нө өө ө ө ө – Онцгой тохиолдолтой хамт хэрэглэгдэж болно: synchronized (object) { … DoFoo(); … } void DoFoo() { throw errException; }
  • 29.
    Lec 8.299/27/10 KubiatowiczCS162 ©UCB Fall 2010 Жава хэлний синхрончлолын дэмжлэг ( ргэлжлэлү ) • Жавагийн обьект болгон цоожноос гадна нэг н хц лт хувьсагчтайө ө байна – Синхрончлогдсон арга болон блок дотор хэрхэн х лээх йлдэлү ү хийх вэ: » void wait(long timeout); // Wait for timeout » void wait(long timeout, int nanoseconds); //variant » void wait(); – Синхрончлогдсон арга болон блок дотроос хэрхэн сигнал йлдэлү хийх вэ: » void notify(); // wakes up oldest waiter » void notifyAll(); // like broadcast, wakes everyone – Н хц лт хувьсагчид нь хязгаарлагдмал хугацаанд х лээж чаднаө ө ү . Энэ нь онцгой тохиолдлыг боловсруулахад хэрэгтэй юм: t1 = time.now(); while (!ATMRequest()) { wait (CHECKPERIOD); t2 = time.new(); if (t2 – t1 > LONG_TIME) checkMachine(); } – Жавагийн б хү VM ижил байдагг йү ! » Т л вл лтийн бодлого нь ялгаатай, заавал зэрэглэлтэй байхө ө ө албаг йү !
  • 30.
    Lec 8.309/27/10 KubiatowiczCS162 ©UCB Fall 2010 Summary • Semaphores: Like integers with restricted interface – Two operations: » P(): Wait if zero; decrement when becomes non-zero » V(): Increment and wake a sleeping task (if exists) » Can initialize value to any non-negative value – Use separate semaphore for each constraint • Monitors: A lock plus one or more condition variables – Always acquire lock before accessing shared data – Use condition variables to wait inside critical section » Three Operations: Wait(), Signal(), and Broadcast() • Readers/Writers – Readers can access database when no writers – Writers can access database when no readers – Only one thread manipulates state variables at a time • Language support for synchronization: – Java provides synchronized keyword and one condition- variable per object (with wait() and notify())