romanova_adelina_lab_8 #133

Open
enuementtt wants to merge 3 commits from romanova_adelina_lab_8 into main
5 changed files with 134 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, является элементом балансировки нагрузки, направляя запросы от клиентов к наиболее подходящим серверам в зависимости от текущей нагрузки.

View File

@ -0,0 +1,25 @@
# Лабораторная работа 8. Как Вы поняли, что называется распределенной системой и как она устроена?
### Задание
Написать небольшое эссе (буквально несколько абзацев) своими словами.
  1. Зачем сложные системы (например, социальная сеть ВКонтакте) пишутся в "распределенном" стиле, где каждое отдельное приложение (или сервис) функционально выполняет только ограниченный спектр задач?
  2. Для чего были созданы системы оркестрации приложений? Каким образом они упрощают / усложняют разработку и сопровождение распределенных систем?
  3. Для чего нужны очереди обработки сообщений и что может подразумеваться под сообщениями?
  4. Какие преимущества и недостатки распределенных приложений существуют на Ваш взгляд?
  5. Целесообразно ли в сложную распределенную систему внедрять параллельные вычисления? Приведите примеры, когда это действительно нужно, а когда нет.
### Эссе
Распределенные системы являются важной частью современных IT-технологий, предоставляя масштабируемость и надежность. Однако, их создание и поддержка требуют дополнительных усилий.
Основная причина использования распределенного подхода - это масштабируемость и надежность. Распределение задач между компонентами позволяет эффективнее использовать ресурсы и обеспечивает отказоустойчивость. При сбое одного компонента, другие продолжают работу.
Системы оркестрации приложений упрощают управление распределенными системами, сосредотачивая внимание разработчиков на коде, а не на сложности взаимодействия компонентов. Однако, они могут усложнить разработку, требуя дополнительной конфигурации.
Очереди обработки сообщений играют важную роль, обеспечивая передачу данных между компонентами. Они позволяют асинхронно обрабатывать сообщения, улучшая производительность и отзывчивость.
Распределенные приложения могут масштабироваться и обеспечивать отказоустойчивость, но их разработка требует дополнительных усилий. Внедрение параллельных вычислений целесообразно при обработке больших данных, но может быть избыточным в других случаях, добавляя лишнюю сложность.