Монітор — в мовах програмування, це високорівнева конструкція для отримання ексклюзивного доступу до спільних ресурсів.
Монітор реалізується за допомогою м'ютекса та умовних змінних.
Монітор був винайдений П.Б. Хансеном та Тоні Гоаром та вперше був застосований в мові Concurrent Pascal.
М'ютекс
Монітор гарантує ексклюзивний доступ до класу, об'єкта чи модуля за допомогою використання м'ютекса.
Приклад об'єкта, що гарантує безпечний доступ до банківського рахунку:
monitor class Account { private int balance := 0 invariant balance >= 0 public method boolean withdraw(int amount) precondition amount >= 0 { if balance < amount then return false else { balance := balance - amount ; return true } } public method deposit(int amount) precondition amount >= 0 { balance := balance + amount } }
Під час виконання потоком метода такого об'єкта, кажуть, що потік займає (чи заблоковує) об'єкт, отримуючи його м'ютекс (lock). У кожен конкретний момент часу не більше одного потоку може виконувати код цього об'єкта.
monitor
є синтаксичним цукром для того, щоб не писати код захвату/вивільнення м'ютекса.
Умовні змінні
Якщо метод монітора має дочекатись деякої умови, що встановлюється методом того самого монітора в іншому потоці, то цей метод повинен:
- тимчасово звільнити м'ютекс та очікувати (призупинити своє виконання),
- після зміни умови отримати м'ютекс назад та бути оповіщеним (пробудженим).
Така функціональність реалізується за допомогою змінних умови (умовна змінна).
Технічно, умовна змінна є списком потоків, що очікують на дану умову. Поки потік очікує на умовну змінну, він не може зайняти монітор.
Єдиними операціями можливими над умовною змінною є: очікування та оповіщення.
Блокуюча умовна змінна — рання реалізація (реалізація Гоара), що при оповіщенні умовної змінної, негайно активізує потік очікування та віддає йому м'ютекс. Ця реалізація технічно складна, і її єдина перевага в тому, що оповіщений потік може бути впевненим, що умова ще чинна.
Неблокуюча умовна змінна — пізніша реалізація (реалізація ) дозволяє потоку, що сповіщає завершити метод монітора, а аж потім пробудити потік очікування. Це реалізація простіша, але вона не гарантує чинності умови в момент пробудження потоку, оскільки умова могла після першої зміни знову змінитись. Тому, в коді очікування потрібно писати while test do wait(cv)
замість if test then wait(cv)
.
Поширення
Монітори підтримують мови програмування:
Примітки
- Brinch Hansen, Per (1973). 7.2 Class Concept. Operating System Principles. Prentice Hall. ISBN .
- Hoare, C. A. R. (October 1974). Monitors: an operating system structuring concept. Comm. ACM. 17 (10): 549—557. doi:10.1145/355620.361161.
Посилання
- Java Monitors (lucid explanation) [ 13 січня 2016 у Wayback Machine.]
- "" by and
- http://en.cppreference.com/w/cpp/thread/condition_variable [ 13 січня 2016 у Wayback Machine.]
- http://msdn.microsoft.com/en-us/library/system.threading.monitor.aspx [ 6 травня 2016 у Wayback Machine.]
- http://msdn.microsoft.com/en-us/library/ms682052.aspx [ 4 травня 2016 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Monitor v movah programuvannya ce visokorivneva konstrukciya dlya otrimannya eksklyuzivnogo dostupu do spilnih resursiv Monitor realizuyetsya za dopomogoyu m yuteksa ta umovnih zminnih Monitor buv vinajdenij P B Hansenom ta Toni Goarom ta vpershe buv zastosovanij v movi Concurrent Pascal M yuteksMonitor garantuye eksklyuzivnij dostup do klasu ob yekta chi modulya za dopomogoyu vikoristannya m yuteksa Priklad ob yekta sho garantuye bezpechnij dostup do bankivskogo rahunku monitor class Account private int balance 0 invariant balance gt 0 public method boolean withdraw int amount precondition amount gt 0 if balance lt amount then return false else balance balance amount return true public method deposit int amount precondition amount gt 0 balance balance amount Pid chas vikonannya potokom metoda takogo ob yekta kazhut sho potik zajmaye chi zablokovuye ob yekt otrimuyuchi jogo m yuteks lock U kozhen konkretnij moment chasu ne bilshe odnogo potoku mozhe vikonuvati kod cogo ob yekta monitor ye sintaksichnim cukrom dlya togo shob ne pisati kod zahvatu vivilnennya m yuteksa Umovni zminniYaksho metod monitora maye dochekatis deyakoyi umovi sho vstanovlyuyetsya metodom togo samogo monitora v inshomu potoci to cej metod povinen timchasovo zvilniti m yuteks ta ochikuvati prizupiniti svoye vikonannya pislya zmini umovi otrimati m yuteks nazad ta buti opovishenim probudzhenim Taka funkcionalnist realizuyetsya za dopomogoyu zminnih umovi umovna zminna Tehnichno umovna zminna ye spiskom potokiv sho ochikuyut na danu umovu Poki potik ochikuye na umovnu zminnu vin ne mozhe zajnyati monitor Yedinimi operaciyami mozhlivimi nad umovnoyu zminnoyu ye ochikuvannya ta opovishennya Blokuyucha umovna zminna rannya realizaciya realizaciya Goara sho pri opovishenni umovnoyi zminnoyi negajno aktivizuye potik ochikuvannya ta viddaye jomu m yuteks Cya realizaciya tehnichno skladna i yiyi yedina perevaga v tomu sho opovishenij potik mozhe buti vpevnenim sho umova she chinna Neblokuyucha umovna zminna piznisha realizaciya realizaciya dozvolyaye potoku sho spovishaye zavershiti metod monitora a azh potim probuditi potik ochikuvannya Ce realizaciya prostisha ale vona ne garantuye chinnosti umovi v moment probudzhennya potoku oskilki umova mogla pislya pershoyi zmini znovu zminitis Tomu v kodi ochikuvannya potribno pisati b while b i test i b do b wait cv zamist b if b i test i b then b wait cv PoshirennyaMonitori pidtrimuyut movi programuvannya Ada C C pochinayuchi z C 11 D Delphi Java Python RubyPrimitkiBrinch Hansen Per 1973 7 2 Class Concept Operating System Principles Prentice Hall ISBN 0 13 637843 9 Hoare C A R October 1974 Monitors an operating system structuring concept Comm ACM 17 10 549 557 doi 10 1145 355620 361161 PosilannyaJava Monitors lucid explanation 13 sichnya 2016 u Wayback Machine by and http en cppreference com w cpp thread condition variable 13 sichnya 2016 u Wayback Machine http msdn microsoft com en us library system threading monitor aspx 6 travnya 2016 u Wayback Machine http msdn microsoft com en us library ms682052 aspx 4 travnya 2016 u Wayback Machine