mirror of https://github.com/t1meshift/os_labs.git
66 lines
3.3 KiB
Markdown
66 lines
3.3 KiB
Markdown
|
# Лабораторная работа №11
|
|||
|
|
|||
|
## Задание 1
|
|||
|
|
|||
|
Программа печатает в каждом потоке начальные данные перед `vector_add` и результат выполнения данной функции.
|
|||
|
Результат может меняться от вызова к вызову, так как весь worker не покрыт мьютексами, но на практике на такой небольшой
|
|||
|
программе это маловероятно достижимо.
|
|||
|
|
|||
|
При добавлении `-d` взаимная блокировка возникает не всегда, а только при попадании переключения потоков между мьютексами.
|
|||
|
|
|||
|
В случае, если число потоков = 1, взаимной блокировки не возникнет.
|
|||
|
|
|||
|
## Задание 2
|
|||
|
|
|||
|
Программа избегает мёртвой блокировки за счёт упорядочивания по адресам, что позволяет постоянно сохранять порядок
|
|||
|
блокировки.
|
|||
|
|
|||
|
В случае если адреса совпадают, то это один мьютекс, и для корректной работы программы его надо блокировать 1 раз.
|
|||
|
|
|||
|
В случае увеличения числа циклов и потоков, время выполнения растёт.
|
|||
|
|
|||
|
В случае включения `-p` время уменьшается, так как разрешается параллелизм.
|
|||
|
|
|||
|
## Задание 3
|
|||
|
|
|||
|
Вызовы pthread_mutex_trylock необходимы для создания порядка блокировки, для того чтобы избежать дедлока.
|
|||
|
|
|||
|
С увеличением числа потоков происходит рост повторных попыток, что является логичным, так как переключение между потоками
|
|||
|
становится более частым.
|
|||
|
|
|||
|
## Задание 4
|
|||
|
|
|||
|
Данный подход защищает уязвимое место дедлока, созданием глобального мьютекса, но при этом не даёт различным векторам
|
|||
|
выполняться параллельно.
|
|||
|
|
|||
|
При использовании `-p` время уменьшается.
|
|||
|
|
|||
|
## Задание 5
|
|||
|
|
|||
|
Указав memory, мы дожидаемся завершения всех операцией с памятью, что своего рода позволяет заменить мьютексы.
|
|||
|
(https://ru.wikipedia.org/wiki/GCC_Inline_Assembly)
|
|||
|
|
|||
|
Сравним время выполнения следующих команд:
|
|||
|
|
|||
|
```text
|
|||
|
./vector-nolock -t -n 2 -l 1000000 -d = 4.08
|
|||
|
./vector-nolock -t -n 2 -l 1000000 -d -p = 0.65
|
|||
|
```
|
|||
|
|
|||
|
```text
|
|||
|
./vector-avoid-hold-and-wait -t -n 2 -l 1000000 -d = 2.98
|
|||
|
./vector-avoid-hold-and-wait -t -n 2 -l 1000000 -d -p = 0.45
|
|||
|
```
|
|||
|
|
|||
|
```text
|
|||
|
./vector-try-wait -t -n 2 -l 1000000 -d = 1.30
|
|||
|
./vector-try-wait -t -n 2 -l 1000000 -d -p = 0.18
|
|||
|
```
|
|||
|
|
|||
|
```text
|
|||
|
./vector-global-order -t -n 2 -l 1000000 -d = 0.69
|
|||
|
./vector-global-order -t -n 2 -l 1000000 -d -p = 0.19
|
|||
|
```
|
|||
|
|
|||
|
Таким образом видно, что vector-nolock работает медленнее других в любом случае.
|