andrzejn: (Default)
[personal profile] andrzejn
Крутые программисты это и так понимают, а вот начинающим может помочь меньше путаться в блокировках. Мне в своё время помогло.

Раньше для исполнения программы у меня в голове был такой образ: текст программы прокручивается в окошке, текущая строка подсвечивается. Ну так же, как оно себя ведёт в отладчике. То есть активная сущность - это программа, она что-то делает, исполняется и шевелится.

Эта метафора при многопоточности только мешает. Как это - программа одновременно шевелится в нескольких разных местах? Как это - в окошке одновременно прокручивается несколько текстов и несколько текущих строк? Ничего же не понятно.

Работающая метафора: текст программы ничего не делает. Это статичная конструкция. Игровое поле. Декорации платформенной игры в Братьев Марио. (Ну да, на самом деле это поле многомерное, но вы не сумеете эффективно вообразить многомерность, так что и не пробуйте.)

Точка исполнения - это сам Марио, бегущий по игре. Тут взял мячик-значение, там кинул его в коробочку-переменную. Дёрнул за рычаг, у юзера пискнул спикер. Забежал в дверь-подпрограмму на другой экран. Пробежал по лабиринту условных операторов. В мешке за спиной у него стек и локальные переменные, он постоянно то что-то туда собирает, то оттуда выкладывает.

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

Критическая секция: один Марио вбежал в дверь, дверь за ним захлопнулась. Другие Марио, которые сюда прибежали, стоят перед дверью, ждут. Первый Марио добежал до конца участка, наступил на педальку - дверь открылась. Толпа ожидающих ломанулась - а дверь-то узкая, ровно на одного. Один Марио проскочил, дверь за ним захлопнулась, остальные ждут дальше.

Домашнее задание: метафоры семафоров, эвентов и дедлоков представьте себе сами.

Date: Wednesday, 16 June 2010 14:17 (UTC)
From: [identity profile] nasse.livejournal.com
Ой.
Тебе действительно так удобно?

Date: Wednesday, 16 June 2010 14:41 (UTC)
From: [identity profile] nasse.livejournal.com
Я не программист.
Когда мне рассказывали про многопоточные программы, мне достаточно хорошо ложилась в голову конкуренция за ресурсы.
Но мне при этом окна с кодом не нужны.

Date: Wednesday, 16 June 2010 14:33 (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner
Просто удивительно, что уже сорок лет как существуют многооконные интерфейсы, а люди до сих пор к ним не привыкли.

Date: Wednesday, 16 June 2010 14:35 (UTC)
From: [identity profile] anita43765.livejournal.com
ой ) сложный образ )
я обычно представляю себе трехмерно, чаще в виде древовидной структуры

Date: Wednesday, 16 June 2010 14:42 (UTC)
From: [identity profile] anita43765.livejournal.com
это только выглядит ) для меня введение персонажа в схему напряжно было бы, наверное - скорее уж переменные сами по узлам бегають )

Date: Wednesday, 16 June 2010 14:45 (UTC)
From: [identity profile] paracloud.livejournal.com
Hint, чтобы далеко не уходить от исходного текста: текущая строка подсвечивается иконкой с Марио, который сидит на этой строке. Братьев Марио много, по количеству потоков, и у каждого свой любимый уникальный цвет. И бегают они всё же не как попало, а по control flow, так что строки можно структурировать в более крупные конструкции поблочно.

Вот что нетривиально, представить разные классы памяти (игровые штучки automatic, static, dynamic, thread-local). Я встречал игрушку (Braid называется (http://ru.wikipedia.org/wiki/Braid)) в стиле Марио, где человечек мог перемещаться во времени (и делать свои клоны, которые изменяли состояние игрового поля). Так объекты там были обычные, и вне времени (глобальные). Откатывая время назад, обычные объекты откатывались вместе с человечиком в исходное состояние, а вот вневременные - оставались. Так что можно было сходить в будущее, открыть там вневременную дверь с другой стороны, вернуться в прошлое и увидеть её открытой.

Вот, непаханное поле для IDE-автоматизации. Подсвечивать не только синтаксис, но и класс памяти объектов, thread-specific точки синхронизации. Вплоть до красного цвета для блока, где общие данные модифицируются без критической секции. И подсказывать про классические дедлоки вроде взятых в разном порядке мутексов. Да много чего наверное придумать можно, если IDE имеет доступ к семантическому дереву и control flow.

Date: Wednesday, 16 June 2010 16:31 (UTC)
From: [identity profile] scarabeus.livejournal.com
Азимов, "Конец вечности" :)

Date: Wednesday, 16 June 2010 19:49 (UTC)
From: [identity profile] paracloud.livejournal.com
Ну там целая ветка реальности вне времени, это скорее как отношение гостевой системы и гипервизора. Индивидуальные предметы прикольнее, представь себе - идёшь, а они подсвечены по классу.

Date: Wednesday, 16 June 2010 15:18 (UTC)
From: [identity profile] scarabeus.livejournal.com
Race conditions ещё :)

Date: Wednesday, 16 June 2010 16:49 (UTC)
From: [identity profile] chieftain-yu.livejournal.com
Семафор - это один сортир в коммунальной квартире.

Date: Wednesday, 16 June 2010 19:54 (UTC)
From: [identity profile] paracloud.livejournal.com
Counted семафор - общак в коммуналке. Сначала все скинулись, потом берут по мере надобности, в пределах возможного. Кто берёт и не отдаёт - дебаггером его, дебаггером! :)

Date: Wednesday, 16 June 2010 21:27 (UTC)
From: [identity profile] lee-bey.livejournal.com
Упс, даже не представляю, как так можно.
Я лично представляю себе несколько узких окошечек рядом, и в каждом -- свой дебаггер, и они крутятся скроллером туда-сюда, чтобы желтая полоска примерно (плюс-минус пару строчек) совпадала.

Date: Sunday, 20 June 2010 22:14 (UTC)
From: [identity profile] a-bronx.livejournal.com
Для меня многопоточная программа представляется как завод или предприятие. Например, офис с активным документооборотом:

Один поток = это один клерк в офисе.
Данные = документы, с которыми работают клерки.

Синхронизация lock-ами:
Блокировка на запись = клерк кладёт документ себе на личный стол и спокойно пишет.
Блокировка на чтение = документ вывешивается на общей доске объявления, читать могут несколько клерков, писать не может никто.
Снятие блокировки = документ кладётся в общий шкаф, где его может взять любой.

Синхронизация очередями:
Каждый клерк организует на своём столе стопку "входящих". После завершения обработки он передаёт документ другому клерку в его "входящие". Если документ не может быть обработан в данное время (не хватает других документов), клерк кладёт его себе же во "входящие", чтобы вернуться к нему позже. В такой системе вообще не нужно думать о синхронизации - алгоритм у каждого клерка получается однопоточный, простой и надёжный, не нужно думать ни о каких "точках исполнения".

Можно клерков заменить на рабочих, рабочие столы - на станки, документы - на заготовки/детали, локи - на крепёж детали в станке (правда, пропадает концепция "лок на чтение"), очереди - на ящики заготовок.

Date: Friday, 16 July 2010 16:56 (UTC)
netch: (Default)
From: [personal profile] netch
Стандартная метафора объектности стиля Simula/Smalltalk (при которой у каждого объекта свой "поток жизни") - рыбы в аквариуме.

Profile

andrzejn: (Default)
Андрій Новосьолов

March 2026

M T W T F S S
       1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16171819202122
23242526272829
3031     

Most Popular Tags

-

Style Credit

Expand Cut Tags

No cut tags
Page generated Sunday, 15 March 2026 21:53
Powered by Dreamwidth Studios