Алгоритмы блокировки потоков
Автор: Степанова Анастасия • Ноябрь 21, 2022 • Лабораторная работа • 1,532 Слов (7 Страниц) • 142 Просмотры
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра ВТ
ОТЧЁТ
по лабораторной работе №1
по дисциплине
«Параллельные алгоритмы и системы»
Тема: «Алгоритмы блокировки потоков»
Студентка гр. 7305 | _____________ | Степанова А.А. |
Преподаватель | _____________ | Пазников А.А. |
Санкт-Петербург
2021
Цель
Ознакомиться с алгоритмами блокировки потоков, выполнить анализ эффективности программы, построить графики пропускной способности от числа потоков.
Задание
- Разработать программу, реализующую параллельный алгоритм. Средства разработки: С/С++, Java.
- Выполнить анализ эффективности параллельной программы: построить графики зависимости пропускной способности от числа потоков, оценить масштабирование.
- Сформулировать выводы
Выполнение работы
При выполнении лабораторной работы были реализованы алгоритмы блокировки потоков, такие как MCS и CLH. Для реализации алгоритмов был выбран язык Java. Был осуществлён анализ эффективности параллельной программы по полученным данным, построены графики.
- MSC
Экспериментальные результаты:
Кол-во потоков | 2 | 4 | 8 | 16 | 32 | 64 |
Кол-во блокировок | 200150 | 110735 | 108321 | 94120 | 76872 | 61854 |
[pic 1]
- CLH
Экспериментальные результаты:
Кол-во потоков | 2 | 4 | 8 | 16 | 32 | 64 |
Кол-во блокировок | 280630 | 145791 | 120945 | 98916 | 89631 | 74721 |
[pic 2]
[pic 3]
Вывод
В результате полученных данных, можно сделать вывод, о том, что наибольшей пропускной способностью обладает алгоритм CLH. Также можно заметить, что при увеличении числа потоков пропускная способность алгоритмов уменьшается.
Листинг
CLH
Main,java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
public class Main {
private final static int threads = 64;
private final static AtomicInteger count = new AtomicInteger(0);
private final static AtomicBoolean stop = new AtomicBoolean(false);
private final static CLHLock lock = new CLHLock();
static class MyRunnable implements Runnable {
@Override
public void run() {
while (!stop.get()) {
lock.lock();
count.incrementAndGet();
lock.unlock();
}
}
}
public static void main(String[] args) {
ExecutorService exec = Executors.newFixedThreadPool(threads);
try {
for (int i = 0; i < threads; i++) {
exec.execute(new MyRunnable());
}
} catch (Exception e) {
e.printStackTrace();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stop.set(true);
exec.shutdown();
System.out.println("locks: " + count);
}
}
...