| |||
![]()
|
![]() ![]() |
![]()
Задачка программстское Имеется язык. С вполне традиционной модульной структурой - ala Modula, ML etc - причем в "современном варианте" - модули не могут взаимно ссылаться друг на друга даже в части реализации. Имеется компилятор - со структурой не вполне трационной - он сначала все модули парсит (заодно при этом выясняется собственно какие модули нужны), потом все typecheck'ает, потом генерит код. На последнем этапе он в числе прочего пишет объектные файлы (которые может использовать при компиляции вместо того, чтобы проделывать весь этот долгий и мучительный процесс). Задача: научить несколько процессов (это именно отделные процессы в обычном смысле) компиляции идти параллельно на программах с сильно весьма пересекающимися наборами модулей. Проблема понятно отчасти в блокировках (что сделать несложно), но задача в другом: как избежать дедлоков (модуль X запрашивает А и B, модуль Y - B и A, соотвественно они лочат каждый свое и дальше ...). Проблема в том, что локи в силу специфической структуры компилятора приходится ставить в самом начале на все подлежащие перекомпиляции модули. |
||||||||||||||
![]() |
![]() |