6 подписчиков
Как мой шестилетний сын подобрался к семафорам
Пекли сегодня с сыном (6 лет) пирожки с разными начинками (важно для контекста). Сели есть. Он показывает мне конфету и читает по обертке название - "Semaphor". Меня триггернуло флешбеками (*мем про собаку и Вьетнамские флешбеки*), и я говорю: "Слушай, а ведь в программировании тоже есть семафоры".
Он подумал секунду и выдает: "Пап, а давай я угадаю, зачем они нужны".
Я: "Давай."
Далее ответ шестилетки: "Если у вас что-то идет, в программировании, чтобы это попало в нужное место назначения. И чтобы другое прошло, они ждут то, что надо, чтобы прошло. Ну, например, чтобы изюм попал в пирожок, а слива - в сырник. Чтобы не попало изюм в сырник, а слива в пирожок - вот для этого семафоры."
Я сначала сказал: "Ну, сигнал от семафора ждут, да, ты прав".
А потом, пока мы продолжали разговор и уже рефлексируя над его мыслями, я начал понимать, что все не так просто.
Что описал ребенок. Он самостоятельно, хоть и имея уже за плечами свой первый "Hello, World!" (на Python, конечно же) за плечами, он пришел к идее, что в программе что-то может кого-то ждать. Человек приоткрыл дверь в в мир конкурентности, и он ее открыл сам.
Конкретно его метафора, про изюм в пирожок и сливу в сырник, это скорее маршрутизация: каждому ингредиенту свое изделие, каждый едет своей дорогой. В коде это две независимые очереди, и они физически не пересекаются. Семафор тут формально не нужен, но интуиция "что-то должно следить, чтобы все попало куда надо" как раз семафорная по духу. Он почувствовал задачу раньше, чем научился ее точно формулировать, а это, честно говоря, и трудная задача в программировании.
Где тут семафор живет по-настоящему. Я попробовал поправить: "Тут скорее, чтобы слива попала по своей очередности в пирожок в тот же, куда попадал изюм". То есть пирожок один, и изюм со сливой оба хотят в него попасть - нужна очередность, кто-то первый, кто-то ждет. Это уже ближе: один общий ресурс, несколько претендентов, правило доступа. Это мьютекс (семафор со счетчиком 1).
А если развернуть дальше, то N одинаковых ресурсов и M претендентов, где M > N. Десять пирожков на столе, пятьдесят ягод рвутся внутрь. Пускаем по десять за раз, остальные ждут. Вот это уже полноценный семафор Дейкстры со счетчиком больше единицы. Классический пример в реальном коде это пул из десяти коннекшенов к базе и пятьдесят воркеров, которые эти коннекшены честно делят.
Мы с ним по сути прошли путь от интуиции к определению за один разговор на кухне. Он задал верное направление, "что-то ждет, чтобы не было путаницы", а точная модель (одно место, несколько претендентов, очередность) дошла уже дальше при рассуждениях.
Больше постов у меня в Telegram-канале: t.me/...kii или через поиск в Telegram по запросу «Сергей Озеранский».
2 минуты
25 апреля