More Related Content
PPTX
PPT
PPTX
PPTX
PPTX
PPTX
PPTX
PPT
005 өгөгдлийн нөөцийн удирдлага What's hot
PPTX
PPTX
өгөгдлийн сангийн удирдлага PPT
004 компьютерын програм хангамж PDF
программ хангамжийн їндсэн ойлголт PDF
PPTX
DOCX
DOCX
PDF
PPTX
PPTX
PPTX
PPTX
PDF
PDF
u.cs101 "Алгоритм ба програмчлал" Лекц №5 PPTX
PDF
PPTX
мэдээллийн системийг хөгжүүлэх PPT
PDF
Similar to Lec08 readerwriter
PPTX
PPTX
PPTX
PPTX
PPTX
PPTX
DOCX
PPT
PPTX
PDF
си хэлний хичээлүүд 11 р анги PPTX
PPTX
PDF
DOCX
PPS
PPTX
PPT
PDF
PDF
PDF
Computerin tehnikin undes 1hicheeliin lektsiin huraangui More from Khuder Altangerel
PPTX
IOI 2016 "Молекул" бодлогын бодолт PPTX
PPTX
PPTX
PPTX
МХТ-ийн мэргэжилд шаардагдах гадаад хэлний чадвар PDF
u.cs101 "Алгоритм ба програмчлал" Лекц №7 PDF
u.cs101 "Алгоритм ба програмчлал" Лекц №6 PDF
u.cs101 "Алгоритм ба програмчлал" Лекц №4 PDF
u.cs101 "Алгоритм ба програмчлал" Лекц №3 PDF
u.cs101 "Алгоритм ба програмчлал" Лекц №2 PDF
u.cs101 "Алгоритм ба програмчлал" Лекц №1 Lec08 readerwriter
- 1.
- 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())