romanova_adelina_lab_7 #132

Open
enuementtt wants to merge 2 commits from romanova_adelina_lab_7 into main
4 changed files with 109 additions and 0 deletions

View File

@ -0,0 +1,37 @@
# Лабораторная работа 6. Определение детерминанта матрицы с помощью параллельных вычислений
## Задание
Требуется сделать два алгоритма: обычный и параллельный. В параллельном алгоритме предусмотреть ручное задание количества потоков, каждый из которых будет выполнять нахождение отдельной группы множителей.
### Запуск программы
Для запуска программы необходимо с помощью командной строки в корневой директории файлов прокета прописать:
```
python main.py
```
### Описание работы программы
Программа реализует вычисление детерминанта квадратной матрицы с использованием двух алгоритмов: *обычного и параллельного*.
  1. Обычный алгоритм
      Использует функцию ```numpy.linalg.det()``` для вычисления детерминанта.
  2. Параллельный алгоритм
      Разбивает матрицу на части и использует несколько потоков для параллельного вычисления детерминанта. Количество потоков задается вручную. Реализован с использованием библиотеки ```concurrent.futures```.
Для каждого размера матрицы программа выводит время выполнения обычного и параллельного алгоритмов, а также соответствующие значения детерминантов.
### Результат работы программы:
![](result.png "")
#### Вывод
Параллельное выполнение нахождения детерминанта может привести к ускорению, особенно на больших матрицах. Однако, для некоторых матриц, результаты детерминантов могут отличаться между обычным и параллельным выполнением.
# Youtube
https://youtu.be/2HcM0LfTgQk

View File

@ -0,0 +1,49 @@
import numpy as np
import time
import concurrent.futures
def calculate_determinant(matrix):
return np.linalg.det(matrix)
def calculate_determinant_parallel(matrix, num_threads):
result = 1.0
chunk_size = matrix.shape[0] // num_threads
def calculate_chunk(start, end):
nonlocal result
for i in range(start, end):
result *= matrix[i, i]
with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor:
futures = []
for i in range(0, matrix.shape[0], chunk_size):
futures.append(executor.submit(calculate_chunk, i, i + chunk_size))
for future in concurrent.futures.as_completed(futures):
future.result()
return result
def benchmark(matrix_size, num_threads=1):
# Генерация квадратной матрицы
matrix = np.random.rand(matrix_size, matrix_size)
# Бенчмарк для обычного нахождения детерминанта
start_time = time.time()
det_normal = calculate_determinant(matrix)
end_time = time.time()
print(f"Размер матрицы {matrix_size}x{matrix_size}")
print(f"Время при обычном выполнении: {end_time - start_time:.6f} секунд")
print(f"Детерминант: {det_normal}")
# Бенчмарк для параллельного нахождения детерминанта
start_time = time.time()
det_parallel = calculate_determinant_parallel(matrix, num_threads)
end_time = time.time()
print(f"Время при параллельном выполнении ({num_threads} поток): {end_time - start_time:.6f} секунд")
print(f"Детерминант: {det_parallel}\n")
# Запуск бенчмарков
benchmark(100)
benchmark(300)
benchmark(500)

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -0,0 +1,23 @@
# Лабораторная работа 7. Балансировка нагрузки в распределённых системах при помощи открытых технологий на примерах
### Задание
Написать небольшое эссе (буквально несколько абзацев) своими словами.
  1. Какие алгоритмы и методы используются для балансировки нагрузки?
  2. Какие открытые технологии существуют для балансировки нагрузки?
  3. Как осуществляется балансировка нагрузки на базах данных?
  4. Реверс-прокси как один из элементов балансировки нагрузки.
***
### Эссе
Балансировка нагрузки в распределенных системах используется для равномерного распределения работы и ресурсов между компонентами системы. Это способствует повышению отказоустойчивости и обеспечивает высокую производительность системы. Для достижения равномерного распределения нагрузки применяются различные алгоритмы.
Алгоритмы балансировки нагрузки включают циклический перебор (распределение запросов между серверами по очереди), взвешенный циклический перебор (с учетом веса каждого сервера в зависимости от его производительности) и выбор сервера с наименьшим количеством активных соединений.
Для балансировки нагрузки в распределенных системах применяются открытые технологии, такие как Nginx и Apache HTTP Server. Эти веб-серверы обеспечивают высокую производительность и отказоустойчивость.
Балансировка нагрузки на базах данных осуществляется с использованием методов репликации данных (синхронизации нескольких копий базы данных) и шардирования (разделение базы данных на несколько шардов с частями данных).
Реверс-прокси, такой как Nginx, является элементом балансировки нагрузки, направляя запросы от клиентов к наиболее подходящим серверам в зависимости от текущей нагрузки.