Re[14]: Что такое realtime?
От: Философ Ад http://vk.com/id10256428
Дата: 07.01.25 10:51
Оценка:
Здравствуйте, vdimas, Вы писали:

Ф>>Без блокировок совсем не выходит, название "lock-free" — это обман.


V>Всё-таки, взаимных блокировок не происходит, и это важно...

V>Вот там мьютексы были паиньками...

Я таки настаиваю, что название "lock-free" крайне кривое и не отражает сути вещей. Дело не в мьютексах потому что блокировка вполне может быть на spin-wait'е. Посмотри:

 private static bool CAS(
    ref Node<T> location, Node<T> comparand, Node<T> newValue) {
    return 
      comparand == Interlocked.CompareExchange<Node<T>>(
                     ref location, newValue, comparand);
  }

  public void Push(T item) {
    Node<T> node = new Node<T>();
    node.Item = item;
    do {
      node.Next = head.Next;
    } while (!CAS(ref head.Next, node.Next, node));
  }


lock-free stack — классический пример, но тут мы видим модифицированный spin-wait. Цикл в методе Push равнозначен spin-wait'у и может быть им заменён.

Ф>>Проблема в переключении контекстов, в том что они долгие/медленные?

V>Да. Переключение контекстов заставляет перепрошивать внутренние таблицы виртуальной памяти, т.е. подтягивать эти таблицы, считай, в кеш 0-го уровня.
V>Помимо этого, переключение потока дорогое еще для потока, который вытесняют, потому что его ставят в очередь потоков, а это приоритетная очередь, операции в которой относительно затратны. А если поток вытесняется из-за блокирующего ожидания на примитиве синхронизации, то еще поток ставят в очередь к примитиву синхронизации.

Я в общем-то знал, что поход в ядро — дорогое удовольствие, просто хотел намекнуть, что это необязательно: во многих случаях вполне можно обойтись spin-wait'ом. Притом многие это понимают, и я юзал такие интерфейсы, вот пример:
https://github.com/scumware/RTSS_time_reader/blob/87d6308bec5c5e0a6e8c1b89392f1c21b899906c/RTSS_interop/OSD.cs#L415
 Thread.SpinWait(100);

Там было вставлено только затем, чтобы в цикл ожидания впихнуть инструкцию PAUSE. В шарпе такой вызов это наиболее простой способ. Это способ экономить электричество: эта инструкция — хинт процессору о том, что тут цикл активного ожидания, она специально для этого создавалась.

Однако о виндовом шедуллере всерьёз не задумывался. Мне всегда хватало твёрдого знания того, что поход в ядро — дорого.

Ф>>..."lock-free" — это обман.

V>Никакого обмана. ))

Я про название.

V>Просто гонку на CAS выиграет только один из потоков.


Ужасная терминология.
Всё сказанное выше — личное мнение, если не указано обратное.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.