Найти в Дзене
6 подписчиков

Как мой шестилетний сын подобрался к семафорам


Пекли сегодня с сыном (6 лет) пирожки с разными начинками (важно для контекста). Сели есть. Он показывает мне конфету и читает по обертке название - "Semaphor". Меня триггернуло флешбеками (*мем про собаку и Вьетнамские флешбеки*), и я говорю: "Слушай, а ведь в программировании тоже есть семафоры".
Он подумал секунду и выдает: "Пап, а давай я угадаю, зачем они нужны".
Я: "Давай."
Далее ответ шестилетки: "Если у вас что-то идет, в программировании, чтобы это попало в нужное место назначения. И чтобы другое прошло, они ждут то, что надо, чтобы прошло. Ну, например, чтобы изюм попал в пирожок, а слива - в сырник. Чтобы не попало изюм в сырник, а слива в пирожок - вот для этого семафоры."

Я сначала сказал: "Ну, сигнал от семафора ждут, да, ты прав".
А потом, пока мы продолжали разговор и уже рефлексируя над его мыслями, я начал понимать, что все не так просто.

Что описал ребенок. Он самостоятельно, хоть и имея уже за плечами свой первый "Hello, World!" (на Python, конечно же) за плечами, он пришел к идее, что в программе что-то может кого-то ждать. Человек приоткрыл дверь в в мир конкурентности, и он ее открыл сам.

Конкретно его метафора, про изюм в пирожок и сливу в сырник, это скорее маршрутизация: каждому ингредиенту свое изделие, каждый едет своей дорогой. В коде это две независимые очереди, и они физически не пересекаются. Семафор тут формально не нужен, но интуиция "что-то должно следить, чтобы все попало куда надо" как раз семафорная по духу. Он почувствовал задачу раньше, чем научился ее точно формулировать, а это, честно говоря, и трудная задача в программировании.

Где тут семафор живет по-настоящему. Я попробовал поправить: "Тут скорее, чтобы слива попала по своей очередности в пирожок в тот же, куда попадал изюм". То есть пирожок один, и изюм со сливой оба хотят в него попасть - нужна очередность, кто-то первый, кто-то ждет. Это уже ближе: один общий ресурс, несколько претендентов, правило доступа. Это мьютекс (семафор со счетчиком 1).

А если развернуть дальше, то N одинаковых ресурсов и M претендентов, где M > N. Десять пирожков на столе, пятьдесят ягод рвутся внутрь. Пускаем по десять за раз, остальные ждут. Вот это уже полноценный семафор Дейкстры со счетчиком больше единицы. Классический пример в реальном коде это пул из десяти коннекшенов к базе и пятьдесят воркеров, которые эти коннекшены честно делят.

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

Больше постов у меня в Telegram-канале: t.me/...kii или через поиск в Telegram по запросу «Сергей Озеранский».
Как мой шестилетний сын подобрался к семафорам  Пекли сегодня с сыном (6 лет) пирожки с разными начинками (важно для контекста). Сели есть.
00:39
2 минуты