Cтраница 3
При применении команды TSL для синхронизации мультипроцессора блок кэша, содержащий мьютекс, будет мотаться взад-вперед между центральным процессором, удерживающим блокировку, и центральным процессором, запрашивающим ее, если оба процессора изменяют содержимое блока. Для снижения шинного трафика запрашивающий центральный процессор выполняет команду TSL раз в 50 циклов шины, но центральный процессор, удерживающий блокировку, изменяет блок кэша между командами TSL. Если блок кэша состоит из 16 32-разрядных слов, для переноса каждого из которых требуется один цикл шины, а шина работает с частотой 400 МГц, какая часть пропускной способности шины съедается перемещением блока кэша взад-вперед. [31]
![]() |
Основные вызовы для потоков, определенные в стандарте POSIX Вызов потока Значение. [32] |
Потоки можно синхронизировать с помощью специальных объектов, которые называются мьютексами. Для того чтобы в конкретный момент времени только один поток мог получать доступ к общему ресурсу, потоки дожны запирать мьютекс перед использованием ресурса и отпирать его после завершения работы с ним. Таким образом можно избежать состояния гонок, поскольку этому протоколу подчиняются все потоки. [33]
В большинстве работ используется модель, в которой поток, не заполучивший мьютекс, какое-то время опрашивает состояние мьютекса в цикле. [34]
Другой способ поддержать наличие нескольких копий модифицируемых страниц заключается в использовании мьютексов. Чтобы получить возможность писать в какую-либо часть виртуального пространства, процесс должен сначала получить мьютекс. После этого процесс может читать и писать в эту память столько раз, сколько это ему необходимо. Когда блокировка отпускается, изменения распространяются на другие копии. До тех пор пока только один центральный процессор может получить блокировку для записи в страницу, такая схема обеспечивает непротиворечивость данных. [35]
Третий механизм синхронизации основан на критических секциях, которые сходны с мьютексами, за исключением локальности по отношению к адресному пространству исходного потока. Поскольку критические секции не являются объектами ядра, у них нет идентификаторов ( handles) и дескрипторов защиты и их нельзя передавать другим процессам. Блокировка и разблокировка осуществляются с помощью EnterCriticalSection и LeaveCriticalSection соответственно. Так как эти функции API выполняются целиком в пользовательском пространстве, они работают гораздо быстрее, чем мьютексы. [36]
![]() |
Использование нескольких мьютексов во избежание пробуксовки кэша. [37] |
До сих пор мы предполагали, что центральный процессор, которому требуется мьютекс, просто ждет, пока тот не освободится, опрашивая его состояние постоянно или периодически, либо присоединяясь к списку ожидающих процессоров. [38]
Среда Win32 API содержит ряд объектов, применяемых для синхронизации потоков - мьютексы, критические секции, семафоры и события. [39]
![]() |
Использование нескольких мьютексов во избежание пробуксовки кэша. [40] |
До сих пор мы предполагали, что центральный процессор, которому требуется мьютекс, просто ждет, пока тот не освободится, опрашивая его состояние постоянно или периодически, либо присоединяясь к списку ожидающих процессоров. [41]
Аналогичная проблема возникает в том случае, когда поток с приоритетом 16 захватывает мьютекс и долго не получает управления, в результате чего более важные системные потоки, ждущие этого мьютекса, умирают от истощения. Эту проблему можно устранить, если разрешить потоку, которому на короткое время требуется мьютекс, просто запрещать планирование на время использования мьютекса. На многопроцессорных системах следует применять спин-блокировку. [42]
Второй метод заключается в том, чтобы преобразовать каждое прерывание в операцию unlock на мьютексе, которого ожидает соответствующий драйвер. [43]
Необходим определенный механизм синхронизации доступа процессов к интерфейсной карте, но такие механизмы, как мьютексы, работают только тогда, когда предполагается сотрудничество процессов. В среде разделения времени с многочисленными пользователями, спешащими выполнить свою работу, один пользователь может просто захватить мьютекс, связанный с картой, и не отдавать его. [44]
Второй метод заключается в том, чтобы преобразовать каждое прерывание в операцию unl ock на мьютексе, которого ожидает соответствующий драйвер. [45]