Комунікуючі послідовні процеси
Взаємодія послідовних процесів (англ. Communicating Sequential Processes, CSP) — формальна мова для опису закономірностей взаємодії в рівночасних системах.[1] Це член сім'ї математичних теорій рівночасності, відомої як алгебра або числення процесів[en], в основі якої лежить обмін повідомленнями через канали. CSP відіграв важливу роль у розробці мови програмування occam[1][2], а також вплинув на дизайн таких мов програмування, як Limbo[3], RaftLib[en], Go[4], та бібліотеки core.async в Clojure[5].
CSP описує послідовні процеси, які взаємодіють лише через передачу повідомлень (і не через використання спільної пам'яті).[6]
CSP був вперше описаний в 1978, у публікації Гоара[7], але з тих пір суттєво змінився[8]. CSP практично застосовувався в промисловості як інструмент для специфікації і верифікації рівночасних аспектів різних систем, таких як Transputer T9000[9], а також безпечної системи електронної комерції.[10] Теорія самого CSP досі є предметом активних досліджень, у тому числі робота з підвищення його спектру практичної застосовності (наприклад, збільшення масштабів систем, які можуть бути проаналізовані).[11]
Версія CSP, представлена в оригінальній публікації Хоара 1978 року була, по суті, рівночасною мовою програмування, а не численням процесів[en]. CSP мав принципово інший синтаксис, ніж у більш пізніх версіях, не володів математично-визначеною семантикою[12] і не був в змозі представляти необмежений недетермінізм[en].[13] Програми в оригінальному CSP були написані, як паралельні композиції фіксованого числа послідовних процесів, які спілкувалися один з одним строго через синхронну передачу повідомлень. На відміну від пізніших версій CSP, кожному процесу призначалось явне ім'я, а джерело або адресат повідомлення визначались задаванням імені передбачуваного відправника або процесу отримувача. Наприклад процес
COPY = *[c:character; west?c -> east!c]
без перестану отримує символ від процесу west
та відправляє цей символ процесу east
. Паралельна композиція
[west::DISASSEMBLE || X::COPY || east::ASSEMBLE]
присвоює ім’я west
процесу DISASSEMBLE
, X
процесу COPY
і east
процесу ASSEMBLE
та виконує ці три процеси паралельно.[7]
Після публікації оригінальної версії CSP, Хоар, Стівен Брукс та Біл Роско розвинули та вдосконалили теорію CSP до її сучасної форми, алгебри процесів. Підхід використаний при перетворенні CSP в алгебру процесів, був обраний під впливом роботи Робіна Мілнера над Численням комунікуючих систем[en] (CCS) та навпаки, CSP вплинула на CCS. Теоретична версія CSP була спочатку представлена у статті Брукса, Хоара і Роско 1984р,[14] пізніше – у книзі Хоара «Communicating Sequential Processes»[12], що була опублікована у 1985р. У вересні 2006 ця книга все ще була однією з найбільш цитованих публікацій у комп’ютерних науках всіх часів за версією Citeseer. Теорія CSP пережила декілька незначних змін з моменту публікації книги Хоара. Більшість змін була викликана появою автоматизованих інструментів для аналізу та верифікації процесів. «The Theory and Practice of Concurrency» від Роско описує новішу версію CSP[1].
Раннім і важливим використанням CSP була специфікація і верифікація елементів транспютера INMOS T9000, комплексного суперскалярного конвеєрного процесора, розробленого для підтримки крупномасштабного мультипроцесингу. CSP було використано у верифікації коректності конвеєра та процесора віртуального каналу (англ. Virtual Channel Processor), що керував позачіповими комунікаціями процесора.[9]
Індустріальне використання CSP у розробці програмного забезпечення, зазвичай, сфокусоване на надійних та критично-безпечних системах. Наприклад, Bremen Institute for Safe Systems та Daimler-Benz Aerospace змоделювали з допомогою CSP систему керування помилками та інтерфейс авіоніки (з приблизно 23000 рядків коду) для використання на Міжнародній космічній станції, та проаналізували модель, перевіривши відсутність в їхньому проекті взаємних блокувань та livelock-ів..[15][16] Процес моделювання та аналізу допоміг відшукати помилки, які було б важко знайти, використовуючи лише тестування. Аналогічно, Praxis High Integrity Systems[en] використали CSP-моделювання і аналіз під час розробки програмного забезпечення (приблизно 100000 рядків коду) для безпечної сертифікації смарт-карток. Praxis стверджує, що система має значно меншу частоту дефектів, порівняно з аналогічними системами.[10]
Оскільки CSP є вдалим рішенням у моделюванні та аналізі систем, які містять складний обмін повідомленнями, він також використовується у перевірці безпеки протоколів зв'язку. Гарним прикладом такого застосування є використання CSP та FDR[en] для знаходження невідомої раніше атаки на протокол аутентифікації з відкритим ключем Нідгема — Шредера, а потім розробити виправлену версію протоколу, що спроможна протистояти атаці.[17]
Виходячи з назви, CSP дозволяє опис систем з точки зору складових процесів, що працюють незалежно та взаємодіють один з одним виключно через обмін повідомленнями. Тим не менш, слово "послідовні" в назві комунікуючих послідовних процесів на сьогодні дещо недоречне, тому що сучасна CSP дозволяє визначати процеси компоненти як послідовними процесами, так і паралельною композицією більш примітивних процесів. Зв’язки між різними процесами і спосіб взаємодії процесу зі своїм середовищем описуються за допомогою різних операторів алгебри процесів[en]. Використовуючи такий алгебраїчний підхід, доволі складний опис процесу може бути легко побудований з декількох примітивних елементів.
CSP забезпечує два класи примітивів в алгебрі процесів:
- Події
- Події являють собою комунікацію чи інші взаємодії. Припускається що вони нероздільні і миттєві. Вони можуть мати як атомарні імена (наприклад вкл, викл), складені імена (наприклад кран.відкрити, кран.закрити), або події вводу/виводу (наприклад mouse?xy, screen!bitmap).
- Примітивні процеси.
- Примітивні процеси задають фундаментальні поведінки, наприклад STOP (процес який не комунікує, який також називають deadlock), та SKIP (який завжди має успішне завершення).
CSP має широкий спектр алгебраїчних операторів. Основними з них є:
- Префікс
- Оператор «префікс» з'єднує подію і процес для отримання нового процесу. Наприклад:
- процес який передає в навколишнє середовище подію , після чого поводиться як процес .
- Детермінований вибір
- Оператор детермінованого (або зовнішнього) вибору дозволяє визначити майбутній розвиток процесу як вибір між двома складовими процесами і дозволяє навколишньому середовищу зробити вибір по початковій події одного з процесів. Наприклад:
- це процес, який залежно від початкової події, або , поводить себе як або . Якщо одночасно відбудуться і і , вибір буде здійснено недетерміновано.
- Недетермінований вибір
- Оператор недетермінованого (або внутрішнього) вибору дозволяє визначити майбутній розвиток процесу як вибір між двома складовими процесами, але не надає навколишньому середовищу контроль над цим вибором. Наприклад:
- може поводити себе, як чи . Він може відкинути або і зобов’язаний продовжити роботу, якщо середовище пропонує і , і . Недетермінізм може бути ненавмисно введений у детермінований вибір, якщо початкові події обох сторін є ідентичними. Наприклад:
- еквівалентно до
- Чергування
- Оператор чергування представляє абсолютно незалежну одночасну діяльність.
- поводить себе одночасно і як , і як . Події з обох процесів довільно чергуються у часі.
- Інтерфейсний паралелелізм
- Оператор інтерфейсного паралелелізму представляє одночасну діяльність, що потребує синхронізації між складовими процесами: будь-яка подія з набору інтерфейсів може відбутися лише тоді, коли всі складові процеси мають можливість виконати цю подію. Наприклад:
- перед виконанням події необхідно, щоб і , і були в змозі виконати цю подію. Тому, наприклад, процес
- може виконати подію і стати процесом
- в той час як на
- чекає deadlock.
- Приховування
- Оператор приховування дозволяє робити деякі події неможливими для спостереження. Тривіальний приклад:
- який, припустивши, що подія не з’являється у , спрощується до
Префіксний запис дозволяє нам описувати поведінку скінченного процесу, але у випадку торгового автомата буде не зручно описувати все його життя з його сотнями і тисячами продажів. Таким чином нам потрібен спосіб для опису повторюваних дій, що дасть нам побічно можливість описувати нескінченно живуть процеси.
Розглянемо механічний годинник, зважаючи на те, що нас цікавлять лише його тіки, тоді:
αCLOCK = {tick}
Після того як годинник тікнув, він залишаться тим же годинником, тоді ми можемо сказати, що об'єкт після тіку стає годинником що виглядає наступним чином:
CLOCK = (tick → CLOCK)
Підставляючи CLOCK в праву частину ми будемо отримувати:
CLOCK
= (Tick → CLOCK) [початкове рівняння]
= (Tick → (tick → CLOCK)) [перша підстановка]
= (Tick → (tick → (tick → CLOCK))) [друга підстановка]
Отже поведінку годинника може бути описано як нескінченна кількість повторюючихся тиків:
tick → tick → tick → · · ·
Даний спосіб посилання на себе буде працювати тільки у випадку якщо з правого боку рівняння вказано вираз, що починається з префіксу, наприклад рівняння:
X = X
Нічого не визначає, тому йому відповідає будь-який процес. Будемо далі називати опис процесу починаються з префіксу «захищеним». Таким чином якщо F (X) захищене вираз містить ім'я процесу X і αX = A, то рівняння:
X = F (X)
має єдине рішення з алфавітом A.
Твердження про те, що захищений вираз має рішення і воно, можливо, унікальне легко демонструється за допомогою методу підстановок: підставляючи у вираз процес ми його подовжуємо, що може тривати необмежено, таким чином ми можемо написати довільно довгий (але кінцевий) опис процесу, а якщо два процеси протягом довільно довгого часу мають однакову поведінку, то ми говоримо що вони однакові.
Синтаксис CSP визначає «легальні» способи комбінування подій і процесів. Нехай - подія, - множина подій. Тоді базовий синтаксис CSP можна визначити як:
Відзначимо, що в інтересах стислості, описаний синтаксис опускає процес , який являє собою «розбіжний процес[en]», а також різні оператори, такі як алфавітний паралелелізм, конвеєризація та індексований вибір.
CSP був доповнений кількома різними семантиками, які визначають значення синтаксично правильного виразу CSP. Теорія комунікуючих послідовних процесів включає взаємно узгоджені денотативну семантику, алгебраїчну семантику та операційну семантику.
Основними денотативними моделями в CSP є модель слідів (англ. traces model), модель стабільних невдач (англ. stable failures), та модель невдач/розбіжностей (англ. failures/divergences). Відображення з виразів що задають процеси на кожну з цих трьох моделей і задають денотативну смантику CSP.[1]
Модель слідів визначає значення виразу процесу як множину послідовностей подій (слідів) які можна спостерігати при роботі процесу. Наприклад:
- тому що не генерує ніяких подій
- тому що процес може не згенерувати події, згенерувати подію , або послідовність подій
Більш формально, процес в моделі процесів описується як такий що:
- (тобто містить порожню послідовність)
- (тобто замкнута операцією взяття префіксу)
де множина всіх можливих скінченних послідовностей подій.
Модель стабільних невдач розширює модель слідів множинами відмов, які є множинами подій які процес може відмовитись виконати. Невдача це пара , що складається зі сліду , та множини невдач яка визначає події які процес може відмовитись виконати коли він виконав слід . Спостережувана поведінка процесу в моделі стабільних невдач описується парою . Наприклад,
Модель невдач/розбіжностей ще більше розвиває модель невдач, аби працювати з розбіжністю. Семантикою процесу в моделі невдач/розбіжностей є пара де визначається як множина всіх слідів які можуть привести до розбіжної поведінки, а .
Деякі інші мови специфікації та формалізми були виведені з класичного CSP, включаючи:
- Timed CSP, який об’єднує в собі часову інформацію про системи реального часу
- Receptive Process Theory, спеціалізація CSP, що передбачає асинхронні операції відправлення
- CSPP
- HSCSP
- Wright, мова опису архітектури
- TCOZ, інтеграція Timed CSP і Object Z
- Circus, інтеграція CSP і Z
- CML (Compass Modelling Language), комбінація Circus і VDM, створена для моделювання SoS (Systems of Systems)
- CspCASL, розширення CCCASL, що інтегрує CSP
- LOTOS, міжнародний стандарт, що містить в собі особливості CSP і CCS
- ↑ а б в г Roscoe, A. W. (1997). The Theory and Practice of Concurrency. Prentice Hall. ISBN 0-13-674409-5.
- ↑ INMOS (12 травня 1995). occam 2.1 Reference Manual (PDF). SGS-THOMSON Microelectronics Ltd. Архів оригіналу (PDF) за 1 Серпня 2020. Процитовано 27 Вересня 2017., INMOS document 72 occ 45 03
- ↑ Resources about threaded programming in the Bell Labs CSP style. Архів оригіналу за 26 Квітня 2013. Процитовано 15 квітня 2010.
- ↑ Language Design FAQ: Why build concurrency on the ideas of CSP?. Архів оригіналу за 2 Січня 2013. Процитовано 27 Вересня 2017.
- ↑ Higginbotham, Daniel. Mastering Concurrent Processes with core.async. Clojure for the Brave and True (вид. 1 edition). San Francisco: No Starch Press. ISBN 978-1-59327-591-4. Архів оригіналу за 28 Вересня 2017. Процитовано 27 Вересня 2017.
- ↑ Coding Tech. Concurrency Patterns In Go. Процитовано 9 серпня 2018. Архівована копія. Архів оригіналу за 30 грудня 2018. Процитовано 9 серпня 2018.
{{cite web}}
: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання) - ↑ а б Hoare, C. A. R. (1978). Communicating sequential processes. Communications of the ACM. 21 (8): 666—677. doi:10.1145/359576.359585.
- ↑ Abdallah, Ali E.; Jones, Cliff B.; Sanders, Jeff W. (2005). Communicating Sequential Processes: The First 25 Years. LNCS. Т. 3525. Springer.
- ↑ а б Barrett, G. (1995). Model checking in practice: The T9000 Virtual Channel Processor. IEEE Transactions on Software Engineering. 21 (2): 69—78. doi:10.1109/32.345823.
- ↑ а б Hall, A; Chapman, R. (2002). Correctness by construction: Developing a commercial secure system (PDF). IEEE Software. 19 (1): 18—25. doi:10.1109/52.976937. Архів оригіналу (PDF) за 2 Грудня 2020. Процитовано 27 Вересня 2017.
- ↑ Creese, S. (2001). Data Independent Induction: CSP Model Checking of Arbitrary Sized Networks. D. Phil. Oxford University.
- ↑ а б Hoare, C. A. R. (1985). Communicating Sequential Processes. Prentice Hall. ISBN 0-13-153289-8.
- ↑ Clinger, William (June 1981). Foundations of Actor Semantics. Mathematics Doctoral Dissertation. MIT. Архів оригіналу за 25 Липня 2019. Процитовано 8 Лютого 2018.
- ↑ Brookes, Stephen; Hoare, C. A. R.; Roscoe, A. W. (1984). A Theory of Communicating Sequential Processes. Journal of the ACM. 31 (3): 560—599. doi:10.1145/828.833.
- ↑ Buth, B.; M. Kouvaras; J. Peleska; H. Shi (December 1997). Deadlock analysis for a fault-tolerant system. Proceedings of the 6th International Conference on Algebraic Methodology and Software Technology (AMAST’97). с. 60—75.
- ↑ Buth, B.; J. Peleska; H. Shi (January 1999). Combining methods for the livelock analysis of a fault-tolerant system. Proceedings of the 7th International Conference on Algebraic Methodology and Software Technology (AMAST’98). с. 124—139.
- ↑ Lowe, G. Breaking and fixing the Needham-Schroeder public-key protocol using FDR (PDF).
- https://swtch.com/~rsc/thread/squint.pdf [Архівовано 11 Січня 2018 у Wayback Machine.]