Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
А вот представлять, что процессор это не волшебная коробка, а вполне себе детерминированное устройство, очень полезно.
Правда Spectre/Meltdown показали, что процессоры — не слишком то уж детерменированные устройства :)Как раз Spectre/Meltdown работают именно из-за детерменированности кешей. Если бы там времена доступа случайными были бы — ничего бы не работало…
Integer x = 1;
while(x > 0) { тут не изменяем x };while(true) {...}(справедливости ради, самые известные компиляторы, насколько я знаю, так не делают)
Здесь не очевидно, что в x может прилететь из другого треда. И вот тут и проблема: согласно java memory model, этого может никогда и не произойти. И компилятор имеет право так считать. А может и произойти.
2. Там же С++
И чем простите мало подходит?Там что до банальных вещей, которые процессор вычисляет «на раз» невозможно никак добраться. Ни до флага «overflow», ни до «carry», никуда.
#include <inttypes.h>
struct pair {
uint64_t low;
uint64_t hi;
};
pair add(pair& a, pair& b) {
pair s;
s.low = a.low + b.low;
s.hi = a.hi + b.hi + (s.low < a.low); //carry
return s;
}
Вот только…В embedded, как раз, как нигде важна переносимость на другие платформы.Не знаю, не знаю, пока в основном видел жалобы на то, что попытки использовать низкоуровневое знание о том, как процессор устроен приводят к тому, что компилятор начинает «бузить».
И совсем не понятно чем мешает «заточенность под PDP»К тому, что заточенность под «железо PDP» в виде
volatile, ++/-- и прочего — поддерживаются на всех платформах, а вот вещи, которые современные DSP умеют (скажем переменные с фиксированной точкой) — вынесены в зависящие от конмпилятора расширения (если вообще есть поддержка).Но на PDP-11 Вы зациклились, volatile, INC, DEC нужны почти на всем (за DSP не ручаюсь)volatile (в том виде, в каком он изначально появился) не нужен в системе без мапирования регистров на память, а INC и DEC — в большинстве систем устроены совсем не так, как в PDP/VAX, где вы можете одной инструкцией процессора считать данные из массива, сдвинуть индекс и ещё что-нибудь в этими данными посчитать «этакое».
++/-- в том виде, в каком он есть в C на уровне машинных кодов не поддерживают.Хотя в принципе могли и ввести в стандарт опциональные платформозависимые вещи, как ввели COMPLEX.Опционально — оно есть. Но тут мы сходу вляпываемся в переносимость: стоит вам этими типами воспользоваться — так сразу получается, что ваш алгоритм вы уже на декстопе не запустите и под embedded — тоже далеко не под любой.
если два разных потока в любом месте системы читают с одного и того же адреса памяти, то они никогда не должны одновременно считывать разные значения.
Что-то после слова "одновременно" возникли сомнения в квалификации автора. Во многопоточной среде понятие одновременности довольно расплывчато и вообще не нужно.
volatile в C/C++ на современных процессорах — это такой же рудимент, как register…Без volatile просто невозможно было бы писать что либо, что с устройствами общается.Ассеблерные вставки его более, чем заменяют. А поскольку без них низкоуровневые штуки не обходятся, то и смысла в нём особо нету…
Драйвера как-то без ассемблера спокойно обходятся чуть ли не полностью.Тот факт, что вы ассемблера не видите — не значит, что его нет. Функции доступа «к железу» почти все являются ассемблерными вставками.
В этом документе описывается почему не следует использовать volatile для синхронизации потоков.
А вот ниже есть вот такая приписка:
There are still a few rare situations where volatile makes sense in the kernel:
- The above-mentioned accessor functions might use volatile on architectures where direct I/O memory access does work.
[...]- Pointers to data structures in coherent memory which might be modified by I/O devices can, sometimes, legitimately be volatile.
asm volatile).А вы специально пропустили тот вариант, который объясняет всё остальное?
А зачем его приводить, если приведенных вариантов — достаточно?
Собственно такая же приписка может быть сделана ко всем остальным пунктам
Но она не сделана. Если уж вы ссылаетесь на авторитеты для подтверждения своего мнения — не нужно им приписывать того, чего они не говорили.
Мифы о кэше процессора, в которые верят программисты