приобретение () и освобождение () блокировать операции с testandset () - PullRequest
0 голосов
/ 31 октября 2018

Мне нужно решить следующую проблему:

а. Покажите, как реализовать операции блокировки acqu () и release () с помощью инструкции TestandSet.

б. Определите проблему с производительностью, которая может возникнуть в вашем решении, когда оно выполняется на многопроцессорном компьютере, но не возникает на однопроцессорном. Опишите конкретный сценарий возникновения проблемы с производительностью.

с. Опишите альтернативную реализацию блокировки, которая уменьшает проблему с производительностью в b, и объясните, как она помогает в конкретном сценарии, представленном вами в b.

У меня есть настройки acqu () и release ():

acquire() {
    while(TestandSet(true)){
        //wait for lock to be released
    {
}
release() {
    TestandSet(false);
}

Однако я не смог определить проблему с производительностью нескольких процессоров или одного процессора. В чем проблема производительности? Или моя реализация acqu () и release () верна?

1 Ответ

0 голосов
/ 31 октября 2018

Найдено по тесту AndSet wiki:

Четырьмя основными метриками оценки для блокировок в целом являются неконтролируемая задержка получения блокировки, трафик шины, справедливость и хранение.

Низкие оценки по двум тестам, а именно: высокий автобусный трафик и несправедливость.

Когда процессор P1 получил блокировку и процессор P2 также ожидает блокировку, P2 будет продолжать выполнять транзакции шины при попытках получить блокировку. Когда процессор получил блокировку, все остальные процессоры, которые также хотят получить такую ​​же блокировку, продолжают пытаться получить блокировку, многократно инициируя транзакции шины, пока не получат блокировку. Это значительно увеличивает требования к тестированию и настройке шины. Это замедляет весь остальной трафик из кэша, что приводит к потере согласованности. Это замедляет весь раздел, так как трафик насыщается неудачными попытками получения блокировки. Test-and-test-and-set является улучшением по сравнению с TSL, поскольку он не инициирует запросы получения блокировки постоянно.

Когда мы учитываем справедливость, мы учитываем, имеет ли процессор реальный шанс получить блокировку, когда он будет освобожден. В экстремальной ситуации процессор может голодать, т. Е. Он не сможет получить блокировку в течение длительного периода времени, даже если за это время он освободился.

Затраты на хранение для TSL практически ничем не отличаются, поскольку требуется только одна блокировка. Неограниченная задержка также низка, так как требуется только одна атомарная инструкция и ветвь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...