Доказательство правильности многопоточных алгоритмов - PullRequest
11 голосов
/ 16 сентября 2008

Многопоточные алгоритмы особенно сложны для разработки / отладки / проверки. Алгоритм Деккера является ярким примером того, как сложно разработать правильный синхронизированный алгоритм. Современные операционные системы Tanenbaum заполнены примерами в разделе IPC. У кого-нибудь есть хорошие ссылки (книги, статьи) для этого? Спасибо!

Ответы [ 6 ]

13 голосов
/ 16 сентября 2008

Невозможно что-либо доказать, не опираясь на гарантии, поэтому первое, что вы хотите сделать, это ознакомиться с моделью памяти вашей целевой платформы; У Java и x86 есть надежные и стандартизированные модели памяти - я не очень уверен насчет CLR, но если все остальное даст сбой, вы будете опираться на модель памяти вашей целевой архитектуры ЦП. Исключением из этого правила является то, что если вы намереваетесь использовать язык, который вообще не допускает общего изменяемого состояния - я слышал, что Эрланг такой.

Первая проблема параллелизма - это общее изменяемое состояние.

Это можно исправить с помощью:

  • Создание состояния неизменным
  • Нет общего состояния
  • Защита общего изменяемого состояния с помощью одного и того же замка (два разных замка не могут охранять один и тот же элемент состояния, если только вы не всегда используете только эти два замка)

Вторая проблема параллелизма - безопасная публикация. Как вы делаете данные доступными для других потоков? Как вы выполняете передачу? Вы найдете решение этой проблемы в модели памяти и (надеюсь) в API. В Java, например, есть много способов публикации состояния, а пакет java.util.concurrent содержит инструменты, специально предназначенные для обработки межпотокового взаимодействия.

Третья (и более сложная) проблема параллелизма - блокировка. Неправильное упорядочение блокировок является источником тупиковых ситуаций. Опираясь на гарантии модели памяти, вы можете аналитически доказать, возможны ли мертвые блокировки в вашем коде. Однако вам необходимо спроектировать и написать свой код с учетом этого, в противном случае сложность кода может быстро сделать такой анализ невозможным для выполнения на практике.

Затем, как только вы докажете или правильно докажете правильное использование параллелизма, вам придется доказать однопотоковую корректность. Набор ошибок, которые могут возникнуть в параллельной базе кода, равен набору однопоточных программных ошибок плюс все возможные ошибки параллелизма.

3 голосов
/ 18 сентября 2008

«Принципы параллельного и распределенного программирования», М. Бен-Ари
ISBN-13: 978-0-321-31283-9
Они читают книги о сафари онлайн:
http://my.safaribooksonline.com/9780321312839

3 голосов
/ 18 сентября 2008
2 голосов
/ 16 сентября 2008

Краткий ответ: это сложно.

В конце 1980-х годов в DEC SRC Modula-3 и лиственнице были сделаны действительно хорошие работы.

, например

Некоторые из хороших идей Modula-3 превращают его в мир Java, например, JML, хотя «JML в настоящее время ограничен последовательной спецификацией», говорится в intro .

1 голос
/ 18 сентября 2008

У меня нет конкретных ссылок, но вы, возможно, захотите взглянуть на теорию Овики-Гриза (если вам нравится доказательство теорем) или теорию / алгебру процессов (для которой также доступны различные инструменты проверки моделей).

0 голосов
/ 16 сентября 2008

@ На всякий случай: я есть. Но из того, что я узнал, сделать это для нетривиального алгоритма - главная боль. Я оставляю такие вещи для более умных людей. Я узнал то, что я знаю, от разработки параллельных программ: Фонд (1988) К М Чанди, Дж. Мисра

...