Метафора многопоточности
Wednesday, 16 June 2010 17:12Крутые программисты это и так понимают, а вот начинающим может помочь меньше путаться в блокировках. Мне в своё время помогло.
Раньше для исполнения программы у меня в голове был такой образ: текст программы прокручивается в окошке, текущая строка подсвечивается. Ну так же, как оно себя ведёт в отладчике. То есть активная сущность - это программа, она что-то делает, исполняется и шевелится.
Эта метафора при многопоточности только мешает. Как это - программа одновременно шевелится в нескольких разных местах? Как это - в окошке одновременно прокручивается несколько текстов и несколько текущих строк? Ничего же не понятно.
Работающая метафора: текст программы ничего не делает. Это статичная конструкция. Игровое поле. Декорации платформенной игры в Братьев Марио. (Ну да, на самом деле это поле многомерное, но вы не сумеете эффективно вообразить многомерность, так что и не пробуйте.)
Точка исполнения - это сам Марио, бегущий по игре. Тут взял мячик-значение, там кинул его в коробочку-переменную. Дёрнул за рычаг, у юзера пискнул спикер. Забежал в дверь-подпрограмму на другой экран. Пробежал по лабиринту условных операторов. В мешке за спиной у него стек и локальные переменные, он постоянно то что-то туда собирает, то оттуда выкладывает.
Многопоточная программа - это то же самое поле, по которому одновременно бегают много братьев Марио. Ну, многопользовательская игра. Сколько потоков, столько и Марио. И игровых штучек побольше.
Критическая секция: один Марио вбежал в дверь, дверь за ним захлопнулась. Другие Марио, которые сюда прибежали, стоят перед дверью, ждут. Первый Марио добежал до конца участка, наступил на педальку - дверь открылась. Толпа ожидающих ломанулась - а дверь-то узкая, ровно на одного. Один Марио проскочил, дверь за ним захлопнулась, остальные ждут дальше.
Домашнее задание: метафоры семафоров, эвентов и дедлоков представьте себе сами.
Раньше для исполнения программы у меня в голове был такой образ: текст программы прокручивается в окошке, текущая строка подсвечивается. Ну так же, как оно себя ведёт в отладчике. То есть активная сущность - это программа, она что-то делает, исполняется и шевелится.
Эта метафора при многопоточности только мешает. Как это - программа одновременно шевелится в нескольких разных местах? Как это - в окошке одновременно прокручивается несколько текстов и несколько текущих строк? Ничего же не понятно.
Работающая метафора: текст программы ничего не делает. Это статичная конструкция. Игровое поле. Декорации платформенной игры в Братьев Марио. (Ну да, на самом деле это поле многомерное, но вы не сумеете эффективно вообразить многомерность, так что и не пробуйте.)
Точка исполнения - это сам Марио, бегущий по игре. Тут взял мячик-значение, там кинул его в коробочку-переменную. Дёрнул за рычаг, у юзера пискнул спикер. Забежал в дверь-подпрограмму на другой экран. Пробежал по лабиринту условных операторов. В мешке за спиной у него стек и локальные переменные, он постоянно то что-то туда собирает, то оттуда выкладывает.
Многопоточная программа - это то же самое поле, по которому одновременно бегают много братьев Марио. Ну, многопользовательская игра. Сколько потоков, столько и Марио. И игровых штучек побольше.
Критическая секция: один Марио вбежал в дверь, дверь за ним захлопнулась. Другие Марио, которые сюда прибежали, стоят перед дверью, ждут. Первый Марио добежал до конца участка, наступил на педальку - дверь открылась. Толпа ожидающих ломанулась - а дверь-то узкая, ровно на одного. Один Марио проскочил, дверь за ним захлопнулась, остальные ждут дальше.
Домашнее задание: метафоры семафоров, эвентов и дедлоков представьте себе сами.
no subject
Date: Wednesday, 16 June 2010 14:17 (UTC)Тебе действительно так удобно?
no subject
Date: Wednesday, 16 June 2010 14:24 (UTC)А ты как себе представляешь работу многопоточной программы? Ты говорила, что визуальные картинки тебе только мешают, но должен же быть какой-то образ для мысленных экспериментов?
no subject
Date: Wednesday, 16 June 2010 14:41 (UTC)Когда мне рассказывали про многопоточные программы, мне достаточно хорошо ложилась в голову конкуренция за ресурсы.
Но мне при этом окна с кодом не нужны.
no subject
Date: Wednesday, 16 June 2010 14:33 (UTC)no subject
Date: Wednesday, 16 June 2010 14:39 (UTC)no subject
Date: Wednesday, 16 June 2010 14:35 (UTC)я обычно представляю себе трехмерно, чаще в виде древовидной структуры
no subject
Date: Wednesday, 16 June 2010 14:39 (UTC)no subject
Date: Wednesday, 16 June 2010 14:42 (UTC)no subject
Date: Wednesday, 16 June 2010 14:45 (UTC)Вот что нетривиально, представить разные классы памяти (игровые штучки automatic, static, dynamic, thread-local). Я встречал игрушку (Braid называется (http://ru.wikipedia.org/wiki/Braid)) в стиле Марио, где человечек мог перемещаться во времени (и делать свои клоны, которые изменяли состояние игрового поля). Так объекты там были обычные, и вне времени (глобальные). Откатывая время назад, обычные объекты откатывались вместе с человечиком в исходное состояние, а вот вневременные - оставались. Так что можно было сходить в будущее, открыть там вневременную дверь с другой стороны, вернуться в прошлое и увидеть её открытой.
Вот, непаханное поле для IDE-автоматизации. Подсвечивать не только синтаксис, но и класс памяти объектов, thread-specific точки синхронизации. Вплоть до красного цвета для блока, где общие данные модифицируются без критической секции. И подсказывать про классические дедлоки вроде взятых в разном порядке мутексов. Да много чего наверное придумать можно, если IDE имеет доступ к семантическому дереву и control flow.
no subject
Date: Wednesday, 16 June 2010 16:31 (UTC)no subject
Date: Wednesday, 16 June 2010 19:49 (UTC)no subject
Date: Wednesday, 16 June 2010 15:18 (UTC)no subject
Date: Wednesday, 16 June 2010 15:23 (UTC)no subject
Date: Wednesday, 16 June 2010 16:49 (UTC)no subject
Date: Wednesday, 16 June 2010 19:54 (UTC)no subject
Date: Wednesday, 16 June 2010 21:27 (UTC)Я лично представляю себе несколько узких окошечек рядом, и в каждом -- свой дебаггер, и они крутятся скроллером туда-сюда, чтобы желтая полоска примерно (плюс-минус пару строчек) совпадала.
no subject
Date: Sunday, 20 June 2010 22:14 (UTC)Один поток = это один клерк в офисе.
Данные = документы, с которыми работают клерки.
Синхронизация lock-ами:
Блокировка на запись = клерк кладёт документ себе на личный стол и спокойно пишет.
Блокировка на чтение = документ вывешивается на общей доске объявления, читать могут несколько клерков, писать не может никто.
Снятие блокировки = документ кладётся в общий шкаф, где его может взять любой.
Синхронизация очередями:
Каждый клерк организует на своём столе стопку "входящих". После завершения обработки он передаёт документ другому клерку в его "входящие". Если документ не может быть обработан в данное время (не хватает других документов), клерк кладёт его себе же во "входящие", чтобы вернуться к нему позже. В такой системе вообще не нужно думать о синхронизации - алгоритм у каждого клерка получается однопоточный, простой и надёжный, не нужно думать ни о каких "точках исполнения".
Можно клерков заменить на рабочих, рабочие столы - на станки, документы - на заготовки/детали, локи - на крепёж детали в станке (правда, пропадает концепция "лок на чтение"), очереди - на ящики заготовок.
no subject
Date: Friday, 16 July 2010 16:56 (UTC)