Прерывания на многопроцессорной машине

Тема в разделе "WASM.WIN32", создана пользователем gilg, 11 окт 2006.

  1. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Стоит задача обработки разделяемых данных в обработчике прерывания (обращение к данным занимает около десяти инструкций). Существует ли быстрый способ блокировки остальных процессоров на время этой обработки? Что-то типа LOCK на несколько инструкций?
     
  2. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    это обычно делается с помощью семафора, владение которым получают, используя инструкции с LOCK. Устраивается гонка до семафора, кто выиграл -- выполняет критичный участок, остальные ждут освобождения семафора. Для захвата семафора весьма подходит lock cmpxchg.
     
  3. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Это-то понятно. Проблема немного в другом. Есть чужое приложение, которое обрабатывает данные по прерыванию и еще где-то по ходу выполнения программы. Данные организованы в виде двусвязного списка. Прерывание происходит несколько раз в секунду. Мне требуется по сигналу прерывания выбирать узлы списка и передавать на обработку. Соответственно, вешаю свой обработчик прерывания и правлю в нем этот список.
    На 1-процессорной машине вопросов нет. На многопроцессорной же возможна ситуация, когда узел из списка будет удален только наполовину, а на другом процессоре приложение к нему обратится. Существует вариант разослать DPC всем остальным процессорам. Но боюсь, что из-за этого капитально просядет производительность. Существуют ли в таком случае какие-нибудь варианты решения?
     
  4. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Тут либо дописать кусок кода для синхронизации к 'чужой' проге, либо в 'своей' части глушить все остальные процессоры при обработке прерывания (что весьма отстойно). Или вариации -- например, на время добавления/удаления узла притормаживать поток(и) 'чужого' приложения.
     
  5. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    В общем быстрого и правильного решения по-любому нет. (Быстро) ^ (надежно) :dntknw:
    Ситуация с необходимостью блокировки остальных процессоров вообще достаточно частая вещь. Почему интересно разработчики процессоров не предусмотрели такой штуки? Имхо, было бы весьма полезно