Чи можна довести безпеку нитки?


10

З огляду на програму, що складається із змінних та інструкцій, що змінюють ці змінні, та примітиву синхронізації (монітор, мютекс, синхронізований Java або замок C #), чи можна довести, що така програма безпечна для потоків?

Чи існує навіть формальна модель для опису таких речей, як безпека ниток або умови гонок?


2
Так, але мови в реальному світі можуть бути болем у дупі, оскільки їх паралельна семантика не завжди є чітко визначеною / фіксованою. Крім того, не все вирішується у кожній моделі. Це широке поле; Google "Теорія concurrency", щоб отримати враження. Зокрема, існує багата теорія, що стосується сіток Петрі.
Рафаель

Відповіді:


10

Довести, що програма є "безпечною для потоків", важко. Однак можна конкретно і формально визначити термін "перегони даних". І можна визначити, чи відповідає траєкторія виконання певного запуску програми чи не має гонки даних у часі, пропорційній розміру траси. Цей тип аналізу сягає щонайменше до 1988 року: Бартон П. Міллер, Джонг-Дек Чой, "Механізм ефективної налагодження паралельних програм", конф. на Прог. Ланг. Dsgn. та Імпл. (PLDI-1988): 135-144 .

З огляду на слід виконання, ми спочатку визначаємо події, що відбуваються перед частковим порядком між подіями в трасі. Враховуючи дві події і які відбуваються в одній нитці, тоді або . (Події одного і того ж потоку утворюють загальний порядок, заданий послідовною семантикою мови програмування.) Події синхронізації (наприклад, вони можуть набувати і випускати mutex, наприклад, дають додатковий міжрядковий потік - перед частковим порядком. (Якщо потік випускає мутекс, а потім нитка набуває цього мутексу, ми кажемо, що випуск відбувається перед придбанням.)aba<bb<aST

Тоді, задавши два доступу до даних (читає або записує до змінних, які не є змінними синхронізації) і які знаходяться в одному і тому самому місці пам'яті, але різними потоками, і де або або - операція запису, ми кажемо, що є дані- гонка між і якщо ні ні .abababa<bb<a

Стандарт C ++ 11 - хороший приклад. (Відповідний розділ 1.10 у проектах специфікацій, доступних в Інтернеті.) C ++ 11 розрізняє об’єкти синхронізації (мутекси та змінні, оголошені з atomic<>типом), та всі інші дані. Специфікація C ++ 11 говорить, що програміст може міркувати про доступ до даних на сліді багатопотокової програми так, як ніби вони послідовно послідовні, якщо доступ до даних не є вільним до перегонів даних.

Інструмент Helgrind (частина Valgrind) виконує подібний тип виявлення, що відбувається раніше, ніж на основі даних, що базуються на даних, як і кілька комерційних інструментів (наприклад, Intel Inspector XE.) Алгоритми в сучасних інструментах засновані на збереженні векторних годин, пов'язаних з кожною ниткою та синхронізації об’єкт. Я думаю, що цю техніку використання векторних годин для виявлення перегонів даних запровадив Мічіель Ронс; Koen De Bosschere: "RecPlay: повністю інтегрована система практичного запису / повтору", ACM Trans. Обчислення. Сист. 17 (2): 133-152, 1999 .


6

З боку практичної системи існує система верифікації VCC, яка може бути використана для офіційного підтвердження безпеки потоку програм C.

Це цитування з веб-сайту:

VCC підтримує паралельність - ви можете використовувати VCC для перевірки програм, які використовують як грубозернисту, так і дрібнозернисту паралельність. Ви навіть можете використовувати його для перевірки своїх примітивів для контролю сумісності. Перевірка функції неявно гарантує безпеку її потоку в будь-якому одночасному середовищі, яке поважає договори про її функції та структури даних.


2
Як це працює? Що лежить в основі формальної моделі? Зауважте, що ОП не (лише) запитує інструмент!
Рафаель

1

Це дуже складна область для забезпечення коректності програми, що стосується виключення умов перегонів, свого роду "ахіллесова п'ята" паралельної обробки. Найкращий підхід до коректності програми - це, як правило, уникати примітивів низького рівня та працювати з моделями дизайну вищого рівня (наприклад, з бібліотек), що забезпечують синхронізацію потоків. Існує одна модель CSP, що передає послідовні процеси Hoare, яка має деякі докази коректності, враховуючи, що розробники обмежують себе "рамками". Він має деяку концептуальну схожість та хронологічне походження / перекриття unix "труб та фільтрів", хоча притулок (ще?) Не знайшов прямого зв'язку між ними.

Дві інші рамки, які намагаються покращити правильність паралелізації за допомогою шаблонів проектування і мають для цього більшість стандартних / відомих алгоритмів / моделей дизайну:


1
Це може бути хорошою (програмовою) порадою, але вона зовсім не відповідає на (CS) питання.
Рафаель

1
?!? критика зовсім не конкретна
vzn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.