vak: (Default)
[personal profile] vak
Взялся из любопытства заценить историческую статью Эдсгера Дейкстры, где он изобрёл семафоры. Называется "Over seinpalen" (PDF), на голландском. Статья не датирована, ориентировочно 1962 год. Оказалась странная вещь: никто её так и не перевёл на английский. Есть более поздние работы, а эта увы. Ну, я быстренько через Google translate набросал. Там надо будет кое-что повычистить на досуге, но и так уже неплохо.

"About semaphores"

Date: 2023-03-15 01:59 (UTC)
dmm: (Default)
From: [personal profile] dmm
!

Date: 2023-03-15 03:23 (UTC)
x86128: (Default)
From: [personal profile] x86128
Без хардвёра никуда. А как в современных ядрах принято атомики и семафоры делать? Куда там этот хардвёр спрятан?

Date: 2023-03-15 04:25 (UTC)
perdakot: (Default)
From: [personal profile] perdakot
В Cortex-M0 ничего такого нет и тем не менее на RP2040 два ядра :) Я так понимаю, что там надо делать Peterson’s Solution.

Date: 2023-03-15 05:13 (UTC)
x86128: (Default)
From: [personal profile] x86128
А вот это уже интересно, но, кажется, что чисто в софтвере семафоры не сделать когда больше чем 1 процессор над общей памятью

Date: 2023-03-15 05:20 (UTC)
From: [personal profile] dijifi
Можно, если есть гарантия что при записи в слово пишет или один, или другой, а не оба вместе создавая помойку из битов.

На самом деле можно и ослабить.. для синхронизации нужна:
- общая память
- гарантия что при записи ячейка пишется целиком, атомарно
- для записи с любого процессора, другие процессоры «когда-нибудь» увидят это изменение
Edited Date: 2023-03-15 05:26 (UTC)

Date: 2023-03-17 03:51 (UTC)
x86128: (Default)
From: [personal profile] x86128
Спасибо за справочку!
Действительно такой алгоритм простой и понятный, но сработает только когда нет кешей у ядра и доступ к памяти осуществляется по одной шине (тогда в любом случае запросы будут сериализованны). В простом случае хватит простого арбитра доступа к памяти и слова volatile в тот сишный псевдокод.

Date: 2023-03-15 05:29 (UTC)
perdakot: (Default)
From: [personal profile] perdakot
Я до этого места не дочитал потому что у меня RP2040 нету.

Date: 2023-03-17 03:53 (UTC)
x86128: (Default)
From: [personal profile] x86128
Любопытно, посмотрю что там предлагается. Можно предположить, что это нечто похожее на то, что в статье Дейкстра предлагал.

Date: 2023-03-18 12:33 (UTC)
x86128: (Default)
From: [personal profile] x86128
Бегло посмотрел доку https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf
Классная машинка, оказывается, этот RP2040 с точки зрения наворотов архитектуры

Даже есть очереди на восемь слотов: Inter-processor FIFOs (Mailboxes)
The SIO contains two FIFOs for passing data, messages or ordered events between the two cores. Each FIFO is 32 bits wide, and eight entries deep. One of the FIFOs can only be written by core 0, and read by core 1. The other can only be written by core 1, and read by core 0.

Там не только RP/M полетит :)
Edited Date: 2023-03-18 12:35 (UTC)

Date: 2023-03-15 03:43 (UTC)
x86128: (Default)
From: [personal profile] x86128
Спасибо! Почитаю. Используешь эти штуки и воспринимаешь как данность, а на самом деле там не просто, особенно когда всякие кеши появляются и память внешняя по отношению к ядру (RDMA, NUMA)

Date: 2023-03-15 04:34 (UTC)
From: [personal profile] dijifi
Тут такой момент что в борьбе за эффективность простые вещи оказываются безумно сложными. Например: два процессора соединены шиной PCIe (один сидит на карте). главный процессор пишет, карточный в упор не видит.
Системщик: не работает!
Хардверщик: а ты прочитай назад.
Системщик: прочитал, совпадает, не работает!
Хардверщик: а ты кэши вытолкнул? И прочисти кэш чтобы на самом деле читало. И не забудь о барьерах, а то кэш можно вытолкнуть ещё до того как данные туда доедут. Ах да, у нас ещё writeback buffer, набей его нулями.
Системщик: работает, но ненадежно.
Хардверщик: А-а-а блин metal spin.

Date: 2023-03-15 06:04 (UTC)
x86128: (Default)
From: [personal profile] x86128
👀😱

Date: 2023-03-17 03:56 (UTC)
x86128: (Default)
From: [personal profile] x86128
Тут кратко, но ёмко описано. Предполагает что эту спеку будут читать люди понимающие о чем речь.
А вот то, что они выбрали именно те инструкции, которые облегчают реализацию атомиков для Си++ не может являться проблемой в более общем случае?

Date: 2023-03-15 10:26 (UTC)
prool: cat (Default)
From: [personal profile] prool
Вроде был перевод на русский и издавался в сборнике под заголовком "Статьи с научного конгресса НАТО". Я тогда еще подумал, что НАТО не только агрессивный антикоммунистический блок, они еще и программированием занимаются.

Ключевые слова parbegin и parend - там Дийкстра ввел такое расширение Алгола-60 - операторные скобки, ограничивающие набор операторов, которые будут выполняться параллельно.

А что касается неделимых атомарных функций, так это классика низкоуровневого программирования

cli
код который нельзя прерывать
sti

и пусть весь мир подождет

Date: 2023-03-15 16:23 (UTC)
From: [personal profile] ichthuss
Это только для однопроцессорных.