ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
1011595 Топик полностью
fk0, легенда (11.06.2020 18:50, просмотров: 757) ответил RxTx на Вопрос чутка некорректный и вот почему. "Mutex" - понимается как mutual exlusion вообще, в целом. Многие без достаточных на то оснований полагают что Mutex это всенепременно объект "операционной системы" и отсюда делается дальнейший вывод что гарантированно нужна операционная система. Но это не так. Mutex это общее понятие, никакой гарантии семантики или гарантированного интерфейса у этого термина нет. В Microsoft операционке в API для межпроцессной синхронизации
Потому, что мьютекс может быть вообще не объект операционки, а C-библиотеки (как в linux). Но суть-то в одном, без операционки, которая может переключить потоки, мьютексы, семафоры, условные переменные -- всё теряет смысл. Потому, что с одной стороны, треду остановившемуся на уже занятом мьютексе (семафоре...) -- некуда деваться, если он будет в цикле проверять мьютекс не освобождая процессор -- это называется spinlock. Который обладает в целом меньшей реактивностью, чем 

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


Тезис: не взаимодействуя с ОС из примитивов синхронизации можно сделать только спинлок (на базе атомика или с использованием алгоритма Петерсона, последнее явная утопия причём). И хуже того, в кооперативной многозадачной системе спинлок не возможен, т.к. без явной отдачи управления будет deadlock. Строить синхронизацию на спинлоках, кроме каких-то узких специфических случаев -- сумасшедшая идея, т.к. реактивность такой системы (подразумевается вытесняющая многозадачность) оказывается очень низкой, и ограничивается частотой запуска планировщика (несколько десятков-сотен раз в секунду), и если программа часто натыкается на занятый спинлок, то она большую часть времени бесполезно крутится в циклах. С нормальными мьютексами это не так: там в таком случае управление передаётся тому потоку, который может сейчас работать.


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

[ZX]