initial but unfortunately with pics which i should redraw and remove from here

This commit is contained in:
Ivan I. Ovchinnikov 2022-12-02 00:05:50 +03:00
commit ca3721dda1
299 changed files with 36726 additions and 0 deletions

8
.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
build/
svg-inkscape/
.DS_Store
*.*~
*.pdf_tex
*.pdf

323
01-dis-lab-01-report.tex Normal file
View File

@ -0,0 +1,323 @@
\documentclass{article}
\input{../common-preamble}
\input{../fancy-listings-preamble}
\input{../bmstu-preamble}
\begin{document}
\pagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{1}{Проектирование распределённых вычислений}{Распределённые информационные системы}{}{Локтев Д.А.}
\newpage
\tableofcontents
\newpage
\section{Результаты выполнения задания}
Задания выполнены с применением значений для варианта №11
\subsection{Сортировка}
В соответствии с вариантом, при выполнении задания по сортировке массива данных, использовались параметры настройки программы \code{ParaLab} представленные в таблице \hyperref[table:sorttask]{\ref{table:sorttask}}.
\begin{table}[H]
\centering
\begin{tabular}{||l|c||}
\hline
Параметр & Значение \\ [0.5ex]
\hline\hline
Производительность процессоров(Gflops) & 1,0 \\
Кол-во процессоров & 4 \\
Метод сортировки & пузырьковая сортировка \\
Топология сети & гиперкуб \\
"Размер массива (нижний предел)" & 1000 \\
"Размер массива (верхний предел)" & 3000 \\
\hline
\end{tabular}
\caption{Параметры настройки программы \code{ParaLab} для сортировки массива данных}
\label{table:sorttask}
\end{table}
Результаты выполнения задания представлены в таблице \hyperref[table:sortresult]{\ref{table:sortresult}}, а график зависимости времени сортировки от размера массива на рисунке \hyperref[pic:sortdiagram]{\ref{pic:sortdiagram}}.
\begin{table}[H]
\centering
\begin{tabular}{||c|c|c|c||}
\hline
Размер массива данных & Время выполнения (мкс) & Из них на передачу данных (мкс) & Время в отчёте \code{ParaLab} \\ [0.5ex]
\hline\hline
1000 & 274,4514 & 270,96 & 365,27 \\
1500 & 396,4165 & 390,96 & 527,49 \\
2000 & 518,4429 & 510,96 & 689,76 \\
2500 & 640,5148 & 630,96 & 852,08 \\
3000 & 762,6231 & 750,96 & 1014,4 \\
\hline
\end{tabular}
\caption{Результаты сортировки массива данных методом пузырьковой сортировки.}
\label{table:sortresult}
\end{table}
\begin{figure}[H]
\centering
\begin{tikzpicture}
\begin{axis}[
xlabel={Количество элементов}, ylabel={Время выполнения},
xmin=0, xmax=3500, ymin=0, ymax=1200,
xtick={500, 1000, 1500, 2000, 2500, 3000, 3500},
ytick={0,200,400,600,800,1000,1100},
legend pos=north west, ymajorgrids=true, grid style=dashed,
]
\addplot[ color=blue, mark=square, ]
coordinates { (1000,274.4514)(1500,396.4165)(2000,518.4429)(2500,640.5148)(3000,762.6231) };
\addplot[ color=red, mark=triangle, ]
coordinates { (1000,270.96)(1500,390.96)(2000,510.96)(2500,630.96)(3000,750.96) };
\addplot[ color=violet, mark=o, ]
coordinates { (1000,365.27)(1500,527.49)(2000,689.76)(2500,852.08)(3000,1014.4) };
\legend{Общее время, Передача данных, Отчёт приложения}
\end{axis}
\end{tikzpicture}
\caption{Зависимость времени сортировки от размера массива}
\label{pic:sortdiagram}
\end{figure}
\subsection{Умножение матриц}
В соответствии с вариантом, при выполнении задания по умножению матриц, использовались параметры настройки программы \code{ParaLab} представленные в таблице \hyperref[table:multiplytask]{\ref{table:multiplytask}}.
\begin{table}[H]
\centering
\begin{tabular}{||l|c||}
\hline
Параметр & Значение \\ [0.5ex]
\hline\hline
Производительность процессоров(Gflops) & 1,0 \\
Кол-во процессоров & 4 \\
Топология сети & гиперкуб \\
Объем исходных данных (нижний предел) & 200 \\
Объем исходных данных (верхний предел) & 300 \\
\hline
\end{tabular}
\caption{Параметры настройки программы \code{ParaLab} для умножения матриц}
\label{table:multiplytask}
\end{table}
Настройка программы \code{ParaLab} для данного задания приводит к ошибке, связанной с тем, что ни один из алгоритмов умножения матриц не может быть реализован на топологии типа - Гиперкуб. Сообщения об ошибке представлено на рисунке \hyperref[pic:multiplyerror]{\ref{pic:multiplyerror}}.
\begin{figure}[H]
\centering
\includegraphics[height=2cm]{01-dis-rpt-plerr.png}
\caption{Ошибка при настройке задачи умножения матриц}
\label{pic:multiplyerror}
\end{figure}
Так как топология сети \textbf{Гиперкуб} не подходит для выполнения задачи, были исследованные остальные доступные топологии на предмет выполняемости условий задачи. Топология \textbf{Линейка} аналогично топологии \textbf{Гиперкуб} не может быть использована для выполнения задачи. Топологии \textbf{Кольцо} и \textbf{Полный граф} хотя и могут быть использованы, однако поддерживают только метод решения \textbf{Ленточный алгоритм}, что недостаточно для решения задачи. Топология \textbf{Решетка} позволяет провести эксперименты для всех методов решения и была выбрана вместо топологии указанной в задаче.
Результаты выполнения задания представлены в таблице \hyperref[table:multiplylent]{\ref{table:multiplylent}}, а график временной зависимости времени сортировки от размера массива на рисунке \hyperref[pic:multiplydiagram]{\ref{pic:multiplydiagram}}.
\begin{table}[H]
\centering
\begin{tabular}{||l|c|c|c||}
\hline
Размерность матрицы & Алгоритм Фокса & Ленточный алгоритм & Алгорим Кэннона \\ [0.5ex]
\hline\hline
200 & 4430 & 823,6 & 5240 \\
300 & 12180 & 1220,4 & 13990 \\
\hline
\end{tabular}
\caption{Результаты матричного умножения}
\label{table:multiplylent}
\end{table}
\begin{figure}[H]
\centering
\begin{tikzpicture}
\begin{axis}[
xlabel={Размерность матрицы}, ylabel={Время выполнения},
xmin=-200, xmax=500, ymin=0, ymax=15000,
xtick={-100, 0, 100, 200, 300, 400},
ytick={0,3000,6000,9000,12000,15000},
legend pos=north west, ymajorgrids=true, grid style=dashed,
]
\addplot[ color=blue, mark=square, ]
coordinates { (200,4430)(300,12180) };
\addplot[ color=red, mark=triangle, ]
coordinates { (200,823.6)(300,1220.4) };
\addplot[ color=violet, mark=o, ]
coordinates { (200,5240)(300,13990) };
\legend{Ленточный алгоритм, Алгоритм Фокса, Алгоритм Кэннона}
\end{axis}
\end{tikzpicture}
\caption{Временные зависимости для алгоритмов матричного умножения}
\label{pic:multiplydiagram}
\end{figure}
\subsubsection{Сравнение алгоритмов}
Исходя из данных полученных в ходе выполнения задачи, можно сделать вывод, что время выполнения алгоритмов, основанных на ленточном разбиении матрицы ниже чем у алгоритмов, основанных на блочном разбиении.
\subsection{Работа с графами}
В соответствии с вариантом, при выполнении задания по работе с графами, использовались параметры настройки программы \code{ParaLab} представленные в таблице \hyperref[table:multiplytask]{\ref{table:multiplytask}}.
\begin{table}[H]
\centering
\begin{tabular}{||l|c||}
\hline
Параметр & Значение \\ [0.5ex]
\hline\hline
Производительность процессоров(Gflops) & 1,0 \\
Кол-во процессоров & 4 \\
Топология сети & гиперкуб \\
\hline
\end{tabular}
\caption{Параметры настройки программы \code{ParaLab} для работы с графами}
\label{table:multiplytask}
\end{table}
Настройка программы \code{ParaLab} для данного задания приводит к ошибке, связанной с тем, что ни один из алгоритмов обработки графов не может быть реализован на топологии типа \textbf{Гиперкуб}. Сообщение об ошибке представлено на рисунке \hyperref[pic:grapherror]{\ref{pic:grapherror}}. Исходя из сообщения об ошибки, топология была изменена на \textbf{Полный Граф}.
\begin{figure}[h]
\centering
\includegraphics[height=3cm]{01-dis-rpt-plerr2.png}
\caption{Ошибка при настройке задачи работы с графами}
\label{pic:grapherror}
\end{figure}
Создать граф из четырёх вершн в соответствии с заданием не представляется возможным, поскольку значения для полного графа возможны только 1, 2, 5, 10, 20. Так случайным образом был сформирован граф с 10 вершинами. Схема графа представлена на рисунке \hyperref[pic:graph10edges]{\ref{pic:graph10edges}}.
\begin{figure}[H]
\centering
\includegraphics[height=6cm]{01-dis-rpt-plfg1.png}
\caption{Сформированный программой \code{ParaLab} полный граф из 10 вершин}
\label{pic:graph10edges}
\end{figure}
\subsubsection{Алгоритм Прима}
\label{subsubsection:algprim}
В ходе выполнения задания при настройке количество процессоров на 20 штук, была получена ошибка, в связи с чем расчеты с такой конфигурацией программы не проводились. Сообщение об ошибке представлено на рисунке \hyperref[pic:graphPerr]{\ref{pic:graphPerr}}.
\begin{figure}[H]
\centering
\includegraphics[height=3cm]{01-dis-rpt-plperr1.png}
\caption{Ошибка выполнения вычислений программой на 20 процессорах}
\label{pic:graphPerr}
\end{figure}
Результаты выполнения задания поиска минимального охватывающего дерева с использованием алгоритма Прима представлены в таблице \hyperref[table:prim]{\ref{table:prim}}. График временных зависимостей для задачи в зависимости от количества процессоров представлен на рисунке \hyperref[pic:primgraph]{\ref{pic:primgraph}}.
\begin{table}[H]
\centering
\begin{tabular}{||l|c||}
\hline
Количество процессоров & Время выполнения (мкс) \\ [0.5ex]
\hline\hline
2 & 181,46 \\
5 & 181,45 \\
10 & 181,44 \\
\hline
\end{tabular}
\caption{Результаты обработки графа алгоритмом Прима}
\label{table:prim}
\end{table}
\begin{figure}[H]
\centering
\includegraphics[height=4cm]{01-dis-rpt-plprim1.png}
\caption{Зависимость времени обработки графа от количества процессоров}
\label{pic:primgraph}
\end{figure}
\subsubsection{Алгоритм Дейкстры}
В ходе выполнения задания, при настройке количество процессоров на 20 штук, была получена ошибка аналогичная ошибке в разделе \hyperref[subsubsection:algprim]{\ref{subsubsection:algprim}}.
Результаты выполнения задания поиска минимального охватывающего дерева с использованием алгоритма Дейкстры представлены в таблице 10. График временных зависимостей для задачи в зависимости от количества процессоров представлен на рисунке 11.
\begin{table}[H]
\centering
\begin{tabular}{||l|c||}
\hline
Количество процессоров & Время выполнения (мкс) \\ [0.5ex]
\hline\hline
2 & 181,46 \\
5 & 181,45 \\
10 & 181,44 \\
\hline
\end{tabular}
\caption{Результаты обработки графа алгоритмлм Дейкстры}
\label{table:prim}
\end{table}
\begin{figure}[H]
\centering
\includegraphics[height=4cm]{01-dis-rpt-pldeix1.png}
\caption{Зависимость времени обработки графа от количества процессоров}
\label{pic:primgraph}
\end{figure}
\section{Контрольные вопросы}
\subsection{Описание алгоритма сортировки, в соответствии с вариантом, использованным в работе}
\textbf{Пузырьковая сортировка}. Алгоритм пузырьковой сортировки в прямом виде достаточно сложен для распараллеливания сравнение пар значений упорядочиваемого набора данных происходит строго последовательно. В связи с этим для параллельного применения используется не сам этот алгоритм, а его модификация, известная в литературе как метод чёт-нечётной перестановки (odd-even transposition). Суть модификации состоит в том, что в алгоритм сортировки вводятся два разных правила выполнения итераций метода в зависимости от чётности или нечётности номера итерации сортировки для обработки выбираются элементы с чётными или нечётными индексами соответственно, сравнение выделяемых значений всегда осуществляется с их правыми соседними элементами. Т.е., на всех нечётных итерациях сравниваются пары
\[
(a_1, a_2), (a_3, a_4), ..., (a_{n1}, a_n)
\]
на четных итерациях обрабатываются элементы
\[
(a_2, a_3), (a_4, a_5), ..., (a_{n2}, a_{n1})
\]
После N-кратного повторения подобных итераций сортировки исходный набор данных оказывается упорядоченным.
Получение параллельного варианта для метода чет-нечетной перестановки уже не представляет каких-либо затруднений сравнение пар значений на итерациях сортировки любого типа являются независимыми и могут быть выполнены параллельно.
\subsection{В чем состоит основное различие сортировки Шелла от пузырьковой сортировки?}
Основное различие состоит в том, что на первых итерациях алгоритма Шелла происходит сравнение пар элементов, которые в исходном наборе данных находятся далеко друг от друга (для упорядочивания таких пар в пузырьковой сортировке может понадобиться достаточно большое количество итераций).
\subsection{Описание метода умножения матрицы, в соответствии с вариантом, использованным в работе}
\subsubsection{Ленточный алгоритм}
При ленточной схеме разделения данных исходные матрицы разбиваются на горизонтальные (для матрицы A) и вертикальные (для матрицы B) полосы. Получаемые полосы распределяются по процессорам, при этом на каждом из имеющегося набора процессоров располагается только по одной полосе матриц A и B. Перемножение полос (данная операция может быть выполнена процессорами параллельно) приводит к получению части блоков результирующей матрицы C. Для вычисления оставшихся блоков матрицы C сочетания полос матриц A и B на процессорах изменяются. В наиболее простом виде это может быть обеспечено, например, при кольцевой топологии вычислительной сети, при числе процессоров, равном количеству полос. В этом случае необходимое для матричного умножения изменение положения данных может быть реализовано циклическим сдвигом полос матрицы B по кольцу. После многократного выполнения описанных действий (количество необходимых повторений является равным числу процессоров) на каждом процессоре получается набор блоков, образующий горизонтальную полосу матрицы C.
Рассмотренная схема вычислений позволяет определить параллельный алгоритм матричного умножения при ленточной схеме разделения данных как итерационную процедуру, на каждом шаге которой происходит параллельное выполнение операции перемножения полос и последующего циклического сдвига полос одной из матриц по кольцу.
\subsubsection{Блочные алгоритмы Фокса и Кэннона}
При блочном представлении данных параллельная вычислительная схема матричного умножения в наиболее простом виде может быть построена, если топология вычислительной сети имеет вид прямоугольной решетки (если реальная топология сети имеет иной вид, например, гиперкуб, как это было необходимо согласно варианта, представление сети в виде решетки можно обеспечить на логическом уровне). Основные положения параллельных методов для блочно представленных матриц состоят в следующем:
\begin{enumerate}
\item каждый из процессоров решетки отвечает за вычисление одного блока матрицы C;
\item в ходе вычислений на каждом из процессоров располагается по одному блоку исходных матриц A и В;
\item при выполнении итераций алгоритмов блоки матрицы А последовательно сдвигаются вдоль строк процессорной решетки, а блоки матрицы B — вдоль столбцов решетки;
\item в результате вычислений на каждом из процессоров получается блок матрицы С, при этом общее количество итераций алгоритма равно числу процессоров.
\end{enumerate}
\subsection{Какие варианты топологии сети возможно использовать для пузырьковой сортировки массива?}
Для пузырьковой сортировки возможно использовать следующие топологии:
\begin{itemize}
\item линейка;
\item кольцо;
\item решетка;
\item гиперкуб;
\item полный граф.
\end{itemize}
\subsection{Перечислите топологии сети, их особенности. Какая сеть обладает наибольшей связанностью рабочих станций при одном и том же количестве станций?}
Основные используемые топологии сети следующие:
\begin{enumerate}
\item полный граф (completely-connected graph или clique) система, в которой между любой парой процессоров существует прямая линия связи; как результат, данная топология обеспечивает минимальные затраты при передаче данных, однако является сложно реализуемой при большом количестве процессоров;
\item линейка (linear array или farm) система, в которой каждый процессор имеет линии связи только с двумя соседними (с предыдущим и последующим) процессорами; такая схема является, с одной стороны, просто реализуемой, с другой стороны, соответствует структуре передачи данных при решении многих вычислительных задач (например, при организации конвейерных вычислений);
\item кольцо (ring) данная топология получается из линейки процессоров соединением первого и последнего процессоров линейки;
\item решетка (mesh) система, в которой граф линий связи образует прямоугольную двумерную сетку; подобная топология может быть достаточно просто реализована и, кроме того, может эффективно использоваться при параллельном выполнении многих численных алгоритмов (например, при реализации методов блочного умножения матриц);
\item гиперкуб (hypercube) данная топология представляет частный случай структуры N-мерной решетки, когда по каждой размерности сетки имеется только два процессора. Так гиперкуб содержит 2N процессоров при размерности N.
\end{enumerate}
Полный граф обладает наибольшей связанностью при одном и том же количестве процессоров.
\section{Выводы}
Программный комплекс \code{ParaLab}, позволяет проводить как реальные параллельные вычисления на многопроцессорной вычислительной системе, так и имитировать такие эксперименты на одном последовательном компьютере, с визуализацией процесса решения сложной вычислительной задачи. Возможности комплекса позволили провести ряд имитационных экспериментов при различных настройках системы. В ходе выполнения работы не учитывались настройки и пропускная способность сетевого соединения между процессорами и были исследованы следующие алгоритмы:
\begin{enumerate}
\item сортировка Шелла;
\item ленточный алгоритм умножения матриц;
\item алгоритм Фокса;
\item алгоритм Кэннона;
\item алгоритм Прима;
\item алгоритм Дейкстры.
\end{enumerate}
Эффективность каждого алгоритма зависит от настроек системы, что говорит о том, для максимально продуктивного выполнения конкретной задачи, должен быть подобран не только правильный алгоритм, но и правильная аппаратно-программная архитектура, топология. Однако, алгоритмы, предназначенные для параллельных вычислений, могут существенно ускорить выполнение, поэтому параллельность, насмотря на сложности проектирования, является мощным инструментом решения сложных вычислительных задач.
\end{document}

243
01-dis-lab-02-report.tex Normal file
View File

@ -0,0 +1,243 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\input{../fancy-listings-preamble}
\begin{document}
\pagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{2}{Мультиагентные системы}{Распределённые информационные системы}{}{Локтев Д.А.}
\newpage
\tableofcontents
\lstlistoflistings
\newpage
\section{Результаты выполнения задания}
Задания выполнены с применением значений для варианта №11(2)
\section{Введение}
Целью работы является изучение подходов к проектированию мультиагентных систем и построению искусственного интеллекта, а также их реализация. Доработка алгоритма поведения игрока и компьютеров в игре Pacman реализуется на языке Python второй версии в среде разработки JetBrains PyCharm Community Edition.
\section{Улучшение агента ReflexAgent}
Комментарий к фукнции \code{evaluationFunction(self, currentGameState, action)} содержал следующие указания:
\begin{verbatim}
Реализуйте здесь лучшую оценочную функцию
Оценочная функция берет текущее и предполагаемое следующее состояние GameStates
(pacman.py) и возвращает число (чем больше число, тем лучше).
Код ниже содержит полезную информацию о состоянии, такую как оставшуюся еду
(newFood) и позицию пакмена после движения (newPos).
newScaredTimes содержит число шагов, в течении которых каждый призрак останется
напуганным, поскольку пакмен съел гранулу силы.
Выведите эти переменные, чтобы посмотреть, что в них находится, и затем
комбинируйте их для создания великолепной оценочной функции.
\end{verbatim}
Улучшенный код рефлексивного агента представлен в листинге \hyperref[lst:betterReflex]{\ref{lst:betterReflex}}. Результаты выполнения тестов, запушенных командой \code{python autograder.py q q1 no-graphics} представлен в выводе \hyperref[fig:result1]{\ref{fig:result1}}.
\begin{lstlisting}[language=Python, caption=Улучшенный код агента, style=PyCodeStyle, label={lst:betterReflex}]
def evaluationFunction(self, currentGameState, action):
# Useful information you can extract from a GameState (pacman.py)
successorGameState = currentGameState.generatePacmanSuccessor(action)
newPos = successorGameState.getPacmanPosition()
newFood = successorGameState.getFood()
newGhostStates = successorGameState.getGhostStates()
newScaredTimes = [ghostState.scaredTimer for ghostState in newGhostStates]
currentPos = currentGameState.getPacmanPosition()
currentFood = currentGameState.getFood()
currentGhostStates = currentGameState.getGhostStates()
currentScaredTimes = [ghostState.scaredTimer for ghostState in currentGhostStates]
additional_score = 0
current_distance_to_food = float("inf")
current_distance_to_ghost = float("inf")
new_distance_to_food = float("inf")
new_distance_to_ghost = float("inf")
for food in newFood.asList():
d = manhattanDistance(food, newPos)
new_distance_to_food = min([new_distance_to_food, d])
pos_x, pos_y = newPos
if currentFood[pos_x][pos_y]:
additional_score += 10
food_before_action = len(currentFood.asList())
food_after_action = len(newFood.asList())
for ghost in successorGameState.getGhostPositions():
d = manhattanDistance(newPos, ghost)
new_distance_to_ghost = min([new_distance_to_ghost, d])
score = 1.0 / new_distance_to_food - food_after_action + additional_score
if new_distance_to_ghost < 2:
score -= 500
return score
\end{lstlisting}
\begin{figure}[H]
\renewcommand{\figurename}{Вывод}
\begin{verbatim}
Question q1
===========
Pacman emerges victorious! Score: 1246
Pacman emerges victorious! Score: 1241
Pacman emerges victorious! Score: 1233
Pacman emerges victorious! Score: 1232
Pacman emerges victorious! Score: 1241
Pacman emerges victorious! Score: 1245
Pacman emerges victorious! Score: 1233
Pacman emerges victorious! Score: 1239
Pacman emerges victorious! Score: 1237
Pacman emerges victorious! Score: 1242
Average Score: 1238.9
Scores: 1246.0, 1241.0, 1233.0, 1232.0, 1241.0, 1245.0, 1233.0,
1239.0, 1237.0, 1242.0
Win Rate: 10/10 (1.00)
Record: Win, Win, Win, Win, Win, Win, Win, Win, Win, Win
*** PASS: test_cases\q1\grade-agent.test (4 of 4 points)
*** 1238.9 average score (2 of 2 points)
*** Grading scheme:
*** < 500: 0 points
*** >= 500: 1 points
*** >= 1000: 2 points
*** 10 games not timed out (0 of 0 points)
*** Grading scheme:
*** < 10: fail
*** >= 10: 0 points
*** 10 wins (2 of 2 points)
*** Grading scheme:
*** < 1: fail
*** >= 1: 0 points
*** >= 5: 1 points
*** >= 10: 2 points
### Question q1: 4/4 ###
Finished at 22:04:54
Provisional grades
==================
Question q1: 4/4
------------------
Total: 4/4
Your grades are NOT yet registered. To register your grades, make sure
to follow your instructor's guidelines to receive credit on your project.
\end{verbatim}
\caption{Результат запуска улучшенного рефлексивного агента}
\label{fig:result1}
\end{figure}
\section{Улучшение алгоритма}
В рамках персонального задания было необходимо улучшить алгоритм альфа-бета отсечения (вариант 11(2)). Улучшенный код алгоритма представлен в листинге \hyperref[lst:alphaBeta]{\ref{lst:alphaBeta}}. Результаты выполнения тестов алгоритма, запушенных командой \code{python autograder.py q q2 no-graphics} представлен в выводе \hyperref[fig:result2]{\ref{fig:result2}}.
\begin{lstlisting}[language=Python, caption=Улучшенный алгоритм Альфа-бета отсечение, style=PyCodeStyle, label={lst:alphaBeta}]
class AlphaBetaAgent(MultiAgentSearchAgent):
def maxvalue(self ,state, agentIndex, currentdepth, alpha, beta):
v = (float("-inf"), "Stop")
for action in state.getLegalActions(agentIndex):
v = max([v, (self.value(state.generateSuccessor(agentIndex, action), (currentdepth + 1) % self.number_of_agents, currentdepth + 1, alpha, beta), action)], key = lambda item:item[0])
if v[0] > beta:
return v
alpha = max(alpha, v[0])
return v
def minvalue(self, state, agentIndex, currentdepth, alpha, beta):
v = (float("inf"), "Stop")
for action in state.getLegalActions(agentIndex):
v = min([v, (self.value(state.generateSuccessor(agentIndex, action), (currentdepth + 1) % self.number_of_agents, currentdepth + 1, alpha, beta), action)], key = lambda item:item[0])
if v[0] < alpha:
return v
beta = min(beta, v[0])
return v
def value(self, state, agentIndex, currentdepth, alpha, beta):
if state.isLose() or state.isWin() or currentdepth >= self.depth * self.number_of_agents:
return self.evaluationFunction(state)
if (agentIndex == 0):
return self.maxvalue(state, agentIndex, currentdepth, alpha, beta)[0]
else:
return self.minvalue(state, agentIndex, currentdepth, alpha, beta)[0]
def getAction(self, gameState):
self.number_of_agents = gameState.getNumAgents()
alpha = float("-inf")
beta = float("inf")
path2 = self.maxvalue(gameState, 0, 0, alpha, beta)
return path2[1]
\end{lstlisting}
\begin{figure}[H]
\renewcommand{\figurename}{Вывод}
\begin{verbatim}
Question q2
===========
*** PASS: test_cases\q2\0-lecture-6-tree.test
*** PASS: test_cases\q2\0-small-tree.test
*** PASS: test_cases\q2\1-1-minmax.test
*** PASS: test_cases\q2\1-2-minmax.test
*** PASS: test_cases\q2\1-3-minmax.test
*** PASS: test_cases\q2\1-4-minmax.test
*** PASS: test_cases\q2\1-5-minmax.test
*** PASS: test_cases\q2\1-6-minmax.test
*** PASS: test_cases\q2\1-7-minmax.test
*** PASS: test_cases\q2\1-8-minmax.test
*** PASS: test_cases\q2\2-1a-vary-depth.test
*** PASS: test_cases\q2\2-1b-vary-depth.test
*** PASS: test_cases\q2\2-2a-vary-depth.test
*** PASS: test_cases\q2\2-2b-vary-depth.test
*** PASS: test_cases\q2\2-3a-vary-depth.test
*** PASS: test_cases\q2\2-3b-vary-depth.test
*** PASS: test_cases\q2\2-4a-vary-depth.test
*** PASS: test_cases\q2\2-4b-vary-depth.test
*** PASS: test_cases\q2\2-one-ghost-3level.test
*** PASS: test_cases\q2\3-one-ghost-4level.test
*** PASS: test_cases\q2\4-two-ghosts-3level.test
*** PASS: test_cases\q2\5-two-ghosts-4level.test
*** PASS: test_cases\q2\6-tied-root.test
*** PASS: test_cases\q2\7-1a-check-depth-one-ghost.test
*** PASS: test_cases\q2\7-1b-check-depth-one-ghost.test
*** PASS: test_cases\q2\7-1c-check-depth-one-ghost.test
*** PASS: test_cases\q2\7-2a-check-depth-two-ghosts.test
*** PASS: test_cases\q2\7-2b-check-depth-two-ghosts.test
*** PASS: test_cases\q2\7-2c-check-depth-two-ghosts.test
*** Running AlphaBetaAgent on smallClassic 1 time(s).
Pacman died! Score: 84
Average Score: 84.0
Scores: 84.0
Win Rate: 0/1 (0.00)
Record: Loss
*** Finished running AlphaBetaAgent on smallClassic after 1 seconds.
*** Won 0 out of 1 games. Average score: 84.000000 ***
*** PASS: test_cases\q2\8-pacman-game.test
### Question q2: 5/5 ###
Finished at 22:41:44
Provisional grades
==================
Question q2: 5/5
------------------
Total: 5/5
Your grades are NOT yet registered. To register your grades, make sure
to follow your instructor's guidelines to receive credit on your project.
\end{verbatim}
\caption{Результаты прохождения тестов алгоритма альфа-бета отсечения}
\label{fig:result2}
\end{figure}
\section{Выводы}
В рамках выполнения задания были применены алгоритмы, позволяющие построить искусственный интеллект способный победить в аркадной игре Pacman.
Оценочная функция позволяет достаточно быстро и точно, в выбранной метрике, указать оценку вероятности победы конкретного игрока для конкретного расположения фигур, не опираясь на то, каким образом игроки к этому состоянию пришли. Алгоритм альфа-бета отсечения является модификацией алгоритма минимакса, однако, в отличие от него, анализ некоторых ходов может быть не выполнен, то есть, прекратиться досрочно.
Агенты позволяют использовать существующее программное обеспечение, в контексте выполнения работы им являлась игра Pacman, для достижения своих целей победы. Алгоритмы их работы являются эвристическими и не гарантируют победу, а лишь позволяют с заданной быстротой и точностью достичь поставленной цели - анализ текущей ситуации и выбор лучшего выхода из неё.
\end{document}

408
01-dis-lab-03-report.tex Normal file
View File

@ -0,0 +1,408 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\input{../fancy-listings-preamble}
\begin{document}
\pagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{3}{Протокол удаленного вызова процедур JSON-RPC}{Распределённые информационные системы}{}{Локтев Д.А.}
\newpage
\tableofcontents
\newpage
\lstlistoflistings
\newpage
\section{Введение}
Основной целью лабораторной работы является изучение принципов построения распределённых систем и закрепление полученных теоретических знаний на практике путём разработки проекта с использованием протокола удаленного вызова процедур JSON-RPC.
\section{JSONRPC2 Java}
Для разработки программ по заданию 1 использовалась IntelliJ IDEA 2021.3 Community Edition (далее IDEA). Для работы с JSONRPC2.0 в секции зависимостей сборщика проектов Gradle были указаны следующие пакеты:
\begin{verbatim}
dependencies {
// ...
implementation 'com.thetransactioncompany:jsonrpc2-base:2.0'
implementation 'com.thetransactioncompany:jsonrpc2-server:1.11.1'
implementation 'com.thetransactioncompany:jsonrpc2-client:1.16.5'
}
\end{verbatim}
Скомпилированный проект сервера в результате компиляции принял вид, представленный на рис \hyperref[pic:srvStruct]{\ref{pic:srvStruct}}.
\begin{figure}[H]
\centering
\includegraphics[width=5cm]{01-dis-rpt-rpc-srv-struct.png}
\caption{Структура сервера RPC}
\label{pic:srvStruct}
\end{figure}
\subsection{Сервер}
Для программы реализующий сервер был использован код из примера первого задания. Код сервера представлен в листинге \hyperref[lst:server]{\ref{lst:server}}.
\begin{lstlisting}[language=Java, caption=Код сервера Java, style=JCodeStyle, label={lst:server}]
package ru.iovchinnikov.rpcsample.server;
import java.io.*;
import java.net.*;
import java.text.DateFormat;
import java.util.Date;
import com.thetransactioncompany.jsonrpc2.*;
import com.thetransactioncompany.jsonrpc2.server.*;
public class Main {
public static class DateTimeHandler implements RequestHandler {
public String[] handledRequests() {
return new String[]{"getDate", "getTime"};
}
public JSONRPC2Response process(JSONRPC2Request req, MessageContext ctx) {
if (req.getMethod().equals("getDate")) {
DateFormat df = DateFormat.getDateInstance();
String date = df.format(new Date());
return new JSONRPC2Response(date, req.getID());
} else if (req.getMethod().equals("getTime")) {
DateFormat df = DateFormat.getTimeInstance();
String time = df.format(new Date());
return new JSONRPC2Response(time, req.getID());
} else {
return new JSONRPC2Response(JSONRPC2Error.METHOD_NOT_FOUND, req.getID());
}
}
}
public static void main(String[] arg) {
JSONRPC2Parser parse = new JSONRPC2Parser();
Dispatcher dispatcher = new Dispatcher();
String line;
JSONRPC2Request req;
JSONRPC2Response res;
dispatcher.register(new DateTimeHandler());
try {
ServerSocket ss = new ServerSocket(3333);
System.out.println("Waiting for a client...");
while (true) {
Socket socket = ss.accept();
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
line = in.readUTF();
System.out.println("Request: " + line);
req = parse.parseJSONRPC2Request(line);
res = dispatcher.process(req, null);
line = res.toJSONObject().toJSONString();
System.out.println("Response: " + line);
out.writeUTF(line);
out.flush();
}
} catch (Exception x) {
x.printStackTrace();
}
}
}
\end{lstlisting}
\subsection{Клиент}
Для программы реализующей клиента был использован код из примера первого задания. Код клиента был переработан в виде тестового стенда для сервера и представлен в листинге \hyperref[lst:client]{\ref{lst:client}}
\begin{lstlisting}[language=Java, caption=Код клиента Java, style=JCodeStyle, label={lst:client}]
package ru.iovchinnikov.rpcsample.tests;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import com.thetransactioncompany.jsonrpc2.*;
import java.net.*;
import java.io.*;
public class TestServer {
private static JSONRPC2Parser parse;
private static int serverPort;
private static InetAddress ipAddress;
@BeforeAll
static void setup() throws UnknownHostException {
ipAddress = InetAddress.getByName("127.0.0.1");
serverPort = 3333;
parse = new JSONRPC2Parser();
}
//функция отправки json запроса
static private JSONRPC2Response Send(JSONRPC2Request request, InetAddress ip, int port) throws Exception {
Socket socket = new Socket(ip, port);
String line;
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.writeUTF(request.toJSONObject().toJSONString());
out.flush();
line = in.readUTF();
socket.close();
return parse.parseJSONRPC2Response(line);
}
@Test
void serverReturnsTime() throws Exception {
String method = "getTime";
int requestID = 0;
JSONRPC2Request request = new JSONRPC2Request(method, requestID);
JSONRPC2Response answerJSON = Send(request, ipAddress, serverPort);
assertNotNull(answerJSON.getResult());
System.out.println("Time on Server - " + answerJSON.getResult());
}
@Test
void serverReturnsDate() throws Exception {
String method = "getDate";
int requestID = 1;
JSONRPC2Request request = new JSONRPC2Request(method, requestID);
JSONRPC2Response answerJSON = Send(request, ipAddress, serverPort);
assertNotNull(answerJSON.getResult());
System.out.println("Date on Server - " + answerJSON.getResult());
}
}
\end{lstlisting}
\subsection{Результат работы}
После запуска приложения сервера оба теста возвращают положительный результат, представленный на рисунках \hyperref[pic:serverTests]{\ref{pic:serverTests}} и \hyperref[pic:serverTestsCl]{\ref{pic:serverTestsCl}}
\begin{figure}[H]
\centering
\includegraphics[height=5cm]{01-dis-rpt-rpc-srv-test1.png}
\caption{Проверка работоспособности в терминале сервера}
\label{pic:serverTests}
\includegraphics[height=5cm]{01-dis-rpt-rpc-srv-test2.png}
\caption{Результат проверки работоспособности сервера клиентом}
\label{pic:serverTestsCl}
\end{figure}
\section{JSONRPC2 Python}
Для разработки программ по заданию 2 использовалась JetBrains PyCharm 2021.3 Community Edition (далее PyCharm). Для работы с JSONRPC была скачана реализация протокола JSONRPC. Так же была установлена необходимая для работы библиотека SimpleJSON. Библиотека SimpleJSON была подключена к проекту при помощи пакетного менеджера \code{pip}. Библиотека JSONRPC была скачана в корень проектов сервера и клиента. На рисунке \hyperref[pic:contentPy]{\ref{pic:contentPy}} представлен снимок экрана с файлами проекта и загруженными библиотеками
\begin{figure}[H]
\centering
\includegraphics[height=6cm]{01-dis-rpt-rpc-pysrv-struct.png}
\caption{Содержимое и настройки проекта}
\label{pic:contentPy}
\end{figure}
\subsection{Сервер}
Для программы, реализующей сервер был использован незначительно модифицированный код из примера второго задания. Код сервера представлен в листинге \hyperref[lst:pythonServer]{\ref{lst:pythonServer}}
\begin{lstlisting}[language=Python, caption=Сервер на языке Python, style=PyCodeStyle, label={lst:pythonServer}]
import jsonrpc
def echo(s):
return s
def multiply(a=None, b=None):
if (a or b) is not None:
return a * b
else:
return "error"
if __name__ == '__main__':
server = jsonrpc.Server(jsonrpc.JsonRpc20(),
jsonrpc.TransportTcpIp(addr=("127.0.0.1", 31415), logfunc=jsonrpc.log_file("myrpc.log")))
server.register_function(echo)
server.register_function(multiply)
print "waiting for client"
# start server
server.serve()
\end{lstlisting}
\subsection{Клиент}
Для программы, реализующей клиент также был использован незначительно модифицированный код из примера второго задания. Код клиента представлен в листинге \hyperref[lst:pythonClient]{\ref{lst:pythonClient}}
\begin{lstlisting}[language=Python, caption=Клиент на языке Python, style=PyCodeStyle, label={lst:pythonClient}]
import jsonrpc
if __name__ == '__main__':
server = jsonrpc.ServerProxy(jsonrpc.JsonRpc20(), jsonrpc.TransportTcpIp(addr=("127.0.0.1", 31415)))
result = server.echo("hello world")
print(result)
result = server.multiply(a=3, b=5)
print(result)
result = server.multiply()
print(result)
\end{lstlisting}
\subsection{Результат работы}
Приложения сервера и клиента были запушены и протестированы. Результат работы сервера, журнал работы, представлен на рисунке \hyperref[pic:pysrvWork]{\ref{pic:pysrvWork}}, а результат работы клиента на рисунке \hyperref[pic:pycliWork]{\ref{pic:pycliWork}}.
\begin{figure}[H]
\centering
\includegraphics[height=5cm]{01-dis-rpt-rpc-pysrv-log.png}
\caption{Результат работы (журнал) сервера}
\label{pic:pysrvWork}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[height=2cm]{01-dis-rpt-rpc-pyclient.png}
\caption{Результат работы клиента}
\label{pic:pycliWork}
\end{figure}
\section{JSONRPC2 Mullti Language}
Заданием для практической части является создание клиент-серверного приложения где клиент и сервер разработаны на разных языках. Клиент должен позволять формировать две матрицы заданного размера и посылать эти матрицы на сервер. Сервер в свою очередь должен суммировать полученные матрицы и отсылать результат клиенту. В качестве сервера была использована программы на Python реализованная во второй части задания. В качестве клиента была использована программа на Java реализованная в первой части задания. Код сервера был модифицирован для решения задачи сложения матриц. Код сервера представлен в листинге \hyperref[lst:pythonServerMatrix]{\ref{lst:pythonServerMatrix}}
\begin{lstlisting}[language=Python, caption=Сервер складывающий матрицы, style=PyCodeStyle, label={lst:pythonServerMatrix}]
import jsonrpc
server=jsonrpc.Server(jsonrpc.JsonRpc20(),jsonrpc.TransportTcpIp( addr=("127.0.0.1", 3340), logfunc=jsonrpc.log_file("myrpc.log")))
def matrixSum(a, b):
if (a or b) is not None:
if(len(a) == len(b)):
n = len(a);
s = [[0] * n for i in range(n)]
for i in range(len(a)):
for j in range(len(a)):
s[i][j] = a[i][j] + b[i][j]
return s
else:
return "Invalit matrix size"
server.register_function( matrixSum )
# start server
server.serve()
\end{lstlisting}
Код клиента был модифицирован для возможности ввода размерности матриц, самих матриц и их вывода в консоль. Код клиента представлен в листинге \hyperref[lst:finalClient]{\ref{lst:finalClient}}
\begin{lstlisting}[language=Java, caption=Код со вводом матриц, style=JCodeStyle, label={lst:finalClient}]
package ru.iovchinnikov.rpcsample.server;
import com.thetransactioncompany.jsonrpc2.*;
import java.net.*;
import java.io.*;
import java.util.*;
public class Client {
static JSONRPC2Parser parse = new JSONRPC2Parser();
public static void main(String[] ar) {
int serverPort = 3340;
String address = "localhost";
String method = "matrixSum";
int requestID = 0;
try {
Scanner in = new Scanner(System.in);
System.out.print("Введите размер матриц: ");
int size = in.nextInt();
System.out.println("Введите матрицe A: ");
int[][] mA = CreateMatrix(size);
System.out.println("Введите матрицe B: ");
int[][] mB = CreateMatrix(size);
InetAddress ipAddress = InetAddress.getByName(address);
List param = new LinkedList();
param.add(mA);
param.add(mB);
JSONRPC2Request request = new JSONRPC2Request(method, param, requestID);
JSONRPC2Response answerJSON = Send(request, ipAddress, serverPort);
System.out.println("Матрица A - " + prntMatrix(mA));
System.out.println("Матрица B - " + prntMatrix(mB));
System.out.println("Сумма матриц - " + answerJSON.getResult());
} catch (Exception x) {
x.printStackTrace();
}
}
private static int[][] CreateMatrix(int size) {
int [][] mtx = new int [size][size];
for(int i = 0; i < mtx.length; i++) {
for (int j = 0; j < mtx[i].length; j++) {
Scanner in = new Scanner(System.in);
System.out.printf("[%d,%d] = ",i,j);
int z = in.nextInt();
mtx[i][j] = z;
}
}
return mtx;
}
//функция отправки json запроса
static private JSONRPC2Response Send(JSONRPC2Request request, InetAddress ip, int port) throws Exception {
Socket socket = new Socket(ip, port);
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.write(request.toJSONObject().toJSONString().getBytes());
out.flush();
String line = in.readLine();
socket.close();
return parse.parseJSONRPC2Response(line);
}
private static String prntMatrix(int[][] a) {
StringBuilder str = new StringBuilder("[");
for (int i = 0; i < a.length; i++) {
if (i != 0)
str.append(",");
str.append("[");
for (int j = 0; j < a.length; j++) {
if (j != 0)
str.append(",");
str.append(a[i][j]);
}
str.append("]");
}
str.append("]");
return str.toString();
}
}
\end{lstlisting}
\subsection{Результат работы}
Приложения сервера и клиента были запушены и протестированы. Результат работы сервера представлен на рисунке \hyperref[pic:pysrvFin]{\ref{pic:pysrvFin}}, а результат работы клиента на рисунке \hyperref[pic:jcliFin]{\ref{pic:jcliFin}}.
\begin{figure}[H]
\centering
\includegraphics[height=5cm]{01-dis-rpt-rpc-srv-test-final.png}
\caption{Результат работы (журнал) сервера}
\label{pic:pysrvFin}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[height=2cm]{01-dis-rpt-rpc-srv-test-final-log.png}
\caption{Результат работы клиента}
\label{pic:jcliFin}
\end{figure}
\section{Выводы}
В ходе выполнения работы была реализованная задача создания распределенной системы, где вся логика обработки данных предоставляется серверу, тогда как работа с данными происходит на клиенте.
Для реализации задачи был использован протокол удаленных вызовов процедур JSON-RPC. Протокол использует JSON для кодирования сообщений. Протокол был использован исходя из рекомендаций к заданию и имеет следующий особенности:
\begin{itemize}
\item небольшой размер;
\item простота использования;
\item документированность;
\item компактность и ёмкость одного выражения;
\item независимость от способа передачи данных;
\item поддержка именованных параметров;
\item поддержка нотификаций;
\item поддержка значений null(None);
\item встроенный контроль сессий;
\end{itemize}
Использование протокола позволяет создавать системы где сервер разрабатывается на одном языке программирование, а клиенты на других.
\end{document}

View File

@ -0,0 +1,500 @@
\documentclass{article}
\input{../common-preamble}
\input{../fancy-listings-preamble}
\input{../bmstu-preamble}
\author{Локтев Даниил Алексеевич (426ю можно досдать отчёты по лабам)}
\title{Распределённые информационные системы}
\date{2021-09-08}
\begin{document}
\maketitle
\newpage
\section{Предисловие}
\subsection{Оргвопросы}
лекции один раз в две недели (всего 8 лекций), лабораторные работы (3 шт) с 9й недели (25.10) 507ю по понедельникам 1350-1715. Лучше делать дома и приходить защищать (отчёты по каждой лабораторной)
Итоговая форма - зачёт (2 модуля, рубежный контроль письменно и лабы):
\begin{enumerate}
\item симулятор распределения вычислений по эвм,
\item пакман алгоритмы на графах,
\item клиент-сервер на двух разных языках.
\end{enumerate}
\subsection{Литература}
Танненбаум, ван Стеен: Распределённые системы. Принципы и парадигмы
Лычёв: Распределённые автоматизированные сиситемы (учебное пособие)
Карпов: Архитектура распределённых систем программного обеспечения
Радченко: Распределённые вычислительные системы
Хон, Вульф: Шаблоны интеграции корпоративных приложений
\section{Основное понятие}
распределённая информационная система - это такая информационная система, в которой информация и её обработка распределены между несколькими устройствами. То есть это набор независимых устройств, которые пользователю предоставляются как единое целое. Может быть распределена как аппаратная, так и программная часть. В первую очередь это распределённое программное обеспечение. Основная общая модель - это клиент-сервер. Клиент выдаёт запросы и получает от сервера ответы. Взаимодействие может быть двух видов:
\begin{itemize}
\item синхронное - клиент даёт запрос и только после получения ответа продолжает работу.
\begin{frm}
\def\svgwidth{70mm}
\input{pics/01-dis-00-sync.pdf_tex}
\label{pic:clientsync}
\end{frm}
Клиент запраживает службу у Сервера и ожидает ответа от сервера, полностью бездействуя
\item асинхронное - клиент не блокируется.
\begin{frm}
\def\svgwidth{70mm}
\input{pics/01-dis-00-async.pdf_tex}
\label{pic:clientasync}
\end{frm}
Клиент запраживает службу у Сервера и возвращает управление себе, работает без ожидания. Когда приходит ответ от Сервера, клиент посылает сигнал подтверждения получения ответа.
\end{itemize}
Процессы внутри информационных систем делятся на две группы:
\begin{itemize}
\item реализующие некоторую службу (служебные процессы). серверы
\item запрашивающие службу у процессов первого типа. клиенты.
\end{itemize}
Типы клиент-серверных архитектур
\begin{enumerate}
\item одноярусные: все три слоя (логических уровня) находятся в одном ярусе - то есть одно устройство. Презентационный слой - это терминал, а логика и ресурсы это приложение;
\item двухярусные: обычно, отображение отделяется от обработки;
\item трёхярусные: презентационный слой на клиенте, слой прикладной логики на среднем ярусе и слой управления ресурсами отделяется на третье устройство;
\item многоярусные: обычно прикладной слой уже делается на разном железе. Или примером такой архитектуры может служить объединение неоднородных систем в одну.
\end{enumerate}
При реализации клиент-серверной архитектуры есть три слоя \textit{(есть ощущение, что здесь речь о \textbf{MVC}, прим. Овчинников)}
\begin{enumerate}
\item презентационный слой (интерфейс, UI) то, с чем работает пользователь (обычно клиент);
\item слой прикладной логики (слой логики приложения, APP);
\item слой управления ресурсами (организовывает доступ к данным, RES) включает в себя не только просто ресурсы, но и другие двух- и трёхъярусные модели.
\end{enumerate}
\begin{figure}[H]
\centering
\def\svgwidth{50mm}
\input{pics/01-dis-00-division.pdf_tex}
\caption{Варианты деления клиент-серверной архитектуры}
\label{pic:division}
\end{figure}
Например:
приложение розничных продаж, где все взаимосвязи происходят через логику приложений, база данных у каждого будет со своим сегментом данных, поэтому ресурсы, получается, отделены друг от друга.
\begin{tikzpicture}[ x=1pt, y=1pt, yscale=1, xscale=1, transform shape ]
\draw (0,0) rectangle (75, 100);
\draw (2, 30) node [anchor=north west][inner sep=0.75pt][align=left] {Доступ\\к данным};
\draw (2, 60) node [anchor=north west][inner sep=0.75pt][align=left] {Логика\\приложения};
\draw (105,0) rectangle (210, 100);
\draw (107, 30) node [anchor=north west][inner sep=0.75pt][align=left] {Доступ\\к данным};
\draw (107, 60) node [anchor=north west][inner sep=0.75pt][align=left] {Логика\\приложения};
\draw (107, 90) node [anchor=north west][inner sep=0.75pt][align=left] {Пользовательский\\интерфейс};
\draw (240,0) rectangle (315, 100);
\draw (242, 30) node [anchor=north west][inner sep=0.75pt][align=left] {Доступ\\к данным};
\draw (242, 60) node [anchor=north west][inner sep=0.75pt][align=left] {Логика\\приложения};
\draw (100,110) rectangle (215, 150);
\draw (130, 135) node [anchor=north west][inner sep=0.75pt][align=left] {Пользователь};
\draw[->] (150, 110) -- (150, 90);
\draw[<-] (155, 110) -- (155, 90);
\draw[<->] (60, 46) -- (108, 46);
\draw[<->] (200, 46) -- (243, 46);
\draw (2, 0) node [anchor=north west][inner sep=0.75pt][align=left] {Система онлайн\\платежей};
\draw (107, 0) node [anchor=north west][inner sep=0.75pt][align=left] {Система розничных\\продаж};
\draw (242, 0) node [anchor=north west][inner sep=0.75pt][align=left] {Партнёр по\\доставке товаров};
\end{tikzpicture}
Или, например, сеть прямого обмена данными между клиентами, согласно которой, клиенты могут общаться напрямую или через сервер.
\begin{tikzpicture}[ x=1pt, y=1pt, yscale=1, xscale=1, transform shape ]
\draw (0,0) rectangle (100, 100);
\draw (2, 60) node [anchor=north west][inner sep=0.75pt][align=left] {Логика\\приложения};
\draw (2, 10) node [anchor=north west][inner sep=0.75pt][align=left] {Клиентская часть};
\draw (42, 90) node [anchor=north west][inner sep=0.75pt][align=left] {Логика\\для клиента};
\draw (110,0) rectangle (210, 100);
\draw (152, 60) node [anchor=north west][inner sep=0.75pt][align=left] {Логика\\приложения};
\draw (112, 10) node [anchor=north west][inner sep=0.75pt][align=left] {Клиентская часть};
\draw (112, 90) node [anchor=north west][inner sep=0.75pt][align=left] {Логика\\для клиента};
\draw (0,110) rectangle (100, 210);
\draw (2, 170) node [anchor=north west][inner sep=0.75pt][align=left] {Логика\\приложения};
\draw (2, 210) node [anchor=north west][inner sep=0.75pt][align=left] {Управяющий сервер};
\draw (110,110) rectangle (210, 210);
\draw (152, 170) node [anchor=north west][inner sep=0.75pt][align=left] {Логика\\приложения};
\draw (112, 210) node [anchor=north west][inner sep=0.75pt][align=left] {Управяющий сервер};
\draw[<->] (10, 60) -- (10, 150);
\draw[<->] (50, 160) -- (155, 160);
\draw[<->] (80, 80) -- (145, 50);
\draw[<->] (50, 50) -- (115, 80);
\draw[<->] (170, 150) -- (170, 60);
\end{tikzpicture}
\section{Программная компонента}
Программная компонента - это единица программного обеспечения, исполняемая на одном компьютере в пределах одного процесса и представляющая некий набор сервисов или служб, которые используются через её внешний интерфейс другими компонентами, выполняемыми как на этом же компьютере, так и на удалённом. Распределённая информационная система - это набор взаимодействующих программных компонент, выполняемых на одном или нескольких связанных компьютерах и выглядящих с точки зрения пользователя как единое целое. Распределение должно быть скрыто от пользователя, то есть пользователь должен представлять, что система это единое целое. Такое сокрытие называется "прозрачность".
Основные характеристики распределённых информационных систем
\begin{enumerate}
\item совместное использование ресурсов
\item открытость (с точки зрения программиста)
\item параллельность
\item масштабируемость
\item отказоустойчивость
\item прозрачность
\end{enumerate}
Заблуждения о распределённых информационных системах
\begin{enumerate}
\item сеть является надёжной
\item задержка равна нулю
\item полоса пропускания неограничена
\item сеть является безопасной
\item топология сети не меняется (с течением времени)
\item есть только один администратор (у каждой части системы может быть свой)
\item сеть однородна (топологии могут быть разными даже в рамках одной системы)
\end{enumerate}
\section{Существующие концепции}
Как строится распределённая система: можно разделить как на аппаратном, так и на программном уровне
\subsection{Концепции аппаратных решений}
\begin{figure}[h!]
\includegraphics[width=10cm]{01-dis-00-concept.png}
\label{pic:concept}
\end{figure}
\subsection{Концепции программных решений}
Именно программное решение более явно отличает распределение системы. Распределённые системы в этом плане похожи на обычные операционные системы: есть менеджер ресурсов, который помогает пользователям и аппаратным составляющим совместно использовать процессоры, память, сеть и другие периферийные устройства, и работать с системой, как с распределённой. Именно программно скрывает распределённость от пользователя. Операционные системы для распределённых систем можно разделить на категории:
\begin{itemize}
\item \textbf{слабо связанные:} операционная система воспринимается как набор независимых операционных систем. Подвид - сетевые операционные системы. Для них не требуется прямой доступ к аппаратному обеспечению. Не требуют, чтобы аппаратное обеспечение на котором они функционируют было однородным и управлялось как единая система. Абстрагирует от аппаратных решений. Но одной только сетевой операционной системы недостаточно для создания распределённой системы, необходимы также компоненты, которые поддерживают прозрачность распределения. За такие компоненты отвечает промежуточный уровень распределённой системы:
\includegraphics[width=8cm]{01-dis-00-spo.png}
\item \textbf{сильно связанные:} операционная система старается работать с одним глобальным представлением ресурсов, которыми она управляет. Обычно используется именно такая связанность для управления распределёнными системами.
\end{itemize}
\subsection{Програмное обеспечение промежуточного уровня}
Распределённые операционные системы не предназначены для управления набором независимых компонент, а сетевые операционные системы не дают одной согласованной системы. Поэтому нужны системы, которые объединяют плюсы сетевых операционных систем (масштабируемость, открытость, итд), и плюсы распределённых систем (прозрачность, относительная простота использования). Программное обеспечение промежуточного уровня скрывает неоднородность, например. Отдельными узлами всё также будет управлять локальная операционная система, но промежуточный уровень позволяет использовать единый набор служб, давая пользователю однородность. Основная задача - скрыть разнообразие базовых платформ от приложений.
\subsection{Модели промежуточного уровня}
\begin{enumerate}
\item представление всех объектов в виде файлов (нет отличия между удалёнными и локальными файлами) тогда программное обеспечение будет построено по принципу распределённой файловой системы (distributed filesystem);
\item промежуточный уровень основан на удалённом вызове процедур (RPC remote procedure call). Процессу разрешается вызывать процедуру из другого процесса. Вызов ничем не отличается от вызова локальной процедуры.
\includegraphics[width=8cm]{01-dis-00-rpc.png}
Когда происходит обращение к удалённому объекту, принцип тот же, но к объетам, удалённый вызов например метода, передача данных об объекте.
\item модель распределённых документов (вся информация располагается в документах, которые прозрачны для пользователя). По сути это дополнительные заголовки, объектизация файлов для проверки целостности, расположения, итд.
\end{enumerate}
\subsection{Службы промежуточного уровня}
Программное обеспечение должно организовывать прозрачность путём предоставления высокоуровневых средств связи (скрыть низкий уровень). этому содействуют:
\begin{enumerate}
\item Служба именования (совместный поиск и использование сущностей). Любая сущность может иметь фиксированное местоположение, или сущность может мигрировать, но нейминг нас от этого абстрагирует;
\item служба сохранности (механизм распределённых транзакций), поддержка целостности данных. Контроль успешности транзакций, например, с БД. В случае неуспеха возвращает все объекты в исходное состояние.
\item служба защиты (обычно распределены и часто это создаёт проблемы, но позволяет взаимозаменять такие службы).
\end{enumerate}
От промежуточного уровня предполагается полнота описания интерфейса. Неполнота приводит к тому, что программисты сами дописывают промежуточный уровень что приводит к неоднородности системы.
\subsection{Распределённое событие}
В распределённых системах может возникнуть необходимость использовать извещения от удалённых подсистем. Так могут возникать два типа событий: сильно и слабо связанные. При сильно связанном событии происходит прямое уведомление, обе стороны должны быть активны одновременно. При слабо связанном событии - передача информации происходит через вспомогательный сервис, источники (издатели) напрямую не взаимодействуют с получателями (подписчиками), что позволяет получателям подписаться на событие и отвязывает сервис от необходимости находиться с получателем на одном компьютере. Распределённое событие может быть реализовано как вызов метода удалённого объекта.
\subsection{Распределённые транзакции (ACID)}
\begin{enumerate}
\item атомарность - всё или ничего
\item согласованность - либо успех либо откат - все данные логически целостны, согласованность не нарушается
\item изоляция - объектам вне транзакции не видны промежуточные состояния данных внутри транзакции
\item постоянство - в случае успешности изменения имеют постоянных характер.
\end{enumerate}
\begin{figure}[h!]
\centering
\includegraphics[width=8cm]{01-dis-00-distrans.png}
\caption{Участники распределённой транзакции}
\label{pic:distrans}
\end{figure}
Условия необходимые для отмены транзакции:
\begin{enumerate}
\item Промежуточная среда должна поддерживать управление распределенными между несколькими компонентами транзакции.
\item Компоненты распределенной системы не должны работать с какими либо службами ли ресурсами которые не могут участвовать в транзакции
\end{enumerate}
\section{Общие сведения о J2EE}
\textbf{Платформа J2EE} - это комплекс взаимодействующих технологий базирующихся на спецификациях фирмы Sun (Oracle) и представляющих собой стандарт разработки серверных приложений уровня предприятий.
Особенности стандарта J2EE:
\begin{itemize}
\item Независимость от платформы
\item Простота разработки приложений уровня предприятия на основе компонентных технологий
\item Переносимость и расширяемость
\item Поддержка многопользовательского режима
\item Возможность разработки распределенных приложений
\item Интеграционные возможности
\begin{itemize}
\item с другими платформами
\item с корпоративными информационными системами
\end{itemize}
\item Обеспечение надежной защиты
\end{itemize}
Состав J2EE:
\begin{itemize}
\item Спецификация
\item Образцовые реализации платформы
\item Модель приложений J2EE
\item Набор тестов для совместимости
\end{itemize}
Технологии J2EE:
\begin{itemize}
\item Вызов удаленных методов RMI (Remote Method Invocation)
\item Интерфейс наименования каталогов JNDI (Java Naming And Directory Interface)
\item Сервис сообщений JMS (Java Message Service)
Java-serverlets
\item Сервис страниц JSP (Java Server Pages) (HTML + JS)
\item Организация работы с базой данных JDBC (Java data base connectivity)
\item Служба транзакций JTA (Java Transaction API); Сервис транзакций JTS (Java transaction Service)
\item Контейнер компонентов логики EJB (Enterprise Java Beans)
\item Язык определения интерфейсов IDL (Interface Definition Language)
\item Почта и структура активизация работы JJM (Java Beans Java Mail) и JAF (Java Beans Activation Framework)
\item Архитектура соединителей и коннекторов J2EE Connector Architecture
\item XML парсер JAXP (Java Api for Xml Parsing)
\item Идентификация и авторизация JAAS (Java Authentication and Authorization Service)
\end{itemize}
\begin{figure}[h!]
\centering
\includegraphics[height=4cm]{01-dis-00-platform.png}
\caption{Архитектура J2EE}
\label{pic:j2eearch}
\end{figure}
Уровни платформы:
\begin{itemize}
\item Web-уровень
\item EJB
\item Уровень сервера БД (EIS - enterprise information server)
\end{itemize}
Приложение должно поддерживать:
\begin{itemize}
\item Браузер
\item Апплеты
\item Автономные Java приложения
\item Приложения клиенты написанные на других языках
\end{itemize}
Уровень приложений содержит:
\begin{itemize}
\item Java - серверлеты
\item Java - страницы JPS
\item Страницы HTML
\item JavaScript
\item Классы
\end{itemize}
Уровень бизнес логики (EJB) - работает в адресном пространстве сервера приложений и через компоненты EJB осуществляет доступ к БД.
Основные задачи контейнера EJB:
\begin{enumerate}
\item Доступ к инфраструктуре J2SE
\item Управление жизненным циклом компонентов
\item Доступ к БД (JDBC)
\end{enumerate}
Когда клиент обращается к компоненту, контейнер перехватывает это сообщение для обеспечения безопасности. Разработчику предоставляется 3 механизма взаимодействия:
\begin{enumerate}
\item Методы обратного вызова (RMI) до или сразу после некоторого события
\item Контекст EJB Context
\item Интерфейс имен (JNDI)
\end{enumerate}
Контейнер EJB автоматически формирует набор свободных соединений с БД.
\includegraphics[width=7cm]{01-dis-00-ejb.png}
Контейнер позволяет объединить несколько компонентов EJB внутри одной транзакции. Компонент EJB представляет собой законченный функциональный модуль встроенный в приложение платформы J2EE соответствующими классами и файлами.
Контейнеры J2EE:
\begin{itemize}
\item Контейнер клиентского приложения
\item Серверная часть
\item Web-контейнер
\item EJB-контейнер
\end{itemize}
\subsection*{Из конспекта 2017}
\includegraphics[width=14cm]{01-dis-00-2017.pdf}
\section{Протоколы}
\subsection{Верхнего уровня}
Поверх транспортного уровня в модели OSI присутствует 3 дополнительных уровня. Однако в протоколах, действующих в Интернете, все, что выше транспортного уровня, собирается в одну группу. С точки зрения промежуточного уровня ни подход OSI, ни подход, действующий в Интернете, не является удачным. Сейчас на верхнем уровне собирают все протоколы, которые не удалось отнести к боле низким уровням.
С точки зрения модели OSI, все распределённые информационные системы являются просто приложениями. В OSI нет четкого разграничения приложений, специальных протоколов приложений и протоколов общего назначения.
Примеры специальных прикладных протоколов: FTP, HTTP\footnote{В настоящее время HTTP в том числе используется в системах, связь которых с Web не предполагается. Например, в RMI HTTP используется для обращения к удаленным объектам}.
\subsection{Промежуточного уровня}
К промежуточному уровню относятся приложения, логически помещаемые на прикладной уровень, но содержащие множество протоколов общего назначения, что дает им право на их собственный уровень, независимый от других более специализированных приложений. \textbf{Например:} Различные методы аутентификации. Протоколы аутентификации не привязаны к какому либо конкретному приложению, поэтому они встраиваются в системы промежуточного уровня на правах общей службы. Протоколы авторизации также имеют тенденцию к переходу на независимый уровень. \textbf{Другой пример} множество протоколов \textit{распределенного подтверждения}. Протоколы подтверждения делают так, чтобы в группе процессов либо все процессы прошли через определенную операцию, либо операция не была применена ни к одному из процессов. Этот механизм (атомарность) используется при организации транзакций. \textbf{Еще пример} протоколы распределенной блокировки, при помощи которых может быть предотвращен одновременный доступ к ресурсам сразу нескольких процессов, распределенных по множеству машин. Эти протоколы также могут быть реализованы в виде общедоступной службы промежуточного уровня, который не зависит от какого либо конкретного приложения. Коммуникационные протоколы промежуточного уровня поддерживают высокоуровневые коммуникационные службы, например есть высокоуровневые коммуникационные протоколы, которые позволяют процессам прозрачно вызывать процедуры или обращаться к объектам на удаленных машинах. Существуют также коммуникационные службы высокого уровня для запуска и синхронизации потоков данных в реальном времени. \textbf{Еще один пример} предоставляемые некоторыми системами надежные службы групповой рассылки, способные поддерживать тысячи получателей, разбросанных по глобальной сети.
Описанный подход к подразделению на уровни приводит к слегка измененной эталонной модели взаимодействия, а именно: по сравнению с моделью OSI сеансовый уровень и уровень приложений заменены одним промежуточным уровнем, который содержит независящий от приложения протокол. Мы ограничимся достаточно подробным рассмотрением трёх служб: удаленный вызов процедур, удаленное обращение к объектам, очереди сообщений.
\subsubsection{Удаленный вызов процедур (RPC)}
Программа не должна знать, что вызывается удаленная процедура. Сложность реализации:
\begin{itemize}
\item Разные адресные пространства на разных машинах.
\item Различные типы процессоров на разных машинах.
\item Компьютеры во время вызова удаленной процедуры могут дать сбой.
\item Передача параметров может осуществляться по-разному.
\end{itemize}
Идея, стоящая за RPC, состоит в том, чтобы удаленный вызов процедур выглядел так же, как и локальный. Вызываемая программа не должна уведомляться о том, что вызываемая процедура располагается на другой машине, и наоборот. Если процедура является удаленной, то в библиотеку помещается специальная версия этой процедуры, называемая клиентской \textbf{заглушкой} (\textit{вероятнее всего, имеется ввиду паттерн Facade (80\%) или Proxy(20\%), прим. Овчинников}).
\def\svgwidth{50mm}
\input{pics/01-dis-00-rpc.pdf_tex}
Если \code{read}, например, локальная процедура, то она вызывает процедуру ОС. В отличие от оригинальной функции (т.е. функции, которая вызывается локально), клиентская заглушка не запрашивает данные ОС. Заглушка упаковывает параметры в сообщение и путем вызова процедуры \code{send()} требует переслать это сообщение на удаленный сервер. После вызова \code{send()} клиентская заглушка вызывает процедуру \code{receive()}, блокируясь до получения ответа.
Когда сообщение приходит на сервер, ОС сервера передает его серверной заглушке. Серверная заглушка фрагмент кода, который преобразует запросы, приходящие по сети, в вызовы локальных процедур. Обычно серверная заглушка запускает процедуру \code{receive} и блокируется, ожидая входящих сообщений. После получения сообщения, серверная заглушка распаковывает сообщение, извлекает параметры и традиционным способом вызывает процедуру сервера. Параметры передаются через стек. Затем процедура выполняется и возвращает результат. Упаковывается результат, серверная заглушка вызывает процедуру \code{send} для передачи результата.
\subsubsection{Спецификация параметров и генерация заглушек в RPC}
При вызове нужно, чтобы обе стороны следовали одному протоколу, т.е. нужно, чтобы они договорились о формате сообщений, которыми они будут обмениваться, о порядке действий, представлении простых типов данных. Обе стороны должны сформировать заглушки. Заглушки, работающие по одному протоколу для разных процедур, различаются только интерфейсом. Интерфейс состоит из набора прототипов процедур, которые могут быть вызваны клиентом, но реализованы на сервере. Для упрощения создания заглушек интерфейсы часто описываются с использованием языка определения интерфейсов IDL\footnote{interface description language}. Интерфейсы, определенные на IDL, могут быть скомпилированы в заглушки. Поскольку клиентские и серверные заглушки легко сгенерировать полностью автоматически, все системы промежуточного уровня, основанные на RPC используют IDL для поддержки разработки ПО.
\subsubsection{О расширении модели RPC}
Здесь речь идет об асинхронном вызове удаленных процедур. Базовая модель синхронная.
Можно предположить, что ответ не нужен. Тогда не нужно блокировать вызов приложений.
\subsubsection{О спецификации DCE (Distributed Computing Environment)}
Среда построена с использованием технологии LPC (Local Procedure Call). Модель программирования, лежащая в основе DCE это клиент-сервер. Процессы пользователей действуют как клиенты, вызывающие удаленные службы, предоставляемые серверными процессами. Вся связь между клиентами и серверами осуществляется с помощью LPC. Некоторые службы, работающие по этому принципу:
\begin{enumerate}
\item Служба распределенных файлов. Представляет собой всемирную файловую систему, предоставляющую прозрачные методы доступа к любому файлу системы одинаковым образом.
\item Служба каталогов. Используется для отслеживания местонахождения любого из ресурсов системы (компьютеры, принтеры и так далее). Служба каталогов позволяет процессу запрашивать ресурс.
\item Служба защиты. Позволяет защищать ресурсы любого компьютера. При этом получение некоторых данных может быть открыто только тем, кому это разрешено.
\item Служба распределенного времени. Позволяет поддерживать глобальную синхронизацию часов различных компьютеров.
\end{enumerate}
Система DCE RPC позволяет клиенту получить доступ к удаленной службе простым вызовом локальных процедур. Система DCE RPC может автоматически определить необходимый сервер и установить связь между клиентом и сервером. Все это называется привязкой (binding).
Эта система может управлять транспортировкой сообщений в обе стороны, а при необходимости управлять их дроблением и последующей сборкой, например когда один из параметров является массивом. DCE RPC может автоматически отслеживать преобразования типов данных между клиентом и сервером, даже если они работают на системах с разной архитектурой.
\paragraph{Привязка клиента к серверу.}
Чтобы разрешить клиенту вызвать сервер необходимо, чтобы сервер был зарегистрирован и был готов к приему входящих вызовов. Регистрация сервера дает клиенту возможность обнаружить сервер и выполнить привязку к серверу. Обнаружение сервера происходит в два этапа:
\begin{enumerate}
\item Обнаружение машины-сервера.
\item Обнаружение службы-сервера, т.е. нужного процесса на этой машине.
\end{enumerate}
В общем случае для того, чтобы связаться с сервером, клиенту нужно знать конечную точку (\textit{endpoint, прим. Овчинников}) машины сервера, в которую он может посылать сообщение. Конечная точка (порт) используется ОС сервера для получения входящих сообщений от различных внешних процессов. В системе DCE на каждой из серверных машин процессом, известным под названием DCE Демон, поддерживается таблица пар сервер - конечная точка. Перед тем как сервер станет доступным для входящих запросов, он должен запросить у ОС конечную точку. Далее сервер регистрирует эту конечную точку у DCE Демона. DCE Демон записывает эту информацию, включая протоколы, по которым осуществляется обмен информацией в конечных точках, для последующего использования. Сервер службы каталогов также регистрирует предоставленный серверной машине сетевой адрес и имя, под которым сервер будет доступен.
\def\svgwidth{150mm}
\input{pics/01-dis-00-dce.pdf_tex}
\begin{enumerate}
\item Регистрация конечной точки;
\item Регистрация службы;
\item Поиск сервера службы каталогов;
\item Запрос конечной точки;
\item Выполнение вызова RPC.
\end{enumerate}
\paragraph{Обращения к удаленным объектам}
По мере накопления опыта применения механизма RPC в распределенных системах пришло понимание того, что эти принципы могут быть применены и к объектам. При этом единственно правильным способом доступа к данным является использование методов, доступ к которым осуществляется через интерфейс объекта. Объект может реализовывать множество интерфейсов. Интерфейсы могут наследоваться разными классами, и в каждом классе интерфейс может реализовываться по-разному. Подразделение на интерфейсы и объекты, реализующие эти интерфейсы, очень важно для распределенных интерфейсов. Такое четкое разделение позволяет помещать интерфейс на одну машину, а сам объект на другую.
\begin{figure}[H]
\centering
\def\svgwidth{120mm}
\input{pics/01-dis-00-proxy.pdf_tex}
\caption{Обобщённая организация распределённых объектов с использованием заместителей клиентов}
\label{pic:dceProxy}
\end{figure}
Когда клиент выполняет привязку к распределенному объекту, в адресное пространство клиента загружается специфическая реализация интерфейса объекта, называемая заместитель. Заместитель-клиент аналогичен клиентской заглушке в системах LPC. Заместитель выполняет:
\begin{enumerate}
\item упаковку параметров (маршаллинг) в сообщениях при обращении к методам;
\item распаковку (демаршаллинг) данных из ответных сообщений, содержащих
результаты обращений к методам и соответственно передачу результатов клиенту.
\end{enumerate}
Сами объекты находятся на сервере и предоставляют необходимый клиентскому заместителю интерфейс. Входящий запрос на обращение к методу сначала попадает на серверную заглушку (скелетон). Скелетон осуществляет распаковку запроса (демаршаллинг) и преобразует входящий запрос в корректное обращение к методу через интерфейс объекта, находящегося на сервере.
\begin{frm}
\textbf{Замечание:} Состояние большинства распределенных объектов не распределяется, т.е. оно локализовано на одной машине. Такие объекты также называют удаленными. Состояние распределенных объектов может быть физически распределено по нескольким машинам, но это распределение скрыто от клиента за интерфейсами объектов.
\end{frm}
Скелетон также отвечает за маршаллинг (упаковку) параметров в ответном сообщении и их пересылку заместителю клиента.
\paragraph{Объекты времени компиляции и объекты времени исполнения}
Объекты в распределенных системах существуют в различной форме: в одних случаях они соответствуют объектам выбранного языка программирования и представляют собой объекты времени компиляции, т.е. являются экземплярами класса. Другой способ создание распределенных объектов непосредственно во время выполнения. Использование объектов времени компиляции в распределенных системах обычно значительно упрощает создание распределенных приложений (например, Java-объект может быть полностью описан в рамках своего класса, интерфейс которого он реализует). Компиляция определения класса порождает код, позволяющий создавать экземпляры объектов языка Java, а интерфейсы можно скомпилировать в клиентские и серверные заглушки, позволяющие обращаться к объектам Java с удаленных машин. Недостаток использования объектов времени компиляции состоит в зависимости от конкретного языка программирования. При работе с объектом времени исполнения способ, которым они будут реализованы, обычно остается открытым. Например, можно решить написать на языке С библиотеку, содержащую набор функций, которые могут работать с общим файлом данных. Эту реализацию надо превратить в объект, методы которого будут доступны с удаленной машины. Традиционный способ использовать адаптер объектов, который исполняет роль оболочки реализации с единственной задачей придать реализации видимость объекта.
\paragraph{Сохранные и нерезидентные объекты}
\textbf{Сохранный объект} это объект, который продолжает существовать, даже не находясь постоянно в адресном пространстве процесса, другими словами сохранный объект не зависит от своего текущего сервера. На практике сервер, обычно управляющий таким объектом, может сохранить состояние объекта вспомогательном запоминающем устройстве и завершить работу. Позже вновь запущенный сервер может считать состояние объекта в свое адресное пространство и обработать запрос на обращение к объекту.
\textbf{Нерезидентный объект} это объект, который существует до тех пор, пока сервер управляет им. Когда сервер завершает работу, этот объект прекращает существование.
\paragraph{Привязка клиента к объекту}
Системы с распределенными объектами обычно предоставляют ссылки на объекты, уникальные в пределах системы. Такие ссылки могут свободно передаваться между процессами, запущенными на различных машинах, например как параметры обращения к методу. Когда процесс хранит ссылку на объект, то перед обращением к любому из методов в объекте процесс должен в первую очередь выполнить привязку к этому объекту. Результатом привязки будет заместитель, размещаемый в адресном пространстве процесса и реализующий специфический интерфейс с методами, к которым обращается процесс. Во многих случаях привязка осуществляется автоматически.
Когда система получает ссылку на объект, то ей требуется способ отыскать сервер, управляющий этим объектом и поместить заместителя в адресное пространство клиента. В случае неявной привязки (автоматической) клиент прозрачно связывается с сервером в момент разрешения ссылки и получения доступа к объекту в действительности.
\textbf{Разрешение ссылки} это общепринятый термин процесса поиска объекта по ссылке. В случае явной привязки клиент должен до обращения к методам объекта вызвать специальную функцию для привязки к объекту. При явной привязке обычно возвращается указатель на локально доступный заместитель.
\paragraph{Реализация ссылок на объекты}
Ссылки на объекты должны содержать достаточно информации, чтобы обеспечить клиентами привязку к объектам. Один из вариантов ссылки простая ссылка на объект содержит сетевой адрес машины, на которой размещен реальный объект вместе с конечной точкой, определяющей сервер, который управляет объектом, и указанием на то, что это за объект. На практике конечная точка соответствует локальному порту, который динамически выделяется локальным хост сервером. Недостатки такого варианта:
\begin{enumerate}
\item если на сервере произойдет сбой, и после восстановления он получит другую конечную точку, то все ссылки на объект станут неправильными. Решение создать на серверной машине локального демона, который будет опрашивать известные конечные точки, и отслеживать назначение конечных точек серверу в таблице конечных точек. После привязки клиента к объекту нужно запросить у демона текущую конечную точку сервера. Такой подход требует кодирования идентификатора сервера в ссылке на объект. Отсюда следствие сервер всегда должен регистрироваться локальным демоном, чтобы его можно было найти.
\item Идея кодирования сетевого адреса машины-сервера в ссылке на объект это тоже неудачная идея. Проблема подобного подхода в том, что в этом случае сервер невозможно перенести на другую машину, не объявив недействительными все ссылки на объекты, которыми он управлял.
\end{enumerate}
\textbf{Решение} распространение идеи локальных демонов, поддерживающих таблицы конечных точек на сервер локализации, постоянно следящий за работой серверов, на которых расположены объекты. Тогда ссылка на объект должна содержать сетевой адрес сервера локализации, а также действующий в системе идентификатор сервера.
\section{Определение местонахождения распределённых объектов}
\begin{enumerate}
\item \textbf{Именование}. За именование отвечает служба именования объектов (naming service). Её основное назначение - управление пространствами имён, представляющими собой наборы связей между именами и объектными ссылками, известными в распределённой системе. Клиент отправляет службе имя, в ответ получает ссылку. Идея в связи имени с объектом, находящемся на сервере. Имена нужны для совместного использования ресурсов, определения уникальных сущностей, ссылок на местоположение объектов и так далее. Чтобы работать с нужной сущностью (функцией, методом, объектом) необходимо иметь к ней доступ через точку доступа. Точка доступа - это, по сути, адрес сущности. Например, это узел с запущенным сервером, адрес которого формируется IP-адресом и портом. Имена, в отличие от адресов, проще в работе с ними. Также, часто в качестве имён могут использоваться идентификаторы. Свойства идентификаторов:
\begin{itemize}
\item идентификатор ссылается не более, чем на одну сущность (однозначность);
\item на каждую сущность ссылается не более одного идентификатора (\textit{как сложно он сказал о связи один-к-одному, прим Овчинников});
\item идентификатор всегда ссылается на одну и ту же сущность (\textit{однозначный и неизменяемый, проще говоря, прим Овчинников}).
\end{itemize}
Связывание имён - это установление соответствия имени и адреса. Имена бывают составные. Составное имя - это последовательность простых имён, задающих путь к объекту через ряд контекстов именований. Сервер именований обычно поддерживает две операции:
\begin{itemize}
\item операция связывания (создаёт новое связывание имени для объекта), используется для регистрации объекта сервера на сервере именований. В качестве параметра принимается имя и объектная ссылка.
\item операция разрешения - возвращает объектную ссылку для имени, переданного в качестве параметра.
\end{itemize}
Можно выделить три типа имён:
\begin{enumerate}
\item имена удобные для восприятия человеком;
\item идентификаторы;
\item адреса.
\end{enumerate}
Пространства имён удобно разбить на три уровня:
\begin{enumerate}
\item глобальный - содержимое этого уровня почти всегда постоянно;
\item административный - редко меняется, можно использовать репликацию и кэширование для увеличения быстродействия;
\item управленческий - меняется часто, для эффективности и производительности операции поиска и обновления. Операции поиска происходят в два этапа: обращение к службе именования (полуаем идентификатор), определение ссылки по идентификатору (находим объект). На этом уровне могут работать службы локализации, на входе идентификатор, на выходе ссылка. Один из вариантов - передача указателей. Для этого часть используется пара заместитель-скелетон.
\end{enumerate}
\item \textbf{Трейдинг}. Определяет местонахождение объектов-серверов исходя из предоставляемых объектами-серверами функций и требуемого качества обслуживания. То есть клиент отправляет не имя, а требуемую функцию с условиями (предикатом). Трейдер выбирает поставщика услуги по запросу и параметрам клиента. Компоненты трейдинга:
\begin{enumerate}
\item Импортёр;
\item Экспортёр;
\item Трейдер.
\end{enumerate}
Шаги работы трейдинга
\begin{enumerate}
\item экспортёр информирует трейдера о том что он может предоставить;
\item импортёр просит трейдера найти сервис, трейдер находит нужный сервис и показывает импортёру куда обращаться;
\item импортёр обращается к найденному экспортёру.
\end{enumerate}
\end{enumerate}
\subsection{Удалённое обращение к методам}
После того как клиент связался с нужным объектом, он, через заместитель, обращается к методу (RMI remote method invocation). Упаковка обращения это маршаллинг, распаковка демаршаллинг. Вызов напоминает RPC. Стандартный способ поддержки это описание интерфейсов объектов (IDL interface definition language).
\begin{enumerate}
\item Динамическое обращение - процесс, когда параметры обращения к методу собираются во время выполнения программы. Метод становится определён только на этапе выполнения программы.
\item Статическое обращение - подход, который использует заранее заданные определения интерфейсов. Требует, чтобы интерфейсы объекта были известны при разработке клиентской части.
\end{enumerate}
Когда объекты распределённые - объекты доступны со всех машин. Ссылки на объекты при вызове методов передаются по значению, то есть копируются с одной машины на другую.
\def\svgwidth{50mm}
\input{pics/01-dis-01-rmi.pdf_tex}
Если объект был локальным он копируется, если были ссылки - копируются только ссылки.
\section{Вопросы к РК2}
У каждого по два вопроса.
\begin{enumerate}
\item Общие сведения о платформе .NET
\item процессы и потоки
\item перенос кода в распределённых информационных системах
\item Серверы объектов в распределённых информационных системах
\item Общие сведения о протоколах OSI и протоколах промежуточного уровня
\item RPC
\item обращение к удалённым объектам
\item определение месторасположения распределённых объектов
\end{enumerate}
\end{document}

File diff suppressed because it is too large Load Diff

136
01-ess-lab-01-report.tex Normal file
View File

@ -0,0 +1,136 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\input{../fancy-listings-preamble}
\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{1}{Создание простой системы в Platform Designer \\ в пакете Quartus Prime}{Программное обеспечение встроенных систем}{}{доцент кафедры ИУ-3 \\ Федоров С.В.}
\newpage
\blankpage
\pagestyle{fancy}
% \tableofcontents
% \newpage
\section*{Цель работы}
\addcontentsline{toc}{section}{Цель работы}
Изучить средства создания систем на кристалле на основе процессора Nios II фирмы Intel в средстве Platfrom Designer. Освоить методику создания и конфигурации систем на кристалле. Реализовать и отладить программное обеспечение системы на кристалле. Освоить методику отладки проекта с применением программных и аппаратных средств. Получить навыки работы с документацией производителя.
\section*{Задания}
\begin{enumerate}
\item Модифицируйте исходную программу следующим образом: нажатие кнопки KEY3 должно зажигать все светодиоды, KEY0 гасить все светодиоды, нажатие центральных кнопок KEY2 и KEY1 должно гасить светодиоды по очереди слева и справа по одному на каждое нажатие.
\item Реализуйте обработку нажатия кнопок и формирование значений на светодиодах по прерыванию. Используйте справочные материалы в каталоге лабораторной работы.
\end{enumerate}
\section*{Листинги программ}
\textbf{Программа по заданию 1} (изменения выделены красным цветом, комментарии приведены и выделены зеленым). для сдвига влево или вправо используется оператор >>, а для наложения полученного значения на текущие обжуленные биты побитовая маска \& с последующим присваиванием обратно в переменную led:
\begin{lstlisting}[language=C,style=CCodeStyle]
#include <stdio.h>
#include <unistd.h>
#include "altera_avalon_pio_regs.h"
#include "system.h"
<@\texttt{\textcolor{codecomments}{// Value read from button PIO when no buttons pressed}}@>
#define NONE_PRESSED 0xF
<@\texttt{\textcolor{codecomments}{// Time in microseconds to wait for switch debounce}}@>
#define DEBOUNCE 30000
int main(void) {
#define KEY_3 0x7
#define KEY_2 0xB
#define KEY_1 0xD
#define KEY_0 0xE
int buttons;
int led = 0x01;
IOWR_ALTERA_AVALON_PIO_DATA(GREEN_LED_BASE,led);
while (1) {
buttons = IORD_ALTERA_AVALON_PIO_DATA(BUTTONS_BASE);
if (buttons != NONE_PRESSED) {
<@\texttt{\textcolor{red}{switch(buttons) \{}}@>
<@\texttt{\textcolor{red}{case KEY\_3:}}@>
<@\texttt{\textcolor{red}{led = 0xFF;}\textcolor{codecomments}{ // all bits 1}}@>
<@\texttt{\textcolor{red}{break;}}@>
<@\texttt{\textcolor{red}{case KEY\_2:}}@>
<@\texttt{\textcolor{red}{led \&= led >> 1;}}@>
<@\texttt{\textcolor{red}{break;}}@>
<@\texttt{\textcolor{red}{case KEY\_1:}}@>
<@\texttt{\textcolor{red}{led \&= led << 1;}}@>
<@\texttt{\textcolor{red}{break;}}@>
<@\texttt{\textcolor{red}{case KEY\_0:}}@>
<@\texttt{\textcolor{red}{led = 0x00;}\textcolor{codecomments}{ // all bits 0}}@>
<@\texttt{\textcolor{red}{break;}}@>
<@\texttt{\textcolor{red}{\}}}@>
IOWR_ALTERA_AVALON_PIO_DATA(GREEN_LED_BASE,led);
usleep (DEBOUNCE);
while (buttons != NONE_PRESSED)
buttons = IORD_ALTERA_AVALON_PIO_DATA(BUTTONS_BASE);
usleep (DEBOUNCE);
}
}
} // end
\end{lstlisting}
\textbf{Программа по заданию 2.} Структура программы: обработчик прерывания от кнопок (в нем считываются задетектированные нажатия кнопок), подпрограмма регистрации обработчика прерывания и главная программа, которая вызывает подпрограмму регистрации и управляет состоянием светодиодов. Во всех функциях использовались макроконстанты, объявленные в заголовочных файлах \code{system.h} и \code{altera\_avalon\_pio\_regs.h}, хранящих адреса соответствующих инструкций и данных. Также был добавлен заголовочный файл \code{sys/alt\_irq.h}. Адреса изменились, потому что теперь это не значения на кнопках (1 для свободной, 0 для нажатой), а значения в регистре прерываний (1 для места, где сработало прерывание).
\begin{lstlisting}[language=C,style=CCodeStyle]
#include <stdio.h>
#include <unistd.h>
#include "altera_avalon_pio_regs.h"
#include "sys/alt_irq.h"
#include "system.h"
#define NONE_PRESSED 0xF
<@\texttt{\textcolor{red}{\#define KEY\_3 0x8}}@>
<@\texttt{\textcolor{red}{\#define KEY\_2 0x4}}@>
<@\texttt{\textcolor{red}{\#define KEY\_1 0x2}}@>
<@\texttt{\textcolor{red}{\#define KEY\_0 0x1}}@>
#define DEBOUNCE 30000
volatile int edge_capture; //from docs
void handle_button_interrupts(void* context, alt_u32 id) {
volatile int* edge_capture_ptr = (volatile int*) context;
*edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(<@\texttt{\textcolor{red}{BUTTONS\_BASE}}@>);
// Сбросили флажки зарегистрированного прерывания
<@\texttt{\textcolor{red}{IOWR\_ALTERA\_AVALON\_PIO\_EDGE\_CAP}}@>(BUTTONS_BASE, 0x0);
IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTONS_BASE);
}
void init_button_pio() {
// from docs
void* edge_capture_ptr = (void*) &edge_capture; // для формирования передаваемого в
прерывание контекста
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTONS_BASE, 0xf);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTONS_BASE, 0x0);
alt_ic_isr_register(BUTTONS_IRQ_INTERRUPT_CONTROLLER_ID,
BUTTONS_IRQ
handle_button_interrupts,
edge_capture_ptr, 0x0);
}
int main(void) {
int led = 0x01;
printf("Simple\n");
IOWR_ALTERA_AVALON_PIO_DATA(GREEN_LED_BASE,led);
init_button_pio();
<@\texttt{\textcolor{red}{edge\_capture = 0;} \textcolor{codecomments}{// инициализация}}@>
<@\texttt{\textcolor{red}{while (1) \{}}@>
<@\texttt{\textcolor{red}{if (edge\_capture != 0) \{} \textcolor{codecomments}{// Если переменная была изменена (случилось прерывание)}}@>
<@\texttt{\textcolor{red}{switch(edge\_capture) \{}}@>
<@\texttt{\textcolor{red}{case KEY\_3:}}@>
<@\texttt{\textcolor{red}{led = 0xFF;}\textcolor{codecomments}{ // all bits 1}}@>
<@\texttt{\textcolor{red}{break;}}@>
<@\texttt{\textcolor{red}{case KEY\_2:}}@>
<@\texttt{\textcolor{red}{led \&= led >> 1;}}@>
<@\texttt{\textcolor{red}{break;}}@>
<@\texttt{\textcolor{red}{case KEY\_1:}}@>
<@\texttt{\textcolor{red}{led \&= led << 1;}}@>
<@\texttt{\textcolor{red}{break;}}@>
<@\texttt{\textcolor{red}{case KEY\_0:}}@>
<@\texttt{\textcolor{red}{led = 0x00;}\textcolor{codecomments}{ // all bits 0}}@>
<@\texttt{\textcolor{red}{break;}}@>
<@\texttt{\textcolor{red}{\}}}@>
IOWR_ALTERA_AVALON_PIO_DATA(GREEN_LED_BASE,led);
edge_capture = 0; <@\texttt{\textcolor{codecomments}{// сбросили глобальную переменную наличия данных от периферии}}@>
}
}
}
\end{lstlisting}
\end{document}

958
01-ess-lab-02-report.tex Normal file
View File

@ -0,0 +1,958 @@
\documentclass[a4paper,fontsize=14bp]{article}
\input{../common-preamble}
\input{../fancy-listings-preamble}
\input{../bmstu-preamble}
\numerationTop
\begin{document}
\setlength{\columnsep}{22pt}
\thispagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{2}{Разработка программного обеспечения. \\Отладка и профилирование кода}{Программное обеспечение встроенных систем}{}{доцент кафедры ИУ-3 \\ Федоров С.В.}
\newpage
\pagestyle{fancy}
%\blankpage
\tableofcontents
\newpage
\section*{Цель работы}
\addcontentsline{toc}{section}{Цель работы}
В лабораторной работе необходимо осуществить отладку программы, её профилирование, выполнить требования по быстродействию и объему для отдельных функций ПО. Изучить влияние ручных оптимизаций циклов на быстродействие программы. Изучить оптимизации компилятора на уровне формируемого ассемблерного кода.
\section*{Задания}
\addcontentsline{toc}{section}{Задания}
\begin{itemize}
\item Общее задание части I
\begin{enumerate}
\item Исходный код программы обработки прерывания от кнопок с замером времени выполнения обработчика прерывания.
\item Результаты измерения времени выполнения первого и последующих вызовов обработчика прерывания для разных уровней оптимизации.
\item Прокомментированный ассемблерный код обработчика прерывания для оптимизации Level3 и для отключенной оптимизации.
\item Сравнение результатов и выводы.
\end{enumerate}
\item Индивидуальное задание части I
\begin{enumerate}
\item Текст индивидуального задания.
\item Исходный код программы, в которой реализована инициализация и обработка массива данных с помощью двух разработанных по заданию функций: одна без развертывания цикла, а другая с развертыванием цикла.
\item Результаты измерения времени выполнения разработанных функций для оптимизации Level3 и для отключенной оптимизации.
\item Результаты измерения количества тактов, затрачиваемых на одну итерацию неразвернутого цикла при включенной оптимизации Level3 при разных объемах массивов данных.
\item Прокомментированный ассемблерный код разработанных функций для оптимизации Level3 и для отключенной оптимизации.
\item Сравнение результатов и выводы.
\end{enumerate}
\item Общее задание части II
\end{itemize}
\section*{Общее задание части I.}
\addcontentsline{toc}{section}{Общее задание части I.}
Для подсчёта времени был модифицирован код из первой лабораторной работы (добавлен таймер и вывод информации с него). Код представлен в листинге \hrf{lst:btnISR} внесённые изменения отмечены \lh{red}{красным}, функции, директивы и комментарии, оставшиеся без изменений опущены:
\begin{lstlisting}[language=C, style=CCodeStyle, caption=Performance counter в обработчике прерываний, label={lst:btnISR}]
// includes
// defines
volatile int edge_capture;
void handle_button_interrupts(void* context, alt_u32 id) {
<@\lh{red}{PERF\_BEGIN (PERFORMANCE\_COUNTER\_0\_BASE, 1);}@>
volatile int* edge_capture_ptr = (volatile int*) context;
*edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTONS_BASE);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTONS_BASE, 0x0);
IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTONS_BASE);
<@\lh{red}{PERF\_END (PERFORMANCE\_COUNTER\_0\_BASE, 1);}@>
}
void init_button_pio() {
// edge capture ptr, PIO_IRQ_MASK, PIO_EDGE_CAP, alt_ic_isr_register
}
int main(void) {
int led = 0x01;
printf("Simple\n");
IOWR_ALTERA_AVALON_PIO_DATA(GREEN_LED_BASE,led);
// Performance counter reset and initialize
<@\lh{red}{PERF\_RESET (PERFORMANCE\_COUNTER\_0\_BASE);}@>
<@\lh{red}{PERF\_START\_MEASURING (PERFORMANCE\_COUNTER\_0\_BASE);}@>
init_button_pio();
edge_capture = 0;
// local counter to control performance
<@\lh{red}{int cntCounts = 0;}@>
while (1) {
if (edge_capture != 0) {
<@\lh{red}{cntCounts++;}@>
switch(edge_capture) {
case KEY_3:
led = 0xFF; // all bits 1
break;
case KEY_2:
led &= led >> 1;
break;
case KEY_1:
led &= led << 1;
break;
case KEY_0:
led = 0x00; // all bits 0
break;
}
IOWR_ALTERA_AVALON_PIO_DATA(GREEN_LED_BASE,led);
edge_capture = 0;
// recompile this condition to check one or ten interrupts
// if (cntCounts == 1) {
<@\lh{red}{if (cntCounts == 10) \{}@>
<@\lh{red}{PERF\_STOP\_MEASURING (PERFORMANCE\_COUNTER\_0\_BASE);}@>
<@\lh{red}{perf\_print\_formatted\_report (}@>
<@\lh{red}{PERFORMANCE\_COUNTER\_0\_BASE,}@>
<@\lh{red}{ALT\_CPU\_FREQ, 1,}@>
<@\lh{red}{"Btn irq time",}@>
<@\lh{red}{"Time of ten interrupts");}@>
<@\lh{red}{PERF\_END (PERFORMANCE\_COUNTER\_0\_BASE, 0);}@>
<@\lh{red}{\}}@>
}
}
}
\end{lstlisting}
Для помещения функции обработчика прерываний в тесно связанную память был добавлен прототип функции с указанием атрибута, уточняющего секцию памяти, в которой функция должна располагаться.
\begin{lstlisting}[language=C,style=CCodeStyle]
void handle_button_interrupts(void* context, alt_u32 id) __attribute__ ((section("irq")));
\end{lstlisting}
В результате выполнения данного кода были получены результаты, представленные в таблице \hrf{table:isrtime}. Скриншоты с этими же результатами представлены в приложении \hrf{appendix:isrtime}. После нескольких запусков с разными вариантами настроек можно однозначно сказать, что при расположении обработчика прерываний в тесносвязанной памяти очевидно ускорение работы функции даже без оптимизаций компилятора. Из результатов видно, что размещённый в тесносвязанной памяти код выполняется так, будто находится в кэше. При размещении в обычной памяти, первый вызов выполняется дольше, поскольку обработчик перемещается в кэш (далее он оттуда не вытесняется, поскольку в целом программа очень простая). Время работы при разных типах оптимизации не меняется так как обработчик очень простой.
\begin{table}[H]
\centering
\begin{tabular}{||l|l|c|c||}
\hline
Использование TCM & Оптимизация & Количество прерываний & Время (тактов) \\ [0.5ex]
\hline\hline
нет & нет & 1 & 62 \\
нет & нет & 10 & 314 \\
нет & -О2 & 1 & 43 \\
нет & -О2 & 10 & 223 \\
нет & размер & 1 & 43 \\
нет & размер & 10 & 223 \\
да & нет & 1 & 28 \\
да & нет & 10 & 280 \\
да & -О3 & 1 & 20 \\
да & -О3 & 10 & 200 \\
да & размер & 1 & 20 \\
да & размер & 10 & 200 \\ [1ex]
\hline
\end{tabular}
\caption{Зависимость времени исполнения функции от количества прерываний}
\label{table:isrtime}
\end{table}
Оптимизации процессора значительно повлияли на транслируемый код, скопмилировав в результате ассемблерный код, представленный в листингах \hrf{lst:noopt} и \hrf{lst:optlv2}. В неоптимизированном коде видно гораздо больше обращений к памяти (мнемоники \code{stw}, \code{ldw}), в то время, как оптимизированный код сразу работает только с периферийным модулем (мнемоники \code{stwio}, \code{ldwio}). Также неоптимизированная версия программы сразу выделяет место для своей работы на стеке (\code{sp,sp,-16}), сохраняет принятые в функцию параметры, несмотря на то, что один из них не используется вовсе, а второй используется только один раз (\code{r4}, \code{r5} записываются в -8 и -12 сдвиги от указателя на фрейм, соответственно, а читается только \code{r4}: \code{ldw r2,-8(fp)}) и активнее работает с локальными регистрами, сохраняя в них промежуточные значения, прочитанные из периферийных модулей. В то время, как оптимизированная функция работает с единственным, возвращающим, регистром \code{r2}.
\begin{lstlisting}[style=ASMStyle, caption=Код без оптимизаций, label={lst:noopt}]
00000284 <handle_button_interrupts>:
284: defffc04 addi sp,sp,-16
288: df000315 stw fp,12(sp)
28c: df000304 addi fp,sp,12
290: e13ffe15 stw r4,-8(fp)
294: e17ffd15 stw r5,-12(fp)
298: 0007883a mov r3,zero
29c: 00820034 movhi r2,2048
2a0: 10c40535 stwio r3,4116(r2)
2a4: e0bffe17 ldw r2,-8(fp)
2a8: e0bfff15 stw r2,-4(fp)
2ac: 00820034 movhi r2,2048
2b0: 10c42337 ldwio r3,4236(r2)
2b4: e0bfff17 ldw r2,-4(fp)
2b8: 10c00015 stw r3,0(r2)
2bc: 0007883a mov r3,zero
2c0: 00820034 movhi r2,2048
2c4: 10c42335 stwio r3,4236(r2)
2c8: 00820034 movhi r2,2048
2cc: 10842337 ldwio r2,4236(r2)
2d0: 0007883a mov r3,zero
2d4: 00820034 movhi r2,2048
2d8: 10c40435 stwio r3,4112(r2)
2dc: 0001883a nop
2e0: e037883a mov sp,fp
2e4: df000017 ldw fp,0(sp)
2e8: dec00104 addi sp,sp,4
2ec: f800283a ret
\end{lstlisting}
\begin{lstlisting}[style=ASMStyle, caption=Код с оптимизацией -О2, label={lst:optlv2}]
00000284 <handle_button_interrupts>:
284: 00820034 movhi r2,2048
288: 10040535 stwio zero,4116(r2)
28c: 10842337 ldwio r2,4236(r2)
290: 20800015 stw r2,0(r4)
294: 00820034 movhi r2,2048
298: 10042335 stwio zero,4236(r2)
29c: 10842337 ldwio r2,4236(r2)
2a0: 00820034 movhi r2,2048
2a4: 10040435 stwio zero,4112(r2)
2a8: f800283a ret
\end{lstlisting}
\section*{Индивидуальное задание части I.}
\addcontentsline{toc}{section}{Индивидуальное задание части I.}
\subsection*{Развёрнутый цикл и оптимизации}
Индивидуальным заданием в первой части работы был расчёт контрольной суммы UDP для блока данных. Код программы, реализующей вызов функции расчёта контрольной суммы и подсчёт времени выполнения посредством Performance Counter представлен в листинге \hrf{lst:udpCode}. На строках \hrf{line:nounroll} и \hrf{line:unroll} представлены циклы, выполняющие одну и ту же задачу, но без применения развёртывания цикла (loop unrolling) и с применением, соответственно. Также важно, что цикл без развёртывания является циклом <<добора>>, то есть когда развёрнутый цикл (строка \hrf{line:unroll}) завершает свою работу в массиве данных могут остаться некратные данные, которые досчитываются циклом со строки \hrf{line:nounroll}.
\begin{lstlisting}[language=C, style=CCodeStyle, caption=Функция расчёта контрольной суммы UDP, label={lst:udpCode}]
#include <stdio.h>
#include <unistd.h>
#include "altera_avalon_pio_regs.h"
#include "altera_avalon_performance_counter.h"
#include "sys/alt_irq.h"
#include "system.h"
#define CACHE_CHECK 2048
unsigned short checkSum(unsigned short* addr, int size) __attribute__ ((section("irq")));
unsigned short checkSum(unsigned short* addr, int size) {
register unsigned short checksum = 0;
register int sum = 0;
// unrolled cycle
while (size > 8) { <@\label{line:unroll}@>
sum += *addr++;
sum += *addr++;
sum += *addr++;
sum += *addr++;
size -= 8;
}
// simple cycle (and)
while (size > 1) { <@\label{line:nounroll}@>
sum += *addr++;
size -= 2;
}
if (size > 0) {
sum += *(unsigned char *) addr;
}
while (sum >> 16) {
sum = (sum & 0xffff) + (sum >> 16);
}
checksum = ~sum;
return checksum;
}
int main(void) {
printf("udp tcm 3 opt unroll cycle\n");
PERF_RESET(PERFORMANCE_COUNTER_0_BASE);
const int SIZE = CACHE_CHECK;
unsigned short udpCheckSum = 0;
short datagram[SIZE];
const void *buf;
// filling datagram
short c1 = 0xf001;
short c2 = 0x0e11;
short c3 = 0xaad0;
short c4 = 0xa00c;
int i = 0;
do {
datagram[i + 0] = c1;
datagram[i + 1] = c2;
datagram[i + 2] = c3;
datagram[i + 3] = c4;
i += 4;
} while (i < SIZE);
buf = (const void*) datagram;
PERF_START_MEASURING(PERFORMANCE_COUNTER_0_BASE);
i = 100;
while (0 < --i) {
PERF_BEGIN (PERFORMANCE_COUNTER_0_BASE, 1);
udpCheckSum = checkSum(buf, (SIZE + 1) * 2);
PERF_END (PERFORMANCE_COUNTER_0_BASE, 1);
}
perf_print_formatted_report (
PERFORMANCE_COUNTER_0_BASE,
ALT_CPU_FREQ, 1,
"UDP 2048",
"Time");
PERF_STOP_MEASURING (PERFORMANCE_COUNTER_0_BASE);
printf("checksum = 0x%x\n", udpCheckSum);
return 0;
}
\end{lstlisting}
Результаты замеров времени выполнения этих двух вариантов функции приведены в таблице \hrf{table:udpchecksum}. Все измерения проводились на 99ти повторениях, снимки экрана представлены в приложении \hrf{appendix:checksumTime}.
\begin{table}[H]
\centering
\begin{tabular}{||r|c|c||}
\hline
Оптимизация & Цикл развёрнут & Время(тактов) \\ [0.5ex]
\hline\hline
нет & нет & 24322152 \\
нет & да & 14470051 \\
-О3 & нет & 6835626 \\
-О3 & да & 4174875 \\
\hline
\end{tabular}
\caption{Применение развёртывания цикла при выполнении вычислений}
\label{table:udpchecksum}
\end{table}
Для массивов длиной 8192 элементов типа \code{unsigned short}, циклически заполненных значениями \code{0xf001}, \code{0x0e11}, \code{0xaad0}, \code{0xa00c} получилось значение \code{0xbec8}, что является корректным значением контрольной суммы.
\subsection*{Оптимизация и заполнение памяти}
В процессе выполнения программы были произведены измерения количества тактов, затрачиваемых на одну итерацию неразвернутого цикла при включенной оптимизации -O3 при разных объемах массивов данных. Результаты измерений приведены в таблице \hrf{table:memory}. Подсчёт результатов был произведён без изменения положения Performace Counter (для всей функции целиком) согласно средней асимтотической сложности алгоритма получения контрольной суммы O(n), где n - это размер входящего массива данных. Для системы было выделено 16384 байта, соответственно, для заполнения её согласно задания необходимо создать массивы на 16384 ($200\%$), 8192 ($100\%$), 4096 ($50\%$), 2048 ($25\%$) элементов типа \code{unsigned short} (шестнадцатиразрядные беззнаковые целые числа). Снимки экрана с результатами работы Performance counter представлены в приложении \hrf{appendix:udpMemory}.
\begin{table}[H]
\centering
\begin{tabular}{||r|c|c|c||}
\hline
Цикл развёрнут & \thead{Расчётное\\заполнение памяти\\(процентов)} & \thead{Время\\функции\\(секунд)} & \thead{Расчётное время\\одной итерации\\(мксек)} \\ [0.5ex]
\hline\hline
нет & 25 & 0.03427 & 0.169024 \\
нет & 50 & 0.06843 & 0.168753 \\
нет & 100 & 0.13671 & 0.168568 \\
нет & 200 & 0.27328 & 0.168482 \\
да & 25 & 0.02097 & 0.413707 \\
да & 50 & 0.04181 & 0.412425 \\
да & 100 & 0.08350 & 0.411833 \\
да & 200 & 0.16676 & 0.411241 \\
\hline
\end{tabular}
\caption{Скорость исполнения одной итерации относительно заполнения памяти}
\label{table:memory}
\end{table}
В таблице видно, что каждая итерация развёрнутого цикла выполняется дольше, но не в четыре раза, поэтому за счёт уменьшения количества итераций в четыре раза получается довольно значительный прирост в скорости исполнения программы. Такой прирост обусловлен снижением накладных расходов на каждую итерацию цикла. В листингах \hrf{lst:nooptsim} и \hrf{lst:nooptunf} представлен ассемблерный код функции подсчёта контрольной суммы без применения развёртывания основного цикла и с применением, соответственно, а в листингах \hrf{lst:optsim} и \hrf{lst:optunf} такой же код, но с оптимизацией компилятора -О3.
В листинге \hrf{lst:nooptsim} на строках с \hrf{line:simbody} по \hrf{line:simcond} виден цикл, обрабатывающий значения из массива. Аналогичный цикл виден как <<цикл добора>> в листинге \hrf{lst:nooptunf} на строках с \hrf{line:unfsimbody} по \hrf{line:unfsimcond}. Адреса начала и конца тел циклов выделены \lh{blue}{синим}.
В листинге с развёртыванием цикла на каждой итерации осуществляется четыре идентичных действия по чтению значения из исходного массива (\hrf{line:unfit1b}, \hrf{line:unfit2b}, \hrf{line:unfit3b}, \hrf{line:unfit4b}), выделены \lh{dkgreen}{зелёным}; прибавления этого значения в регистр суммы и инкремент указателя на массив (\hrf{line:unfit1e}, \hrf{line:unfit2e}, \hrf{line:unfit3e}, \hrf{line:unfit4e}), выделены \lh{red}{красным}. Далее в обеих функциях следует условие добора нечётности исходного массива и цикл преобразования суммы к 16-разрядному значению.
\begin{lstlisting}[style=ASMStyle, caption=Код без развёртывания, label={lst:nooptsim}]
// <@\lh{dkgreen}{выделить для стека функции 16 байт}@>
10000000: defffc04 addi sp,sp,-16
// <@\lh{dkgreen}{сохранить в указатель на фрейм 12й байт (первый элемент) стека}@>
10000004: df000315 stw fp,12(sp)
// <@\lh{dkgreen}{что в sp(8)?}@>
10000008: dc000215 stw r16,8(sp)
// <@\lh{dkgreen}{fp = sp+12}@>
1000000c: df000304 addi fp,sp,12
// <@\lh{dkgreen}{указатель на переданный массив в }@>fp-8
10000010: e13ffe15 stw r4,-8(fp)
// <@\lh{dkgreen}{переданная длина массива в }@>fp-12
10000014: e17ffd15 stw r5,-12(fp)
// <@\lh{dkgreen}{сумма = 0}@>
10000018: 0021883a mov r16,zero
// <@\lh{dkgreen}{переходим по адресу }@>0x44
<@\lh{blue}{1000001c: 00000906 br}@> 10000044<checkSum+0x44> <@\label{line:simbody}@>
// <@\lh{dkgreen}{r2 = массив}@>
10000020: e0bffe17 ldw r2,-8(fp)
// <@\lh{dkgreen}{r3 = массив + 2 байта}@>
10000024: 10c00084 addi r3,r2,2
// <@\lh{dkgreen}{сохраняем новый адрес в }@>r3
10000028: e0fffe15 stw r3,-8(fp)
// <@\lh{dkgreen}{загружаем полуслово по старому указателю на массив}@>
1000002c: 1080000b ldhu r2,0(r2)
// <@\lh{dkgreen}{маск\'{и}руем младшие 16 битов}@>
10000030: 10bfffcc andi r2,r2,65535
// <@\lh{dkgreen}{сумма += r2}@>
10000034: 80a1883a add r16,r16,r2
// <@\lh{dkgreen}{кладём в r2 (оставшуюся) длину массива}@>
10000038: e0bffd17 ldw r2,-12(fp)
// <@\lh{dkgreen}{длина -= 2}@>
1000003c: 10bfff84 addi r2,r2,-2
// <@\lh{dkgreen}{сохраняем оставшуюся длину обратно в }@>fp-12
10000040: e0bffd15 stw r2,-12(fp)
// <@\lh{dkgreen}{загружаем из fp-12 (длина массива) в }@>r2
<@\lh{blue}{10000044: e0bffd17 ldw}@> r2,-12(fp) <@\label{line:simcond}@>
// <@\lh{dkgreen}{r2 = длина > 2}@>
10000048: 10800088 cmpgei r2,r2,2
// <@\lh{dkgreen}{((длина > 2) != false)? переходим 0x20}@>
1000004c: 103ff41e bne r2,zero,10000020<checkSum+0x20>
// <@\lh{dkgreen}{((длина > 2) == false) ? r2 = длина}@>
10000050: e0bffd17 ldw r2,-12(fp)
// <@\lh{dkgreen}{r2 >= 0 ? переходим 0x78}@>
10000054: 0080080e bge zero,r2,10000078<checkSum+0x78>
// <@\lh{dkgreen}{r2 < 0 ? r2 = массив}@>
10000058: e0bffe17 ldw r2,-8(fp)
// <@\lh{dkgreen}{r2 = значение массива}@>
1000005c: 1080000b ldhu r2,0(r2)
// <@\lh{dkgreen}{r2 = r2 \& 0xffff}@>
10000060: 10bfffcc andi r2,r2,65535
// <@\lh{dkgreen}{сумма += r2}@>
10000064: 80a1883a add r16,r16,r2
// <@\lh{dkgreen}{переходим 0x78}@>
10000068: 00000306 br 10000078<checkSum+0x78>
// <@\lh{dkgreen}{r3 = сумма \& 0xffff}@>
1000006c: 80ffffcc andi r3,r16,65535
// <@\lh{dkgreen}{r2 = сумма >> 16}@>
10000070: 8005d43a srai r2,r16,16
// <@\lh{dkgreen}{сумма = r2 + r3}@>
10000074: 18a1883a add r16,r3,r2
// <@\lh{dkgreen}{сумма >> 16}@>
10000078: 8005d43a srai r2,r16,16
// <@\lh{dkgreen}{r2 != 0 ? переходим 0x6c}@>
1000007c: 103ffb1e bne r2,zero,1000006c<checkSum+0x6c>
// <@\lh{dkgreen}{r2 == 0 ? r2 = сумма}@>
10000080: 8005883a mov r2,r16
// <@\lh{dkgreen}{r2 = \textasciitilde(r2|0)}@>
10000084: 0084303a nor r2,zero,r2
// <@\lh{dkgreen}{сумма = r2}@>
10000088: 1021883a mov r16,r2
// <@\lh{dkgreen}{r2 = сумма}@>
1000008c: 8005883a mov r2,r16
// <@\lh{dkgreen}{завершаем выполнение функции, перемещаем обратно указатели}@>
10000090: e6ffff04 addi sp,fp,-4
10000094: df000117 ldw fp,4(sp)
10000098: dc000017 ldw r16,0(sp)
1000009c: dec00204 addi sp,sp,8
// return
100000a0: f800283a ret
\end{lstlisting}
\begin{lstlisting}[style=ASMStyle, caption=Код с развёртыванием, label={lst:nooptunf}]
// <@\lh{dkgreen}{инициализация}@>
10000000: defffc04 addi sp,sp,-16
10000004: df000315 stw fp,12(sp)
10000008: dc000215 stw r16,8(sp)
1000000c: df000304 addi fp,sp,12
// <@\lh{dkgreen}{адрес массива}@>
10000010: e13ffe15 stw r4,-8(fp)
// <@\lh{dkgreen}{длина массива}@>
10000014: e17ffd15 stw r5,-12(fp)
// <@\lh{dkgreen}{сумма = 0}@>
10000018: 0021883a mov r16,zero
// <@\lh{dkgreen}{переход 0x8c}@>
1000001c: 00001b06 br 1000008c<checkSum+0x8c>
<@\lh{dkgreen}{10000020: e0bffe17 ldw}@> r2,-8(fp) <@\label{line:unfit1b}@>
10000024: 10c00084 addi r3,r2,2
10000028: e0fffe15 stw r3,-8(fp)
1000002c: 1080000b ldhu r2,0(r2)
10000030: 10bfffcc andi r2,r2,65535
<@\lh{red}{10000034: 80a1883a add}@> r16,r16,r2 <@\label{line:unfit1e}@>
<@\lh{dkgreen}{10000038: e0bffe17 ldw}@> r2,-8(fp) <@\label{line:unfit2b}@>
1000003c: 10c00084 addi r3,r2,2
10000040: e0fffe15 stw r3,-8(fp)
10000044: 1080000b ldhu r2,0(r2)
10000048: 10bfffcc andi r2,r2,65535
<@\lh{red}{1000004c: 80a1883a add}@> r16,r16,r2 <@\label{line:unfit2e}@>
<@\lh{dkgreen}{10000050: e0bffe17 ldw}@> r2,-8(fp)<@\label{line:unfit3b}@>
10000054: 10c00084 addi r3,r2,2
10000058: e0fffe15 stw r3,-8(fp)
1000005c: 1080000b ldhu r2,0(r2)
10000060: 10bfffcc andi r2,r2,65535
<@\lh{red}{10000064: 80a1883a add}@> r16,r16,r2<@\label{line:unfit3e}@>
<@\lh{dkgreen}{10000068: e0bffe17 ldw}@> r2,-8(fp)<@\label{line:unfit4b}@>
1000006c: 10c00084 addi r3,r2,2
10000070: e0fffe15 stw r3,-8(fp)
10000074: 1080000b ldhu r2,0(r2)
10000078: 10bfffcc andi r2,r2,65535
<@\lh{red}{1000007c: 80a1883a add}@> r16,r16,r2<@\label{line:unfit4e}@>
10000080: e0bffd17 ldw r2,-12(fp)
10000084: 10bffe04 addi r2,r2,-8
10000088: e0bffd15 stw r2,-12(fp)
1000008c: e0bffd17 ldw r2,-12(fp)
10000090: 10800248 cmpgei r2,r2,9
10000094: 103fe21e bne r2,zero,10000020 <checkSum+0x20>
<@\lh{blue}{10000098: 00000906 br}@> 100000c0 <checkSum+0xc0> <@\label{line:unfsimbody}@>
1000009c: e0bffe17 ldw r2,-8(fp)
100000a0: 10c00084 addi r3,r2,2
100000a4: e0fffe15 stw r3,-8(fp)
100000a8: 1080000b ldhu r2,0(r2)
100000ac: 10bfffcc andi r2,r2,65535
100000b0: 80a1883a add r16,r16,r2
100000b4: e0bffd17 ldw r2,-12(fp)
100000b8: 10bfff84 addi r2,r2,-2
100000bc: e0bffd15 stw r2,-12(fp)
<@\lh{blue}{100000c0: e0bffd17 ldw}@> r2,-12(fp) <@\label{line:unfsimcond}@>
100000c4: 10800088 cmpgei r2,r2,2
100000c8: 103ff41e bne r2,zero,1000009c <checkSum+0x9c>
100000cc: e0bffd17 ldw r2,-12(fp)
100000d0: 0080080e bge zero,r2,100000f4 <checkSum+0xf4>
100000d4: e0bffe17 ldw r2,-8(fp)
100000d8: 1080000b ldhu r2,0(r2)
100000dc: 10bfffcc andi r2,r2,65535
100000e0: 80a1883a add r16,r16,r2
100000e4: 00000306 br 100000f4 <checkSum+0xf4>
100000e8: 80ffffcc andi r3,r16,65535
100000ec: 8005d43a srai r2,r16,16
100000f0: 18a1883a add r16,r3,r2
100000f4: 8005d43a srai r2,r16,16
100000f8: 103ffb1e bne r2,zero,100000e8 <checkSum+0xe8>
100000fc: 8005883a mov r2,r16
10000100: 0084303a nor r2,zero,r2
10000104: 1021883a mov r16,r2
10000108: 8005883a mov r2,r16
1000010c: e6ffff04 addi sp,fp,-4
10000110: df000117 ldw fp,4(sp)
10000114: dc000017 ldw r16,0(sp)
10000118: dec00204 addi sp,sp,8
1000011c: f800283a ret
\end{lstlisting}
В оптимизированной версии кода в листингах \hrf{lst:optsim} и \hrf{lst:optunf} также есть общая часть - условие добора нечётности массива и цикл преобразования к 16-разрядному значению, начало и конец выделены \lh{red}{красным}.
\begin{lstlisting}[style=ASMStyle, caption=Код -О3 без развёртывания, label={lst:optsim}]
// unsigned short checkSum(unsigned short* addr, int size) {
// register unsigned short checksum = 0;
// register int sum = 0;
// <@\lh{dkgreen}{параметры функции передаются в регистрах r4 (addr) и r5 (size)}@>
// <@\lh{dkgreen}{r2 = длина < 2}@>
10000000: 28800090 cmplti r2,r5,2
// <@\lh{dkgreen}{((длина < 2) != false) ? переходим 0x78}@>
10000004: 10001c1e bne r2,zero,10000078 <checkSum+0x78>
// <@\lh{dkgreen}{попадаем сюда, если (длина < 2) == false}@>
// <@\lh{dkgreen}{idky записываем во временный регистр r6 значение -2}@>
10000008: 01bfff84 movi r6,-2
// <@\lh{dkgreen}{временный регистр r7 = длина массива - 2}@>
1000000c: 29ffff84 addi r7,r5,-2
// <@\lh{dkgreen}{r2 = r7 \& r6, то есть (длина - 2) \& (-2)}@>
// <@\lh{dkgreen}{предполагаю, что это как-то гарантирует чётность длины}@>
10000010: 3984703a and r2,r7,r6
// <@\lh{dkgreen}{r6 = r4 (указатель на массив) + 2}@>
10000014: 21800084 addi r6,r4,2
// <@\lh{dkgreen}{r6 = r2 (результат операции с 0х0с) + r6 (указатель на массив +2)}@>
// <@\lh{dkgreen}{предполагаю, что это адрес последнего элемента массива}@>
// <@\lh{dkgreen}{для сравнения в цикле 0х024 - 0х030}@>
10000018: 118d883a add r6,r2,r6
// <@\lh{dkgreen}{r3 = r4 (указатель на массив)}@>
1000001c: 2007883a mov r3,r4
// <@\lh{dkgreen}{r2 = 0}@>
10000020: 0005883a mov r2,zero
// <@\lh{dkgreen}{здесь начался цикл аккумулирования значений из массива}@>
// <@\lh{dkgreen}{цикл перевёрнут, то есть реализован как do {} while();}@>
// while (size > 1) {
// sum += *addr++;
// size -= 2;
// }
// <@\lh{dkgreen}{в r5 записался 0-й байт массива беззнаково}@>
<@\lh{blue}{10000024: 1940000b ldhu}@> r5,0(r3)
// <@\lh{dkgreen}{сместили временный указатель на начало массива}@>
10000028: 18c00084 addi r3,r3,2
// <@\lh{dkgreen}{аккумулируем сумму}@>
1000002c: 1145883a add r2,r2,r5
// <@\lh{dkgreen}{проверяем выход за пределы (r6 != r3)}@>
<@\lh{blue}{10000030: 30fffc1e bne}@> r6,r3,10000024 <checkSum+0x24>
// <@\lh{dkgreen}{когда закончили с основным суммирующим циклом}@>
// <@\lh{dkgreen}{во временный регистр r3 записали (((длину массива) - 2) / 2)??!!}@>
// <@\lh{dkgreen}{(r6 == r3) ? r3 = r7 >> 1 (логическое)}@>
10000034: 3806d07a srli r3,r7,1
// <@\lh{dkgreen}{странная манипуляция длиной массива и адресом, видимо,}@>
// <@\lh{dkgreen}{это связано с тем, что стек растёт отрицательно, поэтому}@>
// <@\lh{dkgreen}{адреса последних элементов имеют отрицательное смещение}@>
// <@\lh{dkgreen}{новый размер массива получаем из половины старого * -2}@>
// <@\lh{dkgreen}{r5 = r3 * (-2)}@>
10000038: 197fffa4 muli r5,r3,-2
// <@\lh{dkgreen}{r3 += 1 (прибавили к размеру (половины массива) единицу)}@>
1000003c: 18c00044 addi r3,r3,1
// <@\lh{dkgreen}{судя по всему, получаем реальный размер оставшегося массива}@>
// <@\lh{dkgreen}{r3 += r3}@>
10000040: 18c7883a add r3,r3,r3
// <@\lh{dkgreen}{прибавляем к начальному адресу массива расчётный размер}@>
// <@\lh{dkgreen}{r7 = r5 + r7 (длина - 2)}@>
10000044: 29cf883a add r7,r5,r7
// <@\lh{dkgreen}{сравниваем получившийся результат с единицей}@>
// <@\lh{dkgreen}{то есть, проверяем, дошли ли мы до конца массива)}@>
// <@\lh{dkgreen}{r7 = r7 != 1}@>
10000048: 39c00058 cmpnei r7,r7,1
// <@\lh{dkgreen}{r4 += r3}@>
1000004c: 20c9883a add r4,r4,r3
// <@\lh{dkgreen}{((r7 != 1) != false) ? переходим 0x68}@>
10000050: 3800051e bne r7,zero,10000068 <checkSum+0x68>
// <@\lh{dkgreen}{((r7 != 1) == false) ? производим финальные действия:}@>
// <@\lh{dkgreen}{приводим полученную сумму к размеру и битовую инверсию}@>
// sum += *(unsigned char *) addr;
// <@\lh{dkgreen}{в r3 записываем нулевой элемент массива r4 (полуслово, младшие 8 бит)}@>
<@\lh{red}{10000054: 20c0000b ldhu}@> r3,0(r4)
// <@\lh{dkgreen}{r2 += r3 (нулевой элемент r4)}@>
10000058: 10c5883a add r2,r2,r3
// <@\lh{dkgreen}{переходим 0x68}@>
1000005c: 00000206 br 10000068 <checkSum+0x68>
// while (sum >> 16) {
// sum = (sum \& 0xffff) + (sum >> 16);
// }
// <@\lh{dkgreen}{маск\'{и}руем младшие 16 битов}@>
10000060: 10bfffcc andi r2,r2,65535
// <@\lh{dkgreen}{r2 += r3}@>
10000064: 10c5883a add r2,r2,r3
// <@\lh{dkgreen}{r3 = r2 >> 16 (арифметическое)}@>
10000068: 1007d43a srai r3,r2,16
// <@\lh{dkgreen}{(r3 != 0) ? переходим 0x60}@>
<@\lh{red}{1000006c: 183ffc1e bne}@> r3,zero,10000060 <checkSum+0x60>
// <@\lh{dkgreen}{(r3 == 0) ? r2 = \textasciitilde(r2|0)}@>
// checksum = ~sum;
10000070: 0084303a nor r2,zero,r2
// <@\lh{dkgreen}{Выйти из функции}@>
10000074: f800283a ret
// <@\lh{dkgreen}{r5 = длина == 1}@>
10000078: 29400060 cmpeqi r5,r5,1
// <@\lh{dkgreen}{((длина == 1) == false) ? переходим 0x88}@>
1000007c: 28000226 beq r5,zero,10000088 <checkSum+0x88>
// <@\lh{dkgreen}{в противном случае, то есть, когда}@>
// <@\lh{dkgreen}{((длина == 1) != false) ? r2 = 0}@>
10000080: 0005883a mov r2,zero
// <@\lh{dkgreen}{переходим 0x54}@>
10000084: 003ff306 br 10000054 <checkSum+0x54>
// <@\lh{dkgreen}{вернуть из функции -1}@>
10000088: 00bfffc4 movi r2,-1
// <@\lh{dkgreen}{Выйти из функции}@>
1000008c: f800283a ret
\end{lstlisting}
\begin{lstlisting}[style=ASMStyle, caption=Код -О3 с развёртыванием, label={lst:optunf}]
// <@\lh{dkgreen}{r4 = \&addr, r5 = size}@>
// unsigned short checkSum(unsigned short* addr, int size) {
register unsigned short checksum = 0;
register int sum = 0;
// <@\lh{dkgreen}{Первый, развёрнутый цикл работает по условию size > 8,}@>
// <@\lh{dkgreen}{следовательно, первая проверка - не нужно ли его пропустить}@>
// <@\lh{dkgreen}{r2 = длина < 9}@>
10000000: 28800250 cmplti r2,r5,9
// <@\lh{dkgreen}{если массив не требует обработки развёрнутым циклом}@>
// <@\lh{dkgreen}{((длина < 9) != false) ? переходим 0xe0}@>
10000004: 1000361e bne r2,zero,100000e0 <checkSum+0xe0>
// <@\lh{dkgreen}{вычисляем, где закончится массив}@>
// <@\lh{dkgreen}{((длина < 9) == false) ? r9 = r5 (длина) - 9}@>
10000008: 2a7ffdc4 addi r9,r5,-9
// <@\lh{dkgreen}{r9 = r9 (длина - 9) >> 3 (логическое)}@>
1000000c: 4812d0fa srli r9,r9,3
// <@\lh{dkgreen}{инициализируем переменную куда будем накапливать результат}@>
// <@\lh{dkgreen}{r2 = 0}@>
10000010: 0005883a mov r2,zero
// <@\lh{dkgreen}{r8 = r9 (изменённая на 0х0с длина массива) + 1}@>
10000014: 4a000044 addi r8,r9,1
// <@\lh{dkgreen}{r8 = r8 * 8 (логическим сдвигом)}@>
10000018: 401090fa slli r8,r8,3
// <@\lh{dkgreen}{иными словами считаем, где мы окажемся, когда закончим}@>
// <@\lh{dkgreen}{выполнение нижеследующего цикла}@>
// <@\lh{dkgreen}{r8 = r4 (указатель на массив) + r8}@>
1000001c: 2211883a add r8,r4,r8
// while (size > 8) { <@\label{line:unroll}@>
// sum += *addr++;
// sum += *addr++;
// sum += *addr++;
// sum += *addr++;
// size -= 8;
// }
// <@\lh{dkgreen}{далее начинается развёрнутый явно в коде цикл, в котором}@>
// <@\lh{dkgreen}{происходит последовательное чтение данных из массива}@>
// <@\lh{dkgreen}{со сдвигом относительно адреса на +0, +2, +4, +6 байт,}@>
// <@\lh{dkgreen}{аккумулируя прочитанные значения (в результате) в регистр r2}@>
<@\lh{dkgreen}{10000020: 21c0000b ldhu}@> r7,0(r4)
10000024: 2180008b ldhu r6,2(r4)
10000028: 20c0010b ldhu r3,4(r4)
1000002c: 3885883a add r2,r7,r2
10000030: 308d883a add r6,r6,r2
10000034: 2080018b ldhu r2,6(r4)
10000038: 1987883a add r3,r3,r6
1000003c: 21000204 addi r4,r4,8
10000040: 10c5883a add r2,r2,r3
// <@\lh{dkgreen}{не дошли до конца массива? зацикливаемся, переходим 0x20}@>
<@\lh{dkgreen}{10000044: 413ff61e bne}@> r8,r4,10000020 <checkSum+0x20>
// <@\lh{dkgreen}{r9 = изменённая на 0х0с длина массива * -8}@>
10000048: 4a7ffe24 muli r9,r9,-8
// <@\lh{dkgreen}{r5 = реальная переданная длина массива - 8}@>
1000004c: 297ffe04 addi r5,r5,-8
// <@\lh{dkgreen}{r5 = r9 + r5}@>
10000050: 494b883a add r5,r9,r5
// <@\lh{dkgreen}{на адрес 0х54 мы попадаем, когда размер исходного массива}@>
// <@\lh{dkgreen}{меньше 9 то есть или сразу при вызове функции, или}@>
// <@\lh{dkgreen}{после прохода по явно развёрнутому циклу}@>
// <@\lh{dkgreen}{во временный регистр r3 записываем результат сравнения}@>
// <@\lh{dkgreen}{r3 = переданный размер массива < 2}@>
10000054: 28c00090 cmplti r3,r5,2
// <@\lh{dkgreen}{((r3 < 2) != false) ? переходим 0xb4}@>
// <@\lh{dkgreen}{то есть если размер массива < 2, то переходим}@>
// <@\lh{dkgreen}{к завершению функции, значит код далее (не совершая переход)}@>
// <@\lh{dkgreen}{это код цикла добора. Последовательно забирая элементы}@>
// <@\lh{dkgreen}{массива мы сравниваем получившийся адрес с}@>
// <@\lh{dkgreen}{исходным +0, +2, +4, и выходим по адресу 0х9с, из чего}@>
// <@\lh{dkgreen}{делаем вывод, что произошло развёртывание компилятором}@>
10000058: 1800161e bne r3,zero,100000b4 <checkSum+0xb4>
// <@\lh{dkgreen}{((r3 < 2) == false) ? r7 = array[0]}@>
<@\lh{blue}{1000005c: 21c0000b ldhu}@> r7,0(r4) <@\label{line:unfoptldw0}@>
//<@\lh{dkgreen}{r6 = размера массива - 2}@>
10000060: 29bfff84 addi r6,r5,-2
// <@\lh{dkgreen}{r3 = r6 < 2}@>
10000064: 30c00090 cmplti r3,r6,2
// <@\lh{dkgreen}{накапливаем полученную сумму}@>
// <@\lh{dkgreen}{r2 (сумма) += r7}@>
10000068: 11c5883a add r2,r2,r7
// <@\lh{dkgreen}{((r6 < 2) != false) ? переходим 0x9c}@>
1000006c: 18000b1e bne r3,zero,1000009c <checkSum+0x9c>
// <@\lh{dkgreen}{((r6 < 2) == false) ? r7 = array[1]}@>
<@\lh{blue}{10000070: 21c0008b ldhu}@> r7,2(r4) <@\label{line:unfoptldw2}@>
// <@\lh{dkgreen}{уменьшаем размер массива на 4}@>
// <@\lh{dkgreen}{r5 -= 4}@>
10000074: 297fff04 addi r5,r5,-4
// <@\lh{dkgreen}{временный регистр r3 = r5 (изменённый размер) < 2}@>
10000078: 28c00090 cmplti r3,r5,2
// <@\lh{dkgreen}{накапливаем прочитанный результат}@>
1000007c: 11c5883a add r2,r2,r7
// <@\lh{dkgreen}{((изменённый размер < 2) != false) ? переходим 0x9c}@>
10000080: 1800061e bne r3,zero,1000009c <checkSum+0x9c>
// <@\lh{dkgreen}{((изменённый размер < 2) == false) ? r3 = array[2]}@>
<@\lh{blue}{10000084: 20c0010b ldhu}@> r3,4(r4) <@\label{line:unfoptldw4}@>
// <@\lh{dkgreen}{r5 = изменённый на 0х74 размер массива != 4}@>
10000088: 29400118 cmpnei r5,r5,4
// <@\lh{dkgreen}{накапливаем прочитанный результат}@>
1000008c: 10c5883a add r2,r2,r3
// <@\lh{dkgreen}{((r5 != 4) != false) ? переходим 0x9c}@>
10000090: 2800021e bne r5,zero,1000009c <checkSum+0x9c>
// <@\lh{dkgreen}{((r5 != 4) == false) ? r3 = array[3]}@>
<@\lh{blue}{10000094: 20c0018b ldhu}@> r3,6(r4) <@\label{line:unfoptldw6}@>
10000098: 10c5883a add r2,r2,r3
// <@\lh{dkgreen}{аналогичные простому варианту функции манипуляции}@>
// <@\lh{dkgreen}{с проверкой адреса массива, длины массива с учётом}@>
// <@\lh{dkgreen}{роста стека функции в отрицательные адреса}@>
// <@\lh{dkgreen}{когда закончили с основным суммирующим циклом}@>
// <@\lh{dkgreen}{временный регистр r3 = (((длина массива) - 2) / 2)??!!}@>
// <@\lh{dkgreen}{r3 = r6 >> 1 (логическое)}@>
1000009c: 3006d07a srli r3,r6,1
// <@\lh{dkgreen}{странная манипуляция длиной массива и адресом, видимо,}@>
// <@\lh{dkgreen}{это связано с тем, что стек растёт отрицательно, поэтому}@>
// <@\lh{dkgreen}{адреса последних элементов имеют отрицательное смещение}@>
// <@\lh{dkgreen}{новый размер массива получаем из половины старого * -2}@>
// <@\lh{dkgreen}{r5 (длина) = r3 * (-2)}@>
100000a0: 197fffa4 muli r5,r3,-2
// <@\lh{dkgreen}{r3 += 1 (прибавили к размеру (половины массива) единицу)}@>
100000a4: 18c00044 addi r3,r3,1
// <@\lh{dkgreen}{судя по всему, получаем реальный размер оставшегося массива}@>
// <@\lh{dkgreen}{r3 += r3}@>
100000a8: 18c7883a add r3,r3,r3
// <@\lh{dkgreen}{к исходному адресу массива прибавляем его расчётный размер}@>
// <@\lh{dkgreen}{r4 += r3}@>
100000ac: 20c9883a add r4,r4,r3
// <@\lh{dkgreen}{r5 += r6}@>
100000b0: 298b883a add r5,r5,r6
// <@\lh{dkgreen}{r5 = r5 != 1}@>
100000b4: 29400058 cmpnei r5,r5,1
// <@\lh{dkgreen}{((r5 != 1) != false) ? переходим 0xd0}@>
100000b8: 2800051e bne r5,zero,100000d0 <checkSum+0xd0>
// <@\lh{dkgreen}{((r5 != 1) == false) ? производим финальные действия:}@>
// <@\lh{dkgreen}{приводим полученную сумму к размеру и битовую инверсию}@>
// sum += *(unsigned char *) addr;
// <@\lh{dkgreen}{в r3 записываем нулевой элемент массива r4 (полуслово, младшие 8 бит)}@>
<@\lh{red}{100000bc: 20c0000b ldhu}@> r3,0(r4)
// <@\lh{dkgreen}{накапливаем загруженный результат}@>
// <@\lh{dkgreen}{r2 += r3}@>
100000c0: 10c5883a add r2,r2,r3
// <@\lh{dkgreen}{переходим на 0х68}@>
100000c4: 00000206 br 100000d0 <checkSum+0xd0>
// while (sum >> 16) {
// sum = (sum & 0xffff) + (sum >> 16);
// }
// <@\lh{dkgreen}{маскируем младшие 16 битов}@>
100000c8: 10bfffcc andi r2,r2,65535
// <@\lh{dkgreen}{r2 += r3}@>
100000cc: 10c5883a add r2,r2,r3
// <@\lh{dkgreen}{r3 = r2 >> 16 (арифметическое)}@>
100000d0: 1007d43a srai r3,r2,16
// <@\lh{dkgreen}{((r2 >> 16) != false) ? переходим 0xc8}@>
<@\lh{red}{100000d4: 183ffc1e bne}@> r3,zero,100000c8 <checkSum+0xc8>
// <@\lh{dkgreen}{((r2 >> 16) == false) ? r2 = \textasciitilde(0 | r2)}@>
100000d8: 0084303a nor r2,zero,r2
// <@\lh{dkgreen}{выход из функции}@>
100000dc: f800283a ret
// <@\lh{dkgreen}{обнуляем регистр r2}@>
100000e0: 0005883a mov r2,zero
// <@\lh{dkgreen}{переходим на 0х54}@>
100000e4: 003fdb06 br 10000054 <checkSum+0x54>
\end{lstlisting}
В листинге \hrf{lst:optunf} развёрнутый цикл, описанный явно выделен \lh{dkgreen}{зелёным}. В развёрнутом цикле видно обращение по адресу массива со смещением 0, 2, 4 и 6 байт, соответственно. Основной цикл (для задания с явным развёртыванием цикла - это <<цикл добора>>) выделен в листингах \lh{blue}{синим}, причём в листинге \hrf{lst:optunf} очевидна развёртывающая оптимизация компилятора на строках \hrf{line:unfoptldw0}, \hrf{line:unfoptldw2}, \hrf{line:unfoptldw4}, \hrf{line:unfoptldw6} (выделены \lh{blue}{синим}) следует загрузка значений из массива с последующим сдвигом указателя на исходный массив и суммированием прочитанных значений с промежуточным значением суммы (регистр \code{r2}), дополнительные комментарии представлены в листинге.
Дополнительно были отслежены изменения вспомогательных регистров (для мгновенного расчёта адреса чтения из массива по окончании работы развёрнутого цикла)
\begin{lstlisting}[language=C,style=CCodeStyle]
r4=array& 1000
r5=size 100
00 r2=r5<9 false
04 r2==0
08 r9=20-9 91
0c r9>>=3 11
10 r2=0 0
14 r8=r9+1 12
18 r8<<=3 96
1c r8+=r4 1096
20 c=================
24 c
28 l
2c e
30
34 u
38 n
3c f
40 l
44 d=================
48 r9*=-8 -88
4c r5-=8 92
50 r5+=r9 4
\end{lstlisting}
\section*{Часть II.}
\addcontentsline{toc}{section}{Часть II.}
\subsection*{Задание}
Во второй части работы требовалось изучить отчёт профилировщика, сохранить иерархию вызовов функции main и начало таблицы <<плоского>> профиля. На примере реализованной функции обработки данных в части I определить с помощью Performance Counter, какой оверхед (накладные расходы) в циклах вносит вызов функции \code{mcount} в выполнение функции. Изучите ассемблерный код и найдите в нем вызов функции \code{mcount}. Результаты сохраните в отчет.
\subsection*{Проделанная работа}
Согласно показаний Performance Counter (рис. \hrf{pic:pcpt2}) функция подсчёта контрольной суммы без подключенного профайлера выполнялась в среднем 843.434 микросекунд, а с вызовом \code{mcount} 863.816, то есть на $\approx$20 мкс больше.
\begin{figure}[H]
\centering
\includegraphics[width=9cm]{01-ess-lab-02-counter.png}
\caption{Показания Performance Counter для вызовов функции со включенным профилировщиком}
\label{pic:pcpt2}
\end{figure}
В листинге \hrf{lst:gprofrpt} приведены первые строки плоского профиля выполнения программы, демонстрирующие, что программа находилась 93\% времени в функции \code{main}, то есть, выполняла работу основного цикла (прямые вызовы функции подсчёта контрольной суммы).
\begin{lstlisting}[frame=single, basicstyle={\tiny\ttfamily}, caption=Начало отчёта плоского профиля, label={lst:gprofrpt}, numbers=left, numberstyle=\tiny\color{gray}]
Flat profile:
Each sample counts as 0.001 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
93.26 13.78 13.78 1 13.78 14.14 main
6.47 14.74 0.96 4 0.24 0.24 altera_avalon_jtag_uart_close
0.21 14.77 0.03 1 0.03 0.03 _exit
0.01 14.77 0.00 14 0.00 0.00 __sfvwrite_r
0.01 14.77 0.00 5 0.00 0.00 altera_avalon_jtag_uart_write
0.01 14.77 0.00 28 0.00 0.00 __muldf3
0.01 14.77 0.00 3 0.00 0.00 _fflush_r
\end{lstlisting}
В листинге \hrf{lst:gprofassemble} отмечен \lh{red}{красным} вызов функции \code{mcount}. Интересно, что адрес функции (\code{0000ddfc <\_mcount>:}) считается налету с применением временного регистра.
\begin{lstlisting}[frame=single, basicstyle={\tiny\ttfamily}, caption=Начало отчёта плоского профиля, label={lst:gprofassemble}, numbers=left, numberstyle=\tiny\color{gray}]
10000000 <checkSum>:
10000000: f811883a mov r8,ra
//<@\lh{black}{уходим считать адрес вызова}@>
<@\lh{red}{10000004: 00000f40 call}@> 100000f4 <checkSum+0xf4>
10000008: 403f883a mov ra,r8
1000000c: 28800250 cmplti r2,r5,9
// ...
// ...
// ...
100000ec: 0005883a mov r2,zero
100000f0: 003fdb06 br 10000060 <checkSum+0x60>
// <@\lh{black}{записали 1 в старший разряд временного регистра (at = 65536)}@>
100000f4: 00400074 movhi at,1
// 65536 - 8708 = 0xDDFC
100000f8: 08777f04 addi at,at,-8708
// <@\lh{black}{перемещаемся по адресу 0xddfc}@>
<@\lh{red}{100000fc: 0800683a jmp at}@>
// ...
// ...
// ...
ddf8: f800283a ret
<@\lh{red}{0000ddfc <\_mcount>:}@>
* of values for bits 4:2 won't be even (aligning on cache line boundaries
* will skew it). Higher bits should be fairly random.
\end{lstlisting}
\newpage
\appendix
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Alph{subsection}}
\subsection{Снимки экрана с отчётом Performance Counter}
\label{appendix:isrtime}
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-ess-lab-02-notcmnoopt.png}
\includegraphics[width=8cm]{01-ess-lab-02-notcmnoopt10.png}
\includegraphics[width=8cm]{01-ess-lab-02-notcm2opt.png}
\includegraphics[width=8cm]{01-ess-lab-02-notcm2opt10.png}
\includegraphics[width=8cm]{01-ess-lab-02-notcmszopt.png}
\includegraphics[width=8cm]{01-ess-lab-02-notcmszopt10.png}
\columnbreak
\includegraphics[width=8cm]{01-ess-lab-02-tcmnoopt.png}
\includegraphics[width=8cm]{01-ess-lab-02-tcmnoopt10.png}
\includegraphics[width=8cm]{01-ess-lab-02-tcm3opt.png}
\includegraphics[width=8cm]{01-ess-lab-02-tcm3opt10.png}
\includegraphics[width=8cm]{01-ess-lab-02-tcmszopt.png}
\includegraphics[width=8cm]{01-ess-lab-02-tcmszopt10.png}
\end{multicols}
\caption{Оригинальные терминальные сообщения Performance Counter}
\end{figure}
\subsection{Показания Performance Counter для подсчёта контрольной суммы}
\label{appendix:checksumTime}
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-ess-lab-02-100udpnosim.png}
\includegraphics[width=8cm]{01-ess-lab-02-100udpnounf.png}
\columnbreak
\includegraphics[width=8cm]{01-ess-lab-02-100udpo3sim.png}
\includegraphics[width=8cm]{01-ess-lab-02-100udpo3unf.png}
\end{multicols}
\caption{Performance Counter для вызова функции checkSum}
\end{figure}
\subsection{Показания Performance Counter для подсчёта контрольной суммы массивов разного объёма}
\label{appendix:udpMemory}
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-ess-lab-02-025udpo3sim.png}
\includegraphics[width=8cm]{01-ess-lab-02-050udpo3sim.png}
\includegraphics[width=8cm]{01-ess-lab-02-100udpo3sim.png}
\includegraphics[width=8cm]{01-ess-lab-02-200udpo3sim.png}
\columnbreak
\includegraphics[width=8cm]{01-ess-lab-02-025udpo3unf.png}
\includegraphics[width=8cm]{01-ess-lab-02-050udpo3unf.png}
\includegraphics[width=8cm]{01-ess-lab-02-100udpo3unf.png}
\includegraphics[width=8cm]{01-ess-lab-02-200udpo3unf.png}
\end{multicols}
\caption{Performance Counter для подсчёта контрольной суммыразного объёма данных}
\end{figure}
\begin{lstlisting}[language=C,style=CCodeStyle,caption=Функция расчёта времени выполнения одной итерации цикла]
double count(int datagram_size, double total_time_spent, int actions_in_iteration) {
return (total_time_spent
/ 99.0 // function calls
/ ((datagram_size * 2) // typecast elements
/ actions_in_iteration)) // 1 for simple 4 for unfolded
* 1000000; // seconds to microseconds
}
\end{lstlisting}
\end{document}

1105
01-ess-lab-03-report.tex Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,664 @@
\documentclass[russian]{beamer}
\usepackage{multicol}
\usepackage{babel}
\usepackage{fontspec}
\input{../fancy-listings-preamble}
\makeatletter
\def\beamer@framenotesbegin{% at beginning of slide
\usebeamercolor[fg]{normal text}
\gdef\beamer@noteitems{}%
\gdef\beamer@notes{}%
}
\makeatother
\setbeamertemplate{note page}{\pagecolor{yellow!5}\insertnote}
\setbeameroption{show notes on second screen=right}
\usetheme{Madrid}
\usecolortheme{seahorse}
\setmainfont{PT Astra Serif}
\setsansfont{PT Astra Serif}
\title{Краткий обзор стандартов кодирования}
\author{Иван Игоревич Овчинников}
\institute[МГТУ]{МГТУ им. Н.Э.Баумана}
\date{2021}
\begin{document}
\frame{\titlepage}
\note{Многое из этого уже было сказано на лекциях и семинарах, например, об ассемблерных вставках и оптимизациях кода, развёртывании циклов и прочих интересностях, но говоря о стандартах нельзя не сказать как об их месте в общем процессе создания кода, так и о выборе языка программирования в целом}
\begin{frame}
\frametitle{Введение (K\&R, C++)}
"Язык C - это \alert{инструмент}, острый как бритва, с его помощью можно создать как элегантную программу, так и \alert{кровавое месиво}." \space Брайан Керниган
\vspace{0.5cm}
"Whenever a C++ compiler is used, appropriate compiler options shall be set to \alert{restrict the language} to the selected version of ISO C." \space Barr C standard, 2008, General rule 1.1b
"Limited dependence should be placed on C++ operator procedure rules in expressions" \space MISRA-CPP, Rule 5-0-2
\vspace{0.5cm}
\begin{block}{Интересный факт}
Часто С == С++, но не для встраиваемых систем. На сложные ООП конструкции здесь часто не хватает места. Работа, например, виртуальных функций может выходить за пределы требований реального времени.
\end{block}
\end{frame}
\note{Во первых, о языках, поскольку выбор компании может пасть на что-то вроде RUST. Желательно, относиться к языкам программирования именно как к инструментам, а не как к науке. Такое отношение формирует понимание того, что язык программирования выбирается под задачи, а не наоборот. Так язык программирования С зарекомендовал себя во встраиваемых системах. Часто именно в этой области уделяется особенное внимание размеру программы и скорости её работы. Часто нет возможности применить специфичные конструкции, вроде виртуальных функций ООП, лямбда выражений итд. Несмотря на это, обычно упоминая С подразумевается С++ и наоборот, особенно в контексте ПОВС, поскольку в рамках кода на С++ можно писать конструкции из С и компиляторы С++ почти без изменений умеют компилировать С код. На слайде мы видим правила говорящее о том, что С++ нужно всегда ограничивать до С.}
\begin{frame}
\frametitle{Просто код (ISO)}
Формальное описание того, что должен писать программист, чтобы компилятор понял, что нужно сделать:
\begin{itemize}
\item операторы,
\item операнды,
\item ключевые слова,
\item зарезервированные слова
\end{itemize}
\begin{block}{Интересный факт}
Следующий после С++03 был стандарт С++11, и изменения в стандарте были настолько масштабными, что считается, что это совершенно новый язык программирования. В отличие от С99 и С11, основное отличие которых - добавление поддержки Unicode.
\end{block}
\end{frame}
\note{Язык С, как и другие стандартизирован. Стандартов С/С++ несколько, сейчас они выпускаются с некоторой периодичностью, чтобы изменений было не так много. Стандарты языка описывают то, как синтаксически должна выглядеть программа. То есть, фактически, какие есть операторы в языке, списки зарезервированных слов, где и какие должны находиться скобки и специальные символы. Получается, что это документ, который описывает для программиста то, как его будет понимать компилятор. Новые стандарты языка выпускаются чтобы улучшить язык программирования, облегчить его использование программистом, дать программисту возможность писать меньше кода и получать лучший результат. Сами стандарты платные, но в сети довольно много драфтов, выпущенных буквально за недели до платного релиза.
С ISO 1990/COR2:1996, 1999/COR3:2007, 2011/COR1:2012, 2018
ISO-C++ 1996 1998 2003, C++2005, C++11, C++14, C++17, C++20
}
\begin{frame}
\frametitle{Чистый код (Clang Tidy)}
Следит за тем, чтобы программист соблюдал последние стандарты, писал чистый, однозначный и понятный код
\vspace{2cm}
\begin{block}{Интересный факт}
GNU пытались сделать свой статический анализатор чистоты кода, но решили использовать внутри GCC clang-tidy.
\end{block}
\end{frame}
\note{Напрямую не касается ни стандартов, ни оптимальности скомпилированного кода. Часто, за чистотой кода следит статический анализатор, встроенный в транслятор языка, но бывают случаи, когда такие анализаторы поставляются в виде отдельных плагинов к IDE. Для прикладного программирования нельзя не упомянуть об IDE CLion от питерской команды JetBrains, поскольку их анализатор кода значительно дополняет набор стандартных предупреждений компилятора. Для встраиваемых систем эти вопросы закрываются плагинами к IAR, Keil, Eclipse и другим. Также частично этот функционал закрывается анализатором кода у сборщиков проектов make, ninja, cmake, qmake, qbs}
\begin{frame}
\frametitle{Надёжный код (PRQA HIC, MISRA, Barr C, CERT C)}
"Always code as if the person who ends up maintaining your code is a violent psychopath who knows where you live." (С) Martin Golding
\vspace{1cm}
Для embedded наиболее интересны MISRA и Barr C (Embedded C Coding Standard, ECCS).
\vspace{1cm}
\begin{block}{Интересный факт}
ECCS изначально - это разработка одного человека, Майкла Барра. Практикующий программист, работа которого превратилась в стандарт для разработки встраиваемого ПО.
\end{block}
\end{frame}
\note{ДСК тесно связаны не столько с работоспособностью, сколько с оптимизациям и предотвращением UB. Programming Research Quality Assurance High Integrity C, Barr group Embedded C Coding Standard, Motor Industry Software Reliability Association, Computer Emergency Readiness Team. По сути, это сборники заметок программистов, желающих предотвратить танцы на граблях, поэтому стандарты ссылаются на заметки Кернигана, Ритчи, Скотта Мейерса, Страуструпа, и другие. Эти стандарты в первую очередь стремятся предотвратить несчастные случаи по вине ПО. Как утверждает стандарт Барр С - если вы разрабатываете программы, которые могут убить или навредить одному или более человек, MISRA C чрезвычайно важны и должны стать частью вашего внутреннего стандарта написания кода. ДСК говорят не только о том, что и как не нужно делать, но и объясняют почему, иногда снабжая читателя соответствующими примерами хорошего кода}
\begin{frame}[fragile]
\frametitle{Зачем это мне?}
Дополнительные стандарты объясняют, что не нужно делать и почему.
\begin{itemize}
\item Identifiers in inner scope shall not hide identifiers declared in outer scope (MISRA-C 2-10-2, HIC 3.1.1)
\item Magic numbers shall not be used as the initial value or in the endpoint test of a loop (ECCS 8.4a, HIC 5.1.1)
\end{itemize}
\begin{alert}{Например:}
\begin{lstlisting}[language=C,style=CCodeStyle]
int16_t i;
{
int16_t i;
i = 3;
}
void fn(int16_t i) {
for (int i = 0; i < 100; ++i) { ... }
}
\end{lstlisting}
\end{alert}
\end{frame}
\note{Помимо того, что такие, ДСК избавляют ваш код от ошибок, они ещё и значительно сокращают время, затрачиваемое на внесение правок в давно забытые проекты}
\begin{frame}[fragile]
\frametitle{Зачем это мне?}
Часто это касается не только языков С/С++
\begin{itemize}
\item Do not use tab characters in source files (HIC 2.1.1, ECCS 3.5a)
\item Do not comment out code (HIC 2.3.2, MISRA-C 2-7-2)
\item Ensure that each identifier is distinct from any other visible identifier (HIC 2.4.1, MISRA-C 2-10-1)
\end{itemize}
\begin{alert}{Например:}
\begin{lstlisting}[language=C,style=CCodeStyle]
int32_t he1lo; //Non-compilant
int32_t hel1o;
void FOO() {
int32_t world; //Compilant: 'wor1d' not visible
}
void BAR() {
/* int32_t wor1d; */
}
\end{lstlisting}
\end{alert}
\end{frame}
\note{Самое очевидное - это синтаксические нормы, которые позволят коду выглядеть одинаково у всех и с любыми шрифтами, повысить его читаемость и радость коллег от хорошего стиля}
\begin{frame}[fragile]
\frametitle{Что делать?}
Используйте паттерны, безопасные конструкции, новые стандарты.
\begin{itemize}
\item Use RAII for resources (HIC 3.4.3)
\end{itemize}
\begin{alert}{Например:}
\begin{lstlisting}[language=C,style=CCodeStyle]
void foo_v1() {
int32_t * p = new int32_t;
// if exception is thrown, resource is never freed
std::unique_ptr<int32_t> p(new int32_t());
// resource freed by unique_ptr template
}
void add1 (int32_t val) {
mut.lock();
lst.push_back(val); // If throws an exception
mut.unlock(); // 'unlock' will never be called
}
void add2 (int32_t val) {
// Compliant: Using guard guarantees unlocking
std::lock_guard<std::mutex> lock(mut);
lst.push_back(val); // May throw an exception
}
\end{lstlisting}
\end{alert}
\end{frame}
\note{На минутку заглянем в мир С++, использование паттерна RAII (Resource Acquision Is Initialization, Получение ресурса есть инициализация) смысл которого заключается в том, что с помощью тех или иных программных механизмов получение некоторого ресурса неразрывно совмещалось с инициализацией, а освобождение — с уничтожением объекта. Напоминает по структуре работу с паттерном Синглтон. Суть в том, что следует либо передавать работу по управлению ресурсами операционной системе, либо обновлённым языковым конструкциям, как это показано в первой части примера. С понятием мьютекса мы уже знакомы, поэтому второй пример не потребует хначительных усилий: мы видим, что следует внимательно относиться к высвобождению информации в потоке, поскольку, например, освобождение мьютекса может никогда не произойти}
\begin{frame}[fragile]
\frametitle{Что делать?}
Внимательно относитесь к целочисленным переменным
\begin{itemize}
\item Ensure that data loss does not demonstrably occur in an integral expression (HIC 4.2.2, 5.4)
\item Ensure that integer conversions do not result in lost or misinterpreted data (CERT 5.2)
\item Rules. Expressions. General (MISRA-CPP 6.5.0)
\end{itemize}
\begin{alert}{Например:}
\begin{lstlisting}[language=C,style=CCodeStyle]
uint32_t inv_mult ( uint32_t a, uint32_t b) {
//if ((b != 0) && (a > (UINT_MAX / b))) // Compliant
// throw std::range_error("overflow"); // if added
return ((0 == a) || (0 == b)) ? UINT_MAX
: (1000 / (a * b)); // Non-Compliant: potential div by zero
}
void foo () {
uint32_t v = u >> 8U; // Non-Compliant: always 0
v <<= 32U; // Non-Compliant: undefined behavior
v = 0xF1234567U << 1; // Non-Compliant: MSB is lost
}
\end{lstlisting}
\end{alert}
\end{frame}
\note{Важным аспектом языка является его строгая типизация и как следствие преобразование типов, потери данных при таком преобразовании и потери данных при определённых операциях. В первом примере, не считая закомментированного кода, мы видим, что недостаточно просто проверять некоторые переменные на ноль, поскольку их умножение также очевидно может дать ноль. Во втором примере представлено несколько случаев потери данных из-за неопределённого поведения и сдвигов за пределы хранения переменных. В ПОВС такие операции требуют особого внимания из-за частого применения типов меньших, чем привычные инты, даблы и так далее. Важной ремаркой о целых числах будет то, что указатель - это беззнаковое целое число, хранящее адрес чего бы то ни было, но никогда нельзя путать целые числа с указателями, эти два типа данных внутри языка работают по-разному и к ним применимы разные действия}
\begin{frame}[fragile]
\frametitle{На что обратить внимание?}
Внимательно относитесь к переменым с плавающей точкой
\begin{itemize}
\item Floating point conversions (HIC 4.3)
\item Floating point conversions (MISRA-CPP 5-0-5, -6, -7)
\item Floating point (CERT 6)
\item Floating point (ECCS 5.4)
\end{itemize}
\begin{alert}{Например:}
\begin{lstlisting}[language=C,style=CCodeStyle]
float f (1.0); // Non-Compliant, data loss
double d (1.0L); // Non-Compliant
long double ld (1.0); // Compliant, but not good practice
f = ld; // Non-Compliant
d = ld; // Non-Compliant
f = d; // Non-Compliant
ld = static_cast<float32_t>(f / d); // Non-Compliant
for (float x = 0.1f; x <= 1.0f; x += 0.1f) {} // Don't
\end{lstlisting}
\end{alert}
\end{frame}
\note{Также ДСК утверждают, что следует внимательно относиться и к преобразованиям типов с плавающей точкой, особенно в С++, где некоторые языковые конструкции могут оказаться небезопасными. Также не следует использовать числа с плавающей запятой в качестве счётчиков циклов и неявно преобразовывать целочисленные переменные к нецелочисленным и наоборот. В стандартах этой работе посвящены целые разделы, поэтому здесь будут приведены только самые плохие варианты того какне нужно делать}
\begin{frame}[fragile]
\frametitle{На что обратить внимание?}
Никогда не пытайтесь сравнивать числа с плавающей точкой на равенство (касается всех языков программирования)
\begin{itemize}
\item Floating point to yield exact results (HIC 5.7.2, MISRA-CPP 6-2-2, CERT 6.5, ECCS 5.4b-iv)
\end{itemize}
\begin{alert}{Например:}
\begin{lstlisting}[language=C,style=CCodeStyle]
float f0 = 0.1f;
float f1 = 0;
for (int j = 0; j < 10; ++j)
f1 += 0.01;
std::cout << "f0 = " << f0 << ", f1 = " << f1 << "\n"
<< std::boolalpha << (f0 == f1) << " "
<< (std::fabs(f0 - f1) < 0.0000001) << "\n";
\end{lstlisting}
\begin{verbatim}
f0 = 0.1, f1 = 0.1
false true
\end{verbatim}
\end{alert}
\note{Отдельно хочется сказать про правило прямого сравнения чисел с плавающей точкой, особенно часто оно нарушается новичками в прикладном программировании, где компилятор прощает программисту очень и очень многое, поэтому никто особенно внимательно не следит за происходящим "под капотом". Я тут накидал некоторый код и представил его вывод, который, как я думаю, скажет сам за себя, почему произошло то, что произошло. Как видим прямое сравнение на равенство даёт ложь, надо сказать, что есть исчезающе малое количество случаев, в которых это сравнения даст истинный результат, но эти случаи невозможно спрогнозировать. Такая особенность связана с тем, что числа, как вы возможно знаете, хранятся не в чистом бинарном виде, а разделённые на мантиссу, экспоненту и порядок, поэтому сравнивать их всегда нужно с каким-то допустимым значением погрешности}
\end{frame}
\begin{frame}[fragile]
\frametitle{Меня это не касается, наверное?}
Никогда не пытайтесь сравнивать числа с плавающей точкой на равенство (касается всех языков программирования)
\begin{alert}{Например:}
\begin{lstlisting}[language=Python]
Python 3.9.1 (v3.9.1, Dec 7 2020, 12:10:52)
>>> f0 = 0.1
>>> f1 = 0.0
>>> for i in range(10):
... f1 += 0.01
...
>>> f1 == f0
False
>>> f1
0.09999999999999999
>>> f0
0.1
>>>
\end{lstlisting}
\end{alert}
\end{frame}
\note{Если вы думаете, что вы будете писать на всепрощающем Python и вас это не коснётся, у меня для вас плохие новости}
\begin{frame}[fragile]
\frametitle{Оператор выбора тоже не так прост?}
Обращайте внимание на то, как организован выбор между выражениями
\begin{itemize}
\item A switch statement shall be well-formed to reduce complexity (ECCS 8.2, CERT 3.8, MISRA-CPP 6-4-3, HIC 6.1)
\end{itemize}
\begin{alert}{Например:}
\begin{lstlisting}[language=C,style=CCodeStyle]
switch (i) {
int j = 4; // Non-Compliant
f(j); // Non-Compliant
case 0: // Compliant
case 1:
++i;
break ;
case 2: // Non-Compliant
++i;
default:
break;
}
\end{lstlisting}
\end{alert}
\end{frame}
\note{Оператор выбора всегда может быть заменён на серию иф-элсов. Обращайте внимание на падение через кейсы, читаемость оператора и отсутствие действий вне кейсов. Также важно, что при использовании некоторых компиляторов (в основном старых версий), особенно старых версий кейсы могут восприниматься операторами goto как лейблы для перехода}
\begin{frame}[fragile]
\frametitle{Я могу доверять тому, что пишут в учебниках?}
Не используйте ключевое слово using namespace,
\begin{itemize}
\item Do not use using directives (MISRA-CPP 7-3-4, -5, -6, HIC 7.3.1)
\end{itemize}
\begin{alert}{Например:}
\begin{lstlisting}[language=C,style=CCodeStyle]
# include <iostream>
using namespace std; // Non-Compliant
using std::cout; // Compliant
namespace NS {
int32_t i1;
int32_t j1;
int32_t k1;
}
using namespace NS; // Non-Compliant
using NS::j1; // Compliant
\end{lstlisting}
\end{alert}
\end{frame}
\note{Пространства имён - это важный инструмент разделения идентификаторов, но использоваание using namespace полностью нивелирует его пользу. Да, в простых проектах можно использовать полные пространства имён для сокращения количества написанного кода, но в большом проекте это может привести к конфликтам идентификаторов, которые как раз и должны разрешаться пространствами имён. Несмотря на то, что в любой книге по С++ это популярный способ написания кода, на практике лучше использовать расширение области видимости только конкретных переменных, объектов и функций, а не неймспейсов целиком}
\begin{frame}[fragile]
\frametitle{Что с функциями и макросами?}
Будьте внимательны к макросам, функциям и параметрам
\begin{itemize}
\item Do not use default arguments (HIC 8.3.3)
\item Function-like macros shall not be defined (MISRA-CPP 16-0-4, -5, -6)
\item Avoid side effects in arguments to unsafe macros (CERT 2.2 PRE31-C)
\item Function-Like Macros (ECCS 6.3)
\end{itemize}
\begin{alert}{Например:}
\begin{lstlisting}[language=C,style=CCodeStyle]
void foo (int32_t i, int32_t j = 0); // Non-Compliant
void bar (int32_t i, int32_t j); // Compliant
inline void bar (int32_t i) { bar(i, 0); }
// Non-Compliant or unsafe, depends on macro call
#define ABS(x) (((x) < 0) ? -(x) : (x))
// Compliant
static inline int ab(int x){return (((x) < 0) ? -(x) : (x));}
\end{lstlisting}
\end{alert}
\end{frame}
\note{Нежелательно использовать большое количество параметров функций. Это связано не только с архитектурой используемого процессора и количеством его регистров, но это также индикатор плохого дизайна. Помимо этого, такие функции сложно поддерживать и тестировать. При использовании функций также желательно стараться не использовать значения по-умолчанию по той же причине: тяжесть поддержки и неочевидность при описании функции. Лучше использовать перегрузку функций. Отдельно стоит сказать о макрофункциях, их почти всегда можно заменить на инлайн или просто функцию. Макрос - это работа с текстом программы и его качество сильно зависит от способа как написания макроса так и его вызова, а функции - это то, что может и должно быть оптимизировано компилятором. Работа с макросами сопряжена с рисками и явных причин использовать их в коде встраиваемых систем чаще всего нет}
\begin{frame}[fragile]
\frametitle{Что-то ещё о функциях?}
Некоторые механики, например функции с переменным числом аргументов или рекурсию, лучше не использовать
\begin{itemize}
\item Use variadic templates rather than an ellipsis (HIC 14.1.1)
\item The features of <stdarg.h> shall not be used (MISRA-C 17.1)
\item Functions shall not call themselves (MISRA-CPP 7-5-4, HIC 5.2.2)
\item A prototype shall be declared for each public function (ECCS 6.2b)
\end{itemize}
\begin{alert}{Например:}
\begin{lstlisting}[language=C,style=CCodeStyle]
int32_t foo (int32_t v, ...) {// Non-Compliant: variadic
if (a(v))
return e (v);
else if (b(v))
return foo(f(v), NULL); // Non-Compliant: tail recursion
}
// Compliant: variadic template function prototype
template < typename First , typename ... Rest >
void foo ( First const & v, Rest const & ... args );
\end{lstlisting}
\end{alert}
\end{frame}
\note{Во всех учебниках по языкам С и С++ говорится о возможностях языка, таких как переменное число аргументов или возможность рекурсивного вызова функций. Для макросов, работающих с переменным числом аргументов даже выпускают новые стандарты, С++11 например обновил механики, сделав их значительно стабильнее. Для переменного числа аргументов рекомендуется использовать шаблоны С++, они считаются безопасной с точки зрения типизации альтернативой. Рекурсия же во встраиваемых системах с большей долей вероятности приведёт к переполнению стека, чем в прикладном ПО. Также важно, что у каждой функции, доступной глобально должен быть описан прототип, во избежание дублирования описания во время линковки единиц трансляции}
\begin{frame}[fragile]
\frametitle{Хотя бы с классами всё в порядке?}
Описывает best practices при работе с классами
\begin{itemize}
\item Use static if not using object, use const if not modifying (HIC 9.1.1)
\item Make default arguments the same or absent when overriding (HIC 9.1.2)
\end{itemize}
\begin{alert}{Например:}
\begin{lstlisting}[language=C,style=CCodeStyle]
class C {
int32_t m_c;
int32_t m_i;
public:
int32_t foo () { // Non-Compliant: should be static
C tmp(0); return tmp.bar();
}
int32_t bar () { // Non-Compliant: should be const
++ m_c; return m_i;
}
int const & get () const { // Compliant
return m_i;
}
};
\end{lstlisting}
\end{alert}
\end{frame}
\note{
ДСК возводят некоторые пункты учебных пособий до обязательных к исполнению норм, например, использование модификаторов static и const, так все не виртуальные функции должны быть статическими, а не изменяющие видимое состояние объекта - константными. ДСК также призывают программиста чаще использовать константность при возвращении ссылок на члены класса}
\begin{frame}[fragile]
\frametitle{Классы и наследование}
Внимаьельно относитесь к синтаксису наследования и полиморфизма
\begin{itemize}
\item A base class shall be declared virtual in diamond hierarhy (MISRA-CPP 10-1-2, HIC 10.1.1)
\item Use the override identifier when overriding a function (HIC 10.2.1)
\end{itemize}
\begin{alert}{Например:}
\begin{lstlisting}[language=C,style=CCodeStyle]
class A {
public:
virtual void f(<@\texttt{\textcolor{red}{int64\_t}}@>);
};
// class A_left: public A {}; // Non-Compliant
// class A_right: public A {};
class A_left: public virtual A {}; // Compliant
class A_right: public virtual A {};
class B : public A_left, public A_right {
public:
void f(<@\texttt{\textcolor{red}{int32\_t}}@>) override; //Compilant: compile error
};
\end{lstlisting}
\end{alert}
\end{frame}
\note{В вопросе с наследованием ДСК не открывают ничего нового, но дополнительно указывает на необходимость разрешения ситуаций с так называемым алмазом смерти, ситуацией, в которую мы можем попасть в языках, разрешающих множественное наследование. На слайде мы также видим явную причину использования допонительного ключевого слова override, без него полиморфизм тоже работает, но с ним надёжнее, если вдруг мы не переопределим. а перегрузим функцию, у нас возникнет ошибка компиляции.}
\begin{frame}[fragile]
\frametitle{Как обезопасить данные?}
Скрупулёзное следование правилам инкапсуляции - путь к успеху
\begin{itemize}
\item Declare all data members private (HIC 11.1.1, MISRA-CPP 11-0-1)
\item Do not use friend declarations (HIC 11.2.1)
\end{itemize}
\begin{alert}{Например:}
\begin{lstlisting}[language=C,style=CCodeStyle]
class D {
public:
D ();
std::string m_id; // Non-Compliant
std::string const& getId () const { //here we can assert
return m_id; }
friend D const operator+ (D const&, D const& lhs); // Non
D& operator += (D const& other);
private:
std::string m_id; // Compliant
};
D const operator+= (D const& rhs, D const& lhs){ // Compliant
D result (rhs); result += (lhs); return result;
}
\end{lstlisting}
\end{alert}
\end{frame}
\note{В целом, довольно понятно, что инкапсуляция нужна для защиты данных, но в отличие от ядерной физики, её несоблюдение не наказывает программиста сразу, а иногда наказывает даже не самого программиста, а тех, кто вынужден поддерживать его код. Так MISRA фокусирует внимание приватности полей, а, например, HIC не только уточняет необходимость описания полей класса приватными, тут всё понятно, чем приватнее, тем лучше, исключение составляют только С-шные структуры, объявленные в рамках ключевого слова extern. Но ещё и делает упор на неиспользование friend функций, так как они значительно ухудшают инкапсуляцию и снижают понятность кода. Исключением в части использования дружественных функций считается только использование их в качестве реализации паттерна <<фабричный метод>>. }
\begin{frame}[fragile]
\frametitle{Конструкторы и деструкторы}
Неявное преобразование типов - это нехорошо.
\begin{itemize}
\item Do not declare implicit user defined conversions (HIC 12.1.1, MISRA-CPP 12-1-3)
\end{itemize}
\begin{alert}{Например:}
\begin{lstlisting}[language=C,style=CCodeStyle]
class C {
public:
C(const C&); // Compliant: copy constructor
C(); // Compliant: default constructor
C(int32_t, int32_t); // Compliant: more than one argument
explicit C(int32_t); // Compliant
C(double); // Non-Compliant
C(float f, int32_t i = 0); // Non-Compliant
C(int32_t i = 0, float f = 0.0); // Non-Compliant: default constructor, but also a conversion constructor
operator int32_t() const; // Non-Compliant
explicit operator double() const; // Compliant
};
\end{lstlisting}
\end{alert}
\end{frame}
\note{Переопределяя операторы классов или в конструкторах класса, принимающих один аргумент происходит неявное преобразование типов, ведь при вызове конструктора мы, на вход подаём значение одного типа, а создаём объект другого типа. Все такие функции (операторы и конструкторы) лучше объявлять с ключевым словом explicit, которое запрещает неявное преобразование типов. Кстати, со введением в С++11 универсальной инициализации через фигурные скобки, это касается не только конструкторов с одним параметром.}
\begin{frame}[fragile]
\frametitle{Перегрузка операторов}
В каждом учебнике по С++ говорится о такой возможности
\begin{itemize}
\item Do not overload operators with special semantics (HIC 13.2.1, MISRA-CPP 5-2-11)
\item Comma operator shall not be used (MISRA-CPP 5-18-1)
\item Ensure return type of an operator matches the built-in counterparts (HIC 13.2.2)
\end{itemize}
\begin{alert}{Например:}
\begin{lstlisting}[language=C,style=CCodeStyle]
class A {
public:
bool operator && (A const&); // Non-Compliant
bool operator || (A const&, A const&); // Non-Compliant
A operator , (A const&, A const&); // Non-Compliant
A operator + (A const&, A const&); // Compliant
const A operator - (A const&, A const&); // Non-Compliant
A& operator | (A const&, A const&); // Non-Compliant
bool operator == (A const&, A const&); // Compliant
int32_t operator < (A const&, A const&); // Non-Compliant
};
\end{lstlisting}
\end{alert}
\end{frame}
\note{Перегруженный оператор - это просто функция, поэтому и выполняется с приоритетом функций, к этому факту желательно отнестись с максимальной осторожностью, поскольку порядок выполнения аргументов функции не определён ни стандартом, ни компиляторами. Особенно важно это для логических операторов ИЛИ и И, поскольку в них порядок выполнения как раз определён - слева направо. А оператор запятой лучше вообще не использовать никогда, как утверждает MISRA, хотя там тоже порядок выполнения слева направо. Возвращать переопределённые операторы должны тоже, что вернули бы не переопределённые, на слайде мы видим несколько примеров того, как не следует делать.}
\begin{frame}[fragile]
\frametitle{Обработка исключений}
Исключительные ситуации
\begin{itemize}
\item Only use instances of \texttt{std::exception} for exceptions (HIC 15.1.1)
\item Class-type exceptions caught by reference (MISRA-CPP 15-3-5)
\item Exceptions used for error handling (MISRA-CPP 15-0-1)
\end{itemize}
\begin{alert}{Например:}
\begin{lstlisting}[language=C,style=CCodeStyle]
try {
if (0 == foo()) {
throw -1; // Non-Compliant
throw std::runtime_error ("unexpected condition"); // Compliant
}
} catch (std::exception const & e) {
std::cerr << e.what ();
} catch (std::exception e) { // Non-Compliant
//...
}
\end{lstlisting}
\end{alert}
\end{frame}
\note{Как мы помним, при раработке ПОВС на С++ желательно сокращать язык до подмножества С99, но всё же, если мы взялись использовать шаблоны и исключения, желательно использовать самые новые механики, так, например, в С++11 и старше стали добавлять довольно много наследников класса std::exception, которые должны покрывать довольно много ситуаций, в которых что-то идёт не так. А когда мы ловим объект исключения он должен быть пойман по константной ссылке, это полностью повторяет сказанное в учебниках. Но, есть также и пункт 13.1.4.2 4го издания Языка программирования С++ Бьёрна Страуструпа, который говорит, что можно использовать связку throw-try-catch и в штатных ситуациях, которому полностью противоречит правило MISRA-CPP 15-0-1 утверждающее, что надо эти ключевые слова нужно использовать только для описания ошибок}
\begin{frame}[fragile]
\frametitle{Что-то, что не касается языка напрямую?}
Использование препроцессора
\begin{itemize}
\item All uses of \texttt{\#pragma} shall be documented (MISRA-CPP 16-6-1)
\item Use include guards, and include header files with include guards (HIC 16.1.1, MISRA 16-2-3)
\end{itemize}
\begin{multicols}{2}
\includegraphics[width=5cm]{pics/00-ped-01-pragma.png}
\columnbreak
\begin{lstlisting}[language=C,style=CCodeStyle]
// Compliant
#ifndef UNIQUE_ID
#define UNIQUE_ID
// declarations
#endif
// Non-Compliant
#define CPU 1044
#ifndef CPU
#error "no CPU defined"
#endif
#pragma once
\end{lstlisting}
\end{multicols}
\end{frame}
\note{Если Вы спросите любого программиста, работающего больше полугода, как защитить себя от множественного включения заголовков в трансляцию программы, Вы скорее всего получите ответ: использовать директиву <<pragma once>>. На слайде слева представлена таблица из википедии, говорящая, когда и какие компиляторы начали поддержку этой директивы. Да, для прикладного ПО всё хорошо, но, например, внутрь компилятора IAR вашу программу портировать не удастся. Лучше использовать более надёжные include guards, которые по-старинке описаны в виде дефайнов. Про макросы, как часть работы препроцессора мы говорили ранее}
\begin{frame}[fragile]
\frametitle{Стандартная библиотека}
Стандартная библиотека тоже не совсем хорошая
\begin{itemize}
\item Do not use std::vector<bool> (HIC 17.1.1)
\item The C standard library shall not be used (MISRA-CPP 18-0-1)
\end{itemize}
\begin{alert}{Например:}
\begin{lstlisting}[language=C,style=CCodeStyle]
#include <stdint.h> /* Non-Compilant */
#include <cstdint>
#include <vector>
void foo () {
std::vector <int32_t> vi; // Compliant
std::vector <bool> vb; // Non-Compliant
}
\end{lstlisting}
\end{alert}
\end{frame}
\note{При использовании С++ нежелательно использовать чистые С заголовки стандартной библиотеки, в из С++ адаптации используются специальные С++ конструкции, это не простая копипаста. Также, что касается стандартной библиотеки, особого внимания заслуживает специализация шаблона вектора для булева типа. Она не рекомендуется к использованию, поскольку именно в этой специализации STL алгоритмы не работают так, как ожидается, например взятие адреса нулевого элемента (\&v[0]) не возвращает массив элементов, как это происходит в других типах векторов. Помимо этого, стандарт языка С++ гарантирует, что разные элементы контейнеров STL могут быть безопасно модифицированы асинхронно (can safely be modified concurrently), за исключением единственного контейнера, угадайте какого.}
\begin{frame}
\frametitle{Static code analysis}
Все стандарты не запомнить, но это и не нужно (чаще всего)
\vspace{0.5cm}
\begin{itemize}
\item cpp-check https://sourceforge.net/projects/cppcheck/
\item Coverity scan https://scan.coverity.com
\item clang http://clang-analyzer.llvm.org/
\item Splint http://www.splint.org/
\item Oclint http://oclint.org/
\item frama-c https://www.frama-c.com
\item Helix QAC https://www.perforce.com/products/helix-qac
\end{itemize}
\end{frame}
\note{Естественно, что все правила из всех стандартов, даже при условии, что они часто повторяются, довольно сложно запомнить и утомительно перепроверять вручную. Поэтому во многие средства компиляции уже встроена значительная часть проверок (в виде предупреждений о нежелательных или потенциально опасных участках кода). Часто таких предупреждений оказывается недостаточно или средства трансляции не поддерживают предупреждения о сложных и неочевидных случаях, логических ошибках. Поэтому в последнее время набирают (наконец-то) популярность такие проекты, как PVS-Studio, объединяющие в себе разнонаправленные проверки по разным стандартам и логике. Инструмент прост в установке и настройке, кроме того для проектов с открытыми исходниками бесплатен}
\begin{frame}[fragile]
\frametitle{PVS-Studio}
Некоторые анализаторы могут находить и логические ошибки
\begin{alert}{Например: lp8788-charger.c}
\begin{lstlisting}[language=C,style=CCodeStyle]
static ssize_t lp8788_show_time(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct lp8788_charger *pchg = dev_get_drvdata(dev);
char *stime[] = {"400ms", "5min", "10min", "15min",
"20min", "25min", "30min" "No timeout"};
// ...
}
\end{lstlisting}
\end{alert}
\end{frame}
\note{На слайде мы видим пример кода из проекта Linux Kernel, ПВС студия дала этой ошибке номер V653, попробуйте найти её. Важно помнить, что это найденная и выделенная ошибка, в простыне из тысяч строк (да даже если из пары сотен) такой недосмотр найти почти нереально, поскольку компилятор ничего плохого в этом не увидит. ПВС на этот код выдаст сообщение о том, что в коде есть подозрительная конкатенация строк, предположительно отсутствует запятая между 30 минутами и отсутствием таймаута. (A suspicious string consisting of two parts is used for array initialization. It is possible that a comma is missing. Consider inspecting this literal: "30min" "No timeout")}
\begin{frame}
\frametitle{Ещё больше статического анализа кода}
Помимо заметок и программ, есть соревнования по статическому анализу и государственные институты (правда, американские)
\vspace{0.5cm}
\begin{itemize}
\item Meyers: https://www.aristeia.com/ddjpaper1.html
\item Samsung: https://www.drdobbs.com/tools/code-quality-improvement/189401916
\item SV-COMP: https://sv-comp.sosy-lab.org/2022/
\item USA: https://www.nist.gov/itl/ssd/software-quality-group/samate
\item GCC: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
\item https://www.cs.cmu.edu/~aldrich/courses/654/tools/index.html
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Встраиваемые системы}
Всё зависит от области применения
\begin{itemize}
\item The volatile keyword shall be used whenever appropriate (ECCS 1.8c)
\item Do not share volatile data between threads (HIC 18.2.3)
\end{itemize}
\begin{alert}{Утверждения:}
\begin{multicols}{2}
Barr C: Use volatile keyword to declare a
\begin{enumerate}
\item global variable accessible by any ISR,
\item global variable accessible by two or more threads,
\item pointer to a memory-mapped I/O peripheral register set (e.g., \texttt{timer\_t volatile * const p\_timer}),
\item delay loop counter.
\end{enumerate}
\columnbreak
HIC++: Declaring a variable with the volatile keyword does not provide any of the required synchronization guarantees:
\begin{itemize}
\item atomicity
\item visibility
\item ordering
\end{itemize}
\end{multicols}
\end{alert}
\end{frame}
\note{Закончить, пожалуй, стоит интересным примером, когда дополнительные стандарты кодирования для встраиваемых систем не соглашаются один с другим. Таким примером будет являться обработка прерываний и использование ключевого слова volatile. MISRA тактично не затрагивает эту тему, утверждая, что преобразования типов и любые манипуляции с данными не должны добавлять или снимать волатильность с объектов, HIC же утверждает, что это не безопасно, в то время, как ECCS говорит, что волатильность нужно использовать максимально часто. Скорее всего, правы оба стандарта, просто они описаны для немного разных уровней абстракции, так HIC будет справедлив для работы с операционными системами, там и правда лучше воспользоваться специальными средствами синхронизации, а BarrC лучше применять в живом железе.}
\begin{frame}[fragile]
\frametitle{Использованные ресурсы}
Были использованы официальные документы или предрелизные черновики следующих документов:
\begin{itemize}
\item PRQA HIC++: 2013;
\item MISRA CPP: 2008;
\item SEI CERT Coding Standard: 2016;
\item BARR-C: 2018;
\item C++ DRAFT-4713, 2017-11-27;
\item MISRA C: 2012
\item https://habr.com/ru/post/436296/
\end{itemize}
\end{frame}
\end{document}

View File

@ -0,0 +1,263 @@
Алфимцев Александр Николаевич
Протоколы и интерфейсы информационных систем
* оргвопросы
фактически юзабилити человекомашинного взаимодействия, не ГУИ.
1 пользовательские интерфейсы
2 цифровая обработка изображения
3 искусственный интеллект
1-2 расширенная реальность
1-3 интеллектуальные интерфейсы
2-3 распознавание образов
центр интеллектуальные мультимодальные интерфейсы.
** расписание
14,2809, 12,2610, 9,2311, 7,2112
рубежный контроль через 2 месяца. экзамен
нужно сделать ЛР
** компетенции
- обзор литературы, анализ исторических событий,важно понимать своё место в технологическом развитии
- визионерские качества
** литература
алан купер основы проектирования взаимодействия
* Введение: решаемые курсом вопросы
1. эволюция интерфейсов
2. основные понятия человеко-машинного взаимодействия
3. инструменты проектирования
4. обучение с подкреплением животных и машин
5. ориентация на пользователя
** эволюция
количество инструментов растёт, но правила и требования обратной совместимости заставляют их оставлять. например компьютерная мышь 1963 придумал тот же человек, который придумал WYSIWYG, GUI Xerox Alto, систему передачи гипертекста. первый браузер 1990. понятие смартфон в 2000, айфон 2007. эволюция - это целенаправленное и необратимое развитие пользовательского интерфейса. юзабилити != дизайн. интерфейс - это линия раздела - совокупность средств и методов взаимодействия между элементами системы. геймификация.
теория решения изобретательских задач.
** основные понятия человеко-машинного взаимодействия
доступность,
условия использования,
результативность,
эффективность.
эргономика,
человеко-ориентированное проектирование,
интерактивная система.
образец
удовлетворённость
удобство использования
опыт взаимодействия
валилдация
верификация
*** типы пользовательских интерфейсов
веб-интерфейс
графический интерфейс пользователя
голосовой интерфейс
диалогово-агентный интерфейс
естественно-языковой интерфейс
жестовый интерфейс
задача-ориентированный интерфейс
звуковой интерфейс
интерфейс контролирующий внимание
инклюзивный интерфейс
командная строка
кроссовый интерфейс
масштабируемый интерфейс
мультиэкранный интерфейс
нулевой вход
объектно-ориентированный интерфейс
осязательный интерфейс
пакетный интерфейс
проблемно-ориентированный интерфейс
рефлексивный интерфейс
тактильный интерфейс
текстовый интерфейс
интеллектуальный интерфейс
*** общее
термин юзабилити критикуют потому что много не технических вещей.
** инструменты
функциональная стереотипность
аналогичные решения
фиксация решения
невозвратные затраты
** обучение с подкреплением животных и машин
многое изучено на основе поведения животных (примерно с Павлова, крысы, собакти обезьяны).
пропадание свободы воли при создании правильных условий.
агент взаимодействует со средой, среда возвращает агенту награду и следующее состояние
** ориентация на пользователя
* Когнетика и эргономика
человеко-машинное взаимодействие. все проблемы - человек.
когнитивное сознательное и к-бессознательное. 1 - локус внимания. переход из сознательного в бессознательное можно замерить, например, какая последняя буква вашего имени? даже не имея в сознании этой информации можно идентифицировать своё имя.
к-с всегда включается чем-то новым, нестандартным, опасностью.
к-б возникает когда действия автоматизируются. задача разработки пользовательского интерфейса - вывести пользовательский интерфейс из поля зрения пользователя
ритмы мозга
бета-ритм мозга все когнитивные процессы (фокусирование внимания).
сон - дельта
просыпаемся тета
расслаблены альфа
деятельность мозга основана на нейронах и регулируется нейромедиаторами. нейронов много, а дофаминовых путей мало. дофаминовые реакции происходят от внешних позитивных стимулов, но главное не переборщить поскольку так формируется цифровой аутизм.
есть исследование связывающее юзабилити и красоту, наша задача заставить пользователя пройти нашим маршрутом.
цвет - очень субъективная оценка оптического диапазона, воспринимаются по разному в зависимости от окружающих цветов и фона. базовые цвета обычно соотносятся с действиями. например, красный цвет ассоциируется с кровью, опасностью. у него самая большая длина волны, на уровне физики - лучший для обозначения опасности и привлечения внимания. цвет вырабатывает устойчивую связь с продуктом. на экранах цвет не отражаемый, а излучаемый. рекомендуется использовать не больше 4х цветов, более яркие для активной информации, периферия более мягкая. выявили голубой и зелёный фон как лучший для запоминания информации.
гендерные различия существуют в связи с разной физиологией и восприятием. большинство устройств создано мужчинами, поэтому женщинам не очень удобно им пользоваться, мужчины пользуются более тёмными интерфейсами с меньшим количеством цветов. мужчины быстрее ориентируются, а женщины детальнее и лучше понимают
возрастные различия - например, после 30 мужчин сложно сдвинуть и на них сложно воздействовать
расположение информации - первое это верхний левый угол, затем центр, потом верх-центр. нужно таким образом формировать локус внимания. ЛВ - это место, где сосредотачивается внимание пользователя. внимание нельзя распылить. если мы делаем что то многозадачно - это не эффективно и часто имитация параллельности. ЛВ должен быть перевед§н в автоматизм, привычку. ЛВ нужно формироватьу пользователя чтобы привязать к продкукту, например, статусбар копирования или другие анимации долгих процессов. идеальный интерфейс формирует полезные привычки
но есть цена, например, подтверждения действий
Тест Люшера
* Квантификация интерфейсов
При разработке интерфейсов или ПО есть некоторый условный классический подход: задача, требования, дизайн, и получаем оптимальный интерфейс после опроса пользователей. Строгое математическое обоснование сложно найти, обычно в разработке ПО подходы эвристические.
Квантификация - это сведение качественных характеристик к оличественным, чтобы можно было измерить и получить некоторое число.
Количественный анализ осуществляется по модели GOMS (goals, objects, methods, selection rules) - целей-действий-порядка-правил. Есть много разновидностей моделей GOMS. Зависят от разных характеристик пользователя и использования. (читать хабр гомс). модели гомс оценивают время которое потребуется пользователю для выполнения задачи в рамках интерфейса. разделяет задачу на этапы:
- нажатие клавиши
- указание - время которое необходимо пользователю чтобы пользователь указал на нужную позицию
- перемещение
- действие
- ответ компьютера.
задача: описать интерфейс (фотка слайда)
решения:
1. опшн на С-Ф и Ф-С, два поля ввода между ними стрелка, 7.15сек.
2. шкалы слева и справа С и Ф, если установлены верно, 3,25сек. вариант когда шкалы нужно прокрутить 16,8сек.
3. просто два поля направим пользователя на клавишу ентер. 3.7с
4. одно поле ввода, два поля с результатом. 2,15с. но одно поле будет содержать ошибку, так мы переложили много работы на пользователя.
абстрактно, насколько должен быть быстрым интерфейс? информационно-теоретическая и информационная производительность. некоторые методы могут иметь одинаковую информационную производительность, но совсем разное фактическое время, человекоориентированность и юзабельность.
Закон Фитса и закон Хита.
закон Фитса: чем дальше объект от курсора и чем меньше объект, тем больше потребуется пользователю времени, чтобы попасть в объект. Закон Хика говорит о том, что чем больше вариантов, тем дольше. По этим законам осуществляется оценка сложности интерфейса. Метрики QUIM.
Применение методов машинного обучения.
составили критерии оценки по пользовательским опросникам, поняли можно ли в интерфейсе решить больше количество задач, гибко ли, всё ли загружается, активность, обратная связь, итд. Получив оценки по всем фактоам их объединяют дают на вход многослойного персептрона и получают распределение по правилу Парето 20/80. где 20 процентов интерфейса выполняют 80 процентов функциональности.
* Унификация интерфейсов
Если сделать устройства одинаковыми - пользователю будет легче ими пользоваться. Если избавиться от известных человекомашинных элементов (модлаьных ошибок) интерфейсы станут одинаковыми. унификация - это приведение к единообразию. в рф понимается приведение документации, технических характеристик. в рф принимается базовый агрегат, разнообразие достигается присоединением частей, компаундирование, модифицирование (изменение дорогих частей, обновление), принцип модульности - собираем из частей, как конструктор. унификация - это разновидность систематизации.
Самое простое средство - ручной выбор стандартных функций пользователя (исследование физических действий пользователя для создания разных но при этом унифицированных интерфейсов). Разработка основана на том, что любые выглядящие одинаково элементы должны действовать одинаково. Пользователь должен по виду элемента понять, что с ним можно делать, а что с ним нельзя делать (состоятельность)
Основывается трёх понятиях: на согласованности(consistency), видимости и состоятельности. эти факторы должны приводить к удовлетворению пользователей и соответственно лояльности.
видимым считается элемент, который доступен органам чувств и не ушёл из области быстрой памяти пользователя. если соблюдается принцип видимости - интерфейс и его элементы становится очевидными. Например, пиктограммы - это и кнопки и иконки и ссылки. на бытовом уровне считается, что интерфейс становится более красивым, доступным. со временем стали появляться подсказки, выявилась проблема ограниченной видимости. при этом могут быть эффективны для безграмотных пользователей. На практике текст является лучшей подсказкой к использованию интерфейса, пиктограммы труднее понять, чем текст. Пиктограммы являются эффективными, если их не больще 12ти, должны отличаться друг от друга, иметь одинаковый размер.
стандартизирован ли цвет №7Б917Б? есть нерешённая задача - это коллективная работа над интерфейсом.
стандартизация цвета также важна. плохо описывать цвет текстом, лучше показать. для этого подходят пиктограммы. Пиктограммы в первую очередь должны быть понятны, иногда можно допустить понятность в контексте, а не саму по себе.
режимы - часто применяемая при создании интерфейса механика. интерфейс может находиться в нескольких состояниях, от этого может меняться режим использования. много исследований связано не только со внешним видом, но и с подписями для переключения режимов. опыт пользователя не избавляет от ошибок порождаемых режимами. режим - плохой индикатор состояния, он приводит к необычному для системы поведению. предотвратить можно: 1 не использвать режимы, 2 обеспечить чёткое различие, 3 не использовать одинаковые команды в разных режимах. режимы присущи и джойстикам управления (непонятно, летит вертолёт вверх по нажатию вверх как мы думаем, или вниз как думаю пилоты). постепенно в режимы внедряют адаптивность (перемещение часто используемых функций в начало меню, например). применяют опыт "лягушка в кипятке".
модель "глагол-существительное" и "существительное-глагол". как применять команды (действия к объекту), например мы в редакторе у абзаца меняем шрифт, это сущ-глаг. если в пеинте сначала выбрать краску, а потом инструмент - это глаг-сущ. выглядит одинаково, но является разными с точки зрения юзабилити. лучшие показатели и безопасность показывает сущ-глаг. глаг-сущ приводит к модальным ошибкам, то есть к режимизации интерфейса. ГС проигрывает и в скорости, не нужно переключать внимание пользователя. при использовании глаг-сущ должна быть предусмотрена возможность отмены команды.
монотонность. многозадачность пользователя - проблема, отвлекает внимание, а ещё если и интерфейс бдет косячный - беда. монотонность - тоже унификация.
читать джефф раскин (интерфейсы)
* Шаблоны в пользовательских интерфейсах
шаблон должен описывать общие знания о том как человеку работать с искусственно созданным артефактом. технологии меняются, постоянно появляются новые принципы. Шаблоны тесно связаны с когнетикой.
первые шаблоны появились в архитектуре.
** поведенческие
1. обратимые изменения (наиболее гуманитарный) связан со страхами пользователя - есть возможность вернуть систему в предыдущее состояние.
2. быстрое достижение цели люди не любят ждать это заложено в природе. нацелен на получение успешного опыта в первые 2-3 секунды
3. рациональное исследование - разумная достаточность. пользователи предпочитают достаточно хорошее, а не лучшее. don't make me think
4. неформатированный ввод
5. структурированный ввод
** представления информации
1. поиск, контент, категории
2. стек - отображение связанной со временем информации в обратном порядке (что-кто-когда-где)
3. разнообразный поток, редакторский микс (новости, интервью, ссылки, мнение, письма, аудио, итд)
4. вертикальный макет (полезное содержимое - первые 100 пикселей) прокрутка предпочтительнее долгой загрузки
5. редактор настроек (часто используется для просмотра, а не редактирования настроек) важен случайный доступ к информации и деление на категории
** шаблоны взаимосвязи
связаны с дизайном, навигационной моделью, позволяет более чётко подойти к дизайну.
1. ограниченный вход
2. мастер (назад, вперед, разделы, включение, обнаружение)
3. пирамида - уменьшает количество переходов по приложению + явно отображает логическую связь (назад вперёд вверх)
4. модальное окно - несёт деструктивный характер, не используется для малозначительных данных.
** визуальной иерархии
- первичными являются целостные структуры. Гештальт принципы:
1. сходство
2. близость
3. регулярность
4. замкнутость
5. непрерывность
- базовый макет используется когда есть много окон, лучше сделать их в едином стиле но главное окно можно выделить особо
- базовая сетка содержимое размещается в матрице. аккуратно, рационально. элементы сетки можно подсвечивать или давать ссылки
- аккордеон: множество панелей инструментов, позволяет упорядочить длинные списки
- группировка (клика) кнопок лучше не использовать больше пяти кнопок. объединяется по схожей функциональности WYSIWYG.
** сложных категорий
деревья или графы? деревья лучше для новичков, а графы для продвинутых.
1. двухпанельность - уменьшает визуальную нагрузку, физические усилия, время загрузки. не используется на маленьких устройствах
2. общая картина - общее представление показывается рядом с детальным. большой набор надо видеть одновременно с детализацией
3. атрибутивная фильтрация часто применяется к результатам поиска и фильтрации
4. круговая визуализация упрощает визуализацию отношений особенно длинных таблиц.
5. горизонтальная панель удобно визуализирует действия, размещается обычно снизу или сбоку
6. история изменений показывать постоянно не обязательно, но помогает повторять действие, вспомнить порядок
7. совокупность включений (макросы).
** шаблоны действий и контекстов
антишаблоны: перемещение, размещение инструментов, внешний вид инструментов.
* Маркетинг человекомашинного взаимодействия, конверсия.
конверсия - это отношние посетителей, выполнивших целевое действие к общему количеству посетителей сайта. для увеличения
1. понять для кого интерфейс предназначен;
2. формирование у пользователя чувства доверия;
3. использование стадий покупки;
4. преодолеть страх пользователя;
5. ощущение вовлечённости;
6. протестировать;
7. запустить снова.
** процесс конверсии
минимизировать рекламу, сделка - это одновременно и покупка и продажи. считается, что первопроходец волмарт. конверсия в интернете всегда быстрая, скорость прихода компенсируется скоростью ухода. процесс конверсии начинается с определения количественных показателей. Если лендинг спроектирован плохо - пользователи не терпят а уходят уже через 5 секунд.
** коэффициент конверсии
всё зависит от того, чем мы занимаемся, не всегда конверсия это продажи. сложно сопоставить онлайн и офлайн.
** макро и микроконверсия
макро это общая финальная, а микро к небольшим шагам, этапам макро. любая конверсия начинается с постановки цели. конверсию обычно связывают с KPI.
** бюджетирование
бюджет это схема доходов и расходов организации на определённый период.
** показатели выходов/отказов
монетизация - это процесс конвертации чего-либо в законное платёжное средство
** среднее время и качество трафика
всегда предпочитаются прямые посетители, из-за лояльности
** создание персон
понимание ЦА помогает убеждать к конверсии. главное качество инноватора - эмпатия. для качественной конверсии нужно создать аппроксимацию своего пользователя. влияет сочетание факторов - гео, демо, психографические, поведенческие. есть и отрицательные моменты - ошибки аппроксимации, слишком много информации.
* методы интеллектуализации пользовательских интерфейсов
с точки зрения россии ии - это комплекс технологических решений, позволяющих имитировать когнитивные функции человека
с точки зрения иностранных государств ии это способность исисемы решать задачи, которые в противном случае потребовали бы вмешательство человека
диаграмма инглхарта
интеллектуальный мультимодальный интерфейс - множественный ввод включая человеческую составляющую
* Принципы визуализации данных с помощью диаграмм
от того, как выглядит презентация человека - делается вывод о его компетенциях. диаграмма это графическое представление данных отрезками или геометрическими фигурами для быстрого сравнения некоторых параметров. быстрее воспринять, лучше запомнить, увеличение вовлечённости, привлекает бОльшую аудиторию. бывают линейные, круговые, линейчатые, стопчатые, точечная, пузырьковая, лепестковая (wheel), диапазона (свечки).
правила
если есть динамика - график, если структура и сравнение долей - круговая, линейчатая. важно использовать правильный тип и формат графика. Если в круговой диаграмме больше 3-5 долей - используем линейчатую. если сумма долей не 100% в круговой - это грубая ошибка.
если время расположить сверху вниз человек не сможет воспринять эту информацию. неудачный тип и формат снижает доверие к информации.
данные надо выстраивать логично, от большего к меньшему, от да через затрудняюсь ответить до нет, важен фокус на цели.
дизайн должен быть минималистичный.
дизайн должен быть единообразный и должен быть в цветах фирмы.
должно быть удобно сравнивать данные (2 и более показателей). если разбить на много отдельных графиков - сравнение невозможно
на диаграмме не должно быть неинформативных элементов (сетка, дублирование значений, и другой мусор).
необходимо следить за отсутствием визуальной загромождённости, чтобы не было многоярусных диаграмм. целесообразно разделить
числа должны быть с разделителями разрядов и не должно быть знаков после запятой.
у диаграммы должны быть название и легенда, иначе появляется риск неверного истолкования. надо ставить себя на место человека, который видит диаграмму впервые.
использование правильных цветов.
использовать один вид диаграммы для однотипных данных.
примеры
диаграммы можно и нужно преобразовать от одного типа к другому.
приёмы
выделение цветом:
ответы да-нет (зел-кр)
минимум-максимум согласно логики (зел-кр)
мужчины-женщины (гол-роз)
неважное (серым)
прогноз (прогнозные серые или полупрозрачные)
год (текущий ярко прошлый бледно)
фирменный стиль, бренд
визуальная составляющая
пространство (желательно занимать всё)
среднее (в часто меняющемся графике иногда хорошо показать аппроксимацию)
одна подпись
дополнительная ось
логика + здравый смысл
экз 12-13 янв 426ю

View File

@ -0,0 +1,410 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\author{Баскаков Сергей Сергеевич}
\title{Проектирование информационных и телекоммуникационных систем}
\date{2021-09-07}
\begin{document}
\maketitle
\newpage
\section{Предисловие}
\subsection{Знания из бакалавриата}
С сигналом можно производить:
\begin{itemize}
\item манипуляции (для цифровых систем связи)
\item модуляции (для аналоговых систем связи)
\end{itemize}
Вероятность ошибок модуляции \newline
\begin{figure}[h]
\centering
\def\svgwidth{50mm}
\input{pics/01-itsp-01-ber.pdf_tex}
\caption{график вероятности появления ошибки к соотношению сигнал-шум}
\label{pic:BER}
\end{figure}
(максимальная верятность ошибки 0,5)
\subsection{Организационные вопросы}
раз в две недели (по чётным неделям), лабы расписание с ноября, курсовой проект (как начало дипломной работы)
\subsection{Понятие информационной и телекоммуникационной системы}
Предмет - то, что сейчас называется "интернет вещей", по факту распределённая система сбора данных. Раньше были только специального назначения, сейчас дешевеет поэтому приходит в коммерцию.
Фактическая задача - снять данные с датчика, передать по каналу связи шлюзу (концентратору) далее по каналам связи передать серверу (или, например, облаку) и произвести обработки.
\section{Введение}
все информационные и телекоммуникационные системы бывают:
\begin{itemize}
\item по уровню оцифрованности
\begin{itemize}
\item аналоговые. полностью аналоговые уже не разрабатываются.
\item цифровые, даже если первичная и конечная информация аналоговая - на входе ЦАП, на выходе АЦП. в первую очередь потому что цифра дешевле и гибче.
\end{itemize}
\item по ширине полосы:
\begin{figure}[H]
\centering
\def\svgwidth{50mm}
\input{pics/01-itsp-01-bandwidth.pdf_tex}
\label{pic:bandwidth}
\caption{Понятие ширины полосы}
\end{figure}
\[
\Delta_f = f_1 - f_2
\]
\[
\mu = \frac{\Delta_f}{f_c}
\]
где $\mu$ - это показатель ширины полосы.
\begin{itemize}
\item узгополосные,
\item широкополосные,
\item сверхширокополосные
На узкополосную систему не влияют частотно-селективные замирания. Широкополсные системы связи меняются, то есть скорости передачи данных растут.
\item также выделяют системы связи \textit{UNB}
\textbf{ultra-narrow-band} сверхузкополосные системы связи. Меньше шумов - значительно увеличивается дальность, уменьшение мощности передатчика, энергопотребление. например, 10б/сек.
Минусы: частоты приёмника и передатчика должны совпадать, то есть предположим, точность кварца 10ppm (parts-per-million) например, его частота 20МГц с погрешностью $10*10^{-6}$. то есть погрешность 200Гц. погрешность несущей 10ГГц будет $10^{9}*10*10^{-6} = 10\text{КГц}$. То есть передатчик передаёт 100Гц приёмник будет его слушать на $10\text{КГц}\pm200\text{Гц}$, полное непопадание.
Решение: можно попробовать увеличить точность кварца (термостатированный или термостабилизированный кварц.) соответственно такие кварцы с тысячи раз дороже. на практике обычно использутся обычные кварцы в передатчиках, а приёмник слушает параллельно широкий сигнал и ищет модуляции на разных полосах.
Топология: такой системы может быть только звезда - с централизацией, более сложные системы не получатся потому что каждое устройство скорее всего не увидит другое.
\end{itemize}
\item по степени мобильности абонентов
\begin{itemize}
\item все абоненты стационарны,
\item все мобильны.
\end{itemize}
большинство систем в реальной жизни - смешанного типа, например, телефонная или вайфай сеть где точка доступа фиксированна, а абоненты перемещаются. При проектировании важно понимать насколько мобильны будут абоненты. \textbf{Эффект Допплера}: чем выше относительная скорость абонентов - тем больше смещение (но разница - десятки герц, будет иметь критическое влияние для UNB). Для широкополосных систем не принципиально, поскольку ширина полосы значительно больше. В таких сетях нужно думать о бесшовном переключении абонентов от одной зоны обслуживания к другой. Влияет на маршрутизацию и объём служебной информации, как следствие на энергопотребление
\item по размеру зоны обслуживания, расчёт на масштаб сети.
\begin{itemize}
\item персональные - несколько метров, несколько (до 10) устройств, мощность десятки миллиВатт, например, блютус
\item локальные сети - вайфай, мощность десятки-сотни милливатт, десятки-сотни устройств, дальность десятки-сотни метров,
\item региональные - сотовые радио сети,
\item глобальные - спутникоые, GPS.
\end{itemize}
влияет на проектирование - закладывается масштабирование, служебные данные устройств и служебный трафик. так вопрос маштабирования нужно решать на всех уровнях (как в модели ISO-OSI)
\end{itemize}
\section{Преимущества цифровых систем связи}
\begin{enumerate}
\item \textbf{Любые данные можно оцифровать и передать.} Но нужно учитывать особенности. Например, голос нужно передавать без задержек (менее 250миллисек) чтобы не было эхо или заиканий. При этом не важна пропажа информация, то есть достоверность и полнота, так пропажа одной буквы не изменит понятность всего сообщения в целом. Если мы рассматриваем, например, телеметрическую информацию не реального масштаба времени, важен факт передачи, временн\'{ы}е потери не важны, но нужна целостность и отсутствие потерь данных. То есть, в зависимости от приложения системы нужно понимать какую технологию использовать. При этом важно учитывать приоритеты. Например в сотовой связи важнее голос, чем СМС или трафик, поэтому делать датчики на основе, например СМС не целесообразно, потому что вообще нет гарантии доставки.
\item \textbf{надёжнее}, меандр всегда чётче синусоиды, можно передавать контрольные суммы
\item цифра передаётся пакетами, поэтому \textbf{легче обнаружить ошибки} на канале и факт приёма
\item программно можно \textbf{изменять протоколы} передачи полностью.
\item технология SDR (software-defined radio) \textbf{дешевеет}. Поэтому цифровая связь становится популярнее и придумываются новые протоколы, итд.
\item цифра \textbf{позволяет объединять} много данных и выставлять приоритеты передачи этих данных. Первая задача при придумывании новых цифровых протоколов - исключить коллизии данных, вторая задача - это снижение энергопотребления.
\end{enumerate}
\begin{figure}[H]
\centering
\def\svgwidth{60mm}
\input{pics/01-itsp-01-rxtx-ack.pdf_tex}
\caption{Подтверждение приёма данных от передатчика}
\label{pic:rxack}
\end{figure}
Где (1) - это норма, а (2) - любая ошибка данных, отсутствие ответа. По прошествии таймаута вторая попытка передать пакет. При этом, бесконечно повторять нет смысла, потому что устройство приёма может быть вовсе отключено. Если канал однонаправленный - обычно передаются коды коррекции ошибок. в двунаправленном выгоднее переповторить, чем закладывать в протокол пространство для передачи кодов коррекции ошибок.
\textbf{Проблемы:} битовая синхронизация, кадровая синхронизация. Актуально и для проводных и для беспроводных систем.
\subsection{Схема преобразования информации между устройствами}
\includegraphics[width=10cm]{01-itsp-01-scheme.png}
\begin{enumerate}
\item источник данных (например, если это аналоговый сигнал)
\item форматирование - приведение к цифре (АЦП)
\item кодирование - сжатие может быть как с потерями так и бес потерь. например, голос - кодеки для сжатия, снижаем поток информации с сохранением качества информации. если это ТМИ, можем передавать дифференциальный сигнал, например. то есть всё от задачи и направлено на снижение объёма данных
\item шифрование - крипта. возможно, классическое шифрование, возможно, просто проверка целосности (добавление в сообщение хеш-функции), несмотря на то что это опциональный блок, чаще всего он всё равно нужен. желательно внимательно подходить к этому, чтобы не подвергать опасности устройство.
\item канальное кодирование - добавить код коррекции ошибок, добавление помехоустойчивости
\item уплотнение - агрегация информации из разных источников, экономим трафик сети и энергопотребление на передачу от каждого отдельного источника
\item импульсная модуляция - преобразование выходного сигнала, например, манчестерская кодировка (тактирование в два раза быстрее, но восстановить сигнал становится проще за счёт увеличения количества спадов, избавляемся от постоянной составляющей, всегда идёт изменение 0-1-0). возможно, нужно добавить ещё избыточных данных для исправления ошибок каналов связи
\item полосовая модуляция - делаем именно то, что будем передавать передатчиком (амплитудная, фазовая, частотная, квадратурно-амплитудная). меняя фазу гармонического колебания мы передаём полезную информацию. вид будет влиять на вероятность битовой ошибки при одинаковом соотношении сигнал-шум. отличаются сложностью реализации. многоуровневые модуляции могут увеличить скорость передачи данных (но снижаем помехоустойчивость).
\item расширение спектра - теоретически опциональный, нацелено на то чтобы не мешать другим и собирать меньше шумов, мы должны стремиться к тому чтобы полоса нашего сигнала должна быть наименьшая. позволяет повысить помехоустойчивость.
\begin{frm}
\def\svgwidth{50mm}
\input{pics/01-itsp-01-bad.pdf_tex}
если есть помеха - мы снижаем риск того что она будет критической для системы.
\end{frm}
\item множественный доступ (к среде) - большинство - это не точка-точка, а многопользовательские системы связи, значит нужно придумать способ общения клиентов (правила для экономии ресурсов сети, частоту, время, кодовое пространство). распределить нужно как можно более эффективно. актуально и для проводных систем связи. часто 9 и 10 меняются местами и/или объединяются.
\item передатчик - для нас чёрный ящик, потому что среда может быть абсолютно разная.
\item импульсная характеристика канала - помехи канала (аддитивные, мультипликативные) замирания мелко и крупномасштабные, искажения. в проводных тоже есть но в радио сильно больше.
\item все дальнейшие действия - обратные на приёмнике.
\end{enumerate}
\section{Частотные диапазоны}
\noindent\textbf{30-300Гц 10000-1000км \\
300-3000Гц 1000-100км \\
... }
\textit{Здесь так и не появилась таблица из раздаточного материала, но смысл понятен} - чем больше частота тем меньше расстояние, на которое мы можем передавать данные, внизу таблицы только прямая видимость, то есть сигналы, которые не в состоянии огибать землю. Все частоты в странах либо используется либо зарезервированы, когда мы сделали модуляцию - мы перенесли на какую-то несущую. Например, сигнал имеет полосу 1МГц, мы переносим ту же ширину на другую частоту. делается для того чтобы:
\begin{itemize}
\item произвести частотное планирование (выделить частоты под разные нужды, чтобы системы и люди не мешали друг другу).
\item размер антенны всегда сопоставим с длиной волны, поэтому для сотен километров нужна и антенна пару десятков метров. для использования в мобильной связи это может оказаться неудобным
\end{itemize}
В основном будем говорить о частотах от десятков МГц до единиц ГГц, чем выше частота, тем сильнее затухание.
\subsection{Нелицензируемые диапазоны частот}
\textbf{ISM} - industrial scientific medical. Идея в том, что это частоты, которые можно использовать без дополнительных согласований. \textbf{EIRP} - эквивалентная изотропная излучаемая мощность. Единственное что нужно - удостовериться, что устройство отвечает требованиям диапазона. Например, нельзя увеличивать EIRP при использовании нелицензируемых частот, штраф и конфискация оборудования (касается лайфхаков по улучшению вайфая итд).
\begin{itemize}
\item 433МГц полоса 700КГц мощность EIRP 10мВт (с учётом коэфф усиления антенны)
\item 868МГц полоса 500КГц мощность 25мВт (в определённых условиях до 100мВт) - в америке эта частота отличается, 915МГц, поэтому, некоторые устройства могут оказаться несовместимы.
\item 2,4ГГц полоса 83,5МГц мощность 100мВт
\end{itemize}
При частоте 2,4 можем использовать более крутые модуляции, например используется для WiFi, IEEE 802.15.4.
\section{Распространение радиоволн}
\def\svgwidth{60mm}
\input{pics/01-itsp-01-width.pdf_tex}
\[u(t) = S_I(t)+jS_Q(t)\]
комплексный сигнал $S_I$ вещественная часть синфазная и $S_Q$ мнимая часть, квадратурная составляющая. Полоса этого синала несколько МГц. полосу шириной В переносим на несущую частоту, B \textbf{много меньше}, чем частота несущей
\[S(t) = S(t)\cos(2^if_ct) - S_Q(t)\sin(2^if_ct)\]
вещественный сигнал
\[S(t) = Re\{u(t)e^{j2^if_c}\}\]
\[u(t) = a(t)e^{j\phi(T)}\]
\[S(t) = Re\{a(t)e^j\phi(t)e^{j2if_ct}\} = a(t)\cos(2if_c+\phi(t))\]
это три эквивалентные формулы, представляющих одно и тоже.
\[a(t) = \sqrt{S^2_I(t) + S^2_Q(t)}\]
\[phi(t) = \arctg[\frac{S_Q(t)}{S_I(t)}] \]
задача анализа распространения радиоволн: понять что будет с сигналом на входе приёмника при прохождении среды распространении. обратная задача - зная, что мы приняли, понять как повлияла среда на распространение.
\textbf{Базовые эффекты при распространеии радиосигнала}
\begin{enumerate}
\item отражение (длина волны сигнала - это длина волны несущей, не любая поверхность может отражать любые сигналы) $Z_0 < \frac{\lambda}{16\sin\Theta}$ где $\Theta$ это угол падения сигнала, а $\lambda$ это длина волны
\item дифракция (возникает когда волна сталкивается с объектом с острыми краями, но иногда помогает при отсутствии прямой видимости, например, не можем передать сигнал сквозь гору, но можем поверх)
\item рассеивание (сталкиваемся с объектами, которые значительно меньше длины волны, например, растения (2.4ГГц длина волны ок. 12см))
\end{enumerate}
потери сигнала (PL, path loss), дБ
\[PL = 10\lg\frac{P_t}{P_z}\]
Потери сигнала равны десяти десятичным логарифмам отношения переданного к принятому. В среднем скорость затухания линейно возрастает в логарифмической шкале относительно расстояния, но далее на этом пути начинают включаться негативные эффекты распространения сигнала.
\def\svgwidth{120mm}
\input{pics/01-itsp-01-zamir.pdf_tex}
\begin{itemize}
\item медленное (крупномаштабное) замирание, например, крупные препятствия на пути сигнала
\item быстрые (мелкомасштаблые) замирания - меняется при изменении положения передатчика или приёмника в масштабе длины волны, может быть до десятков децибел
\end{itemize}
\subsection{Основные параметры антенн, критерии выбора}
Антенна - это система проводников, преобразующая электрический сигнал в электромагнитную волну. приёная антенна - обратная задача. Антенны работают в обе стороны. Большинство реальных систем - двунаправленные, и как правило это одна и та же антенна. Задача разработчика - максимально эффективное преобразование. Основная эарактеристика - диаграмма направленности.
\textbf{Передающие устройства:}
\begin{itemize}
\item Изотропная антенна - некая точка в пространстве, которая излучает электромагнитное излучение во все стороны (это абстракция, реально таких не существует). диаграмма направленности - сфера.
\def\svgwidth{50mm}
\input{pics/01-itsp-01-izo.pdf_tex}
это трёхмерная характеристика
\[G(\Theta,\phi)\]
коэффициент направленного действия передачи антенны, диаграмма направленности: это отношение плотности потока мощности (Ватт на кв.см) к плотности потока мощности от изотропной антенны.
\item монополь/диполь полуволновые, четвертьволновые. Коэффициент усиления антенны (значит в каком-то одном направлении антенна сильнее эталонной), но при этом игнорируем, что в других направлениях это значение будет компенсировано.
\def\svgwidth{50mm}
\input{pics/01-itsp-01-monopol.pdf_tex}
\def\svgwidth{50mm}
\input{pics/01-itsp-01-dipol.pdf_tex}
Зачем роутеру в этом случае две антенны? Чтобы выставить их под углом 90 градусов, чтобы получился и вертикальный и горизонтальный тор, формирующий почти сферу.
\item направленная антенна, например, Яги (Yagi). это набор поперечных прутов. например, секторная антенна, используются в вышках сотовой связи. каждый сектор - обслуживает физическую территорию (пространственное разделение каналов).
\def\svgwidth{100mm}
\input{pics/01-itsp-01-direct.pdf_tex}
G - максимальный коэфф усиления G (например, 10дБ относительно изотропной антенны). Чем больше коэфф усиления, тем меньше угол $\alpha$ (ширина главного лепестка). Есть также уровень боковых лепестков, например, -30дБ, это значит, что он в 30 раз меньше, чем главный. Суммарная мощность антенны остаётся равной подаваемой.
Так при использовании точка-точка мы можем использовать максимальный коэффициент усиления и узкой шириной главного лепестка - нужно очень точно наводить антенны друг на друга, то есть появляется требование к точности наведения.
\end{itemize}
\[EIRP = P_tG_t = P_t + G_t\]
то есть для вайфай
\[ P_t = 100\text{мВт} = 20\text{дБм} \]
\[ G_t = 10\text{дБи} \]
\[ EIRP = 30\text{дбМ} (1\text{Вт}) \]
мощность в абсолютной шкале, а коэффициент усиления в логарифмической шкале. Чтобы мВт перевести в логарифмическую шкалу = $10lg[\text{мВт}] = [\text{дБм}]$, чтобы дБи перевести в абсолютные = $10 / 10 ^ 1 = 10\text{раз}$.
То есть при допуске 100мВт мы превышаем нормативы в 10 раз. Чтобы не превышать - нужно кратно уменьшать выходную мощность антенны. Получается, что использовать направленные антенны целесообразно для:
\begin{enumerate}
\item контроля направления излучения сигнала.
\item антенна всегда используется в двух направлениях, за счёт этого получается приёмник с лучшим соотношением сигнал-шум
\item контроль области пространства откуда принимается сигнал.
Например, Для ракет томагавк используется система наведения через GPS. если делать широкополосные омехи на канале GPS - это будет не эффективно, а эффективнее будет принимать сигнал GPS и переизлучать его.
\def\svgwidth{70mm}
\input{pics/01-itsp-01-station.pdf_tex}
Поскольку станция постановки помех ближе - она будет приоритетной, поэтому ракета за 1млн может быть отправлена в болото станцией за 20долларов. Выход для производителей ракет - направленная вверх антенна.
\end{enumerate}
При настройке антенны важно не только убрать шумы, но и согласовать устройство с точки зрения реальной эксплуатации (материалы корпуса, окружающие предметы).
\subsection{Модели распространения радиоволн}
Один из основных вопросов: как себя поведёт сигнал во время эксплуатации (затухание - разница излучаемого и принятого сигнала). Такое поведение с разной степенью точностьи позволяет посчитать характеристики. Чаще всего говорится именно о вероятности битовой ошибки. То есть при каком соотношении сигнал-шум мы получим какую вероятность битовой ошибки при данной дальности связи.
\begin{itemize}
\item \textbf{детерминированные}
все модели работают для дальней зоны формирования волны антенной (близко от антенны волна ещя считается не сформированной)
\begin{enumerate}
\item \textbf{модель распространения в открытом пространстве}. Например, модель точка-точка, нет препятствий, прямая видимость.
d - расстояние между передатчиком и приёмником
Gt - коэффициент усиления передатчика
Gr - коэффициент усиления приёмника
получаем
\[ r(t) = Re\frac{\lambda\sqrt{GtGr}e^{-j2.d/\lambda}}{4.d}u(t)r^{-j2.j_{ct}} \]
PL - затухание
\[ PL = 10lg\frac{Pt}{Pr} = 10lg\frac{(4.d)^2}{GtGr\lambda^2} дБ \]
затухание обратно пропорционально длине волны. чем больше длина волны, тем меньше затухание, или наоборот чем больше частота несущей - тем больше затухание. Формула расчёта дальней зоны, где L размер антенны, а лямбда длина волны: $df = \frac{2L^2}{\Lambda}$ и результат должен быть много больше исходных
Наример частота 900Мгц (длина волны около 33см) и мы используем антенну размером 1метр. по формуле получаем расстояние дальней зоны - 6 метров. Видим, что это много больше, чем 1 метр и чем 33см. Также есть эмпирическое правило, что дальняя зона - это сумма длин волн.
\item \textbf{двухлучевая модель распространения}. Предполагает уточнение высоты установки антенн передатчика и приёмника (не высоту самих антенн). получается два луча - прямая видимость и отражённый от поверхности земли. Коэфф усиления а и б - прямая видимость с,д это падающий и отражённый лучи. угол падения Тета большое, расстояния падения и отражения х и хштрих. получаем формулу суммы лучей прямой видимости и отражённого луча, но отражённый луч приходит на время тау позже и формируется сдвиг фаз сигнала. В зависимости от того как приходят сигналы картина сигналов может значительно отличаться.
\def\svgwidth{60mm}
\input{pics/01-itsp-02-zamir.pdf_tex}
Такая картина возникает из-за разницы фаз, но в асимптотическом случае получаем после какого-то расстояния мощность принятого сигнала будет (схлопываются до GrGt) как у прямой видимости. Также важно учесть коэффициент отражения (зависит от множества факторов, как от диэлектрических свойств, так и от длины волны, итд.) затухание происходит быстрее - 4я степень расстояния, в отличие от квадрата в открытом пространстве и нет зависимости от длины волны.
\item \textbf{десятилучевая модель распространения (Модель гранд каньон)}. Лучи отражаются как в двухлучевой модели + от стен + многократные отражения. Считается, что больше трёх отражений учитывать не нужно из-за слабости сигнала. Также в этой модели используются разные комбинации таких отражений.
\def\svgwidth{100mm}
\input{pics/01-itsp-01-ten.pdf_tex}
Так получаем оригинальный луч и сумму всех отражённых лучей с учётом разницы фаз и коэффициентов отражений от диэлектрической проницаемости среды. Если у лучей недостаточно широкая полоса - сливаются в один. В сверширокополосных системах каждый импульс различим. Передаваемый сигнал обычно распространяется во все стороны и не учитывается сигнал, уходящий в другую сторону. Скорость затухания равна квадрату расстояния но вплоть до шестой степени. В некоторых случаях сигнал может приниматься даже лучше, чем в прямой видимости. Применяется в шахтах, на длинных улицах, ущельях.
\item \textit{Эффекты дифракции и рассеивания}. Точно описать модель дифракции почти невозможно из-за разницы геометрии препятствий. Модель клиновидного препятствия хорошо описана. Волна попадает за препятствие (дифракция, затенение).
\def\svgwidth{70mm}
\input{pics/01-itsp-01-obstacle.pdf_tex}
Согласно этой модели есть два расстояния d и d' а также высота препятствия h, при этом если высота значительно меньше длины волны и расстояния значительно больше высоты возникает разница фаз и обозначается дифракционным параметром Френеля-Кирхгофа.
\[\Delta d = \frac{h^2}{2}\frac{d+d'}{dd'}\]
Существуют разные аппроксимации, важно помнить что величину дифракции считаем по логарифмической шкале, а дифрагированный сигнал считается в абсолютных величинах (10 10-чных логарифмов). Заборы, углы зданий, вершины скал, итд
\item \textit{Рассеивание}. в городских условиях листва, дорожные знаки, и так далее. Сигнал отражается от рассеивающего объекта и какая-то часть доходит до приёмника. В общем случае есть луч прямой видимости. Какое-то количество отражённых лучей по десятилучевой модели (произвольное, а не 10), также учитываем многократные отражения, лучи, которые претерпели дифракцию, и произвольное количество рассеянных лучей. На практике такие модели посчитать почти невозможно, хоть и есть САПР.
\end{enumerate}
\item \textbf{эмпирические}
Проводится серия экспериментов. Всегда надо сначала понять для каких условий модель применима. Доверять модели можно только если не экстраполировать модель на совсем непохожие условия. Все расчёты всегда происходят с медианными значениями, не могут быть точными из-за большого количества факторов.
\begin{enumerate}
\item модель Окамуры (Окомуры). Наиболее часто используется, позволяет определить затухание в городских условиях. Используется для проектирования сотовых сетей, применима от 1 до 100км и от 15мгц до 2ггц. Согласно модели медианное значение потерь можно высчитать по формуле
\[PL(d) = L_F(f_c,d) + A_{mu}(f_c,d) - G(h_t) - G(h_r) - G_{area}, \text{дБ} \]
Потери состоят из
\begin{itemize}
\item $L_F$ потери свободного пространства на несущей $F_c$ и расстоянии $d$
\item поправочные коэффициенты
\begin{itemize}
\item медианное значение дополнительных потерь свободного пространства (всегда положительные) $A_{mu}$
\item высота установки антенны передатчика и приёмника со знаком минус (чем выше антенна, тем меньше затухание) $G$
\item тип застройки (также знак минус, чем меньше застройка, тем меньше потерь)
\end{itemize}
Шкалы были получены эмперически.
\end{itemize}
Новизна модели состоит во введении шкалы дополнительного затухания строящегося из отношения расстояния и частоты. Модель применима для сотовых и микросотовых сетей. погрешность 10-14Дб, это очень мало.
\item Модель Хата. Дополняет модель Окамуры и упрощает расчёт потерь на трассе. Модель Окамуры неудобна из-за того что каждый раз нужно считать всё по кривым итд. Модель Хата задаёт медианные потери в виде параметризированный формулы.
\[PL_{(urban)}(d) = 69,55 + 26,16lg f_c - 13,82lg h_t - a(h_r) + (44,9 - 6,55lg h_t)lg d, \text{дБ} \]
для распространения в городских условий.
Добавляем поправочные коэффициенты для пригорода или сельской местности. Также является обобщением эмпирических данных.
\item COST-231 модификация модели Хата. Модификация для применения с частотами 1,5-2ГГц. Согласно этой модели медианные потери считаются также параметрической формулой
\[PL(d) = 46,3 + 33,9lg f_c - 13,82lg h_t - a(h_r) + (44,9 - 6,55lg h_t)lg d + C_M\]
с расстояниями и высотами из модели Хата, где $C_M$ = 0дБ для средних городов и пригорода и 3дБ для центра города.
\end{enumerate}
\item \textbf{статистические}
Такие модели решают проблемы эмпирических и детерминированных в части подсчёта вероятностей. Описывают ситуации, когда есть медленные и быстрые замирания. Быстрые замирания особенно видны в помещениях или в условиях плотной городской застройки. Проявляются в масштабах длины волны. Все эти замирания носят случайный характер, поэтому для их апроксимации применяют статистические модели. В отличие от модели Окамуры или Хата нет единственного числа, а есть статистическая модель.
\begin{enumerate}
\item логарифмически нормальная модель. Согласно этой модели потери в тракте - это случайная величина. Если её выразить в дБ она будет выражена в нормальном распределения (гауссовский закон).
\[ f(\psi) = \frac{1}{\sqrt{2\pi}\sigma}\exp[-\frac{(\psi-\mu)}{2\sigma^2}] \]
\[ \psi = PL(d) = \overline{PL}(d) + X_{\sigma} = \overline{PL}(d_0) + 10\alpha lg(\frac{d}{d_0}) + X_{\sigma} \]
характеризуется 4мя параметрами
\begin{enumerate}
\item эталонное расстояние (обычно берётся <<с потолка>>, 1м (чаще всего), для простоты вычислений. Должно соответствовать дальней зоне антенны, ближняя зона - это несколько длин волн),
\item средние потери (измерить серией экспериментов или теоретически посчитать, используя детерминированную модель, например, модель распространения в открытом пространстве),
\item скорость возрастания потерь в зависимости от расстояния (высчитываем альфа и сигма эмпирически произведя серию экспериментов, или используем готовые исследования),
\item глубина замирания.
\end{enumerate}
Используется для описания медленных, крупномасштабных замираний, особенно в ситауции внутри помещения. Сигма = 0 значит случайного фактора нет, а альфа = 2 - это скорость затухания, в этом случае получим модель распространения в открытом пространстве. Например
\begin{table}[H]
\begin{tabular}{||p{0.1\textwidth}|c|c|c|p{0.45\textwidth}||}
\hline
Условие & Частота несущей & Альфа & Сигма & Примечания \\ [0.5ex]
\hline\hline
Офис & 900 & 2,4 & 9,6 & альфа почти не изменилась, потому что в среднем условия не поменялись, а сигма говорит о том, что нам стали мешать больше предметов. Разброс случайных величин становится больше, более выражен случайный фактор \\
Офис & 1900 & 2,6 & 14,1 & \\
Пром. терр. с прямой видимостью & 1300 & 1,6 & 5,8 & частота несущей не изменилась, геометрия мешающих предметов не изменилась, сигма осталась почти такой же, а вот альфа изменилась, средние потери ухудшились, потому что нет доминирующего сигнала, только отражённые \\
Пром. терр. без ПВ & 1300 & 3,3 & 6,8 & \\
\hline
\end{tabular}
\caption{Примеры}
\label{table:examples}
\end{table}
В этой модели мы всегда оперируем вероятностями. Мы можем посчитать вероятность мощности принятого сигнала большего чем какой-то минимальный порог.
\[ P_r[R(d) > P_{min}] = 1-\Phi(\frac{P_{min} - P_{t} + \overline{PL}(d_0) + 10\alpha lg(\frac{d}{d_0})}{\sigma}) \]
$\Phi$ - это функция распределения стандартной нормальной случайной величины (с нулевым средним и дисперсией равной единице). Подставив значения порогов и расстояний и берём справочное значение $\Phi$. Если хотим узнать вероятность с которой мощность на расстоянии окажется ниже заданного порога
\[ P_r[P(d)<P_{min}] = \Phi(\frac{P_{min} - P_{t} + \overline{PL}(d_0) + 10\alpha lg(\frac{d}{d_0})}{\sigma}) \]
Для улучшения качества приёма надо уменьшать порог чувствительности и увеличивая мощность передатчика. Должны поменять модуляции и множество других факторов.
Можем посчитать коэфф номинальной зону покрытия сигнала (то есть мощность выше порога) в виде вероятности
\[ U(P_{min}) = \frac{1}{\pi R^2} \iint_V P_r[P(r) > P_{min}] = Q(d)+exp(\frac{2-2ab}{b^2})Q(\frac{2-2ab}{b}) \]
\[ a = \frac{P_{min} - P_{t} + \overline{PL}(d_0) + 10\alpha lg(\frac{R}{d_0})}{\sigma} \]
\[ b = \frac{10\alpha lg e}{\sigma} \]
\end{enumerate}
\item \textbf{модели для узкополосных систем}
В общем случае это сумма из множества лучей, включающих прямой луч. Есть сдвиги по фазе из-за разницы времени и учитывается эффект допплера уникальные для каждого отражения. От времени зависит не только фаза, но и количество лучей.
допущения:
\begin{enumerate}
\item временные задержки примерно равны (полоса недостаточно широка, чтобы каждый луч выделить в отдельный) лучи для приёмника неразличимы, он их считает суммой всех синусов. Единственное исключение - сверхширокополосная связь. Принятый сигнал р(т) равен сумме квадратурных сигналов(р(т) кос + р(ку)син). Квадратурный коэффициент. сигнал - синус с амплитудой и фазой. если представить его на плоскости то амплитуда это радиус, угол это фаза. иногда удобнее представлять в виде квадратуры - это проекции на оси на х р(и(т)) синфазная составляющая и у р(ку(т)) при этом принятый сигнал р(т). квадратуры описывают через амплитудные коэффициенты форму сигнала.
\item мы не знаем какое распределение случайных лучей, а каждый луч это сумма квадратур, но если количество лучей достаточно велико, согласно центральной линейной теореме при бесконечности сумм какое бы не было распределение сумма будет иметь нормальное распределение. то есть случайные величины будут иметь нормальное распределение
\item величины стационарны, чтобы упростить себе жизнь мы предполагаем что амплитудный коэффициент и временная задержка не важны, убираем фактор времени.
\item мат ожидание равно нулю поэтому убираем луч в линии прямой видимости.
\end{enumerate}
\[\Phi_n(t) = 2\pi f_c\tau_n - 2\pi f_Dt - \phi_0\]
Фаза н-ного луча зависит от временной задержки. фазовый сдвиг вызван эффектом допплера, фи нулевое это начальная фаза, которая не играет роли. Допплеровский сдвиг частоты это в пределах нескольких десятков герц, основной фактор, который будет влиять на фазу - это тау(н) частота несущей. частота обычно обратна временнОй задержке. небольшое изменение может меняться во вс§м возможном диапазоне значений. Математическое ожидание
\[M[r_I(t)] = M[\sum_n\alpha_ncos\phi_n(t)] = \sum_nM[\alpha_n]M[\cos\phi_n(t)]\]
мат ожидание это произведение каждого мат ожидания по отдельности. поскольку одно мат ожидание равно 0 то общее тоже. потому что мат ожидание фазы это 0. синус среднего распределения на всём периоде равно 0.
\textbf{Замирания}
\begin{enumerate}
\item \textbf{релея} описывает случай когда нет луча прямой видимости. $z(t) = |r(t)| = \sqrt{r_I^2(t) + r_Q^2(t)}$ корень суммы квадратов случайных величин с нормальным распределением. Показывает насколько далеко реальное распределение будет отличаться от среднего. Распределение плотности вероятности для амплитуды огибающей выгялдит как $p_z(z) = \frac{2z}{p_r}exp(-\frac{z^22}{p^2}) = \frac{z}{\sigma^2}exp(-\frac{z^2}{2\sigma^2})$
функция плотности распределения вероятности для мощности принятного сигнала $p_w(w) = \frac{1}{p_r}exp(-\frac{w}{p_r})$
предположим релеевский канал и средняя мощнсть канала -80дБМ. на входе приёмника мощность -90 дБМ. -80дБМ = $10^{-8}$мВт, -90 = $10^{-9}$мВт. считаем вероятность того что принятый сигнал будет выше порога.
\[P(w<W) = \int_0^W \frac{1}{p_r}exp(-\frac{x}{p_r})dx = 1-exp(-\frac{W}{p_r}) = 1 - exp(-\frac{10^{-9}}{10^{-8}}) = 0,95\]
\item \textbf{Райса} описывает более общий случай, когда есть и прямой луч
\[p_z(z) = \frac{z}{\sigma^2}exp[-\frac{z^2+S^2}{2\sigma^2}]I_0(\frac{zs}{\sigma^2})\]
\[S^2 = \alpha_0^2\]
\[2\sigma^2 = \overline{Z_n}M[\alpha_n]\]
\[K = \frac{S^2}{2\sigma^2}\]
\[p_r = S^2 + 2\sigma^2\]
\[p_z(z) = \frac{2(K+1)z}{p_r}exp[-K-\frac{(K+1)z^2}{p_r}]I_0(2\sqrt{\frac{K(K+1)}{p_r}}z)\]
При К = 0 релей, при бесконечной прямая видимость доминирует над отражёнными сигналами. представляется в децибелах.
\item \textbf{распределение накагами}. суть в том что оно ещё более общего вида. помогает посчитать как часто и сколько в среднем времени мы будем находиться ниже порога гарантии принятия сигнала.
\[L_z = \sqrt{2\pi(K+1)f_{D_m} \rho e^{-K-(K+1)\rho^2}I_0(2\rho\sqrt{K(K+1)})}\text{райс}\]
если в это выражение подставить к = 0 получим релея.
\[L_z = \sqrt{2\pi}f_{D_M}\rho e^{-\rho^2}\]
среднее время нахождения ниже порога
\[t_z = \frac{e^{\rho^2}}{\rho f_{D_m}\sqrt{2\pi}}\]
\[\rho = \frac{z_0}{\sqrt{p_r}} = \sqrt{\frac{p_0}{p_r}}\]
в примере получаем разовые битовые ошибки 17 раз в секунду. если больше - биты подряд, если меньше - ошибок нет
\end{enumerate}
\end{itemize}
\end{document}

420
01-isip-00-exam.tex Normal file
View File

@ -0,0 +1,420 @@
\documentclass[a4paper,fontsize=9bp]{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\numerationTop
\begin{document}
\thispagestyle{empty}
\tableofcontents
\newpage
\pagestyle{fancy}
\section{Семь основных исторических дат развития пользовательских интерфейсов.}
\begin{multicols}{3}
\textbf{(из лекции)}
\begin{enumerate}
\item компьютерная мышь 1963,
\item WYSIWYG,
\item GUI Xerox Alto,
\item систему передачи гипертекста.
\item первый браузер 1990.
\item понятие смартфон в 2000,
\item айфон 2007.
\end{enumerate}
\textbf{(из слайдов)}
\begin{itemize}
\item 63 sketchpad
\item 63 мышь
\item 68 on-line system
\item 73 GUI xerox alto
\item 74 WYSIWYG
\item 81 PC xerox
\item 88 IRIX3
\item 90 browser www
\item 92 IBM simon
\item 96 OS/2
\item 98 первый сенсорный дисплей
\item 00 термин smartphone
\item 05 winmobile
\item 07 iphone
\item 10 ipad
\item 12 win8
\item 14 первый интерфейс мозг-машина-мозг
\item 15 notebook interface in DS
\item 16 oculus rift
\item 20 zoom
\end{itemize}
\end{multicols}
\section{Четыре фундаментальных этапа эволюции пользовательских интерфейсов.}
\begin{multicols}{2}
\begin{itemize}
\item 1964-1981 господствовал режим разделения времени на мэйнфреймах и мини-компьютерах с использованием алфавитно-числовых дисплеев, пользователи могли взаимодействовать с компьютером путем ввода с клавиатуры команд с параметрами
\item 1981-2000 были созданы графические интерфейсы пользователя (GUI), предназначенные для работы на растровых графических сетевых рабочих станциях. Эти интерфейсы принято обозначать аббревиатурой WIMP (Windows-Icons-Menus-Pointing device), что отражает задействованные интерактивные сущности - окна, пиктограммы, меню и позиционирующее устройство (обычно мышь).
\item 2000-2025 Post-WIMP-интерфейс - это такой интерфейс, который заключает в себе по крайней мере один метод взаимодействия, не присущий классическим двухмерным решениям, таким как меню и пиктограммы. Он должен включать действующие в параллель сенсорные каналы, коммуникации с помощью естественного языка - и все это в среде из многих пользователей. распознаватели жестов, диалоговые видеоигры, Объекты, инкапсулирующие 3D-геометрию и предназначенные для управления другими объектами, Ввод с помощью двух рук, Распознавание речи, "Осязательные" пользовательские интерфейсы
\item 2025-?
\end{itemize}
\end{multicols}
\section{Семь основных характеристик верхнего уровня модели качества программного продукта.}
\begin{multicols}{2}
по Глассу
\begin{enumerate}
\item переносимость
\item надёжность
\item эффективность
\item юзабилити
\item тестируемость
\item понятность
\item модифицируемость
\end{enumerate}
\columnbreak
по ISO/IEC
\begin{enumerate}
\item функциональная пригодность
\item уровень производительности
\item совместимость
\item удобство использования
\item надёжность
\item защищённость
\item сопровождаемость
\item переносимость (мобильность)
\end{enumerate}
\end{multicols}
\newpage
\section{Семь основных понятий человеко-машинного взаимодействия.}
\begin{multicols}{2}
\begin{itemize}
\item доступность - пригодность использования продукта услуги среды или оборудования для людей
\item условия использования - пользователи, задачи, оборудование, физическая и социальная среда в которых используют продукцию
\item результативность - степень реализации запланированной деятельности и достижения запланированных результатов
\item эффективность - связь между достигнутым результато и использованными ресурсами
\item эргономика - научная дисциплина, изучающая взаимодействие человека с другими элементами системы, предполагающая использование теории, принципов, данных и методов для обеспечения благополучия человека и оптимизации общей производительности системы
\item человеко-ориентированное проектирование - способ проектирования и разработки систем с применением при проектировании принципов эргономики для повышения пригодности использования интерактивных систем
\item интерактивная система - система компонентов аппаратного и программного обеспечения которая получает информацию вводимую пользователем и передаёт ему свой ответ помогая в работе или выполнеии задачи
\item образец - интерактивная система или её часть, которая может хотя бы ограниченно быть использована для анализа и оценки проекта
\item удовлетворённость - отсутствие дискомфорта при использовани продукции
\item удобство использования - свойство системы, продукции, услуги при наличии которого установленный пользователь может применить продукциюв определённых условиях использования для достижения установленных целей с необходимой результативностью, эффективностью и удовлетворённостью
\item опыт взаимодействия - восприятие и ответные действия пользователя, возникающие в результате использования и/или предстоящего использования продукции, системы или услуги
\item валилдация - подтверждение посредством предоставления объективных свидетельств того, что требования, предназначенные для конкретного использования или применения, выполнены.
\item верификация - подтверждение посредством предоставления объективных свидетельств того, что требования выполнены
\item качество программного обеспечения - \textbf{ISO} способность программного продукта при заданных условиях удовлетворять установленным или предполагаемым потребностям. \textbf{ГОСТ} весь объём признаков и характеристик программ, который относится к их способностям удовлетворять установленным или предполагаемым потребностям. \textbf{IEEE} степень в которой система компонент или процесс удовлетворяют потребностям или ожиданиям заказчика или пользователя.
\end{itemize}
\end{multicols}
\section{Семь основных когнитивных измерений по Томасу Грину.}
\begin{multicols}{2}
Когнитивные измерения — это принципы разработки синтаксиса, пользовательских интерфейсов и других особенностей языков программирования.
\begin{enumerate}
\item Градиент абстракции (abstraction gradient)
\item Близость соответствия (closeness of mapping)
\item Согласованность (consistency)
\item Размытость — краткость (diffuseness — terseness)
\item Подверженность ошибкам (error-proneness)
\item Трудность мыслительных операций (hard mental operations)
\item Скрытые зависимости (hidden dependencies)
\item Сопоставляемость (juxtaposability)
\item Преждевременная фиксация решения (premature commitment)
\item Поэтапное оценивание (progressive evaluation)
\item Выразительность ролей (role-expressiveness)
\item Вторичные обозначения и избегание формализма (secondary notation and escape from formalism)
\item Вязкость (viscosity)
\item Наглядность (visibility)
\end{enumerate}
\end{multicols}
\newpage
\section{Формула оценки сложности интерфейса.}
\begin{multicols}{2}
\[C = -N \sum_{i=1}^n p_i log_2 p_i\]
где N - кол-во объектов, p отношения объектов в i-том классе ко всем объектам, n - кол-во классов объектов.
\[\mu = ((N/\nu) + 1) / (M + 1)t\]
где N - общий объём информации (кол-во элементов), M - кол-во элементов, обладающих заданным признаком, $\nu$ - оперативный объём зрительного восприятия ($5\pm2$ элементовв поле $\approx10$ градусов) t
\end{multicols}
\section{Пять экспериментов по восприятию цвета пользователем.}
\begin{multicols}{2}
\begin{enumerate}
\item Гипотеза Сурнина-Ширева (РГППУ): Пользователь в первую очередь запомнит информацию, помещенную на предпочитаемом им цветовом фоне и расположенную в определенном месте страницы независимо от содержания этой информации.
\item Гипотеза ИУ3: Существуют гендерные когнитивные различия, определяющие предпочтения пользователей для интерфейса операционной системы, его фоновой заставки, количества элементов интерфейса и основных цветов.
\item Теория визуального предположения Грегори: визуальное восприятие зависит от нисходящей обработки. Нисходящая обработка, или концептуально управляемый процесс, осуществляется тогда, когда мы формируем представление о большой картине из мелких деталей. Мы строим предположение о том, что видим, на основе ожиданий, убеждений, прежних знаний и предыдущего опыта. Другими словами, мы делаем обдуманное предположение.
\item Эксперимент Саноки и Сульмана на соотношения цветов: По данным многочисленных психологических исследований сочетания однородных цветов более гармоничны и приятны. В то время как контрастные цвета обычно ассоциируются с хаосом и агрессией.
\item Феномен бинокулярного соперничества: Бинокулярное соперничество возникает, когда мы видим два разных изображения в одном месте. Одно из них доминирует, а второе — подавляется. Доминирование чередуется через определенные промежутки времени. Так, вместо того, чтобы видеть комбинацию двух картинок одновременно, мы воспринимаем их по очереди, как два конкурирующих за доминирование изображения.
\end{enumerate}
\end{multicols}
\section{Три фундаментальные взаимосвязи в процессах обучения животных и машин.}
\begin{multicols}{2}
\begin{enumerate}
\item Алгоритмы предсказания и управления RL является налогом Павловского и Инструментального обуславливания. Ключевым различием является сущность подкрепляющего сигнала: в первом случае он не зависит от поведения животного, а во втором зависит.
\item В AL и RL обучение методом проб и ошибок является базовым методом, который позволяет сформулировать Закон эффективности, который в свою очередь вводит понятие формирования условных рефлексов путём последовательного приближения к цели.
\item Животные и агенты способны во время обучения строить и использовать когнитивные карты как дополнение и/или альтернативу методу оценки состояний-действий в быстро меняющейся среде. Что приводит к краеугольному камню обучения: model-free RL (habitual AL) vs. model-based RL (goal-directed behavior).
\end{enumerate}
\end{multicols}
\newpage
\section{Три понятия характеризующих локус внимания пользователя.}
\begin{multicols}{2}
\begin{enumerate}
\item сингулярность - я не моду думать об х если думаю об у. (в среднем пользователю нужно 10сек, чтобы переключить внимание с одного контекста на другой)
\item автоматизм - по мере повторения действие становится привычным, человек выполняет его не задумываясь. Привычка == отказ от внимания к деталям. В идеальном человеко-ориентированном интерфейсе доля участия самого интерфейса в работе пользователя должна сводитьчся к формированию полезных привычек.
\item эксплуатация - обратное автоматизму, никаким количеством повторений нельзя научиться НЕ формировать привычки при регулярном использовании некоторого интерфеса. например, любой запрос о подтверждении, требующий установленного ответа, вскоре становится бесполезным. Пользователь может быть в различной степени поглощен задачей, которая в данный момент находится в локусе его внимания. Цель разработчика интерфейса поставить саму задачу в качестве локуса внимания.
\end{enumerate}
\end{multicols}
\section{Два главных закона квантификации.}
\begin{multicols}{2}
Квантификация (англ. quantificaion) — сведение качественных характеристик к количественным для следующего этапа — измерения, то есть придания результату численного значения. Многие количественные и эвристические методы используются для анализа и изучения интерфейсов. Количественные методы могут свести спорные вопросы к простым вычислениям.
\begin{itemize}
\item Закон Фитса (Fitts' Law) позволяет определить количественно
тот факт, что чем дальше находится объект от текущей позиции курсора или чем меньше размеры этого объекта, тем больше времени потребуется пользователю для перемещения к нему курсора.
\item Закон Хика (Hick's Law) позволяет количественно определить наблюдение, заключающееся в том, что чем больше количество вариантов заданного типа вы предоставляете, тем больше времени требуется на выбор.
\end{itemize}
\end{multicols}
\section{Пять параметров модели GOMS.}
\begin{multicols}{2}
Время, требующееся для выполнения какой-либо задачи пользователем, является суммой всех временных интервалов, затраченных на последовательное выполнение составных частей задачи. Упрощенная модель не может быть использована для получения абсолютных временных значений.
\begin{itemize}
\item К, 0,20(сек) - Нажатие клавиши. Время, необходимое для того, чтобы нажать клавишу
\item Р, 1,10(сек) - Указание. Время, необходимое пользователю для того, чтобы указать на какую-то позицию на экране монитора
\item Н, 0,40(сек) - Перемещение. Время, необходимое пользователю для того, чтобы переместить руку с клавиатуры на ГУВ или с ГУВ на клавиатуру
\item M, 1,35(сек) - Ментальная подготовка. Время, необходимое пользователю для того, чтобы умственно подготовиться к следующему шагу
\item R - Ответ. Время, в течение которого пользователь должен ожидать ответ компьютера
\end{itemize}
\end{multicols}
\newpage
\section{Шесть правил модели GOMS.}
\begin{multicols}{2}
\begin{enumerate}
\item Оператор I возникает лишь при начале работы с программой и предшествует первому результативному действию.
\item Оператор Е предшествует первому результативному действию в каждом новом окне, а так же действию со сменой руки.
\item Если оператор, следующий за оператором M, является полностью ожидаемым с точки зрения оператора, предшествующего M, то этот оператор M должен быть удален.
\item В когнитивных единицах следует удалять все операторы М за исключением первого. Когнитивной единицей называется строка вида М S М S М S М S..., непрерывная последовательность вводимых символов, образующих в совокупности имя команды или ее аргумент.
\item Если оператор S означает лишний разделитель, стоящий в конце когнитивной единицы (например, разделитель команды, следующий сразу за разделителем аргумента этой команды), то следует удалить оператор M, стоящий перед ним.
\item Оператор М необходимо устанавливать перед всеми операторами S и Р, предназначенными для выбора команд, но перед операторами P, указывающими аргументы этих команд, оператор M ставить не следует.
\item Если оператор S является разделителем, стоящим после константной строки (название команды или любая другая сохраняющая неизменный вид последовательность символов), то следует убрать оператор M, стоящий перед ним, так как в этом случае добавление разделителя становится частью строки и не требует специального оператора М. Однако, если оператор S является разделителем строки аргументов или любой другой изменяемой строки, то оператор М перед ней сохраняется.
\item Части оператора М, перекрывающие оператор R, не учитываются.
\end{enumerate}
\end{multicols}
\section{Шесть метрик интегрированной модели оценки интерфейса QUIM.}
\begin{multicols}{2}
\begin{enumerate}
\item Essential Efficiency - показывает как близко пользовательский интерфейс к идеальному для юзкейса
\item Layout Appropriateness - показывает, насколько хорошо сгруппированы часто используемые объекты, для уменьшения затрачиваемого пользователем на взаимодействие времени
\item Task Concordance измеряет, насколько хорошо частота задачи соответствует её сложности, предполагает, что более частые задачи должны быть проще
\item Task Visiblity - пропорция объектов интерфейса, нужных для выполнения задачи к общему количеству элементов интерфейса.
\item Horizontal or Vertical balance - сбалансированность экрана для горизонтального и вертикального режимов использования
\item Task Effectiveness - сколько задач нужно выполнить, чтобы достичь цели
\end{enumerate}
\end{multicols}
\section{Пять примеров режимов в интерфейсах.}
\begin{multicols}{2}
режимы - часто применяемая при создании интерфейса механика. интерфейс может находиться в нескольких состояниях, от этого может меняться режим использования. много исследований связано не только со внешним видом, но и с подписями для переключения режимов. опыт пользователя не избавляет от ошибок порождаемых режимами. режим - плохой индикатор состояния, он приводит к необычному для системы поведению. предотвратить можно: 1 не использвать режимы, 2 обеспечить чёткое различие, 3 не использовать одинаковые команды в разных режимах. режимы присущи и джойстикам управления (непонятно, летит вертолёт вверх по нажатию вверх как мы думаем, или вниз как думаю пилоты). постепенно в режимы внедряют адаптивность (перемещение часто используемых функций в начало меню, например). применяют опыт "лягушка в кипятке".
\end{multicols}
\newpage
\section{Пример расчета теоретически значимой производительности интерфейса.}
\begin{multicols}{2}
Задача
\begin{itemize}
\item Программа должна переводить температурные показания из шкалы Фаренгейта в шкалу Цельсия или наоборот.
\item Значение температуры оператор может ввести только с помощью клавиатуры или компьютерной мыши. Голосовые или другие средства ввода отсутствуют.
\item Перевод из одной шкалы в другую требуется с равной вероятностью. Приблизительно 25\% значений — отрицательные. 10\% значений являются целочисленными.
\item Результат перевода из одной шкалы в другую должен отражаться на экране. Другие средства вывода результатов не используются.
\item Вводимые и выводимые числовые значения температур могут иметь до десяти цифр с каждой стороны от десятичного разделителя.
\end{itemize}
Интерфейс с двумя радио и двумя полями ввода
\begin{itemize}
\item Перемещение руки к графическому устройству ввода данных: H
\item Перемещение курсора к необходимому переключателю в группе: HP
\item Нажатие на необходимый переключатель: HPK
\item Перемещение рук снова к клавиатуре: HPKH
\item Ввод четырех символов: HPKHKKKK
\item Нажатие клавиши <Enter>: HPKHKKKKK
\item HMPMKHMKMKMKMKMK
\item HMPKHMKKKKMK
\item H+M+P+K+H+M+K+K+K+K+M+K =
\item = 0.4+1.35+1.1+0.2+0.4+1.35+4*(0.2)+1.35+0.2=7.15с
\end{itemize}
Интерфейс с двумя слайдерами
\begin{itemize}
\item Случай 1. HPK HPKPK HMPMKMK HMPKK HMPKK 0.4+1.35+1.1+0.2+0.2=3.25с
\item Случай 2. Время прокручивания шкал - S
\item HPKSKPKSKPKSKPKK
\item H+3(M+P+K+S+K)+M+P+K+K
\item 0.4+3*(1.35+0.2+3.0+0.2)+1.35+0.4+0.2+0.2=16.8с
\end{itemize}
\end{multicols}
\section{Формула оценки кросс-платформенного юзабилити.}
\begin{multicols}{2}
\[T_{execuation} = \sum_{i=1}^n T_{sp_i} - \bigg(\sum_{i=1}^n T_{en_i} + \sum_{i=1}^n T_{ex_i} + \sum_{i=1}^n T_{sw_i} + \sum_{i=1}^n T_{sy_i}\bigg)\]
где
\begin{itemize}
\item sp - время, потраченное на задачу (все подзадачи)
\item en - время входа в каждый сервис - время до начала работы над подзадачей
\item ex - время выхода из каждого сервиса - после работы над подзадачей
\item sw - время переключения между устройствами при использовании нескольких
\item sy - время синхронизации - сколько времени нужно объекту для кроссплатформенной синхронизации
\end{itemize}
\[T_{accuracy} = \frac{\sum_{i=1}^n T_{subtasks\_with\_errors\_in\_service_i}}{\sum_{i=1}^n T_{subtasks\_with\_no\_errors\_in\_service_i}} * 100\]
\[T_{effectiveness} = \frac{W(\sum_{i=1}^n T_{subtasks\_in\_service_i})}{S(\sum_{i=1}^n T_{subtasks\_in\_service_i})} * 100\]
\[P_{productivity} = \frac{\sum_{i=1}^n T_{productive} - \sum_{i=1}^n T_{unproductive}}{\sum_{i=1}^n T_{productive}} * 100\]
где
\begin{itemize}
\item productive - пропорция времени, затраченного пользователем для решения подзадачи
\item unproductive - пропорция времени, затраченного на поиск решения, помощи, восстановления после ошибок, итд.
\end{itemize}
\end{multicols}
\newpage
\section{Метод оценки юзабилити на основе машинного обучения.}
\begin{multicols}{2}
\textbf{(из лекции)} составили критерии оценки по пользовательским опросникам, поняли можно ли в интерфейсе решить больше количество задач, гибко ли, всё ли загружается, активность, обратная связь, итд. Получив оценки по всем фактоам их объединяют дают на вход многослойного персептрона и получают распределение по правилу Парето 20/80. где 20 процентов интерфейса выполняют 80 процентов функциональности.
\textbf{(из пдф)}
\begin{enumerate}
\item старт > 2
\item сбор данных > 3
\item измерение юзабилити > 4
\item удовлетворяет ли оценка интерфейса +> стоп -> 5
\item найти лучшую модель машинного обучения > 6
\item настроить чувствительность анализа в модели > 7
\item подсчитать индексы по всем факторам > 8
\item применить правило парето > 9
\item улучшить систему обучения > 2
\end{enumerate}
\end{multicols}
\section{Четыре способа создания унифицированных изделий.}
\begin{multicols}{2}
(из лекции)
Если сделать устройства одинаковыми - пользователю будет легче ими пользоваться. Если избавиться от известных человекомашинных элементов (модлаьных ошибок) интерфейсы станут одинаковыми. унификация - это приведение к единообразию. в рф понимается приведение документации, технических характеристик. в рф принимается \textbf{базовый агрегат}, разнообразие достигается присоединением частей, \textbf{компаундирование}, \textbf{модифицирование} (изменение дорогих частей, обновление), \textbf{принцип модульности} - собираем из частей, как конструктор. унификация - это разновидность систематизации.
Самое простое средство - ручной выбор стандартных функций пользователя (исследование физических действий пользователя для создания разных но при этом унифицированных интерфейсов). Разработка основана на том, что любые выглядящие одинаково элементы должны действовать одинаково. Пользователь должен по виду элемента понять, что с ним можно делать, а что с ним нельзя делать (состоятельность)
Основывается трёх понятиях: на согласованности(consistency), видимости и состоятельности. эти факторы должны приводить к удовлетворению пользователей и соответственно лояльности.
\end{multicols}
\section{Модели «глагол-существительное» и «существительное-глагол».}
\begin{multicols}{2}
модель "глагол-существительное" и "существительное-глагол". как применять команды (действия к объекту), например мы в редакторе у абзаца меняем шрифт, это сущ-глаг. если в пеинте сначала выбрать краску, а потом инструмент - это глаг-сущ. выглядит одинаково, но является разными с точки зрения юзабилити. лучшие показатели и безопасность показывает сущ-глаг. глаг-сущ приводит к модальным ошибкам, то есть к режимизации интерфейса. ГС проигрывает и в скорости, не нужно переключать внимание пользователя. при использовании глаг-сущ должна быть предусмотрена возможность отмены команды.
\end{multicols}
\section{Три способа предотвращения модальных ошибок.}
\begin{multicols}{2}
модальная ошибка это ошибка, возникающая в результате неверной классификации или анализа пользователем ситуации при взаимодействии с интерфейсом
1 не использвать режимы, 2 обеспечить чёткое различие, 3 не использовать одинаковые команды в разных режимах.
\end{multicols}
\section{Создание персон.}
\begin{multicols}{2}
понимание целевой аудитории помогает убеждать к конверсии. главное качество инноватора - эмпатия. для качественной конверсии нужно создать аппроксимацию своего пользователя. влияет сочетание факторов - гео-, демо-, психографические, поведенческие. соответственно и профили. есть и отрицательные моменты - ошибки аппроксимации, слишком много информации для анализа, вторжение в частную жизнь. мелкие компании не имеют средств узнать своих клиентов, крупные имеют слишком много информации.
\end{multicols}
\section{Пятишаговый процесс достижения преданности пользователя.}
\begin{multicols}{2}
\end{multicols}
\section{Проектирование интерфейса с помощью итеративной оптимизации конверсии интерфейса.}
\begin{multicols}{2}
\end{multicols}
\section{Основные причины снижения показателей конверсии Веб-сайтов.}
\begin{multicols}{2}
\end{multicols}
\section{Персонализация пользовательских интерфейсов на основе методов машинного обучения с подкреплением.}
\begin{multicols}{2}
\end{multicols}
\section{Два правила видимости элемента интерфейса.}
\begin{multicols}{2}
\end{multicols}
\section{Два правила состоятельности элемента интерфейса.}
\begin{multicols}{2}
\end{multicols}
\section{Современное состояние и направления развития интеллектуальных человеко- машинных систем.}
\begin{multicols}{2}
\end{multicols}
\section{Моделе-ориентированное проектирование пользовательского интерфейса.}
\begin{multicols}{2}
\end{multicols}
\section{Пять недостатков пиктограмм.}
\begin{multicols}{2}
\end{multicols}
\section{Шестишаговый метод разработки удобных пиктограмм.}
\begin{multicols}{2}
\end{multicols}
\section{Шаблоны сложных категорий в проектировании пользовательских интерфейсов.}
\begin{multicols}{2}
\end{multicols}
\section{Шаблоны представления информации в проектировании пользовательских интерфейсов.}
\begin{multicols}{2}
\end{multicols}
\section{Поведенческие шаблоны проектирования пользовательских интерфейсов.}
\begin{multicols}{2}
\end{multicols}
\section{Шаблоны взаимосвязи в проектировании пользовательских интерфейсов.}
\begin{multicols}{2}
\end{multicols}
\section{Шаблоны визуальной иерархии в проектировании пользовательских интерфейсов.}
\begin{multicols}{2}
\end{multicols}
\section{Основные понятия интеллектуального мультимодального интерфейса.}
\begin{multicols}{2}
\end{multicols}
\section{Окружающая интеллектуальность.}
\begin{multicols}{2}
\end{multicols}
\section{Классификация интеллектуальных мультимодальных интерфейсов.}
\begin{multicols}{2}
\end{multicols}
\section{Смежные науки интеллектуальных мультимодальных интерфейсов.}
\begin{multicols}{2}
\end{multicols}
\section{Декларативно-процессное проектирование интеллектуального мультимодального интерфейса.}
\begin{multicols}{2}
\end{multicols}
\section{Свойства интеллектуального мультимодального интерфейса.}
\begin{multicols}{2}
\end{multicols}
\section{Понятие процесса в теории пи-исчисления.}
\begin{multicols}{2}
\end{multicols}
\section{Процессные модели интеллектуального мультимодального интерфейса.}
\begin{multicols}{2}
\end{multicols}
\section{Нейрокомпьютерные интерфейсы.}
\begin{multicols}{2}
\end{multicols}
\section{Обучение с подкреплением для проектирования интеллектуального интерфейса.}
\begin{multicols}{2}
\end{multicols}
\section{Критика интеллектуальных интерфейсов.}
\begin{multicols}{2}
\end{multicols}
\section{Инструментарий интеллектуального мультимодального интерфейса.}
\begin{multicols}{2}
\end{multicols}
\section{Прототипирование интеллектуального мультимодального интерфейса.}
\begin{multicols}{2}
\end{multicols}
\section{Архитектура интеллектуального мультимодального интерфейса.}
\begin{multicols}{2}
\end{multicols}
\end{document}

245
01-isip-lab-01-report.tex Normal file
View File

@ -0,0 +1,245 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\setcounter{secnumdepth}{0}
\begin{document}
\pagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{1}{Введение в анализ интерфейсов}{Протоколы и интерфейсы информационных систем}{}{Большаков В.Э.}
\newpage
\tableofcontents
\newpage
\section{Упражнение 1}
\subsection{** За одну минуту найти максимальное количество ссылок о себе в Интернете}
Разные поисковые системы ожидаемо выдают разные результаты поиска по сочетанию фамилии, имени и отчества.
Так, Google выдал на первых трёх страницах поиска (не считая однофамильцев) более десятка ссылок на налоговую информацию как физического, так и юридического лица. В третьем десятке результатов появились ссылки на профили используемых ресурсов для разработчиков.
Поисковик Yandex первой строкой выдаёт ссылку на соответствующий запросу профиль в социальной сети <<вКонтакте>>. Далее аналогично, налоговая информация, ссылка на профиль <<GitHub>> появилась только на пятой странице. Очевидно, что Яндекс более ориентирован на то, что им будут пользоваться в России, искать информацию о человеке, полезную для российских заинтересованных лиц.
%\addcontentsline{toc}{section}{Упражнение 2}
\section{Упражнение 2}
\subsection{*** Найти примеры семи комбинаций из трёх указанных способов}
В упражнении были указаны следующие способы достижения быстрого и удобного просмотра веб-сайтов:
\begin{enumerate}
\item Создание визуальной иерархии
\item Использование принятых условностей
\item Разделять страницы на чёткие области
\item Ясно обозначить активные элементы
\item Уменьшить визуальный шум
\end{enumerate}
По результатам поиска были обнаружены следующие сочетания:
\begin{enumerate}
\item Хорошим примером \textit{плохого} дизайна (который, по словам создателей, был разработан таким преднамерено) может служить сайт reddit.com (до его превращения в социальную сеть <<примерно как все остальные>> с понятной лентой событий и областями для новостей и уведомлений).
\includegraphics[width=14cm]{01-isip-lab-01-reddit.png}
Здесь мы видим:
\begin{itemize}
\item явную перегруженность (шумность) интерфейса (5.1);
\item отсутствие явного разделения областей (3);
\item неявно обозначенные активные элементы (4).
\end{itemize}
\item Разнообразные любительские сайты и личные странички обычно оставляют весьма неприятное впечатление о себе.
\includegraphics[width=14cm]{01-isip-lab-01-gifs.png}
Хотя, вероятно, задумывались авторами, как источники полезной информации:
\begin{itemize}
\item налицо полное отсутствие какой-либо иерархии (1);
\item отсутствие общепринятых условностей (2);
\item данная страница настолько шумная, что даже заголовок не напоминает о цели визита (5.2).
\end{itemize}
\item Особенно интересно наблюдать юзабилити сайтов веб-студий, которые, предполагается, должны делать хорошие веб-сайты для своих клиентов.
\includegraphics[width=14cm]{01-isip-lab-01-popup.png}
\begin{itemize}
\item неясно обозначены активные элементы (4);
\item много фонового шума (всплывающие окошки, реклама) (5.2);
\item отсутвтие иерархии в основной части сайта - каталоге работ (1).
\end{itemize}
\item Лаконичный дизайн некоторых сайтов на первый взгляд выглядит привлекательно, но при работе с таким ресурсом обычно не получается быстро разобраться, где искать нужное:
\includegraphics[width=14cm]{01-isip-lab-01-elements.png}
\begin{itemize}
\item отсутствие общепринятых условностей (2);
\item отсутствие явного разделения областей (3);
\item неясно обозначены активные элементы (4);
\end{itemize}
\item На снимке экрана ниже не видно, но это действующий сайт небольшого локального магазина, а на фоне салют - это движущиеся изображения.
\includegraphics[width=14cm]{01-isip-lab-01-navigation.png}
\begin{itemize}
\item отсутствие общепринятых условностей (2);
\item отсутствие явного разделения областей (3);
\item чрезвычайно много отвлекающих факторов, из-за которых не видно даже основной навигации (5.2)
\end{itemize}
\item Далее будет представлено два снимка, призванные показать, что основная информация при переходе по ссылкам изменяется за пределами видимости посетителя ресурса. Также в каталоге отсутствует иерархия, и вся информация на сайте представлена в виде сплошного полотна картинок и текста
\includegraphics[width=14cm]{01-isip-lab-01-vet1.png}
Отдельно отмечу, что верхний снимок экрана - это одна страница, помещающаяся на один экран и при нажатии пунктов меню он остаётся неизменным.
\includegraphics[width=14cm]{01-isip-lab-01-vet2.png}
\begin{itemize}
\item Каталог услуг в виде плиточного перечисления создаёт трудности поиска нужной услуги (1);
\item отсутствие общепринятых условностей, например, поисковой строки (2);
\item отсутствие явного разделения областей, зато постоянно перед глазами контактная информация, которая ещё и продублирована в разделе <<Контакты>>. (3);
\end{itemize}
\item Отдельно хотелось бы отметить шедевр от внимательных веб-дизайнеров, допустивших попадание в сеть сайта, воспользоваться которым не сможет никто и никогда:
\includegraphics[width=14cm]{01-isip-lab-01-best.png}
В целом, к этому ресурсу можно применить все пять способов улучшения навигации и использования.
\end{enumerate}
\section{Упражнение 4}
\subsection{** Найти примеры пяти веб-сайтов на которых не выполняются рекомендации по сокращению текстовой информации}
Излишней многословностью обычно грешат страницы ресторанов, баз отдыха и отелей, а также полу-любительские страницы локальных бизнесов, таких как автосервисы, сферы услуг и предпринимателей, вот несколько примеров:
\begin{enumerate}
\item Ресторан <<Пирогово>>
\includegraphics[width=14cm]{01-isip-lab-01-pirogovo.png}
\item Ресторан <<Зверобой>>
\includegraphics[width=14cm]{01-isip-lab-01-zveroboy.png}
\item Санаторий <<Литвиново>> (отдельное им спасибо за замену словосочетания <<лечение грязями>> на слово <<бальнеоклиматический>>)
\includegraphics[width=14cm]{01-isip-lab-01-litvinovo.png}
\item Автосервис <<Гиперавто>>
\includegraphics[width=14cm]{01-isip-lab-01-hyperauto.png}
\item Частная пекарня в Екатеринбурге
\includegraphics[width=14cm]{01-isip-lab-01-bakery.png}
\end{enumerate}
\section{Упражнение 5}
\subsection{** Найти примеры пяти веб-сайтов для которых не выполняются требования по размещению информации на начальной странице}
\begin{enumerate}
\item Главная страница сайта microsoft.com
\includegraphics[width=14cm]{01-isip-lab-01-microsoft.png}
На данной странице представлены все необходимые элементы, кроме иерархии веб-сайта, которая убрана в выпадающий список <<Продукты Майкрософт>>. Таким образом, формально, эта страница является хорошим примером. С другой стороны, сайт очень сильно ориентирован на пользователей именно компании, и людям, не часто пользующимся продуктами данной компании, может быть сложно понять, как именно получить информацию о нужном продукте или услуге, поскольку отсутствует панель, отображающая полную иерархию веб-сайта.
\item Главная страница сайта google.com
\includegraphics[width=14cm]{01-isip-lab-01-google.png}
Страница была специально разработана лаконичной, что сформировало у пользователей узнаваемый облик компании. На данной странице нет ни одного компонента, присущего главным страницам, кроме глобального поиска. Маркетинговым ходом и основной отличительной чертой компании также является то, что на главной странице поисковика никогда не было рекламы ни за какие деньги.
\item Главная страница сайта intel.com
\includegraphics[width=14cm]{01-isip-lab-01-intel.png}
Страница содержит все обычные компоненты, кроме рекламы. Скорее всего, компания маштаба Intel, может себе позволить не размещать рекламу на своей главной странице. На этом примере мы видим, что наличие рекламы абсолютно не является обязательным пунктом для начальной страницы.
\item Главная страница интернет-магазина ozon.ru
\includegraphics[width=14cm]{01-isip-lab-01-ozon.png}
На странице спрятана большая часть компонентов, вместо них располагается реклама и анонс содержимого сайта. Вероятнее всего, это сделано по причине узкой направленности страницы: привлекать покупателей и нацеливать их на уход в глубину сайта.
\item Главная страница радиолюбительского сайта radiomuseum.org
\includegraphics[width=14cm]{01-isip-lab-01-radio.png}
На данной странице отсутствуют как слоган и описание основной идеи, так и иерархия. Если за нагромождением сливающегося текста ещё можно найти форму личного кабинета и строку поиска, то вряд ли с первого взгляда будет ясно, о чём этот сайт, и что чаще всего запрашивают пользователи.
\end{enumerate}
\section{Упражнение 6}
Основными навигационными элементами веб-сайта являются
\begin{enumerate}
\item логотип
\item название страницы
\item разделы
\item элементы локальной навигации
\item индикаторы местоположения (breadcrumbs)
\item поиск
\end{enumerate}
\subsection{** Открыть десять веб-страниц, найти и выделить шесть элементов навигации}
\begin{enumerate}
\item https://www.google.com/
\includegraphics[width=14cm]{01-isip-lab-01-06-google.png}
\item https://yandex.ru
\includegraphics[width=14cm]{01-isip-lab-01-06-yandex.png}
\item https://mail.ru
\includegraphics[width=14cm]{01-isip-lab-01-06-mail.png}
\item https://www.youtube.com
\includegraphics[height=4cm]{01-isip-lab-01-06-youtube.png}
\item https://jugru.org
\includegraphics[width=14cm]{01-isip-lab-01-06-jugru.png}
\item https://en.cppreference.com/
\includegraphics[width=14cm]{01-isip-lab-01-06-cppreference.png}
\item https://www.ozon.ru
\includegraphics[width=14cm]{01-isip-lab-01-06-ozon.png}
\item https://github.com
\includegraphics[width=14cm]{01-isip-lab-01-06-github.png}
\item https://gitlab.com/
\includegraphics[width=14cm]{01-isip-lab-01-06-gitlab.png}
\item https://www.microsoft.com/ru-ru/
\includegraphics[width=14cm]{01-isip-lab-01-06-microsoft.png}
\end{enumerate}
\subsection{*** Предложить вариант навигации для десяти исследуемых страниц}
\begin{enumerate}
\item Навигация по главной странице (google.com) устроена таким образом, чтобы пользователь не отвлекался от цели своего визита на страницу, в левом-верхнем углу сконцентрированы элементы управления и местоположения пользователя. От демонстрации всех разделов сайта (услуг) компания отказалась для увеличения концентрации пользователя именно на поиске.
\item Как видно (yandex.ru), основная информация сконцентрирована в левой и верхней части страницы, но нет акцента на элементах управления в чати перехода между разделами сайта и предоставляемыми услугами. Возможно, удобнее было бы увеличить раздел локальной навигации и добавить индикаторы текущего местоположения пользователя.
\item Основная информация о посещаемом ресурсе (mail.ru) и его логотип расположены в левом-верхнем углу, также в этом пространстве находится основная услуга компании - электронная почта. Элементы локальной навигации и текущего местоположения пользователя объединены и находятся в середине, но акцент смещён не на них, а на поисковую строку. Таким образом, основной рекомендацией может быть отделение локальной навигации от демонстрации текущего местоположения.
\item На данной странице (youtube.com) недостаточно выделена локальная навигация и текущее положение пользователя, но, вероятнее всего, в этом нет острой необходимости в связи с узкой специализацией ресурса.
\item Сайт организатора конференций (jugru.org). Полностью отсутствует локальная навигация, что делает перемещение по внутренним страницам ресурса не удобным. Частично присутствует индикатор местоположения, и хотя пользователь знает, где он находится, нет понимания, насколько далеко он от, например, главной страницы.
\item Страница справочника по языку программирования (cppreference.com). Элементы интерфейса и навигации объединены, за счёт чего создаётся соответствие внешнего вида и цели ресурса. Единственным недочётом я могу назвать недостаточный акцент на поисковой строке, поскольку это должен быть наиболее часто используемый на странице элемент.
\item Навигация по сайту (ozon.ru) ориентирована на поисковую строку, то есть предполагается, что пользователь не должен самостоятельно осуществлять перемещение по каталогу, но поскольку компания предоставляет и другие услуги, кроме онлайн покупок, следует вынести каталог услуг на отдельную панель, возможно, в левой части страницы, и сделать эту панель доступной для всех страниц.
\item Два ресурса (github.com, gitlab.com) с идентичными проблемами навигации: совершенно непонятно, где пользователь находится, и как ему попасть в нужное место, ни карты сайта, ни секции с разделами, ни локальной навигации. Вероятнее всего это обусловлено узкой специализацией и технической направленностью обоих. Так рекомендациями для этих сайтов может стать общее повышение дружественности пользователю и создание статичных панелей вверху и слева с перечнями предоставляемых услуг и текущего местоположения пользователя.
\item Главная страница сайта (microsoft.com) содержит только визуальную информацию и ссылки на разделы, которые хочет продемонстрировать компания, дальнейшая же навигация по сайту, продуктами и услугам осуществляется либо через множество пунктов меню, любо через строку поиска. Также при переходе на внутренние страницы теряется общее ощущение местоположения из-за отсутствия индикаторов местоположения. Компании, возможно, следует сделать информацию о текущем местоположении пользвоателя более явной.
\end{enumerate}
\section{Упражнение 7}
\subsection{* Выбрать три веб-сайта с вкладками. Провести их анализ в соответствии с правилами A-D}
\begin{itemize}
\item [A.] Чёткая прорисовка;
\item [B.] Отличие от других графических элементов;
\item [C.] Выделение цветом;
\item [D.] Обязательное выделение только одной из вкладок.
\end{itemize}
Так всем четырём правилам не соответствует ни один из представленных ниже вариантов, хотя есть предположение, что современные тенденции в графическом дизайне тяготеют к единообразию разных типов компонентов:
\begin{enumerate}
\item На странице ozon.ru видно, что вкладки ничем не отличаются от ссылок в верхней правой части <<шапки>> сайта. Также совершенно никак не выделена вкладка на которой находится пользователь (в данном случае, <<бренды>>):
\includegraphics[width=14cm]{01-isip-lab-01-07-ozon.png}
\item Вкладки на странице restore не ничем не отличаются от логотипа в левом верхнем углу, не отличаются от выпадающего списка выбора региона, не выделены цветом, и выглядят как просто ссылки:
\includegraphics[width=14cm]{01-isip-lab-01-07-restore.png}
\item Аналогично остальным, на сайте auto.ru панель глобальной навигации не отличается от вкладок с локальной навигацией. Но выполняется пункт (С) про выделение цветом.
\includegraphics[width=14cm]{01-isip-lab-01-07-auto.png}
\end{enumerate}
\end{document}

153
01-isip-lab-02-report.tex Normal file
View File

@ -0,0 +1,153 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\setcounter{secnumdepth}{0}
\begin{document}
\pagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{2}{Количественный анализ интерфейсов}{Протоколы и интерфейсы информационных систем}{}{Большаков В.Э.}
\newpage
\tableofcontents
\newpage
\section{Упражнение 17}
\subsection{* Количественно оценить эффективность пяти интерфейсов, используя законы Фитса и Хика.}
\textbf{Оценка интерфейсов сайта МГТУ им. Н.Э.Баумана и Уральский федеральный университет им. Б.Н. Ельцина. }
Законы Фиттса и Хика указывают на отношение времни, затраченного пользователем интерфейса к сложности этого интерфейса по формулам, где числа, это примерные изменяемые величины, говорящие о понятности и привычности интерфейса:
\textbf{Закон Фиттса:} Время = $50 + 150 * log_2(\frac{\text{расстояние до элемента}}{\text{размер элемента}} + 1)$
\textbf{Закон Хика:} $50 + 150 * log_2 (\text{количество элементов} + 1)$
Во всех случаях стартовой позицией курсора будет считаться положение, оставшееся после клика по поисковой строке браузера (верхний левый угол).
\begin{enumerate}
\item сайт bmstu.ru
\includegraphics[width=14cm]{01-isip-lab-02-bmstu.png}
Дизайн сайта направлен на посещение как студентами, так и поступающими. Так наибольшее количество информации предоставляется поступающим и навигация предполагается в два шага: выбор основного пункта меню (326 пикселей и 8 элементов на выбор) и выбор нужной ссылки в подменю (241 пиксель и около 15 элементов на выбор).
\begin{enumerate}
\item Fitts: 1452.309223, Hick: 525.488750
\item Fitts: 1386.933400, Hick: 650.000000
\end{enumerate}
Таким образом, суммарное время, проведённое пользователем в поиске нужной страницы составит в среднем около 4,014 секунд.
\item сайт https://urfu.ru/ru/
Сайт предназначен как для студентов, так и для абитуриентов, поэтому пользователю может быть интересен любой из разделов. Всего в верхнем меню 6 разделов, в среднем по 20-40 ссылок, а на основной странице 13 ссылок, но находящихся на большем расстоянии от стартовой позиции. Для простоты подсчётов по формуле Фитса примем размер каждой ссылки (целевого элемента) за единицу. Так суммарное среднее время навигации будет составлять:
\begin{itemize}
\item для верхнего меню:
\includegraphics[width=14cm]{01-isip-lab-02-urfu1.png}
на первом шаге 157 пикселей и выбор из 6 элементов, на втором шаге 247 пикселей и выбор из примерно 30 ссылок.
\begin{enumerate}
\item Fitts: 1294.193112, Hick: 471.103238
\item Fitts: 1392.255085, Hick: 793.129447
\end{enumerate}
Итого пользователем для выбора нужного пункта меню будет затрачено около 3,950 секунд.
\item для основной страницы:
\includegraphics[width=14cm]{01-isip-lab-02-urfu2.png}
пользователь выбирает из часто посещаемых страниц и делает это в один шаг. Расстояние до основного меню составляет около 240 пикселей, получаем:
\begin{enumerate}
\item Fitts: 1386.033589, Hick: 621.103238
\end{enumerate}
То есть пользователь, потребности которого удовлетворяются меню в середине страницы может получить нужную ему информацию за 2,007 секунд.
\end{itemize}
\end{enumerate}
\section{Упражнение 18}
\subsection{* Вычисление математического ожидания времени поиска для значений \textit{t} разного порядка.}
Вычисление осуществляется по формуле
\[
\mu = \frac{(N/\eta) + 1}{(M + 1) * t}
\]
Где N - общий объём информации (количество элементов) на экране, M - количество элементов, обладающих поисковым признаком, $\eta$ - объём зрительного восприятия ($\approx$ 5 элементов на $\approx$ 10 градусов угла зрения), \textit{t} - длительность фиксации.
Выберем признак поиск информации о поступлении в магистратуру.
\textbf{МГТУ им. Н.Э. Баумана:}
\includegraphics[width=14cm]{01-isip-lab-02-bmstu2.png}
\[
\mu = \frac{(32 / 8) + 1}{(3 + 1) * 0,01} = 125
\]
\[
\mu = \frac{(32 / 8) + 1}{(3 + 1) * 0,1} = 12,5
\]
\[
\mu = \frac{(32 / 8) + 1}{(3 + 1) * 1} = 1,25
\]
\[
\mu = \frac{(32 / 8) + 1}{(3 + 1) * 10} = 0,125
\]
\[
\mu = \frac{(32 / 8) + 1}{(3 + 1) * 100} = 0.0125
\]
\textbf{Уральский федеральный университет им. Б.Н. Ельцина:}
\includegraphics[width=14cm]{01-isip-lab-02-urfu3.png}
\[
\mu = \frac{(61 / 11) + 1}{(14 + 1) * 0,01} = 43.6364
\]
\[
\mu = \frac{(61 / 11) + 1}{(14 + 1) * 0,1} = 4.3636
\]
\[
\mu = \frac{(61 / 11) + 1}{(14 + 1) * 1} = 0.4364
\]
\[
\mu = \frac{(61 / 11) + 1}{(14 + 1) * 10} = 0.0436
\]
\[
\mu = \frac{(61 / 11) + 1}{(14 + 1) * 100} = 0.0044
\]
Представленные вычисления показывают, что наилучшим значением длительности зрительной фиксации является наибольшее, поскольку в этом случае получается наименьшее ожидаемое время поиска элемента.
\section{Упражнение 19}
\subsection{Количественная оценка сложности интерфейса}
Сложность определяется по формуле:
\[
C = -N \sum^n_{i=1} p_i log_2 p_i
\]
где N - количество всех объектов, $p_i$ - отношения объектов в i-том классе ко всем объектам ($p_i = \frac{n_i}{n}$, где n - это количество классов объектов, $n_i$ - количество объектов i-го класса). Рассмотрим интерфейсы институтов
\textbf{МГТУ им. Н.Э. Баумана:}
\includegraphics[width=14cm]{01-isip-lab-02-bmstu3.png}
на снимке экрана видно, что общее количество элементов N = 25, всего классов объектов пять, представителей этих классов 4, 8, 11, 1 и 1, соответственно. Получаем:
\begin{equation*}
\begin{aligned}
-25 * (\frac{4}{5} * log_2\frac{4}{5} + \frac{8}{5} * log_2\frac{8}{5} + \frac{11}{5} * log_2\frac{11}{5} + \frac{1}{5} * log_2\frac{1}{5} + \frac{1}{5} * log_2\frac{1}{5}) =\\
-25 * (0.8 * -0.322 + 1.6 * 0.678 + 2.1 * 1.070 + 0.2 * -2.322 + 0.2 * -2.322) =\\
-25 * (0.568 + 1.0848 + 2.247 - 0.4644 - 0.4644) =\\
-25 * 2.971 = -74.275\\
\end{aligned}
\end{equation*}
таким образом, сложность интерфейса можно оценить в -74.275 условных единиц
\textbf{Уральский федеральный университет им. Б.Н. Ельцина:}
\includegraphics[width=14cm]{01-isip-lab-02-urfu.png}
на снимке экрана видно, что общее количество элементов N = 66, всего классов объектов шесть, представителей этих классов 44, 13, 6, 1, 1 и 1, соответственно. Получаем:
\begin{equation*}
\begin{aligned}
-66 * (\frac{44}{6} * log_2\frac{44}{6} + \frac{13}{6} * log_2\frac{13}{6} + \frac{6}{6} * log_2\frac{6}{6} + \frac{1}{6} * log_2\frac{1}{6} + \frac{1}{6} * log_2\frac{1}{6} + \frac{1}{6} * log_2\frac{1}{6}) =\\
-66 * (7.3 * 2.868 + 2.1 * 1.070 + 1 * 0 + 0.16 * -2.644 + 0.16 * -2.644 + 0.16 * -2.644) =\\
-66 * (20.9364 + 2.247 + 0 - 0.42304 - 0.42304 - 0.42304) =\\
-66 * 21.91428 = -1446.34248\\
\end{aligned}
\end{equation*}
таким образом, сложность интерфейса можно оценить в -547.857 условных единиц
\end{document}

95
01-isip-lab-03-report.tex Normal file
View File

@ -0,0 +1,95 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\setcounter{secnumdepth}{0}
\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{3}{Эскизирование интерфейсов}{Протоколы и интерфейсы информационных систем}{}{Большаков В.Э.}
\newpage
\thispagestyle{empty}
\tableofcontents
\newpage
\section{Упражнение 12}
\textbf{* Нарисовать карандашом алфавиты эскизов физических и виртуальных объектов.}
Алфавиты физичеких (рис. \hyperref[pic:phys]{\ref{pic:phys}}) и виртуальных (рис. \hyperref[pic:virt]{\ref{pic:virt}}) объектов применяются для однозначного обозначения физических объектов и для единообразного обозначения виртуальных объектов для снижения визуального шума интерфейса.
\begin{figure}[H]
\begin{multicols}{2}
\includegraphics[width=8cm]{01-isip-lab-03-5195.JPG}
\caption{Алфавит физических объектов}
\label{pic:phys}
\columnbreak
\includegraphics[width=8cm]{01-isip-lab-03-5196.JPG}
\caption{Алфавит виртуальных объектов}
\label{pic:virt}
\end{multicols}
\end{figure}
\newpage
\section{Упражнение 13}
\textbf{* Найти в интернете пять новых интерфейсов веб-сайтов и сделать эскизы. Для первого эскиза сделать заметки для элементов интерфейса. Для последнего интерфейса сделать эскиз по памяти, не смотря на интерфейс.}
Для создания эскиза (рис. \hyperref[pic:onfly]{\ref{pic:onfly}}) был выбран сайт foxford.ru (портал для обучения детей и педагогов). Слева в основной области внимания представлено главное меню, включающее ссылку на вход в личный кабинет, поисковую строку и основные разделы портала. Основная страница поделена на горизонтальные секции с основными направлениями деятельности, помощи, описанием форм обучения, фото преподавателей и так далее. Внизу страницы расположена секция с отзывами людей, прошедших обучение на портале.
\begin{figure}[H]
\centering
\includegraphics[width=15cm]{01-isip-lab-03-5197.JPG}
\caption{Эскиз <<на лету>>}
\label{pic:onfly}
\end{figure}
\newpage
\section{Упражнение 14}
\textbf{*** Создать цветные эскизы для наручных фитнесс часов}
При эскизировании мобильных устройств важную роль играют эскизы следующих объектов и процессов:
\begin{enumerate}[label=\alph*]
\item Эскизы статических жестов человека
\item Эскизы взаимодействия статических жестов человека с различными предметами
\item Эскизы взаимодействия статических жестов человека с мобильным устройством
\item Эскизы взаимодействия статических жестов человека с мобильным устройством на определённом фоне в заданном контексте.
\end{enumerate}
Указанные эскизы представлены на рисунке \hyperref[pic:watch]{\ref{pic:watch}}. A демонстрирует, что наручные часы не мешают пользователю совершать привычные для него действия, B показывает абстрактный способ управления наручными часами (нажатие на кнопку пальцем). Эскиз C демонстрирует вероятный способ взаимодействия с устройством (например, человек поднял руку, смотрит на устройство, видит время). D демонстрирует использование человеком наручных часов как фитнес-браслета, на котором отображается время, остаток заряда акуумуляторной батареи, количество шагов и пройденное расстояние.
\begin{figure}[H]
\centering
\includegraphics[width=10cm]{01-isip-lab-03-5198.JPG}
\caption{Эскизы для мобильных устройств (наручных часов)}
\label{pic:watch}
\end{figure}
\newpage
\section{Упражнение 15}
\textbf{* Повторить эскизы, представленные в примерах}
В данном упражнении были созданы следующие эскизы, представленные на рис. \hyperref[pic:dynamic]{\ref{pic:dynamic}}:
\begin{enumerate}[label=\Roman*]
\item мобильного устройства (планшет);
\item область, ответственная за интерфейс;
\item примеры интерфейсов (главный экран, просмотр фото, установка таймера);
\item пример смены режима работы устройства по жесту пользователя (свайп на заблокированном экране открывает камеру).
\end{enumerate}
\begin{figure}[H]
\centering
\includegraphics[width=10cm]{01-isip-lab-03-5199.JPG}
\caption{Динамические эскизы}
\label{pic:dynamic}
\end{figure}
\newpage
\section{Упражнение 16}
\textbf{*** Создать свою эскиз-историю по аналогии с примером}
На рис. \hyperref[pic:comic]{\ref{pic:comic}} представлен эскиз-история, ознакамливающая пользователей о новой функции, доступной обладателям мобильного устройства определённого производителя
\begin{figure}[H]
\centering
\includegraphics[width=15cm]{01-isip-lab-03-5200.JPG}
\caption{Эскиз-история}
\label{pic:comic}
\end{figure}
\end{document}

64
01-isip-lab-04-report.tex Normal file
View File

@ -0,0 +1,64 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\setcounter{secnumdepth}{0}
\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{4}{Проектирование интерфейсов интерфейсов}{Протоколы и интерфейсы информационных систем}{}{Большаков В.Э.}
\newpage
\thispagestyle{empty}
\tableofcontents
\newpage
\section{Цель}
Целью работы является получение опыта проектирования интерфейсов. Для достижения цели были поставлены следующие задачи:
\begin{enumerate}
\item Используя сервис ninjamock (https://ninjamock.com) или аналоги спроектировать интерфейс для веб-сайта в соответствии с вариантом по списку группы.
\item При создании эскизов учесть все особенности, усвоенные на предыдущих лабораторных работах.
\item Подготовить не мене трех различных страниц одного веб-сайта.
\end{enumerate}
В работе было выполнено задание по варианту 11 (1) - видеохостинг для мобильного устройства.
\section{Выполнение}
\subsection{Главная страница}
На главной странице (рис. \hyperref[pic:main]{\ref{pic:main}}) важно дать пользователю доступ к наиболее часто используемому содержимому конкретного пользователя, также важно дать возможность быстрого поиска по всему архиву видео. В верхней части располагается сложенное меню и строка поиска, далее вниху сразу расположены рекомендованные пользователю видео. При нажатии на меню (рис. \hyperref[pic:menu]{\ref{pic:menu}}), поверх главного экрана разворачивается список страниц, доступных пользователю.
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-isip-lab-04-main.png}
\caption{Главная страница}
\label{pic:main}
\columnbreak
\includegraphics[width=8cm]{01-isip-lab-04-menu.png}
\caption{Меню пользователя}
\label{pic:menu}
\end{multicols}
\end{figure}
\subsection{Добавление видео}
На экране добавления нового видео (рис. \hyperref[pic:upload]{\ref{pic:upload}}) важна область предпросмотра, кнопка загрузки нового видео и возможность добавить к видео метаинформацию (название, описание, и так далее). Также на экране загрузки, возможно, будет полезен перечень уже загруженных видео, чтобы не загружать дубликаты.
\begin{figure}[H]
\centering
\includegraphics[width=8cm]{01-isip-lab-04-upload.png}
\caption{Экран загрузки нового видео}
\label{pic:upload}
\end{figure}
\subsection{Промотр профиля}
На экране просмотра профиля (рис. \hyperref[pic:profile]{\ref{pic:profile}}) отображаются изображение профиля (аватар пользователя), находятся элементы управления профилем, такие как возможность изменить настройки, информацию и управлять своими загруженными видеозаписями. Также внизу экрана находятся область для быстрого доступа к двум категориям видео - избранное видео пользователя и загруженное видео пользователя.
\begin{figure}[H]
\centering
\includegraphics[width=8cm]{01-isip-lab-04-profile.png}
\caption{Экран просмотра профиля пользователя}
\label{pic:profile}
\end{figure}
\section{Выводы}
Проектирование интерфейсов - это важная часть разработки сервисов для пользователя. Проектирование позволяет избежать большого количества ошибок на этапе разработки и создать более удобный для пользователя интерфейс. В данной работе был разработан мобильный интерфейс для видеохостинга. Данный интерфейс учитывает все изученные ранее особенности построения интерфейсов и в значительной степени повторяет существующие интерфейсы популярных видеохостингов. Особенностью данного интерфейса является его минималистичный дизайн и возможность быстрого доступа пользователя к основной функциональности сервиса.
\end{document}

287
01-itsp-lab-01-report.tex Normal file
View File

@ -0,0 +1,287 @@
\documentclass[a4paper,fontsize=14bp]{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\input{../fancy-listings-preamble}
\setcounter{secnumdepth}{0}
\numerationTop
\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{1}{Исследование беспроводного канала связи \\ при распространении радиоволн \\ в открытом пространстве}{Проектирование информационных \\ и телекоммуникационных систем}{}{к.т.н., доцент кафедры ИУ-3 \\ Баскаков С.С.}
\newpage
\thispagestyle{empty}
\tableofcontents
\newpage
\pagestyle{fancy}
\section{Цель}
Целью данной лабораторной работы являлось изучение основ работы с системой имитационного моделирования OMNeT++, построение имитационной модели беспроводного канала связи и исследование его характеристик средствами имитационного моделирования и аналитическими расчетами.
\section{Задание}
\begin{enumerate}
\item Выполнить моделирование исходного проекта, обработку результатов экспериментов по приведенному выше описанию и убедиться в повторяемости приведенных графиков.
\item Изменить значения параметров исходной имитационной модели системы в соответствии с индивидуальным вариантом.
\item Провести аналогичный имитационный эксперимент с модифицированной моделью системы. В случае необходимости следует увеличить максимальное время моделирования, чтобы рассмотреть ситуацию с ухудшением качества связи и ее отсутствием по мере увеличения расстояния между устройствами.
\item Обработать результаты моделирования и построить соответствующие графики.
\item Выполнить аналитические расчеты для оценки мощности принятого сигнала, вероятности битовой ошибки и вероятности пакетной ошибки для модифицированной системы. Сравнить расчетные значения с полученными в ходе имитационного моделирования.
\end{enumerate}
\section{Выполнение}
\subsection{Обработка исходной модели}
После запуска исходной модели в папке с результатами были записаны файлы со скалярными и векторными значениями моделирования. По этим значениям в пакете математического моделирования MATLAB были построены графики, представленные на рисунках \hyperref[pic:defpowrel]{\ref{pic:defpowrel}}, \hyperref[pic:defber]{\ref{pic:defber}}, \hyperref[pic:defper]{\ref{pic:defper}}, \hyperref[pic:defploss]{\ref{pic:defploss}}. Полученные графики являются идентичными с представленными в задании к лабораторной работе.
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-itsp-lab-01-def-pow-rel.png}
\caption{Мощность принятого сигнала и отношение сигнал/(интерференция+шум)}
\label{pic:defpowrel}
\columnbreak
\includegraphics[width=8cm]{01-itsp-lab-01-def-ber.png}
\caption{Вероятность битовой ошибки}
\label{pic:defber}
\end{multicols}
\end{figure}
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-itsp-lab-01-def-per.png}
\caption{Вероятность пакетной ошибки}
\label{pic:defper}
\columnbreak
\includegraphics[width=8cm]{01-itsp-lab-01-def-ploss.png}
\caption{Количество потерянных пакетов}
\label{pic:defploss}
\end{multicols}
\end{figure}
\subsection{Изменение исходной модели}
Исходная система была модифицирована согласно задания, итоговые значения приведены в таблице \hyperref[table:individual]{\ref{table:individual}}, а полный файл настроек в листинге \hyperref[lst:modified]{\ref{lst:modified}}
\begin{table}[H]
\centering
\begin{tabular}{||r|r|r|r|r|r|r|r||}
\hline
D (байт) & T (мсек) & $P_t$ (мВт) & F (МГц) & R (кбит/с) & W (МГц) & $P_t$ (дБм) & V (м/с) \\ [0.5ex]
\hline\hline
50 & 10 & 80 & 2000 & 200 & 300 & -90 & 20 \\ [1ex]
\hline
\end{tabular}
\caption{Параметры системы согласно индивидуальному варианту (№ 11)}
\label{table:individual}
\end{table}
\begin{lstlisting}[style=ASMStyle, caption=Изменённый файл omnetpp.ini, label={lst:modified}]
[Config Lab_1]
description = Point-to-point wireless communication channel
network = Lab_1_Network
sim-time-limit = 100s
*.host*.ipv4.arp.typename = "GlobalArp"
*.hostTX.numApps = 1
*.hostTX.app[0].typename = "UdpBasicApp"
*.hostTX.app[0].destAddresses = "hostRX"
*.hostTX.app[0].destPort = 5000
*.hostTX.app[0].messageLength = 50B
*.hostTX.app[0].sendInterval = exponential(10ms)
*.hostTX.app[0].packetName = "UDPData"
*.hostRX.numApps = 1
*.hostRX.app[0].typename = "UdpSink"
*.hostRX.app[0].localPort = 5000
*.host*.wlan[0].typename = "AckingWirelessInterface"
*.host*.wlan[0].mac.useAck = false
*.host*.wlan[0].mac.fullDuplex = false
*.host*.wlan[0].mac.headerLength = 23B
*.host*.**.bitrate = 200kbps
*.radioMedium.typename = "ApskScalarRadioMedium"
*.radioMedium.pathLoss.typename = "FreeSpacePathLoss"
*.radioMedium.backgroundNoise.power = -90dBm
*.radioMedium.mediumLimitCache.centerFrequency = 2GHz
*.radioMedium.mediumLimitCache.maxTransmissionDuration = 1s
*.host*.wlan[0].radio.typename = "ApskScalarRadio"
*.host*.wlan[0].radio.centerFrequency = 2GHz
*.host*.wlan[0].radio.bandwidth = 300kHz
*.host*.wlan[0].radio.transmitter.power = 80mW
*.host*.wlan[0].radio.transmitter.preambleDuration = 10us
*.host*.wlan[0].radio.transmitter.headerLength = 8B
*.host*.wlan[0].radio.receiver.sensitivity = -110dBm # not used
*.host*.wlan[0].radio.receiver.energyDetection = -110dBm # not used
*.host*.wlan[0].radio.receiver.snirThreshold = 0dB # not used
*.hostRX.wlan[*].radio.minSnir.result-recording-modes = default,+vector
*.hostRX.wlan[*].radio.bitErrorRate.result-recording-modes = default,+vector
*.hostRX.wlan[*].radio.packetErrorRate.result-recording-modes = default,+vector
*.hostRX.mobility.typename = "LinearMobility"
*.hostRX.mobility.speed = 20mps
*.hostRX.mobility.initialMovementHeading = 0deg
*.host*.wlan[0].mac.queue.packetCapacity = 50
*.visualizer.mobilityVisualizer.displayVelocities = true
*.visualizer.mobilityVisualizer.displayMovementTrails = true
\end{lstlisting}
\subsection{Результаты моделирования}
В результате моделирования с представленными в листинге \hyperref[lst:modified]{\ref{lst:modified}} значениями, в среде OMNeT++ сеть не дошла до максимального уровня пакетной ошибки, в связи с чем время моделирования было изменено на 200 сек. Результаты моделирования (в виде исходных «*.sca»- и «*.vec»-файлов приложены к отчёту). Графики поведения модели представлены на рисунках \hyperref[pic:wrkpowrel]{\ref{pic:wrkpowrel}}, \hyperref[pic:wrkber]{\ref{pic:wrkber}}, \hyperref[pic:wrkper]{\ref{pic:wrkper}}, \hyperref[pic:wrkploss]{\ref{pic:wrkploss}}.
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-itsp-lab-01-wrk-pow-rel.png}
\caption{Мощность принятого сигнала и отношение сигнал/(интерференция+шум)}
\label{pic:wrkpowrel}
\columnbreak
\includegraphics[width=8cm]{01-itsp-lab-01-wrk-ber.png}
\caption{Вероятность битовой ошибки}
\label{pic:wrkber}
\end{multicols}
\end{figure}
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-itsp-lab-01-wrk-per.png}
\caption{Вероятность пакетной ошибки}
\label{pic:wrkper}
\columnbreak
\includegraphics[width=8cm]{01-itsp-lab-01-wrk-ploss.png}
\caption{Количество потерянных пакетов}
\label{pic:wrkploss}
\end{multicols}
\end{figure}
В результате аналитических расчётов были получены следующие графики (рисунки \hyperref[pic:anpowrel]{\ref{pic:anpowrel}}, \hyperref[pic:anber]{\ref{pic:anber}}, \hyperref[pic:anper]{\ref{pic:anper}}). На основании полученных графиков можно сделать вывод о полном соответствии смоделированной системы и теоретических значений параметров.
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-itsp-lab-01-an-pow-rel.png}
\caption{Мощность принятого сигнала и отношение сигнал/(интерференция+шум)}
\label{pic:anpowrel}
\columnbreak
\includegraphics[width=8cm]{01-itsp-lab-01-an-ber.png}
\caption{Вероятность битовой ошибки}
\label{pic:anber}
\end{multicols}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=8cm]{01-itsp-lab-01-an-per.png}
\caption{Вероятность пакетной ошибки}
\label{pic:anper}
\end{figure}
\section{Выводы}
В результате выполнения лабораторной работы были изучены основные аспекты системы имитационного моделирования OMNeT++, были выполнены различные имитационные эксперименты модели беспроводного канала связи, а также было проведено исследование характеристик модели созданной средствами имитационного моделирования и с помощью аналитических расчетов в системе пакете MATLAB. Также был написан код на языке Python для построения аналитических моделей, представленный в приложении \hyperref[appendix:jupyter]{\ref{appendix:jupyter}}
\newpage
\appendix
\setcounter{secnumdepth}{5}
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Alph{subsection}}
\subsection{Jupyter notebook}
\label{appendix:jupyter}
\begin{lstlisting}[language=Python, style=PyCodeStyle]
import matplotlib.pyplot as plt
import numpy as np
from scipy import special
from math import pi
D = 50
PT = 80
FREQ = 2000
PN = -90
R = 200
W = 300
SPEED = 20
# График 1 Мощность принятого сигнала и Отношение сигнал / (интерференция + шум)
def get_rx_power():
timestamp = 200
light_speed = 3 * 10 ** 8
initial_distance = 5
freq = FREQ * 10 ** 6
Pt = PT * 10 ** -3
wavelength = light_speed / freq
rx_power = []
for t in range(1, timestamp + 1):
distance = initial_distance + SPEED * t
result = Pt * wavelength ** 2 / (4 * pi * distance) ** 2
rx_power.append(result)
return rx_power
Pn = 10 ** ((PN/10) - 3)
rx_power = get_rx_power()
signal_noise = []
signal_noise_scaled = []
rx_power_scaled = []
for i in range(len(rx_power)):
rx_power_scaled.append(10 * np.log10(rx_power[i]) + 30)
signal_noise.append(rx_power[i] / Pn)
signal_noise_scaled.append(10 * np.log10(signal_noise[i]))
fig, ax = plt.subplots()
ax.grid()
ax.set_xlabel('Время, сек')
ax.set_ylim(-90, -30)
ax.set_ylabel('Мощность принятого сигнала Prx, дБм', color="C0")
ax.plot(range(1, 201), rx_power_scaled, color="C0")
ax2 = ax.twinx()
ax2.set_ylim(-10, 60)
ax2.set_ylabel('Отношение сигнал/(интерференция+шум), дБ', color="C1")
ax2.plot(range(1, 201), signal_noise_scaled, color="C1")
plt.gcf().set_dpi(300)
plt.show()
# График 2 Аналитическая вероятность битовой ошибки
ber_values = []
for i in range(len(signal_noise)):
ber_values.append(0.5 * special.erfc(np.sqrt((signal_noise[i] * W) / R)))
fig, ax = plt.subplots()
ax.set_xlim(0, 201)
ax.set_ylim(10 ** -18, 10)
ax.grid()
ax.set_xlabel('Время, сек')
ax.set_ylabel('Вероятность битовой ошибки')
plt.semilogy(range(1, 201), ber_values)
plt.gcf().set_dpi(300)
plt.show()
# График 3 Аналитическая вероятность пакетной ошибки
L = D + 59
per_values = []
for i in range(len(ber_values)):
per_values.append(1 - (1 - ber_values[i]) ** (8 * L))
fig, ax = plt.subplots()
ax.set_ylim(0, 1.1)
ax.grid()
ax.set_xlabel('Время, сек')
ax.set_ylabel('Вероятность пакетной ошибки')
plt.plot(range(1, 201), per_values)
plt.gcf().set_dpi(300)
plt.show()
\end{lstlisting}
\end{document}

283
01-itsp-lab-02-report.tex Normal file
View File

@ -0,0 +1,283 @@
\documentclass[a4paper,fontsize=14bp]{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\input{../fancy-listings-preamble}
\setcounter{secnumdepth}{0}
\numerationTop
\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{2}{Исследование беспроводного канала связи при \\ медленных и быстрых замираниях радиосигнала}{Проектирование информационных \\ и телекоммуникационных систем}{}{к.т.н., доцент кафедры ИУ-3 \\ Баскаков С.С.}
\newpage
\thispagestyle{empty}
\tableofcontents
\newpage
\pagestyle{fancy}
\section{Цель}
Целью данной лабораторной работы являлось закрепление навыков работы с системой имитационного моделирования OMNeT++, построение имитационной модели беспроводного канала связи и исследование его харак- теристик в условиях многолучевого распространения радиосигналов.
\section{Задание}
\begin{enumerate}
\item Выполнить моделирование исходного проекта, обработку результатов экспериментов по приведенному выше описанию и убедиться в повторяемости приведенных на рисунках графиков.
\item Изменить значения параметров исходной имитационной модели системы в соответствии с индивидуальным вариантом из таблицы
\item Провести аналогичный имитационный эксперимент с модифицированной моделью системы. В случае необходимости следует увеличить максимальное время моделирования, чтобы рассмотреть ситуацию с ухудшением качества связи и ее отсутствием по мере увеличения расстояния между устройствами.
\item Обработать результаты моделирования и построить соответствующие графики.
\item Используемые на предыдущем этапе индивидуальные значения параметров $\alpha$, $\sigma$ и K увеличить в 2 раза независимо от единиц измерения. Например, если по индивидуальному варианту заданы значения $\alpha$ = 2, $\sigma$ = 1дБ и K = 8дБ, то после увеличения они должны быть равны $\alpha$ = 4, $\sigma$ = 2дБ и K = 16дБ. Снова повторить эксперимент и выполнить обработку его результатов.
\item Сравнить результаты моделирования и объяснить наблюдаемые эффекты.
\end{enumerate}
\section{Выполнение}
\subsection{Обработка исходной модели}
После запуска исходной модели в папке с результатами были записаны файлы со скалярными и векторными значениями моделирования. По этим значениям в пакете математического моделирования MATLAB были построены графики вероятности битовой ошибки (рис. \hyperref[pic:deflogber]{\ref{pic:deflogber}}, \hyperref[pic:defricber]{\ref{pic:defricber}}), вероятности пакетной ошибки (рис. \hyperref[pic:deflogper]{\ref{pic:deflogper}}, \hyperref[pic:defricper]{\ref{pic:defricper}}), количества потерянных пакетов (рис. \hyperref[pic:deflogploss]{\ref{pic:deflogploss}}, \hyperref[pic:defricploss]{\ref{pic:defricploss}}), мощности принятого сигнала и соотношения сигнал/(интерференция+шум) (рис. \hyperref[pic:deflogpowrel]{\ref{pic:deflogpowrel}}, \hyperref[pic:defricpowrel]{\ref{pic:defricpowrel}}). Полученные графики являются идентичными с представленными в задании к лабораторной работе (кроме графика битовой ошибки, не представленного в методическом материале).
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-itsp-lab-02-def-log-ber.png}
\caption{Вероятность битовой ошибки с логарифмически нормальным распределением}
\label{pic:deflogber}
\columnbreak
\includegraphics[width=8cm]{01-itsp-lab-02-def-ric-ber.png}
\caption{Вероятность битовой ошибки с распределением Райса}
\label{pic:defricber}
\end{multicols}
\end{figure}
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-itsp-lab-02-def-log-per.png}
\caption{Вероятность пакетной ошибки с логарифмически нормальным распределением}
\label{pic:deflogper}
\columnbreak
\includegraphics[width=8cm]{01-itsp-lab-02-def-ric-per.png}
\caption{Вероятность пакетной ошибки с распределением Райса}
\label{pic:defricper}
\end{multicols}
\end{figure}
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-itsp-lab-02-def-log-ploss.png}
\caption{Количество потерянных пакетов с логарифмически нормальным распределением}
\label{pic:deflogploss}
\columnbreak
\includegraphics[width=8cm]{01-itsp-lab-02-def-ric-ploss.png}
\caption{Количество потерянных пакетов с распределением Райса}
\label{pic:defricploss}
\end{multicols}
\end{figure}
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-itsp-lab-02-def-log-pow-rel.png}
\caption{Мощность принятого сигнала и соотношение сигнал/(интерференция+шум) с логарифмически нормальным распределением}
\label{pic:deflogpowrel}
\columnbreak
\includegraphics[width=8cm]{01-itsp-lab-02-def-ric-pow-rel.png}
\caption{Мощность принятого сигнала и соотношение сигнал/(интерференция+шум) с распределением Райса}
\label{pic:defricpowrel}
\end{multicols}
\end{figure}
\subsection{Изменение исходной модели}
Исходная система была модифицирована согласно задания, итоговые значения приведены в таблице \hyperref[table:individual]{\ref{table:individual}}, а полный файл настроек в листинге \hyperref[lst:modified]{\ref{lst:modified}}
\begin{table}[H]
\centering
\begin{tabular}{||r|r|r|r|r|r|r|r|r|r|r||}
\hline
\thead{D\\(байт)} & \thead{T\\(мсек)} & \thead{$P_t$\\(мВт)} & \thead{F\\(МГц)} & \thead{R\\(кбит/с)} & \thead{W\\(МГц)} & \thead{$P_n$\\(дБм)} & \thead{V\\(м/с)} & \thead{$\alpha$} & \thead{$\sigma$\\(дБ)}& \thead{K\\(дБ)} \\ [0.5ex]
\hline\hline
50 & 10 & 80 & 2000 & 200 & 300 & -90 & 20 & 3.0 & 2 & 1 \\ [1ex]
\hline
\end{tabular}
\caption{Параметры системы согласно индивидуальному варианту (№ 11)}
\label{table:individual}
\end{table}
\begin{lstlisting}[style=ASMStyle, caption=Изменённый файл omnetpp.ini, label={lst:modified}]
#---------------------------------------------
[Config Lab_2_LogNormal]
description = RF channel (LogNormal Path Loss)
network = Lab_2_Network
sim-time-limit = 100s
*.host*.ipv4.arp.typename = "GlobalArp"
*.hostTX.numApps = 1
*.hostTX.app[0].typename = "UdpBasicApp"
*.hostTX.app[0].destAddresses = "hostRX"
*.hostTX.app[0].destPort = 5000
*.hostTX.app[0].messageLength = 50B
*.hostTX.app[0].sendInterval = exponential(10ms)
*.hostTX.app[0].packetName = "UDPData"
*.hostRX.numApps = 1
*.hostRX.app[0].typename = "UdpSink"
*.hostRX.app[0].localPort = 5000
*.host*.wlan[0].typename = "AckingWirelessInterface"
*.host*.wlan[0].mac.useAck = false
*.host*.wlan[0].mac.fullDuplex = false
*.host*.wlan[0].mac.headerLength = 23B
*.host*.**.bitrate = 0.2Mbps
*.radioMedium.typename = "ApskScalarRadioMedium"
*.radioMedium.pathLoss.typename = "LogNormalShadowing"
*.radioMedium.pathLoss.alpha = 3
*.radioMedium.pathLoss.sigma = 2
*.radioMedium.backgroundNoise.power = -90dBm
*.radioMedium.mediumLimitCache.centerFrequency = 2GHz
*.radioMedium.mediumLimitCache.maxTransmissionDuration = 1s
*.host*.wlan[0].radio.typename = "ApskScalarRadio"
*.host*.wlan[0].radio.centerFrequency = 2GHz
*.host*.wlan[0].radio.bandwidth = 300MHz
*.host*.wlan[0].radio.transmitter.power = 80mW
*.host*.wlan[0].radio.transmitter.preambleDuration = 10us
*.host*.wlan[0].radio.transmitter.headerLength = 8B
*.host*.wlan[0].radio.receiver.sensitivity = -120dBm # not used
*.host*.wlan[0].radio.receiver.energyDetection = -120dBm # not used
*.host*.wlan[0].radio.receiver.snirThreshold = 0dB # not used
*.hostRX.wlan[*].radio.minSnir.result-recording-modes = default,+vector
*.hostRX.wlan[*].radio.bitErrorRate.result-recording-modes = default,+vector
*.hostRX.wlan[*].radio.packetErrorRate.result-recording-modes = default,+vector
*.hostRX.mobility.typename = "LinearMobility"
*.hostRX.mobility.speed = 20mps
*.hostRX.mobility.initialMovementHeading = 0deg
*.host*.wlan[0].mac.queue.packetCapacity = 50
*.visualizer.mobilityVisualizer.displayVelocities = true
*.visualizer.mobilityVisualizer.displayMovementTrails = true
#---------------------------------------------
[Config Lab_2_RicianFading]
description = RF channel (Rician Fading Path Loss)
extends = Lab_2_LogNormal
*.radioMedium.pathLoss.typename = "RicianFading"
*.radioMedium.pathLoss.alpha = 3
*.radioMedium.pathLoss.k = 1dB
\end{lstlisting}
\subsection{Результаты моделирования}
В результате моделирования с представленными в листинге \hyperref[lst:modified]{\ref{lst:modified}} значениями, в среде OMNeT++ сеть не дошла до стабильного значения максимального уровня пакетной ошибки, в связи с чем время моделирования было изменено на 150 сек. Результаты моделирования (в виде исходных «*.sca»- и «*.vec»-файлов для медленных и быстрых замираний приложены к отчёту). По полученным значениям в пакете математического моделирования MATLAB были построены графики вероятности битовой ошибки (рис. \hyperref[pic:wrklogber]{\ref{pic:wrklogber}}, \hyperref[pic:wrkricber]{\ref{pic:wrkricber}}), вероятности пакетной ошибки (рис. \hyperref[pic:wrklogper]{\ref{pic:wrklogper}}, \hyperref[pic:wrkricper]{\ref{pic:wrkricper}}), количества потерянных пакетов (рис. \hyperref[pic:wrklogploss]{\ref{pic:wrklogploss}}, \hyperref[pic:wrkricploss]{\ref{pic:wrkricploss}}), мощности принятого сигнала и соотношения сигнал/(интерференция+шум) (рис. \hyperref[pic:wrklogpowrel]{\ref{pic:wrklogpowrel}}, \hyperref[pic:wrkricpowrel]{\ref{pic:wrkricpowrel}}). При $\alpha = 3$, $\sigma = 2$дБ и K = 1дБ, связь всё время (начиная с 10-й секунды) будет с плохими показателями вероятности пакетной ошибки, а после 100-й секунды полностью отсутствовать при быстрых замираниях. При медленных замираниях стабильное поведение канала наблюдается примерно до 50-й секунды, и полностью обрывается связь на 125й секунде.
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-itsp-lab-02-log-pow-rel.png}
\caption{Мощность принятого сигнала и отношение сигнал/(интерференция+шум) с логарифмически нормальным распределением}
\label{pic:wrklogpowrel}
\columnbreak
\includegraphics[width=8cm]{01-itsp-lab-02-ric-pow-rel.png}
\caption{Мощность принятого сигнала и отношение сигнал/(интерференция+шум) с распределением Райса}
\label{pic:wrkricpowrel}
\end{multicols}
\end{figure}
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-itsp-lab-02-log-ber.png}
\caption{Вероятность битовой ошибки с логарифмически нормальным распределением}
\label{pic:wrklogber}
\columnbreak
\includegraphics[width=8cm]{01-itsp-lab-02-ric-ber.png}
\caption{Вероятность битовой ошибки с распределением Райса}
\label{pic:wrkricber}
\end{multicols}
\end{figure}
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-itsp-lab-02-log-per.png}
\caption{Вероятность пакетной ошибки с логарифмически нормальным распределением}
\label{pic:wrklogper}
\columnbreak
\includegraphics[width=8cm]{01-itsp-lab-02-ric-per.png}
\caption{Вероятность пакетной ошибки с распределением Райса}
\label{pic:wrkricper}
\end{multicols}
\end{figure}
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-itsp-lab-02-log-ploss.png}
\caption{Количество потерянных пакетов с логарифмически нормальным распределением}
\label{pic:wrklogploss}
\columnbreak
\includegraphics[width=8cm]{01-itsp-lab-02-ric-ploss.png}
\caption{Количество потерянных пакетов с распределением Райса}
\label{pic:wrkricploss}
\end{multicols}
\end{figure}
Результаты моделирования с удвоенными значениями $\alpha$, $\sigma$ и K (в виде исходных «*.sca»- и «*.vec»-файлов для медленных и быстрых замираний приложены к отчёту). По полученным значениям в пакете математического моделирования MATLAB были построены графики вероятности битовой ошибки (рис. \hyperref[pic:dwrklogber]{\ref{pic:dwrklogber}}, \hyperref[pic:dwrkricber]{\ref{pic:dwrkricber}}), вероятности пакетной ошибки (рис. \hyperref[pic:dwrklogper]{\ref{pic:dwrklogper}}, \hyperref[pic:dwrkricper]{\ref{pic:dwrkricper}}), количества потерянных пакетов (рис. \hyperref[pic:dwrklogploss]{\ref{pic:dwrklogploss}}, \hyperref[pic:dwrkricploss]{\ref{pic:dwrkricploss}}), мощности принятого сигнала и соотношения сигнал/(интерференция+шум) (рис. \hyperref[pic:dwrklogpowrel]{\ref{pic:dwrklogpowrel}}, \hyperref[pic:dwrkricpowrel]{\ref{pic:dwrkricpowrel}}).
При увеличении в два раза показателей альфа, сигма и К мощность принятого сигнала при быстрых замираниях убывает гораздо быстрее, область надежной связи сильно сокращается, потери пакетов начинаются раньше, но и полное прекращение передачи пакетов происходит несколько позже - после 125й секунды.
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-itsp-lab-02-d-log-pow-rel.png}
\caption{Мощность принятого сигнала и отношение сигнал/(интерференция+шум) с логарифмически нормальным распределением}
\label{pic:dwrklogpowrel}
\columnbreak
\includegraphics[width=8cm]{01-itsp-lab-02-d-ric-pow-rel.png}
\caption{Мощность принятого сигнала и отношение сигнал/(интерференция+шум) с распределением Райса}
\label{pic:dwrkricpowrel}
\end{multicols}
\end{figure}
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-itsp-lab-02-d-log-ber.png}
\caption{Вероятность битовой ошибки с логарифмически нормальным распределением}
\label{pic:dwrklogber}
\columnbreak
\includegraphics[width=8cm]{01-itsp-lab-02-d-ric-ber.png}
\caption{Вероятность битовой ошибки с распределением Райса}
\label{pic:dwrkricber}
\end{multicols}
\end{figure}
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-itsp-lab-02-d-log-per.png}
\caption{Вероятность пакетной ошибки с логарифмически нормальным распределением}
\label{pic:dwrklogper}
\columnbreak
\includegraphics[width=8cm]{01-itsp-lab-02-d-ric-per.png}
\caption{Вероятность пакетной ошибки с распределением Райса}
\label{pic:dwrkricper}
\end{multicols}
\end{figure}
\begin{figure}[H]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-itsp-lab-02-d-log-ploss.png}
\caption{Количество потерянных пакетов с логарифмически нормальным распределением}
\label{pic:dwrklogploss}
\columnbreak
\includegraphics[width=8cm]{01-itsp-lab-02-d-ric-ploss.png}
\caption{Количество потерянных пакетов с распределением Райса}
\label{pic:dwrkricploss}
\end{multicols}
\end{figure}
\section{Выводы}
В результате выполнения лабораторной работы были изучены основные аспекты системы имитационного моделирования OMNeT++, были выполнены различные имитационные эксперименты модели беспроводного канала связи, а также было проведено исследование характеристик моделей с нормальным логарифмическим распределением и распределением Райса.
\end{document}

499
01-neural-networks.tex Normal file
View File

@ -0,0 +1,499 @@
\documentclass[a4paper,fontsize=14bp]{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\author{Боровик Ирина Геннадьевна}
\title{Нейронные сети}
\date{2021-09-07}
\begin{document}
\maketitle
\newpage
\tableofcontents
\newpage
\section{Оргвопросы (в целом, по магистратуре)}
\begin{enumerate}
\item до 01.10 найти научрука: профессор, доцент, со степенью, исключения: лычков ведьманов. неизвестны с бакалавриата: гребенюк, алфимцев. если нашли препода с тематикой (кадырбаева, германчук)- они ведут, но официально на ВКР договариваются
\item сразу обговорить тему магистерской работы. на основе этой работы будет вестись вся практическая работа
\begin{enumerate}
\item НИР тематика, курсовая (формально проектирование итс), педпрактика, официально с 1.09, всё у научрука (задания на нир, кр, пп) бланки у старосты
\item дисциплины по выбору начнутся на втором курсе.
\item опубликовать минимум 1 статья, норма 2 статьи (участие в студенческой весне)
оформление работы до 01.10
\end{enumerate}
\item до 15.10 тему МР скинуть старосте
\item заполнить задания и отчёты в том числе по педагогической практике, курсовые, итд.
\end{enumerate}
\section{Оргвопросы курс}
\begin{enumerate}
\item 1й модуль - посещение
\item 2й модуль - 3 лабы, 1 дз.
\item ЛР по сб с 4 недели. дома, методички скинут. отчёты на почту big@bmstu.ru
\item ДЗ на 6й неделе - распознавание рукописных букв
\end{enumerate}
\section{Введение в нейронные сети}
НС - это математический инструмент для обработки данных. Многофакторный регрессионный анализ задача найти по коэффициентам как работает инструмент.
\[ax1+bx2+сx3...nxn=y\]
Коэффициенты - это та функция по которой работает чёрный ящик. В нс коэффициенты гибкие и изменяются в процессе обучения сети.
\begin{figure}[H]
\centering
\def\svgwidth{60mm}
\input{pics/01-nn-00-oa1.pdf_tex}
\caption{Эталонные изображения для распознавания}
\end{figure}
Нс часть используют для распознавания образов. Для распознавания таких образов можно сделать простой конъюнктивный автомат, где первая цифра это строка, вторая - столбец.
\[(1,2)\wedge(2,1)\wedge(2,3)\wedge(3,1)\wedge(3,3)\wedge(4,2) = O\]
\[(1,2)\wedge(2,1)\wedge(2,3)\wedge(3,1)\wedge(3,2)\wedge(3,3)\wedge(4,1)\wedge(4,3) = A\]
\begin{figure}[H]
\centering
\def\svgwidth{60mm}
\input{pics/01-nn-00-oa2.pdf_tex}
\caption{Не эталонное изображения для распознавания}
\end{figure}
Когда встречаемся с не эталонными изображениями возникает проблема: логические системы не срабатывают. Можно добавить вероятности, каждый сигнал умножать на вероятности и складывать уже не сигналы, а вероятности.
Если сложить все вероятности: А по сумме 3,9, О по сумме 3,8. человеческий глаз может на опыте определить, логическая система не может, надо как-то обучать и приходим к нейронной сети.
\begin{figure}[H]
\centering
\def\svgwidth{60mm}
\input{pics/01-nn-00-neuron3.pdf_tex}
\caption{Устройство нейрона мозга}
\end{figure}
Построен по принципу биологического нейрона. В центре тело клетки, входные отростки дендриты по ним передаются сигналы. Выходной отросток (аксон) один, но разветвляется. Дендриты стыкуются с аксонами, и аксоны связаны с дендритами других нейронов. На месте их соединения находится синапс. Тело клетки окружено мембраной, там находятся ионы калия и ионы натрия. Клетка непроницаема, поэтому много нейронов калия внутри(1) и натрия снаружи (2). К потенциал (1) -65мВ. поступает электрический сигнал и стенка становится проницаемой, ок 2 миллисек выброс калия наружу и натрий внутрь, меняется полярность, разница потенциалов достигает +45милливольт, сигнал пробивается меняет синапс, передаётся следующей клетке. После ухода сигнала разница потенциалов приходит в норму, мембрана становится непроницаемой. итог: есть входы по которым идёт сигнал по дендритам $X_1$, $X_2$, $X_n$, сигналы могут идти по нескольким входам. Интоксикация влияет на проницаемость синапса. Прослойку назовём омега. Аксон назовём промежуточный Y (если не промежуточный назовём его V). Импульс нейрона зависит от силы входного сигнала, то есть если слабые - не запустят хим процесс проницаемости мембраны. Порог обозначим h.
\[V_{\text{вых}} = f(\sum_{i=1}^n(\omega X)-h)\]
\begin{figure}[H]
\centering
\def\svgwidth{60mm}
\input{pics/01-nn-00-neuron313.pdf_tex}
\caption{Устройство нейрона мозга}
\end{figure}
Коэффициенты могут быть как положительные, так и отрицательные. Величина порога регулирует величину возбуждения нейрона, благодаря синапсисам по дендритам передаётся как возбуждающее, так и тормозящее действие. Передаточная функция f выбирается простейшая для увеличения скорости вычисления.
\begin{figure}[H]
\centering
\def\svgwidth{60mm}
\input{pics/01-nn-00-neuron314.pdf_tex}
\begin{equation*}
\begin{gathered}
\{X_1X_2X_5\}\to Y_1\\
\{X_3X_4X_6\}\to Y_2\\
\{X_1X_2X_6\}\to Y_3
\end{gathered}
\end{equation*}
\caption{Схема устройства нейрона мозга (возможные отношения)}
\end{figure}
\begin{figure}[H]
\centering
\def\svgwidth{70mm}
\input{pics/01-nn-00-neurnet315.pdf_tex}
\caption{Модель нейрона мозга}
\label{ris:3.15}
\end{figure}
Для примера возьмём систему с несколькими входами и выходами наблюдали что при сигналах на входе образуется сигнал на выходе. Моделируем: 6 входов и три выхода (см. Рис.~\ref{ris:3.15}) вход как правило датчики, выход как правило сумматор. В середине располагается слой нейронов. В зависимости от количества слоёв обучается лучше или хуже. Если слоёв вообще нет - просто замыкаем и получаем однослойную сеть, конечный автомат. Плохо потому что при изменении условия надо переобучать. В условиях есть закономерности, их нужно замечать и объединять. Сколько брать слоёв - зависит от факторов: каждый слой на 1 меньше предыдущего, в рисунке идеально было бы два (и на всякий случай можно добавить), но для примера сделаем один. количество нейронов промежуточного слоя это среднее между количеством на входе и на выходе. три промежуточных слоя - слишком много.
\section{Трассировка сети (ручное обучение)}
\begin{figure}[H]
\centering
\def\svgwidth{120mm}
\input{pics/01-nn-00-neuron316.pdf_tex}
\caption{Пример трассировки сети}
\end{figure}
Для трассировки строят матрицу следования - это диагональная матрица, где располагаются все нейроны. Принцип соединения нейронов в сети - все со всеми. Обозначаем, что сигнал от $x_1$ передаётся на 1,2,3,4, вход на 1,2,3,4 выход на $y_1$, $y_2$, $y_3$. Коэффициенты внутри матрицы это $\omega$. Для обучения можно выбирать любые, поэтому можно списать нулевые, чтобы ничего не пропускали. Далее сеть начинает обучаться по эталонам: идёт предварительный анализ всех эталонов (подстраивают сеть под удобные варианты) - ищем закономерность, в нашем примере это $x_1$ всегда идёт с $x_2$.
\begin{enumerate}
\item закономерность $x_1x_2$
\item берём первый эталон (идеальный пример для обучения) соответствие входа и выхода. ($x_1,x_2,x_5=y_1$)
\item отмечаем закономерность в матрице и закрепляем нейрон.
\item выставляем коэффициент 2 по количеству вхождений в эталоны
\item меняем в нейроне синапсические коэффициенты с нуля до единицы
\item остался х5 закрепляем за ним следующий промежуточный нейрон (2) с коэффициентом 1
\item закрепляем промежуточный 1,2 на $y_1$ меняем синапсис на 1
\item $x_3x_4$ = 1 на 3й нейрон м=2
\item $x_6$ = 1 на 4й м=1
\item 3,4 на $y_2$
\item $x_1x_2$ на 1 промежуточный, $x_6$ на 4й
\item 1,4 на $y_3$
\end{enumerate}
Обычно в процессе работы синапсис увеличивается не на единицу. Первоначально надо распределять от 0 до 0,5 а при обучении задавать коэфф 0,75, а не 1 для гибкости.
Формально по шагам путь прохождения трассировки:
\begin{enumerate}
\item рисуем матрицу следования, по вер и гор отмечаем все нейроны, внутри матрицы отмечаем связи
\item исследуем входные эталоны на закономерности (может быть и в середине обучения)
\item для каждого эталона строим схему прохождения сигнала путём изменения синапсических весов
\item параллельно отмечаем на схеме путь прохождения возбуждения
\end{enumerate}
\section{Способы предварительной обработки изображения для передачи в нейронную сеть}
\begin{enumerate}
\item построковое сканирование (сканируем каждый пиксель и передаём его характеристику)
\item блоковое сканирование (по областям, передаём характеристику сразу целой области (как размытие изображения))
\item захват области (игнорирование статических и ненужных частей изображение, передаются только характеристики найденного объекта) используется в основном в играх и для движущихся объектов. не объект передаётся через раз или даже реже
\item оптимизация (другая нейронная сеть, свёрточная) передают определённые признаки областей - однородные и статические области не передаются или передаются как области, а не попиксельно
\end{enumerate}
\section{Нейронные сети}
Классификация официально делятся по архитектуре (структуре) на:
\begin{enumerate}
\item иерархические
\begin{enumerate}
\item конвергентные
\item дивергентные
\end{enumerate}
\item сеть с одним входом (или выходом), звёзды гросберга
\item локальные, не используются сами по себе, а используются внутри других сетей нужны для тормозящей или возбуждающей функции
\end{enumerate}
По методу обучения:
\begin{enumerate}
\item обучение с учителем (когда есть обучающая эталонная выборка характеризующая соответствие входа и выхода)
\item самообучающиеся (ассоциативная память) в основном используют для классификации.
\end{enumerate}
По организации бывают обычные или рекуррентные (с обратной связью).
Систематическое изучение искусственных нейронных сетей начато в 1943м Маккалох и Питтс. Для распознавания изображений по модели учитель-ученик. в 1960м Розенблатт построил первую электронную машину на основе нейронной сети марк1.
\section{Персептрон}
\begin{figure}[H]
\centering
\def\svgwidth{80mm}
\input{pics/01-nn-00-neuron317.pdf_tex}
\caption{Пример применения нейросети}
\label{ris:3.17}
\end{figure}
\begin{figure}[H]
\centering
\def\svgwidth{100mm}
\input{pics/01-nn-00-neuron318.pdf_tex}
\caption{Нейросеть и функция активации}
\label{ris:3.18}
\end{figure}
Первый персептрон называется персептрон Розенблатта. Розенблатт смоделировал работу нейрона мозга и построил машину. Она линейно разделяла два нелинейных множества (см. Рис. ~\ref{ris:3.17}).
Персептрон состоит из трех элементов: первый элемент сенсорный, второй ассоциативный, третий реагирующий (см. Рис. ~\ref{ris:3.18}).
\begin{enumerate}
\item задача сенсорного это просто вход, имеет пороговую функцию (1)
\item ассоциативный вначале ф-ция зависела от (2) сначала была пороговой, потом сделали дифференцированной, изначально порог ставили около 0,6
\item реагирующий это обычно чистый сумматор
\end{enumerate}
2021-10-12 доска: потерялось фото-в-телефоне
\section{Многослойный персептрон}
Тоже самое, но слоёв промежуточных нейронов много, принцип соединения все-со-всеми. Ввёл также Розенблатт, но столкнулся с проблемой - как их обучать, ведь когда слоёв больше одного - формулы для промежуточных не работают.
\begin{figure}[H]
\centering
\def\svgwidth{120mm}
\input{pics/01-nn-00-multilayer.pdf_tex}
\caption{Многослойный персептрон}
\end{figure}
V - это промежуточные нейроны, у - это конечный выход (сверху для однослойного, снизу для многослойных)
проблема обучения решаются дифференцированием функции, должно быть легко взять производную. Самая простая дифференцируемая функция, сигмоидальная, например, $f = \frac{1}{1+exp^{-\alpha x}}$, где $\alpha$ это коэффициент угла наклона.
Так многослойный персептрон характеризуется --числа большим количеством промежуточных слоёв нейрона,
нелинейная, зачастую сигмаидальная функция активации, высокая связанность (все со всеми).
Обучается обычно также с учителем, на эталоне. Целевая функция энергия ошибки (формула Е с доски) где особенно важен коэффициент -1/2 обучение происходит по алгоритму обратного распространения ошибки: --числа. Вычисляем разность между д и у, $\frac{d(d-y)}{d\omega}$ подаём производные на вход и изменяем все синапсические связи.
Так и происходит уточнение весов. Функция активации - это разница между ожидаемым и полученным. В итоге получаем требуемую энергию ошибки.
\section{Персептрон с обратной связью (рекуррентные сети)}
Обратная связь может идти как от выхода так и от промежуточного слоя, так на вход и на промежуточные слои. Основная особенность: когда подаём на вход сигнал с выхода - сигналы от входа никуда не деваются, и подаём до получения устойчивого состояния.
было:
\[V = \sum \omega V\]
стало:
\[V=\sum \omega x + \sum Ky + b\]
Соответственно энергия ошибки тоже меняется. В простом варианте это была разность входов и выходов, а в рекуррентных считается по функции Ляпунова с тремя слагаемыми.
\[E = -\frac{1}{2} \sum_{j} \sum_{i!=j} \omega_{ij} y_{i} y_{j} + \sum_{i=1}^{N} \frac{1}{R_{i}} \int_{0}^{x} f_{i}^{-1} (y_{1}) dy_{i} + \sum_{i=1}^{N} b_{i} y_{i}\]
Это математический аппарат для исследования устойчивых динамических систем любого нелинейного вида и любой размерности. Устойчивое состояние достигается когда ляпунов -> min. То есть когда при передаче выходов на вход не поменяется состояние нейронов мы считаем, что обучение завершено. Аттракторы - это нейроны в рекуррентной сети с достигнутым энергетическим минимумом. Благодаря им рекуррентные сети можно применять в качестве ассоциативной памяти. В зависимости от того, куда и откуда подаются сигналы меняется название сети: самый простой - рекуррентный многослойный (R multilayer P) персептрон, рекуррентная сеть реального времени (Realtime R Network) и частный случай - сеть Эльмана.
\section{RMLP}
\begin{figure}[H]
\centering
% \includegraphics[width=12cm]{RMLP.png}
\caption{Устройство нейрона мозга}
\end{figure}
Сверху начальные входы-все-со-всеми промежуточные кружки идут в один круг выход откуда стрелка на выход и стрелка и входы внизу, то есть получается:
\[{1, x_1, x_2, ..., x_n}, {y_1, y_2, ..., y_m}\]
где $y = f(x)$, и это только первый шаг, далее добавляется второй шаг, итд.
\[x(k) = [1, x{k, x{k-1}, x(k-(N-1))}, y(k-P), y(k-P-1), y(k-1)]\]
N - 1 количество задержек на входе
P - количество задержек выхода
k - количество нейронов
Средние нейроны также вычисляются по известной формуле фото-в-телефоне.
\begin{figure}[H]
\centering
% \includegraphics[height=6cm]{rmlt.png}
\caption{Устройство нейрона мозга}
\end{figure}
Обучение происходит как и в обычном персептроне, просто учитываются обратные связи. Алгоритм вильяма-зипсера (слайд) --числа:
\begin{enumerate}
\item выбрать случайные начальные значения весов сети (W)
\item рассчитать состояние всех К нейронов для очередного момента (t)
\item рассчитать значения по формуле (сложная)
\item уточнить значения весов по алгоритму наискорейшего спуска (несколько формул, где альфа - это шаг обучения)
\end{enumerate}
\begin{figure}[H]
\centering
% \includegraphics[width=12cm]{vz.png}
\caption{Устройство нейрона мозга}
\end{figure}
Разница в том, что просчитываем игреки, пока система не придёт в равновесие.
\section{RTRN}
\begin{figure}[H]
\centering
% \includegraphics[width=12cm]{RTRN.png}
\caption{Устройство нейрона мозга}
\label{ris:RTRN}
\end{figure}
\begin{figure}[H]
\centering
% \includegraphics[width=12cm]{for-rtrn.png}
\caption{Устройство нейрона мозга}
\label{ris:formulsRTRN}
\end{figure}
Отличие в том, что она однослойная, нет задержек (см. Рис. \ref{ris:RTRN}. в отличие от многослойного персептрона расчитывается на один цикл. То есть это частный случай рекуррентной сети. Формулы (см. Рис. \ref{ris:formulsRTRN}) не отличаются от формул для одного персептрона, не ждём равновесия.
\section{Рекуррентная сеть Эльмана}
\begin{figure}[H]
\centering
% \includegraphics[width=12cm]{elm.png}
\caption{Устройство нейрона мозга}
\label{ris:formulsRTRN}
\end{figure}
\begin{figure}[H]
\centering
% \includegraphics[width=12cm]{for-elm.png}
\caption{Устройство нейрона мозга}
\label{ris:formulsRTRN}
\end{figure}
Разница в новой связи ко второму слою. обратная связь идёт не с выходов, а с промежуточных элементов (называется частичная обратная связь). Формулы практически не отличаются от многослойного персептрона, единственное, что вторая связь не от выходов y, а от промежуточных ${u_1, u_2, u_k}$. Часто используются в задачах прогноза векторного временного ряда.
Самая большая проблема в новых нейронных сетях - придумывать новые формулы для расчёта нейронов.
\section{Cеть радиально-базисных функций (RBF)}
Обязательно содержит слой радиально-симметричных нейронов (преобразует расстояние от центра нейронов до некоторого входного нейрона по некоторому нелинейному уравнению, чаще всего функция Гаусса). сравнение векторов (параметры какой-то модели) (нейрон с центром сравнивается с нейроном на входе). Радиальная функция - это функция, зависящая от расстояния между двумя точками в пространстве.
\begin{enumerate}
\item плоский сплайн
\item сплайн с натяжением
\item полностью регуляризованный сплайн
\item мультиквадратичная функция
\item обратная мультиквадратичная функция
\end{enumerate}
Сплайн - это кусочная интерполяция функции. Обратная интерполяция - подбираем функцию по точкам. Так сплайнами можно построить любую модель любой поверхности. Аппроксимация - это построение среднего по точкам. Интерполяция - функция, которая проходит через все значения. При интерполяции каждому входному вектору соответствует выходной вектор. Так персептрон - это глобальная аппроксимация при попытке сделать глобальную интерполяцию - попытка удовлетворить все выходы омега со входов х. Сплайн занимается локальной интерполяцией, а не глобальной. Используются для задач распознавания образов (и обнаружения движения) чаще, чем персептроны, несмотря на то, что последние значительно проще. Шумоподавление.
\begin{figure}[H]
\centering
% \includegraphics[width=12cm]{rbf.png}
\caption{Устройство нейрона мозга}
\label{ris:formulsRTRN}
\end{figure}
Имеет двухслойную архитектуру. (10-б) первый слой как раз функция вычисления расстояния (РБФ), выход чаще всего простой линейный нейрон.
РБФ показывает соответствие (вероятность) насколько похожи промежуточные на вход. Можно добавлять туда персептронских слоёв (после вероятностей) будет сложнее обучаться, но работает намного "интереснее".
Что нужно для обучения: обучается с учителем. Нужно написать функцию ошибки. Промежуточные слои обозначают G. Часто вводят масштабирующую матрицу (это матрица (матрица корелляции), которая выравнивает параметры и приводит их к общему диапазону, размерности) - это обычная транспонированная матрица. Вводим этот коэффициент для всех уравнений. Нужно найти центры и найти расстояния (можно задать самим, так обычно делают в начале обучения, решают задачу кластеризации) берут количество нейронов на входе и $\frac{x_\text{макс}-x_\text{мин}}{\text{кол-во}}$. Найти области перекрытия $\frac{max(c_i-c_j)}{\sqrt{2n}}$, где n - это количество нейронов скрытого слоя) ищем центры кластеризации, разбиваем вектор на определённое количество нейронов, если сеть работает некорректно - увеличиваем количество нейронов скрытого слоя.
Алгоритм не подразумевает уменьшения количества. считаем расстояния
- евклидово
- квадрат евклидова
- городских кварталов
- чербышева
- степенное
Алгоритм не подразумевает уменьшения количества. Считаем расстояния
\begin{enumerate}
\item евклидово
\item квадрат евклидова
\item городских кварталов
\item чебышева
\item степенное
\end{enumerate}
Есть и более простой способ (гибридный алгоритм обучения):
\begin{enumerate}
\item выбирается начальное значение центров и параметров ширины, расчёт коэффициентов выходного слоя
\item на основе этих весов происходит адаптация нелинейных параметров радиальных функций.
\end{enumerate}
Основная проблема - выбор количества радиально-базисных нейронов. Зависит от количества выборок, от объёма данных, структуры аппроксимирующей функции.
\section{Нейронные сети Кохонена}
\begin{enumerate}
\item самообучающиеся сети. Классифицирующие, нет эталона. используется для сжатия информации, кластеризации.
\item есть вектор входных параметров и надо разбить на классы. сеть определяет к какому классу отнести тот или иной входной параметр.
Для обучения применяется механизм конкуренции. Возникает проблема мёртвых нейронов, а значит и погрешность увеличивается.
\end{enumerate}
\begin{figure}[H]
\centering
% \includegraphics[width=12cm]{kox1.png}
\caption{Устройство нейрона мозга}
\label{ris:formulsRTRN}
\end{figure}
\begin{figure}[H]
\centering
% \includegraphics[width=12cm]{kox2.png}
\caption{Устройство нейрона мозга}
\label{ris:formulsRTRN}
\end{figure}
\begin{figure}[H]
\centering
% \includegraphics[width=12cm]{kox3.png}
\caption{Устройство нейрона мозга}
\label{ris:formulsRTRN}
\end{figure}
\section{Звезда Гросберга}
Это фрагмент нейронной сети, который моделирует функции. входная звезда имеет большой входной вектор с единственным выходом. Выходная звезда наоборот при единичном входе выдаёт огромный выходной вектор. Сами по себе не используются, но можно построить сеть со смешанным обучением и использованием звёзд гросберга и сетей кохонена. Часто применяются в скоринговых системах.
\begin{figure}[H]
\centering
% \includegraphics[width=12cm]{kox4.png}
\caption{Устройство нейрона мозга}
\label{ris:formulsRTRN}
\end{figure}
\section{Ассоциативная память}
\subsection{Сеть Хопфилда}
Реализует восстановление по искажённому сигналу, по ассоциации, что ближе ко входному вектору. В честь хопфилда назвали базу, сейчас на этой модели есть много разных сетей, например, сеть Коско.
Это рекуррентная сеть (среднее между самообучением и обучением с учителем). состоит из трёх слоёв: входной (сенсорный элемент, даже не нейроны), слой нейронов (поэтому сеть называют однослойной) и выходной вектор (не нейроны, просто вектор). Выходы нейронов подключены ко всем входам кроме себя. Синапсический коэфф на входах == коэфф на выходах. Все сети с обратной связью - синапсические. Энергия сети считается по функции Ляпунова. Можно использовать как авто ассоциативную или как фильтр. Иногда используется для задач оптимизации. Всегда работает до достижения равновесия. Число нейронов сети это размерность входного вектора.
В отличие от многих НС, которые получают ответ через несколько тактов, это динамическая сеть, которая всегда работает до состояния устойчивости.
Это полносвязная сеть с симметричной матрицей связи. Размерность входных и выходных сигналов ограничены только возможностью вычислительной системы и совпадают.
Динамическое изменение состояния сети может быть выполнено двумя способами: синхронно и асинхронно. Если синхронно - все нейроны изменяются одновременно. При асинх подходе на каждом этапе меняется состояние только одного нейрона. сеть вычисляется матричным подходом, без всяких сигм и прочего. Чем больше сумм тем расстояние между образами должно быть больше (рассчитывается по метрике хемминга). Каждый эталон называется аттрактом - притягивает входной образ к себе. если сделать негатив эталона - он будет точно таким же аттрактом. то есть образы в сети являются инвариантными. Сеть нельзя назвать самообучающейся, но нельзя обучать бесконечно.
Сеть нельзя сделать бесконечно большой. Может запомнить 15\% образов от количества нейронов. То есть КПД == 15\%. от последовательности или параллельност качество обучения не меняется. на каждом шаге меняется энергия сети (и каждого нейрона). Предпочтительно всегда работать в асинхронном режиме.
\begin{figure}[H]
\centering
% \includegraphics[width=12cm]{hop1.png}
\caption{Устройство нейрона мозга}
\label{ris:formulsRTRN}
\end{figure}
\begin{figure}[H]
\centering
% \includegraphics[width=12cm]{hop2.png}
\caption{Устройство нейрона мозга}
\label{ris:formulsRTRN}
\end{figure}
\subsection{Сеть Коско}
Двунаправленная ассоциативная память, базируется на ассоциативной памяти хопфилда. Можем по входам восстановить выходы, и по выходам входы. Это однослойная нейронная сеть. Благодаря двунаправленности называется гетероассоциативная память. т.к. основана на АПХопфилда, к ней подходит всё, что подходит для Х. может обобщать и вырабатывать правильную реакцию на искажённый вход. Может из зашумлённых сигналов выделять эталонные версии. Нельзя дообучить в процессе работы. Процесс обучения это вычисление перед началом работы матрицы коэффициентов. работает в основном с двоичными векторами. Векторная компонента может быть либо +1 либо -1 или +1 и 0.
Задача: есть сеть 3х3. входной вектор обозначим а, выходной б. б = омега а. омега = атранспонированное умножить на бштрих равно суппа атранспонированное итое умножить на бштрих итог.
\begin{verbatim}
а1 100 - б1 001
а2 010 - б2 010
а3 001 = б3 100
атранспонированное1 100
атранспонированное2 010
атранспонированное3 001
бштрих1 011
бштрих2 101
бштрих3 011
перемножаем матрицы
ат1б1 ат2б2 ат3б3
110 010 100
001 101 100
001 010 011
\end{verbatim}
Складываем омега матрица = 110,101,011. б = омегаштрих * атранспонированное
Обучили, работаем. В а приходит сигнал 100 омега матрица = 001 010 100, перемножили 001 101 011, сложили 001 получили б1.
Есть несколько разновидностей двунаправленных ассоциативных памятей:
\begin{enumerate}
\item синхронная: два слоя между которыми есть двусторонние связи, соединены все-со всеми. Если квадратная и симметричная, то она превращается в сеть хопфилда. Передача будет происходить до того момента, как будет подобран наиболее близкий к эталонному сигнал.
\item непрерывная асинхронная ДАП: все нейроны меняют своё состояние независимо от других нейронов. Состояния нейронов зависят следующий от предыдущего. можно использовать функцию активации "простой порог". Работает по сигмаидальной функции, благодаря которой достигается непрерывность. по достижении порога сигмаидальная функция разрывается
\item адаптивная ДАП: меняет матрицу весовых коэффициентов в процессе функционирования. Обучается по типу персептрона, постепенно каждому эталону. На вход подаётся входной вектор, а на выход - эталон. Сеть сама подстраивает веса в соответствие входов выходам. в результате такого обучения кратковременная память становится долговременной. Можно дообучить как и персептрон на зашумлённых векторах.
\item конкурирующая ДАП: вводится конкуренция между нейронами. вводятся дополнительные связи между нейронами одного слоя и веса этих связей формируют другую весовую матрицу. в этой другой матрице по главной диагонали находятся положительные элементы, все остальные отрицательные. Если какой-то нейрон более активный по сравнению с остальными - он и выигрывает конкуренцию и именно он меняет своё состояние, подстраиваясь под вектор, который его активировал. При использовании конкуренции возникает проблема: появляется нейрон, который всегда выигрывает. нужно думать как избавляться от аномалий, возможно, исключить победителя из соревнований или добавить выход нейрона на вход соседей.
\end{enumerate}
\section{Сеть Ворда}
Вход 3 нейр, выглядит как майндмэп до 9 нейронов среднего слоя через две точки объединения.
Первый входной слой обычный, далее скрытый слой разбивается на блоки, и также на нейроны выходного слоя (тоже 3 и как правило построен на сумме омег входных сигналов). Примечателен именно скрытый слой: в отдичие от остальных сетей, где применяются сигмаидальные пороговые и прочие функции, может применяться несколько функций. То есть средний слой будет подбирать лучшую функцию для обработки входного сигнала. Фактически это архитектурная топология, а не сеть. Это многослойная сеть с обычным обучением, с той разницей, что каждый блок обучается отдельно от других, а на выходе суммируем значения. Главное, чтобы топология скрытого слоя была однотипная.
\section{Генеративно-состязательная сеть}
generative adversarial network
Алгоритм машинного обучения, основанного на соперничестве двух сетей. генератор Г и дискриминатор Д. Оба персептроны или свёрточные сети. Принцип в том, что Д - это обычная сеть для распознавания изображений. обычная сеть проверки подлинности, ей нужно классифицировать изображение. на вход Г подаётся шум, на основе шума Г создаёт вектор и посылает его Д. Д должен классифицирует этот вектор, и посылает обратно в Г, Г самообучается, подстраивая свои веса так, чтобы подать Д правильный вектор.
Вход синус. х - это иделаьная последовательность, эталон. подали на Д. Д обучился воспринимать синус. Г подаём на вход шум (z) на основе неё генерируются точки. в результате должны сгенерироваться точки, похожие на х. Д возвращает вероятность, попала точка в х или нет. то есть это простое обучение, но учитель не мы, а Д. Если генератор достаточно обучить - он может выдавать идеальные векторы.
Используется для восстановления изображений. По сути в итоге - это минимакс двух игроков. После обучения Д его замораживаем и запрещаем менять весовые коэффициенты и начинаем обучать Г. Почему используется минимаксная функция? суть Г - создать вектор так, чтобы Д их принимал за настоящие. В математическом плане функция Г заключается в минимизировании функции ошибки.
\[min_G\log (1 - D(G(Z))\], где Z - это шум.
Цель Д обратная
\[max_D(\log (B(x_t)) + \log(1 - D(x_f)))\],
где $x_f = G(z)$.
Как можно чётче максимизировать отличия. Общая формула получается минимаксная игра (G играет в минимум, D в максимум) - \[min_Gmax_D(\log D(x_t) + \log(1 - D(G(z)))\], где $\log D(x_t)$ - это эталон, а $\log(1 - D(G(z)))$ - это отличие от эталона.
Виды:
\begin{enumerate}
\item глубокая свёрточная ГСС - сделана на основе свёрточной сети, более устойчива для обучения, используется когда мощности обычной сети не хватает, может эффективно работать на сложных данных, использует больший набор признаков
\item улучшенная ГСГСС - ещё более высокого разрешения, минус в том, что увеличивая качество входа - вектор сходимости плохой (при добавлении эпох ошибка будет расти).
\item условная ГСС - использует не только вектор, но и дополнительную информацию, по сути приходит не только вектор, но и категория, к которой относится вектор (дополнительная контрольная сумма). основана на таком же классическом алгоритме, используется когда нужно увеличить качество и есть дополнительный контроль.
\item информационная ГСС - дополнительно выдаёт кодировку изображения. не просто распознают, но например ещё определяют угол поворота изображения. используется когда данные не очень сложные.
\item сеть вассерштейна - работает с восстановлением изображений, в уравнение добавлена функция потерь, модифицированная так, чтобы алгоритм учитывал функцию сходимости, то есть останавливает обучение, когда дальше уже не эффективно. используется если требуется высокая стабильность обучения при высокой скорости обучения
\item улучшенная сеть вассерштейна - улучшенная метрика функции потерь, простые приближения, и другие параметры, в итоге сеть показывает ещё лучшие результаты. может работать с большим количеством данных и архитектур, но отбразывает детальную прорисовку. используется для распознавания номеров машин в камерах
\item ГСС граничного равновесия - использует простую архитектуру, добавляет динамику при обучении сети, то есть рекуррентная сеть. похожа на вассерштейна, но работает немного дольше.
\item прогрессирующая ГСС - создана на основе вассерштейна, добавляет слои в архитектуру, так во время обучения появляется идеально прорисованное изображение, потому что каждый дополнительный слой увеличивает качество. в основе использует свёрточную сеть.
\item цикличная ГСС - одна из самых передовых свёрточных сетей, чтобы переводить изображения в другую категорию. подбирает по мимо вектора ещё и категорию, и на основе признаков подбирает изображение из готовых.
\end{enumerate}
% тут больше прикола ради формул закину, которые делал для другого предмВета, налету)
% \textbf{Райса} описывает более общий случай, когда есть и прямой луч
% \[p_z(z) = \frac{z}{\sigma^2}exp[-\frac{z^2+S^2}{2\sigma^2}]I_0(\frac{zs}{\sigma^2})\]
% \[S^2 = \alpha_0^2\]
% \[2\sigma^2 = \overline{Z_n}M[\alpha_n]\]
% \[K = \frac{S^2}{2\sigma^2}\]
% \[p_r = S^2 + 2\sigma^2\]
% \[p_z(z) = \frac{2(K+1)z}{p_r}exp[-K-\frac{(K+1)z^2}{p_r}]I_0(2\sqrt{\frac{K(K+1)}{p_r}}z)\]
% При К = 0 релей, при бесконечной прямая видимость доминирует над отражёнными сигналами. представляется в децибелах.
% \textbf{распределение накагами}. суть в том что оно ещё более общего вида. помогает посчитать как часто и сколько в среднем времени мы будем находиться ниже порога гарантии принятия сигнала.
% \[L_z = \sqrt{2\pi(K+1)f_{D_m} \rho e^{-K-(K+1)\rho^2}I_0(2\rho\sqrt{K(K+1)})}\text{райс}\]
% если в это выражение подставить к = 0 получим релея.
% \[L_z = \sqrt{2\pi}f_{D_M}\rho e^{-\rho^2}\]
% среднее время нахождения ниже порога
% \[t_z = \frac{e^{\rho^2}}{\rho f_{D_m}\sqrt{2\pi}}\]
% \[\rho = \frac{z_0}{\sqrt{p_r}} = \sqrt{\frac{p_0}{p_r}}\]
% в примере получаем разовые битовые ошибки 17 раз в секунду. если больше - биты подряд, если меньше - ошибок нет
\end{document}

245
01-nn-hw-01-report.tex Normal file
View File

@ -0,0 +1,245 @@
\documentclass[a4paper,fontsize=14bp]{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\input{../fancy-listings-preamble}
\setcounter{secnumdepth}{0}
\numerationTop
\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{домашней}{1}{Программирование нейронной сети}{Нейронные сети}{а}{Боровик И.Г.}
\newpage
\thispagestyle{empty}
\tableofcontents
\newpage
\pagestyle{fancy}
\section{Цель}
Целью домашней работы было написание нейронной сети на языке программрования. Нейронная сеть должна распознавать изображения рукописных букв кириллического алфавита.
\section{Выполнение}
Для простоты реализации был выбран язык \code{Python} с применением библиотек \code{PyTorch} (нейросеть), pandas (импортирование датасета), sklearn (работа с датасетом, разделение на тестовый и обучающий). Датасеты сразу содержали чистые и зашумлённые изображения.
\subsection{Подготовка}
Для создания и обучения нейросети были скачены большие датасеты и установлены библиотеки для работы с нейросетями. В рамках выполнения задания был выбран многослойный персептрон с обратной связью. Работа производилась в редакторе \code{VSCode} с подключенным плагином \code{Jupyter Notebook}. Для увеличения количества вычислительных ресурсов при обучении нейросети код был перемещён на серверы Google в проект Colab (https://colab.research.google.com).
\subsection{Создание датасетов}
Наборы данных для нейросети создавались как набор байтов в формате \code{csv} (Comma-separated values, значения, разделённые запятой), где каждое значение - это нормированное значение байта изображения и обозначение выходного эталона для сравнения (что за буква зашифрована в байте). Код, импортирующий данные из файлов представлен в листинге \hyperref[lst:importcsv]{\ref{lst:importcsv}}, а проверочные изображения (для визуального сопоставления изображения и лейбла пользователем) на рис. \hyperref[pic:firstletters]{\ref{pic:firstletters}}.
\begin{figure}[H]
\centering
\begin{multicols}{5}
\includegraphics[width=3cm]{01-nn-hw01.png}
\columnbreak
\includegraphics[width=3cm]{01-nn-hw02.png}
\columnbreak
\includegraphics[width=3cm]{01-nn-hw03.png}
\columnbreak
\includegraphics[width=3cm]{01-nn-hw04.png}
\columnbreak
\includegraphics[width=3cm]{01-nn-hw05.png}
\end{multicols}
\caption{Случайно выбранные изображения из импортированных файлов}
\label{pic:firstletters}
\end{figure}
\begin{lstlisting}[language=Python, style=PyCodeStyle, caption=Код импорта данных из файлов, label=lst:importcsv]
from google.colab import drive
drive.mount('/content/drive')
import numpy as np
import matplotlib.pyplot as plt
import string
import os
from PIL import Image
# Load images and labels
X = np.loadtxt('/content/drive/MyDrive/bmstu/nn-hw/input/cyrillic_data/cyrillic_data.csv', delimiter=",")
y = np.loadtxt('/content/drive/MyDrive/bmstu/nn-hw/input/cyrillic_label/cyrillic_label.csv', delimiter=",")
# Display 5 random letters and their labels
for _ in range(5):
i = np.random.randint(X.shape[0])
my_letter = X[i].reshape(28,28)
letters = "ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
my_label = letters[int(y[i])]
print(f"Displaying letter {my_label}")
plt.imshow(my_letter, cmap="gray")
plt.show()
\end{lstlisting}
После импорта изображения были риведены к нужному размеру (28*28) и упакованы в датасет для распознавания нейросетью. некоторые фрагменты этого процесса приведены в листинге \hyperref[lst:dataset]{\ref{lst:dataset}}.
\begin{lstlisting}[language=Python, style=PyCodeStyle, caption=Код импорта данных из файлов, label=lst:dataset]
letters = "ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
PATH_PREF = '/content/drive/MyDrive/bmstu/nn-hw/input'
PATH = PATH_PREF + '/images/images/Cyrillic/Cyrillic'
sorted(os.listdir(PATH))
ratio = 0.25
def convert2csv(img_folder:str, ratio = 0.25):
folders = sorted(os.listdir(img_folder))
out_img = PATH_PREF + '/cyrillic_data/my_cyrillic_data.csv'
out_label = PATH_PREF + '/cyrillic_label/my_cyrillic_label.csv'
img_csv = open(out_img, 'w')
label_csv = open(out_label, 'w')
for folder in folders:
if folder == '.DS_Store':
continue
files = os.listdir(img_folder + '/' + folder)
for file in files:
if file == '.DS_Store':
continue
img = Image.open(img_folder + '/' + folder + '/' + file)
img.load()
img = img.resize((28,28), Image.ANTIALIAS)
img.convert('L')
pixels = list()
for i in range(28):
for j in range(28):
pix = img.getpixel((i,j))
pixels.append(pix[3])
img_csv.write(",".join(str(pix) for pix in pixels) + '\n')
label_csv.write(str(letters.index(folder)) + '\n')
\end{lstlisting}
\subsection{Нейросеть: Свойства и создание}
При создании нейросети первое, что было сделано - это разделение общего датасета на данные для обучения и данные для тестирования. Все данные были разделены в соотношении 80/20\%, где 80 - это обучающий объём, а 20 - тестирующий. Поскольку в обучающих датасетах получилось более 15000 изображений, для более эффективного обучения, их необходимо было разделить на порции (пакеты). Каждый обучающий пакет создавался размером в 107 изображений. Подготовительный код представлен в листинге \hyperref[lst:prepare]{\ref{lst:prepare}}
\begin{lstlisting}[language=Python, style=PyCodeStyle, caption=Подготовка датасетов к обучению, label=lst:prepare]
train = pd.read_csv('/content/drive/MyDrive/bmstu/nn-hw/input/cyrillic_data/my_cyrillic_data.csv', delimiter=',')
X = train.loc[:].values/255
train_labels = pd.read_csv('/content/drive/MyDrive/bmstu/nn-hw/input/cyrillic_label/my_cyrillic_label.csv', delimiter = ',')
Y = (train_labels.to_numpy()).reshape(len(train_labels))
features_train, features_test, targets_train, targets_test = train_test_split(X, Y, test_size=0.2, random_state=42)
Y_train = torch.from_numpy(targets_train).type(torch.LongTensor)
Y_test = torch.from_numpy(targets_test).type(torch.LongTensor)
train = torch.utils.data.TensorDataset(X_train, Y_train)
test = torch.utils.data.TensorDataset(X_test, Y_test)
train_batch_size =107
test_batch_size =107
train_loader = torch.utils.data.DataLoader(train, batch_size = train_batch_size, shuffle = False)
test_loader = torch.utils.data.DataLoader(test, batch_size = test_batch_size, shuffle = False)
\end{lstlisting}
Далее была создана нейросеть со следующими свойствами:
\begin{itemize}
\item Входных нейронов: 784 (по количеству пикселей входящего изображения, 28*28);
\item Выходных нейронов: 33 (по количеству букв современного кириллического алфавита);
\item Промежуточных слоёв: 2;
\item Нейронов в промежуточных слоях: 128, 22;
\item Функция потерь: отрицательная функция логарифмической вероятности;
\item learning rate: 0.003;
\item momentum: 0.9.
\end{itemize}
Код, устанавливающий даные свойства и создающий нейросеть представлен в листинге \hyperref[lst:create]{\ref{lst:create}}
\begin{lstlisting}[language=Python, style=PyCodeStyle, caption=Создание нейросети, label=lst:create]
input_size = 784
hidden_sizes = [128, 22]
output_size = 33
model = nn.Sequential(nn.Linear(input_size, hidden_sizes[0]),
nn.ReLU(),
nn.Linear(hidden_sizes[0], hidden_sizes[1]),
nn.ReLU(),
nn.Linear(hidden_sizes[1], output_size),
nn.LogSoftmax(dim=1))
criterion = nn.NLLLoss()
optimizer = torch.optim.SGD(model.parameters(),lr=0.003, momentum=0.9)
images, labels = next(iter(train_loader))
images = images.view(images.shape[0], -1)
logps = model(images.float())
loss = criterion(logps, labels)
\end{lstlisting}
\subsection{Нейросеть: Обучение}
Обучение нейросети производилось 200 эпох, код, последовательно обучающий сеть представлен в листинге \hyperref[lst:learn]{\ref{lst:learn}}, последние сообщения из журнала обучения на рис. \hyperref[pic:learn]{\ref{pic:learn}}, а график обучения на рис. \hyperref[pic:learndiag]{\ref{pic:learndiag}}.
\begin{lstlisting}[language=Python, style=PyCodeStyle, caption=Обучение нейросети, label=lst:learn]
epochs = 200
time0 = time()
train_losses, test_losses = [] ,[]
for epoch in range(epochs):
running_loss = 0
for images,labels in train_loader:
images = images.view(images.shape[0], -1)
labels = Variable(labels)
optimizer.zero_grad()
output = model(images.float())
loss = criterion(output,labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
else:
train_losses.append(running_loss/len(train_loader))
\end{lstlisting}
\begin{figure}[h]
\centering
\begin{multicols}{2}
\includegraphics[width=8cm]{01-nn-hw-lrl.png}
\caption{Фрагмент журнала обучения нейросети}
\label{pic:learn}
\columnbreak
\includegraphics[width=8cm]{01-nn-hw-lrd.png}
\caption{Диаграмма обучения нейросети}
\label{pic:learndiag}
\end{multicols}
\end{figure}
\section{Тестирование нейросети и выводы}
По результатам тестирования нейросети видно, что чаще всего рукописная буква А похожа на О, Э и Д. Буква О изредка была перепутана с А, Р, С и Ф. Но в целом, сеть ошиблась в 0,3 процентах случаев. Этот показатель можно улучшить, добавив в обучение эпох или изменив количество нейронов среднего слоя. Важно не сделать средний слой слишком большим, чтобы избежать сложностей при обучении. Код, тестирующий нейросеть представлен в листинге \hyperref[lst:test]{\ref{lst:test}}.
\begin{lstlisting}[language=Python, style=PyCodeStyle, caption=Тестирование нейросети, label=lst:test]
test_images = pd.read_csv("/content/drive/MyDrive/bmstu/nn-hw/input/cyrillic_data/my_cyrillic_data_test.csv")
test_image = test_images.loc[:].values/255
test_dataset = torch.from_numpy(test_image)
new_test_loader = torch.utils.data.DataLoader(test_dataset, batch_size = 100, shuffle = False)
results = []
with torch.no_grad():
model.eval()
for images in new_test_loader:
test = images.view(images.shape[0], -1)
output = model(test.float())
ps = torch.exp(output)
top_p, top_class = ps.topk(1, dim = 1)
results += top_class.numpy().tolist()
predictions = np.array(results).flatten()
submissions=pd.DataFrame({"Result Label": predictions})
test_label = pd.read_csv("/content/drive/MyDrive/bmstu/nn-hw/input/cyrillic_label/my_cyrillic_label_test.csv")
test_label.columns = ['True label']
submissions['true'] = test_label['True label']
submissions.to_csv("/content/drive/MyDrive/bmstu/nn-hw/my_res.csv", index = False, header = True)
\end{lstlisting}
\end{document}

156
01-nn-lab-01-report.tex Normal file
View File

@ -0,0 +1,156 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\setcounter{secnumdepth}{0}
\begin{document}
\pagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{1}{Построение персептрона}{Нейронные сети}{а}{Боровик И.Г.}
\newpage
\tableofcontents
\newpage
\section{Цель работы}
Ознакомление c моделью персептрона, а также процессом проектирования и обучения нейронных сетей с использованием программной платформы Neuroph. Neuroph фреймворк для разработки нейронных сетей, реализованный на языке программирования Java. Neuroph состоит из Java-библиотеки и пользовательского интерфейса для проектирования нейронных сетей (Neuroph Studio). Neuroph Studio позволяет проводить эксперименты с рядом стандартных архитектур нейронных сетей, которые также можно в дальнейшем вставить в собственную программу, используя Java-библиотеку.
\section{Задания}
\begin{enumerate}
\item Создание и обучение простейшего персептрона: занести в отчет структуру спроектированного персептрона, график ошибки (отображается при обучении), а также результаты тестирования нейронной сети.
\item Создание и обучение однослойного персептрона. Определение оптимального количества нейронов скрытого слоя.
\end{enumerate}
\section{Работа и результат:}
\subsection{Задание 1: Создание простейшего персептрона}
В результате прохождения процесса создаия персептрона при помощи мастера создаётся визуализация, представленная на рис. \hrf{pic:viz}.
\begin{figure}[ht]
\centering
\includegraphics[width=5cm]{01-nn-lab1-1.png}
\caption{Визуализация построения персептрона}
\label{pic:viz}
\end{figure}
На графике обучения (рис. \hrf{pic:gra}) видно, что обучение прошло за два шага и вероятность ошибки за эти шаги снизилась с 0,25 до нуля, поскольку персептрон обучался выполнять логическую операцию ИЛИ на простейшей таблице истинности.
\begin{figure}[ht]
\centering
\includegraphics[width=10cm]{01-nn-lab1-2.png}
\caption{График обучения простейшего персептрона}
\label{pic:gra}
\end{figure}
Проверочные данные для персептрона полностью совпадают с таблицей истинности для обучения, поэтому на рис. \hrf{pic:res} видно, что персептрон обучен абсолютно безошибочно.
\begin{figure}[ht]
\centering
\includegraphics[width=5cm]{01-nn-lab1-3.png}
\caption{Результаты тестирования персептрона}
\label{pic:res}
\end{figure}
\newpage
\subsection{Задание 2: Создание однослойного персептрона}
Заданием был сравнительный анализ обучения нескольких персептронов по нескольким изменяемым параметрам обучения. В результате прохождения процесса создаия персептрона при помощи мастера были созданы несколько персептронов. Для чистоты эксперимента, персептроны были обучены на одинаковых наборах данных. Ниже приведена таблица вариантов настроек обучения (в таблице не указано количество входных и выхоодных нейронов, поскольку для всех вариантов оно было одинаковое):
\begin{center}
\begin{tabular}{|c|c|c|c|}
\hline
Скрытые нейроны & Скорость обучения & Момент & Максимальная ошибка \\
\hline
14 & 0,2 & 0,7 & 0,01 \\
\hline
14 & 0,3 & 0,6 & 0,01 \\
\hline
10 & 0,3 & 0,6 & 0,01 \\
\hline
10 & 0,5 & 0,7 & 0,01 \\
\hline
5 & 0,2 & 0,7 & 0,01 \\
\hline
17 & 0,2 & 0,7 & 0,01 \\
\hline
17 & 0,6 & 0,2 & 0,02 \\
\hline
\end{tabular}
\label{tabl:sett}
\end{center}
На основе произведённого обучения были получены сведения, представленные в таблице \hrf{tabl:resu} из которой видно, что при допуске большей ошибки в обучении персептрон совершает гораздо меньше итераций.
\begin{table}[ht!]
\centering
\begin{tabular}{|c|c|c|c|c|c|}
\hline
Скрытые нейроны & Скорость & Момент & Макс. ошибка & Значение ошибки & Количество итераций \\
\hline
14 & 0,2 & 0,7 & 0,01 & 0,011694999820544496 & 60 \\
\hline
14 & 0,3 & 0,6 & 0,01 & 0,011548815049850565 & 38 \\
\hline
10 & 0,3 & 0,6 & 0,01 & 0,012183585385078192 & 92 \\
\hline
10 & 0,5 & 0,7 & 0,01 & 0,018752958982292532 & 51 \\
\hline
5 & 0,2 & 0,7 & 0,01 & 0,017730898002278603 & 450 \\
\hline
17 & 0,2 & 0,7 & 0,01 & 0,011347284109802744 & 61 \\
\hline
17 & 0,6 & 0,2 & 0,02 & 0,023625908020656096 & 30 \\
\hline
\end{tabular}
\caption{Результаты обучения персептронов}
\label{tabl:resu}
\end{table}
Также составим график зависимости количества итераций от количества нейронов скрытого слоя, который наглядно демонстрирует, что малое (недостаточное) количество нейронов вынуждает сеть переобучаться значительное количество раз.
\begin{tikzpicture}
\begin{axis}[
%title=Title,
xlabel=Нейронов,
ylabel=Итераций,]
\addplot coordinates {(5,450) (10,92) (10,51) (14,60) (14,38) (17,61) (17,30)};
\end{axis}
\end{tikzpicture}
Снимки экранов с результатами тестирования нейронных сетей представлены в приложении \hyperref[appendix:testing]{\ref{appendix:testing}} на рисунках 4-10
\newpage
\appendix
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
%\renewcommand{\thesubsection}{\Alph{subsection}}
\subsection{Результаты тестирования}
\label{appendix:testing}
\begin{figure}[ht]
\centering
\includegraphics[width=15cm]{01-nn-lab2-1tst.png}
\caption{Для задания 1}
\includegraphics[width=15cm]{01-nn-lab2-2tst.png}
\caption{Для задания 2}
\includegraphics[width=15cm]{01-nn-lab2-3tst.png}
\caption{Для задания 3}
\includegraphics[width=15cm]{01-nn-lab2-4tst.png}
\caption{Для задания 4}
\includegraphics[width=15cm]{01-nn-lab2-5tst.png}
\caption{Для задания 5}
\includegraphics[width=15cm]{01-nn-lab2-6tst.png}
\caption{Для задания 6}
\includegraphics[width=15cm]{01-nn-lab2-7tst.png}
\caption{Для задания 7}
\end{figure}
\subsection{Визуализации Neuroph Studio}
\label{appendix:vis}
\begin{figure}[h]
\centering
\includegraphics[width=15cm]{01-nn-lab2-12.png}
\caption{Для заданий 1 и 2}
\includegraphics[width=15cm]{01-nn-lab2-34.png}
\caption{Для заданий 3 и 4}
\includegraphics[width=15cm]{01-nn-lab2-5.png}
\caption{Для задания 5}
\includegraphics[width=15cm]{01-nn-lab2-67.png}
\caption{Для заданий 6 и 7}
\end{figure}
\end{document}

221
01-nn-lab-02-report.tex Normal file
View File

@ -0,0 +1,221 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\begin{document}
\pagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{2}{Прогнозирование на базе нейронных сетей}{Нейронные сети}{а}{Боровик И.Г.}
\newpage
\tableofcontents
\newpage
\section*{Цель работы}
\addcontentsline{toc}{section}{Цель работы}
Познакомиться с процессом решения задач аппроксимации и прогнозирования с помощью многослойных персептронов с использованием программной платформы \code{Neuroph}. \code{Neuroph} фреймворк для разработки нейронных сетей, реализованный на языке программирования Java. \code{Neuroph} состоит из Java-библиотеки и пользовательского интерфейса для проектирования нейронных сетей \textbf{Neuroph Studio}. \textbf{Neuroph Studio} позволяет проводить эксперименты с рядом стандартных архитектур нейронных сетей, которые также можно в дальнейшем вставить в собственную программу, используя Java-библиотеку.
\section*{Задание}
\addcontentsline{toc}{section}{Задание}
Целью данного задания является создание нейронной сети, способной дать прогноз результата футбольного матча и выдвинуть одну из теорий: победит команда хозяев, победит команда гостей, матч завершится ничьей, основываясь на некоторых исходных данных.
Для обучения нейронной сети использовались результаты английской премьер-лиги сезона 2011/12 года. Данный массив выборок был приложен к методическому пособию. Ввиду большого количества матчей из общего числа было случайно выбрано 106 выборок. Каждая выборка представляет собой 8 входных значений и 3 выходных атрибута.
Входные значения:
\begin{enumerate}
\item Рейтинг вратаря команды хозяев;
\item Рейтинг защиты команды хозяев;
\item Рейтинг полузащиты команды хозяев;
\item Рейтинг атаки команды хозяев;
\item Рейтинг вратаря команды гостей;
\item Рейтинг защиты команды гостей;
\item Рейтинг полузащиты команды гостей;
\item Рейтинг атаки команды гостей.
\end{enumerate}
Выходные атрибуты:
\begin{enumerate}
\item Победила команда хозяев;
\item Ничья;
\item Победила команда гостей.
\end{enumerate}
\section*{Работа и результат}
\addcontentsline{toc}{section}{Работа и результат}
\subsection*{Два нейрона скрытого слоя}
\addcontentsline{toc}{subsection}{Два нейрона среднего слоя}
Для сети, содержащей два нейрона среднего слоя была создана визуализация, представленная на рисунке \hyperref[pic:net2]{\ref{pic:net2}}. График ошибки в каждом случае представлял собой гиперболу, первый график представлен на рисунке \hyperref[pic:net2graphic]{\ref{pic:net2graphic}}, а точные значения количества итераций и итоговой ошибки тренировки в таблице \hyperref[table:net2]{\ref{table:net2}}.
\begin{figure}[H]
\centering
\includegraphics[height=5cm]{01-nn-lab2-hid2.png}
\caption{Визуализация нейронной сети с двумя нейронами среднего слоя}
\label{pic:net2}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[height=5cm]{01-nn-lab2-hid2-01.png}
\caption{Диаграмма изменения ошибки нейронной сети с двумя нейронами среднего слоя}
\label{pic:net2graphic}
\end{figure}
\begin{table}[H]
\centering
\begin{tabular}{||l|c|c|c|c|c|c||}
\hline
Попытка & \thead{Количество нейронов \\ скрытого слоя} & \thead{Скорость \\ обучения} & Момент & \thead{Максимальная \\ ошибка} & \thead{Количество \\ итераций} & Итоговая ошибка \\ [0.5ex]
\hline\hline
1 & 2 & 0,2 & 0,7 & 0,01 & 5561 & 0.24720360676290098 \\
\hline
2 & 2 & 0,3 & 0,7 & 0,01 & 5593 & 0.2465275090858466 \\
\hline
3 & 2 & 0,5 & 0,7 & 0,01 & 5611 & 0.24972900771732465 \\
\hline
4 & 2 & 0,7 & 0,7 & 0,01 & 5617 & 0.2507264554126911 \\
\hline
\end{tabular}
\caption{Попытки обучения нейронной сети с двумя нейронами среднего слоя}
\label{table:net2}
\end{table}
Из данных, представленных в таблице \hyperref[table:net2]{\ref{table:net2}} видно, что вне зависимости от скорости обучения, после примерно пяти с половиной тысяч итераций обучения сеть обучается примерно одинаково.
\subsection*{Разное количество нейронов скрытого слоя}
\addcontentsline{toc}{subsection}{Разное количество нейронов скрытого слоя}
Количество входных и выходных нейронов диктует поставленная задача и набор обучающих выборок. В то же время количество количество нейронов скрытого слоя остаётся неясным. Так, если будет использовано слишком много нейронов скрытого слоя, нейронная сеть будет неспособна моделировать сложные данные, результатом чего станет плохой прогноз. Если будет использовано недостаточное количество нейронов скрытого слоя, обучение сети до нужной точности может продлиться чересчур долго, как мы смогли видеть при двух нейронах скрытого слоя. Таким образом, количество нейронов скрытого слоя необходимо выяснить опытным путем. Отношения количества нейронов среднего слоя, настроек обучения и итоговых значений ошибки показаны в таблице \hyperref[table:netDiff]{\ref{table:netDiff}}. Графики обучения в общем представляли собой гиперболическую кривую, кроме двух случаев, продемонстрированных в приложении \hyperref[appendix:chair]{\ref{appendix:chair}}. График зависимости количества нейронов среднего слоя и лучшего значения ошибки при разных параметрах обучения и $\approx$5600 итераций, показан на рисунке \hyperref[pic:errDiagram]{\ref{pic:errDiagram}}.
\begin{table}[H]
\centering
\begin{tabular}{||l|c|c|c|c|c|c||}
\hline
Попытка & \thead{Количество нейронов \\ скрытого слоя} & \thead{Скорость \\ обучения} & Момент & \thead{Максимальная \\ ошибка} & \thead{Количество \\ итераций} & Итоговая ошибка \\ [0.5ex]
\hline\hline
5 & 4 & 0,001 & 0,05 & 0,01 & 5584 & 0.25931106670036286 \\
6 & 4 & 0,9 & 0,9 & 0,01 & 5594 & 0.19200605707303842 \\
7 & 4 & 0,5 & 0,5 & 0,01 & 5605 & 0.18196311771073956 \\
8 & 6 & 0,2 & 0,7 & 0,01 & 5563 & 0.12125280516407777 \\
9 & 6 & 0,3 & 0,7 & 0,01 & 5599 & 0.10807535771153445 \\
10 & 8 & 0,2 & 0,7 & 0,01 & 5587 & 0.09381396680869421 \\
11 & 8 & 0,3 & 0,7 & 0,01 & 5586 & 0.086759142587247 \\
12 & 8 & 0,5 & 0,7 & 0,01 & 5583 & 0.06318043759639597 \\
13 & 12 & 0,2 & 0,7 & 0,01 & 5558 & 0.024105983026779552 \\
14 & 12 & 0,3 & 0,7 & 0,01 & 5628 & 0.036639338505130305 \\
15 & 12 & 0,5 & 0,6 & 0,01 & 5568 & 0.015498538429990109 \\
16 & 20 & 0,2 & 0,7 & 0,01 & 5598 & 0.01722806954097388 \\
17 & 30 & 0,2 & 0,7 & 0,01 & 5572 & 0.025964472982198655 \\
18 & 30 & 0,3 & 0,7 & 0,01 & 5574 & 0.020700472107266176 \\
\hline
\end{tabular}
\caption{Попытки обучения нейронной сети с несколькими нейронами среднего слоя}
\label{table:netDiff}
\end{table}
\begin{figure}[H]
\centering
\begin{tikzpicture}
\begin{axis}[
xlabel=Нейронов,
ylabel=Ошибка,]
\addplot coordinates {(4,0.18196311771073956) (6,0.10807535771153445) (8,0.06318043759639597) (12,0.015498538429990109) (20,0.01722806954097388) (30,0.020700472107266176) };
\end{axis}
\end{tikzpicture}
\caption{График зависимости значения ошибки от количества нейронов среднего слоя}
\label{pic:errDiagram}
\end{figure}
На графике отчётливо видно, что при правильно подобранном количестве нейронов среднего слоя обучение максимально эффективно, но если сделать лишком много нейронов - качество обучения ухудшится (уход кривой вверх после 12ти нейронов). Также интересный эффект в обучении наблюдался для восьми нейронов скрытого слоя, графики, демонстрирующие необычное поведение нейронной сети представлены в приложении \hyperref[appendix:hazard]{\ref{appendix:hazard}}.
\subsection*{Тестирование нейронной сети}
\addcontentsline{toc}{subsection}{Тестирование нейронной сети}
В данном задании обучение нейронной сети производится для того, чтобы показать влияние параметров персептрона и параметров обучения на его скорость и точность. Однако на практике нейронные сети обучаются с конкретной целью. В этой части задания был обучен персептрон с сорока нейронами промежуточного слоя. Результат обучения представлен в таблице \hyperref[table:netForTests]{\ref{table:netForTests}}.
\begin{table}[H]
\centering
\begin{tabular}{||l|c|c|c|c|c|c||}
\hline
Попытка & \thead{Количество нейронов \\ скрытого слоя} & \thead{Скорость \\ обучения} & Момент & \thead{Максимальная \\ ошибка} & \thead{Количество \\ итераций} & Итоговая ошибка \\ [0.5ex]
\hline\hline
19 & 40 & 0,2 & 0,07 & 0,01 & 5644 & 0.030568281883777332 \\
\hline
\end{tabular}
\caption{Параметры обучения нейронной сети для тестирования}
\label{table:netForTests}
\end{table}
Для обучения был использован тот же набор исходных данных, тестирование производилось на наборе, представленном в таблице \hyperref[table:dataForTests]{\ref{table:dataForTests}}
\begin{table}[H]
\centering
\begin{tabular}{||c|c|c|c|c|c|c|c||c|c|c||}
\hline
In1 & In2 & In3 & In4 & In5 & In6 & In7 & In8 & Out1 & Out2 & Out3 \\ [0.5ex]
\hline\hline
0.6875 & 1.0 & 0.5556 & 0.5311 & 0.625 & 0.7656 & 0.1528 & 1.0 & 1.0 & 0.0 & 0.0 \\
0.75 & 0.5 & 0.4722 & 0.435 & 0.75 & 0.5625 & 0.8333 & 0.0 & 0.0 & 0.0 & 1.0 \\
0.6875 & 1.0 & 0.5556 & 0.5311 & 0.5625 & 0.4531 & 0.4398 & 0.4124 & 1.0 & 0.0 & 0.0 \\
0.4375 & 0.5156 & 0.4352 & 0.4237 & 0.5625 & 0.2813 & 0.4167 & 0.4181 & 0.0 & 0.0 & 1.0 \\
0.5625 & 0.4063 & 0.4491 & 0.4463 & 0.25 & 0.1719 & 0.0556 & 0.8531 & 1.0 & 0.0 & 0.0 \\
\hline
\end{tabular}
\caption{Параметры обучения нейронной сети для тестирования}
\label{table:dataForTests}
\end{table}
Результаты тестирования приведены в таблице \hyperref[table:testResults]{\ref{table:testResults}}.
\begin{table}[H]
\small
\begin{tabular}{||c||c|c|c|c|c|c|c|c||c|c|c||c|c|c||}
\hline
& \multicolumn{8}{c||}{Входные значения} & \multicolumn{3}{c||}{Выходные значения} & \multicolumn{3}{c||}{Ожидаемые}\\ [0.5ex]
\hline
& In1 & In2 & In3 & In4 & In5 & In6 & In7 & In8 & O1 & O2 & O3 & EO1 & EO2 & EO3 \\
\hline\hline
1 & 0,6875 & 1 & 0,5556 & 0,5311 & 0,625 & 0,7656 & 0,1528 & 1 & 0,9997 & 0,0927 & 0 & 1 & 0 & 0 \\
2 & 0,75 & 0,5 & 0,4722 & 0,435 & 0,75 & 0,5625 & 0,8333 & 0 & 0,028 & 0,0012 & 0,8979 & 0 & 0 & 1 \\
3 & 0,6875 & 1 & 0,5556 & 0,5311 & 0,5625 & 0,4531 & 0,4398 & 0,4124 & 0,944 & 0,0061 & 0,0372 & 1 & 0 & 0 \\
4 & 0,4375 & 0,5156 & 0,4352 & 0,4237 & 0,5625 & 0,2813 & 0,4167 & 0,4181 & 0,072 & 0,0202 & 0,8967 & 0 & 0 & 1 \\
5 & 0,5625 & 0,4063 & 0,4491 & 0,4463 & 0,25 & 0,1719 & 0,0556 & 0,8531 & 0,9999 & 0,0015 & 0,0001 & 1 & 0 & 0 \\
\hline
\end{tabular}
\caption{Таблица входных, выходных и ожидаемых тестовых значений}
\label{table:testResults}
\end{table}
Результаты тестирования показали значение средней квадратичной ошибки сети \textbf{0.0027093099154115057} и представлены в виде снимка экрана в приложении \hyperref[appendix:final]{\ref{appendix:final}}.
При детальном рассмотрении данных можно сделать вывод о том, что после обучения сеть с достаточной степенью достоверности предсказывает результат, формируя для ожидаемой единицы очень близкое к единице выходное значение, а для ожидаемого нуля - очень близкое к нулю выходное значение.
\newpage
\appendix
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Alph{subsection}}
\subsection{Результаты обучения (4 нейрона)}
\label{appendix:chair}
\begin{figure}[H]
\centering
\includegraphics[width=15cm]{01-nn-lab2-hid4-01-test.png}
\caption{Искривление графика обучения сети с четырьмя нейронами скрытого слоя}
\end{figure}
\subsection{Результаты обучения (8 нейронов)}
\label{appendix:hazard}
\begin{figure}[H]
\centering
\includegraphics[width=15cm]{01-nn-lab2-hid8-01-interesting.png}
\caption{Искривление значения ошибки сети с восемью нейронами скрытого слоя}
\includegraphics[width=15cm]{01-nn-lab2-hid8-01-interesting2.png}
\caption{Искривление значения ошибки сети с восемью нейронами скрытого слоя}
\end{figure}
\subsection{Результаты финального тестирования (40 нейронов)}
\label{appendix:final}
\begin{figure}[H]
\centering
\includegraphics[width=15cm]{01-nn-lab2-hid40-test.png}
\caption{Снимок экрана с результатами тестирования нейронной сети}
\end{figure}
\end{document}

54
01-nn-lab-03-report.tex Normal file
View File

@ -0,0 +1,54 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\begin{document}
\pagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{3}{Прогнозирование на базе нейронных сетей}{Нейронные сети}{а}{Боровик И.Г.}
\newpage
\tableofcontents
\newpage
\section*{Цель работы}
\addcontentsline{toc}{section}{Цель работы}
Целью данной лабораторной работы являлось теоретическое ознакомление с процессом использования многослойных персептронов для распознавания образов, а также практическое освоение полученной информации с помощью \textbf{Neuroph Studio}.
\section*{Задание}
\addcontentsline{toc}{section}{Задание}
В практической части требовалось создать многослойный персептрон и обучить его распознавать образы на основе изображений, приложенных к методическому пособию, используя Neuroph Studio.
\section*{Работа и результат}
\addcontentsline{toc}{section}{Работа и результат}
\subsection*{Обучение нейронной сети}
\addcontentsline{toc}{subsection}{Обучение нейронной сети}
Согласно заданию был создан многослойный персептрон для распознавания изображений, содержаший 12 нейронов скрытого слоя, обучение проводилось на прикреплённых к методическому пособию датасетах с применением исключающих датасетов, также прикрепленных к материалам работы. Структура нейронной сети представлена на рисунке \hyperref[pic:NeuroStruct]{\ref{pic:NeuroStruct}}, а график обучения нейросети представлен на рисунке \hyperref[pic:NeuroGraph]{\ref{pic:NeuroGraph}}.
\begin{figure}[H]
\centering
\includegraphics[height=5cm]{01-nn-lab3-structure.png}
\caption{Структура многослойного персептрона для распознавания изображений}
\label{pic:NeuroStruct}
\includegraphics[height=5cm]{01-nn-lab3-training-diagram.png}
\caption{Диаграмма обучения на представленном наборе данных}
\label{pic:NeuroGraph}
\end{figure}
\subsection*{Тестирование нейронной сети}
\addcontentsline{toc}{subsection}{Тестирование нейронной сети}
Результаты тестирования приведены на рисунке \hyperref[pic:neuroTest]{\ref{pic:neuroTest}}
\begin{figure}[h]
\centering
\includegraphics[height=5cm]{01-nn-lab3-deer-test.png}
\caption{Результаты тестирования обученной сети}
\label{pic:neuroTest}
\end{figure}
По данным нейросети изображение оленя с 0.9443 вероятностью действительно олень. С некоторой, значительно меньшей вероятностью олень мог оказаться дельфином, птицей или котом (0.6549, 0.4919, 0.4105, соответственно). Менее всего, по мнению нейросети, олень похож на летучую мышь (0.0368).
\section*{Выводы}
\addcontentsline{toc}{section}{Выводы}
Многослойного персептрона с двенадцатью нейронами среднего слоя достаточно для однозначной идентификации чёткого чёрно-белого изображения размером 230х230 пикселей. Наибольшая вероятность совпадения соответствует корректному изображению, то есть на выходе нейросети достаточно осуществить простое сравнение и взять наибольшее значение с выходных нейронов.
\end{document}

View File

@ -0,0 +1,161 @@
Иноземцев Владимир Александрович
Методология научного познания (просто методология)
Учебник: Петров Ю.А., Лебедев
* оргвопросы
практика и семинары не предполагаются, зачёт
курс разбиваем на 2 части: лекционная, защита реферата 7-8 занятий ноябрь-декабрь
3 модуля:
- теория
- защита
- остатки
список тем ок 15.09 (2-3 человека на одну тему) Защита в конце октября
Тема: Аналитические и вероятностно-статистические методы исследования
реферат оформление 12-15 стр:
1. титул ФИО препод тема, без содержания.
2. введение 1стр (актуальность, цели, задачи, объект, субъект)
3. цели и задачи (цель всегда одна и коррелирует с названием, задачи - это подразделение цели, их много, цель дробим на 3-4 задачи, например: определить, рассмотреть, ...)
4. основная часть работы
5. заключение (повторение, выжимка основной части)
6. список литературы (по ГОСТу)
ссылки на список литературы [1], [1, с.105]
При защите реферата времени около 6-8 минут, важно сделать акцент на актуальности, целях и задачах, результате и выводах. Работаем очно без презентаций, а заочно с презой.
* Структура курса
0. Предмет методологии: один из центральных разделов гносеологию (теория познания), входит в состав общего курса философии
1. История методологии
1.1. возникновение метода идей в эпоху античности
- первые мыслители методологии на стыке с логикой сократ платон и аристотель: занимались анализом методов дедукции и индукции как методами научного познания
- в средние века исчезает в связи с религиозными течениями, но, несмотря на это разработана модальная логика, логическая семантика и прочие разделы средней логики. Предположительно это связано с чтением религиозных текстов, требующих логики, но отрицающих науку и технику.
1.2. появление методологии в 17м веке
- рене декарт основоположник рационализма и всей рационалистической методологии. возвращается к аристотелевскому подходу
- френсис бэкон основоположник естествознания, основоположник эмпирической методологии
- методология научного познания незначительно развивалась в эпохе просвещения
1.3. развитие методологии в раннем позитивизме
- разработан огюстом контом (осуществил ревизиию науки и философии того времени)
- 1850-1970-е превалировал позитивизм
1.4. методология идей неопозитивизма
- 20е-30е годы ХХ века: венский кружок, варшавская школа, логический неопозитивизм
- концентрация на математизации научного знания
- разработка и анализ структур научного знания, языков науки, логических языков
1.5. методология постпозитивизма
- 50е-70е годы ХХ века: лакатош, поппер, полони, кун. Их объединяет анализ динамики научного знания, в отличие от неопозитивизма, который скорее создавал методологический язык.
- изучалась история наук, история методологии, привлекался материал из прошлого и смежных областей
1.6. современная методология
- плюралистичность (прагматизм, марксизм, постмодернизм) и другие смешения
- вопросы не изучения внутренней динамики развития науки (интерналистский подход) а вписывание методологии научного познания в общий контекст развития (экстернализм)
2. Теоретические пробемы методологии
2.1. структура современной методологии
2.2. научное знание и научная рациональность
- классическая научная рациональность
- неклассическая научная рациональность
- постнеклассическая научная рациональность
2.3. структура и уровни научного познания
- эмпирический (наблюдение, эксперименты)
- теоретический (формализация)
- метатеоретический (философские методы)
- чувственный уровень научного познания выделен лебедевым
- гносеология (в принципе знание) - чувственное и рациональное
- внутри эпистемология (научное)
- внутри методология (подраздел)
2.4. основания науки (ввёл Стёпин, разрабатывает Лебедев)
- научная картина мира
- идеалы и нормы научного исследования
- философские основания науки
все менялись на всех этапах развития методологии.
переходы от одних оснований науки к другим - это научные революции. Первым говорил об этом Томас Кун, ввёл понятие. Хотя больше говорить о научных революциях присуще марксистам.
2.5. динамика научного знания
- почему происходит
- почему происходит рост
- понимание истины в науке
* История методологии
латинский становится общим языком науки только на рубеже нашей эры. до этого использовались греческие термины.
до 17 века всё образование в европе происходило на латинском языке.
- формирование методологии (в рамках античной философии)
- развитие методологии (в новое время)
** возникновение методологии и формирование методологии в период античности
*** особенности античной науки (древняя грефия, древний рим)
- наука была не похожа на современную и даже на науку начала нового времени
- для обозначения использовался термин Философия. в качестве главного образа учёного выступал философ (в средние века вся наука локализовалась в церкви и образом стал монах или священнослужитель)
- созерцательный и умозрительных характер. господство рабовладельческого строя, и любая практическая деятельность, в том числе эмпирическая деятельность учёного - это удел рабов. несмотря на то что философия больше был удел рабовладельцев, поэтому они не занимались практической деятельностью, а созерцали. созерцание (др греч теория). несмотря на это был сделан ряд некоторых умозаключений, например, анатомичность. считалось, что можно весь мир познать с помощью ума. Парменид, Платон.
- в основе лежал принцип разумного или достаточного основания. в отличие от мифологии и религии где многие положения принимаются на веру. так Сократ, и представители классической школы были нацелены на критическое освоение действительности, не принимались на веру, а должны были быть доказаны. то есть обоснованность - это основной критерий научности. Пифагор - ввёл слова философия и математика, и своих учеников поделил на две группу - опусматики простые обыватели, знание давалось без доказательства, считали пифагора богом, их было большинство, и математики - кому знание давалось только обосновано, появилась процедура доказательства (далее в средние века критерий доказательности укрепился, несмотря на господство религиозного мировоззрения)
*** формирование методологии
решение вопросов первооснов (например, число, физические явления). гносеология, теория познания. в эпоху античности была периферической областью. вся проблематика сводилась к вопросу о взаимоотношению методов познания дедукции (от общего к частному) и индукции (от частного к общему), частично интуиции. категорический силлогизм (3 высказывания, два вводных третий результат) все металлы электропроводны, медь - металл, значит медь - электропроводна. но учёные ещё не задаются вопросом откуда взялся первый тезис, проблема генерализации. (все люди смертны, сократ человек, значит сократ смертен). также это выводы из логических высказываний. индукция сводит набор множества знаний к общему. (методология Бэкона - был первый, кто начал формализовывать). в античности - это полная индукция, в целом если взяли десять предметов класса и описали свойства - можем говорить о том, что все предметы этого класса обладают этими же свойствами. у аристотеля появляется ещё один вариант полной индукции через перечисление.
Сократ и его последователи изучали природу (др греч фюзис, их называли физиками) был первым, кто обратился к изучению человека и этической проблематике (антропология и этика). занимался проблемами изучения обобщений относительно человека. своей задачей он видел определение общих этических понятий - добро, зло, честность, добродетели. как правило он приводит примеры добра зла благородства храбрости и переходит к определению этих понятий, то есть занимался индукцией. индукция и дедукция это общелогические понятия, не только научные.
Платон, его ученик. вся его методология идёт через теорию идей (основоположник идеологизма) превалировали не материальные субствнции. продолжал работу в направлении индукции. фактически только через диалоги платона у нас есть информация о том, что говорил сократ. вопрос, насколько платон свои собственные мысли привнёс в диалоги с платоном и насколько сократ - это аутентичный сократ, а не платонова проекция. платон продолжает понимание индукции как переход от частного к общему. увязывает с теорией идей. идеи - вечны и неизменны, смотрит на индукцию как на обратную дедукцию. с точки зрения исследователей 19-20 века это казалось анахронизмом, считается, что на него повлияти индийские мировоззрения, но платон считал, что знание - это припоминание того что было в прошлой жизни. сейчас считается что за этим стоит интуиция, как метод, никогда не называемый платоном.
Аристотель - создал теорию дедуктивных умозаключений. крупнейший систематизатор всей античной мысли, разделил науки на практические, теоретические и поэтические. был отцом науки, которая потом будет названа логикой, термин будет введён через 50 лет после аристотеля. написал около десятка работ Органон (инструмент). то есть логика не самостоятельна, а методологический инструмент других наук. разработал и ввёл в употребление 3 из 4 законов мышления - закон тождества, закон исключённого третьего, закон недопущения противоречия. разрабатывает категорический силлогизм, теорию индукции (использует для индукции термин диалектика, поскольку неоднозначная, не даёт совершенных знаний).
отсюда же возникает софистика (у жабы нет крыльев, у вас нет крыльев, значит вы жаба)
** средние века
религиозное мировоззрение и религиозная философия.
важнейшее достижение - появление образовательных учреждений, университетов, в отличие от античной, которая концентрировалась в школах физиков, вокруг платона аристотеля и специализированных научных школ поздней античности (александрийская школа в египте с изучением арифметики механики астрономии геометрии итд). первый универ - италия, болонья. их предшественник - монастырские школы, где монахи передавали свои знания выходцам из разных сословий. универы важны тем, что в них в широком диапазоне начинают воспроизводиться научные знания. в основном науки в итоге были гуманитарными потому что недостойно верующему человеку изучать природу, всё знание изложено в святых книгах, знать больше было не положено, получается был негласный запрет на естествознание. образованность сводилась к знанию латинского, древнееврейского, греческого. то есть филологические. знание языка и умение интерпретировать тексты. конец 13 века - роджер бэкон считает что нужно изучать природу, считается изобретателем очков, знание - сила. многие его тезисы повторялись френсисом бэконом в 17 веке
** новое время
эпоха возрождения это в первую очередь развитие искусства в италии, но в части познания не было ничего нового. 17-18 век, начало эпохи капитализма после великих географических открытий. появление мануфактур и захват новых территорий и начало исследований в области естествознания. здесь появляется две основных программы (иногда противоречащих)
1. эмпирически-индукционистская программа (методология) фрэнсиса бэкона
2. рационалистически-дедуктивистская программа (методология) рене декарта
спор школ перешёл в 18 и даже 19й век.
*** эмпирически-индукционистская программа Бэкона
1626й год простудился и умер. главная установка Бэкона - это борьба со схоластикой, аристотелем и его учениками, ультрадедуктивизмом. бэкон понял что дедукции недостаточно пишет работу под названием новый органон. противопоставляет себя аристотелю, формализует индуктивные рассуждения. рассматривает пять методов неполной научной индукции
- сходства
- различия
- соединённый метод сходства и различия
- сопутствующих изменений
- остатков
последний - это единственный, который он не успел, он будет описан в середине 19-го века джоном стюардом милем в волне раннего позитивизма. бэкон считает, что естествознание должно быть востребовано в индуктивных процедурах. считает что в эпоху схоластики появилось слишком много идолов (ошибок ума, заблуждений) и нужна большая работа по искоренению и профилактике, выделяет 4 типа:
- идолы рода - общие заблуждения, видимые человеку, связанные с восприятием человека
- идолы пещеры - платоновская аллегория пещеры, у всех есть индивидуальные особенности восприятия, с детства надо над этим работать
- идолы рынка (рыночной площади, форума) - связаны с искажением восприятия от коммуникаций, непонимания других людей, разных языков
- идолы театра - неправильная, чрезмерная вера в авторитет.
называет в работах три пути
- паука - догматика дедуктивиста
- муравья - противопоставление, эмпирик. изучает всё, что видит, собирает все факты, которые даже не всегда относятся к делу.
- пчелы - выглядит как эмпирический, но при этом избирательно
делает упор на факты и наблюдения, а не на рассуждения и дедукцию.
*** рационалистически-дедуктивистская программа декарта
1650й год умер. работы писались как ответ бэкону после его смерти. реабилитирует дедукцию, но не в аристотелевском смысле, возрождает идеи Платона. дополняет дедукцию и делает акцент не на эмпирическом, а на рационалистическом аспекте. увеличивает роль разума. Удалось построить цельную методологическую программу, антитеза Бкэону. в "Рассуждениях о методе" возвращается к изучению интуиции (интеллектуальная интуиция, по сути, свёрнутая дедукция, пропускание промежуточных этапов рассуждений). наряду с ним в этом направлении работали Спиноза и Лейбниц. рационалисты.
*** третьим можно выделить подход 20-3-е годы 17 века рационализм.
проявил себя в конкретно научных областях. ньютон, галилей. в методологии уделяют внимание роли и значению гипотезы. к 19му веку оформиловь в гипотетико-дедуктивный метод. попытка отказаться от крайностей первых двух подходов, обращение к реальным результатам научного познания. можно выделить второе крыло связанное с завершителями первой и второй парадигмы - блок (англ учёный) и лейбниц.
*** Кант априористско-дедуктивистская концепция
вещи-в-себе, империум.
вещи в себе не могут быть постигнуты. пытается нащупать основопологающие моменты априорного знания. врождённые идеи (встречаются и у платона и у декарта). кант продолжает линию декарта, но превращает её в более общую. впервые представляет познание как бесконечный процесс.
*** Гегель
один из первых формулирует в современном значении диалектический метод.
диалектика это
- античность это искусство спора ради достижения истины
- средние века это формальная логика (аристотелева)
- новое время это диалектический метод (по сути в понимании Гегеля (идеалистически) и Маркса (материалистически) это три законы 1 единства и борьбы противоположностей, 2 отрицания отрицания, 3 перехода количества в качество).
внёс явный отрицательный оттенок в термин метафизика.
- античность важнейшая работа аристотеля, то что он называет пераой философией
- средние века (кант тоже пользовался) не было негатива, теоретическая философия.
- новое время (гегель) - метод, противостоящий диалектическому.
* методология раннего позитивизма (вторая половина 19-го века)
включает в себя множество школ и направлений. можно свести в несколько основных волн:
** раний Позитивизм 30-80е годы 19го века (фр Конт, анг Милль, анг Спенсер)
Стадии истории человечества с позиции позитивизма (согласно Огюсту Конту)
- Теологическая (античность) — в качестве объяснительной гипотезы используют понятие Бога, которому предписывают первопричины явлений и которого облекают в человекоподобный образ. Сама теологическая стадия распадается на три ступени: фетишизм, политеизм и монотеизм.
- Фетишизм вызван тем, что фантазия человека ещё слишком слаба, чтобы выйти за пределы явлений, поэтому человек поклоняется фетишам — вещам, наделённым человеческим статусом.
- Политеизм — люди начинают облекать первопричины в человеческие образы и измышлять богов.
- Монотеизм характеризуется тем, что первопричины структурируются, среди них выделяются главные и второстепенные, пока, наконец, не открывается главная первопричина — Единый Бог. Эта ступень получает имя монотеизма.
- Метафизическая (возрождение и новое время) — люди по-прежнему стремятся постичь начало и назначение вещей, но место богов занимают абстрактные сущности. Место Единого Бога занимает Природа, которую Конт определяет как «смутный эквивалент универсальной связи». Именно в языке позитивистов метафизика приобретает негативный оттенок, поскольку сущности и пресловутая природа вещей оказываются плодом беспочвенной фантазии, пусть даже она и выражена в строгой логической форме.
- Позитивная (1930+) — единственной формой знания по Конту становится научное знание. Человечество становится достаточно взрослым, чтобы мужественно признать относительность (релятивность) нашего познания. В этом аспекте позитивизм преодолевает характерный для научной революции эпохи барокко оптимизм. Второй важной чертой научного знания является эмпиризм — строгое подчинение воображения наблюдению. Здесь Конт повторяет идею Бэкона о том, что фундаментом знания должен стать проверенный опыт. Учёные должны искать не сущность явлений, а их отношение, выражаемое с помощью законов — постоянных отношений, существующих между фактами. Ещё одной чертой научного знания является прагматизм. Учёные перестают быть эрудитами и энциклопедистами. Одним словом, знание становится позитивным: полезным, точным, достоверным и утвердительным.
Милль добавляет метод остатка к индуктивистским методам Бэкона.
Спенсер популяризует позитивизм. Формирует понятие системного подхода, глобальный эволюционизм (геология до дарвина, затем знаменитая работа дарвиа, затем распространение от астрономии до социальных наук). выделяет эволюцию в неживой, живой природе и социальной эволюции.
** неокантианство
возврат к идеям канта, выделяют два типа: науки о прирроде, науки о духе.
** махизм или империокрейтицизм (физик эрнст мах, швейцарский химик аринариус)
критика опыта, сыграл связующую роль разных волн позитивизма. единственное направление, которое раскритиковал Ленин.
** неопозитивизм
1. венский кружок
2. львовско-варшавская школа
* подходы к классификации научной рачиональности
выделяются конкретные культурно-исторические типы науки
1. восточная преднаука
2. античная наука
3. средневековая наука
4. классическая наука
5. неоклассическая наука
6. постнеклассическая наука

188
01-skm-refer-final.tex Normal file
View File

@ -0,0 +1,188 @@
\documentclass[a4paper,fontsize=14bp]{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\numerationTop
\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader
\vspace*{4em}
\begin{center}
\LARGE{\textbf{Реферат \\
на тему \\
<<Методы чувственного познания в науке>> \\
по курсу \\
<<Методология научного познания>>
}}
\end{center}
\vspace*{5em}
\begin{flushright}
Выполнил: Овчинников И.И.\\
Группа: ИУ3-11М \\
Принял: Иноземцев В.А.
\end{flushright}
\vspace*{5em}
\begin{center}
Москва, 2021 г.
\end{center}
\newpage
\pagestyle{fancy}
\tableofcontents
\newpage
\section{Введение}
Актуальность данной темы обуславливается тем, что в современном мире наука развивается с чрезвычайно высокой скоростью и объем научных знаний удваивается каждые 10-15 лет. За последние триста лет, примерно такой возраст современной науки, человечество сделало такой большой рывок, который был невозможен для наших предков. Весь окружающий мир показывает, какого прогресса достигло человечество. Именно наука явилась главной причиной столь бурно протекающей научно-технической революции, перехода к постиндустриальному обществу, повсеместному внедрению информационных технологий, появления <<новой экономики>>, для которой не действуют законы классической экономической теории, начала переноса знаний человечества в электронную форму, столь удобную для хранения, систематизации, поиска и обработки информации.
Можно смело утверждать, что основная форма человеческого познания наука в наши дни становится всё более существенной и значимой частью реальности. Однако наука не была бы столь продуктивной, если бы не имела столь присущую ей развитую систему методов, принципов и императивов познания. Именно правильно выбранный метод наряду с талантом учёного помогает ему познавать глубинную связь явлений, вскрывать их сущность, открывать законы и закономерности. Количество методов, которые разрабатывает наука для познания действительности постоянно увеличивается. Точное их количество, довольно трудно определить. Ведь в мире существует более десяти тысяч наук, каждая из которых имеет свои специфические методы и предмет исследования.
Вместе с тем все эти методы находятся в диалектической связи с общенаучными методами, которые они, как правило, содержат в различных сочетаниях и со всеобщим, диалектическим методом. Это обстоятельство является одной из причин, которые определяют важность наличия философских знаний у любого ученого. Вдобавок ко всему философия наделяет ученого тем всеобщим методом, без которого невозможно обойтись в любой области научного познания.
Процесс познания включает получение информации через органы чувств (чувственное познание), переработку данной информации мышлением (рациональное познание) и материальное освоение познаваемых фрагментов действительности (общественная практика). Существует тесная связь познания с практикой, в ходе которой происходит материализация (опредмечивание) творческих устремлений людей, превращение их субъективных замыслов, идей, целей в объективно существующие предметы, процессы.
Целью данной реферативной работы является освещение методов чувственного (эмпирического) познания в науке. Задачами работы - определение чувственного познания и его места в познании в целом, определение уровней чувственного познания, определение места и роли чувственного познания в науке.
\section{Чувственное познание}
Познание — это специфический вид деятельности человека, направленный на постижение окружающего мира и самого себя в этом мире. «Познание это, обусловленный прежде всего общественно-исторической практикой, процесс приобретения и развития знания, его постоянное углубление, расширение, и совершенствование.»[1, c.208]
На протяжении всей своей жизни человек налаживает связь с другими членами общества и окружающей их средой, постоянно осмысляя увиденное и услышанное им. Благодаря пониманию и осмыслению мира вокруг себя люди получают возможность гармонично вливаться в природу и общество. В гносеологии (раздел философии, изучающий познание) выделяют две разновидности познания: рациональное и чувственное. Чувственное познание — это разновидность познания, основанная на восприятии окружающего мира с помощью органов чувств. Традиционно этот тип познания противопоставляется мышлению, представляющему собой уже вторичную методику познания действительности. А за формирование первоначальных знаний об окружающей среде, а также о внешнем виде и устройстве наполняющих ее предметов отвечают органы чувств человека. К пяти основным человеческим чувствам относят зрение, слух, вкус, осязание и обоняние.
Человек постигает окружающий его мир, овладевает им различными способами, среди которых можно выделить два основных. Первый (генетически исходный) — материально-технический — производство средств к жизни, труд, практика. Второй — духовный (идеальный), в рамках которого познавательные отношения субъекта и объекта — лишь одно из многих других. В свою очередь процесс познания и получаемые в нем знания в ходе исторического развития практики и самого познания все более дифференцируется и воплощается в различных своих формах. Каждой форме общественного сознания: науке, философии, мифологии, политике, религии и т.д. соответствуют специфические формы познания. Обычно выделяют следующие из них: обыденное, игровое, мифологическое, художественно-образное, философское, религиозное, личностное, научное. Последние хотя и связаны, но не тождественны одна другой, каждая из них имеет свою специфику.
Наборов операций и приемов, благодаря которым осуществляется познание, существует множество. Все методы делятся на два типа: эмпирические и теоретические. Благодаря особенности чувственного познания, большинство теоретических (или научных) приемов, таких, как анализ, дедукция, аналогия, индукция и пр. к нему не применимы. Создавать впечатление об объектах возможно лишь с помощью следующих действий:
\begin{itemize}
\item [--] Наблюдение то есть восприятие явлений, не осуществляя вмешательство в них.
\item [--] Измерение определение отношения измеряемого предмета к эталонному.
\item [--] Сравнение выявление сходств и различий.
\item [--] Эксперимент помещение предметов и явлений в управляемые условия и изучение их.
\end{itemize}
Чувственный тип познания относится к первичным источникам ознакомления человека с внешним миром. Чувственное познание — это разновидность познания, основанная на восприятии окружающего мира с помощью органов чувств.
Основа объективности содержания чувственного объекта и чувственного познания вообще — норма чувственного восприятия человека, которая у большинства людей одинакова или имеет минимальные отклонения от нормы. В науке объективность содержания чувственных восприятий исследователя дополнительно гарантируется и контролируется с помощью различного рода научных приборов и измерительных устройств — микроскопа, телескопа, фото-, видео- и киносъемки, термометра, барометра, химических реагентов и т.д. Критерий существования чувственных объектов в свое время сформулировал британский философ и епископ Дж. Беркли: для подобного рода объектов «существовать» означает «быть воспринимаемым». К этому критерию Беркли необходимо добавить еще один: быть повторно воспроизводимым и идентифицируемым с помощью органов чувств или приборов. Множество чувственных объектов с их свойствами и отношениями образует чувственную реальность. Эта реальность имеет особый статус и характер, будучи посредствующим звеном между объективной реальностью (множеством «вещей в себе» — Кант) и эмпирической реальностью науки.
\section{Формы чувственного познания в науке}
Большинство философских систем, сложившихся в Новое время, выделяли два основных этапа: чувственное и рациональное познание. Их роль и значение в процессе познания определялись в зависимости от позиции того или иного философа. Рационалисты, например Декарт, Спиноза, Лейбниц, Кант и Гегель, были склонны приписывать решающее значение рациональному познанию, не отрицая значения чувственного познания в качестве механизма связи разума с материальным миром. Сторонники эмпиризма, напротив, признавали чувственное восприятие главным и даже единственным источником наших знаний. <<В интеллекте нет ничего такого, - утверждал Гоббс, - чего бы не было в чувственном восприятии.>> Эту мысль в еще более резкой форме повторял Локк. Но если все знания, размышляли рационалисты, формируются лишь на основе чувственного восприятия с помощью особых правил или принципов, то откуда берутся сами эти правила или принципы, ведь их нельзя воспринять с помощью органов чувств.
Этот спор и в наши дни не утратил своей остроты. Он приобрел особое значение в связи с развитием исследований по созданию искусственного интеллекта. В чувственном познании выделяют три уровня, целью которых является подготовка индивидуума к переходу на более высокую стадию познавательной деятельности, связанную с абстрагированием. К основным формам данного познания относят: ощущение, восприятие, представление.
\subsection{Ощущение}
Для познания человеком вещей и процессов природы необходима форма деятельности, которая называется чувственной деятельностью или чувственным познанием. Она связана с функционированием органов чувств, нервной системы, мозга, благодаря чему возникают ощущение и восприятие. Ощущение может рассматриваться как простейший и исходный элемент чувственного познания и человеческого сознания вообще.
Биологические и психофизиологические дисциплины, изучая ощущение в качестве своеобразной реакции человеческого организма, устанавливают различные зависимости: например, зависимость реакции, т.е. ощущения, от интенсивности раздражения того или иного органа чувств. В частности, установлено, что с точки зрения <<информационной способности>> на первом месте у человека стоят зрение и осязание, а затем слух, вкус, обоняние. Современные биологические науки исследуют сложнейшую структуру нервных процессов человека, деятельность его мозга, показывая, какие именно процессы мозговой деятельности выполняют функции <<приема>> и <<переработки>> ощущений. Так, в затылочных отделах коры головного мозга - <<центр>> зрительных ощущений, в теменных отделах - осязания, в височных - центр слуховых ощущений, задняя часть коры головного мозга в основном перерабатывает информацию, тогда как передняя подает сигнал, <<инструкцию>> деятельности, лобные доли мозга обеспечивают сравнение эффекта действия с исходным его замыслом.
Естественно-научный подход к изучению ощущений характеризуется также тем, что человеческая чувствительность, т.е. способность человека реагировать на воздействие внешнего мира, рассматривается в тесной связи с эволюцией природы. При этом устанавливается, что способность отражения в разной степени присуща всем живым существам, а в зачаточной форме свойственна вообще всей природе. Поскольку такая способность рассматривается как универсальное, предельно широко понимаемое свойство всего природного мира, возможно также исследование человеческого ощущения с точки зрения восприятия и отражения внешнего сигнала, его передачи и переработки поступающей в организм информации. Такой подход характерен для теории информации, в частности для кибернетики.
Ощущение выступает субъективным, идеальным образом предмета, поскольку отражает, преломляет воздействие предмета через призму человеческого сознания. Так, болевые ощущения обязательно порождаются каким-либо существующим вне сознания человека предметом или каким-либо объективным раздражителем. Мы ощущаем боль от ожога, прежде всего потому, что на кожу подействовал огонь, раскаленный предмет. Но в самом огне, в самом горячем предмете, разумеется, нет боли; боль есть особый ответ нашего организма. Боль - ощущение человеческого существа, которое имеет своим следствием определенное состояние его психики, эмоций, ответную реакцию, то или иное действие.
Весьма важно то, что уже в ощущении начинает отражаться объективная связь ощущающего субъекта (его органов, процессов, совершающихся в его организме, в его мозгу, в его психике) с теми вполне определенными явлениями и процессами окружающего мира, с которыми практически взаимодействует данный субъект. Ощущение, таким образом, стоит у истоков отражения и фиксирования объективной системы отношений, в которые реально вступает и реально включен человек. Так, мы знаем, что предмет определенным образом расположен в пространстве относительно воспринимающего субъекта, и ощущение строго зависит от этого взаимного пространственного расположения, пространственного отношения предмета и субъекта: качество, форма, интенсивность зрительного и слухового ощущения, обоняния зависят от близости или дальности предмета, от того, каким образом, какой стороной он обращен к воспринимающему человеку и т.п.
Ощущения одновременно зависят и от состояния органов чувств и всего организма (так, у дальтоников - иные зрительные ощущения, чем у обычных людей, у больного человека - иные обонятельные и вкусовые ощущения, чем у здорового, и т.п.). Но, несмотря на эту, весьма сложную двойную зависимость, ощущения и от объекта, и от субъекта, в процессе функционирования сознания у человека выработалась способность оценивать и повседневно использовать объективную информацию, поставляемую ощущениями и другими компонентами чувственного опыта. По интенсивности ощущения мы можем более или менее определенно судить о том, насколько нагретым или охлажденным является предмет, как далеко он расположен от нас, насколько интенсивен реальный источник звука и т.п. Можно сделать вывод, что ощущения дают нам первую, самую элементарную форму образного отражения предмета. Образ является идеальной формой отображения предмета или явления в их непосредственно наблюдаемой целостной форме.
Специфическое свойство человеческого чувственного познания связано с тем, что отдельные, конкретные ощущения, являясь составными элементами чувственного отражения, реально, на деле, не существуют обособленно друг от друга: они не существуют вне целостного образного отражения того или иного предмета или явления. Например, когда мы смотрим на дом, мы видим его как целое, хотя отдельное и конкретное зрительное ощущение показывает нам часть дома, часть его крыши и т.п. При этом зрительные ощущения неотделимы от слуховых и прочих, разумеется, при условии нормального функционирования органов чувств. Книга лежит на столе, я ее реально вижу как целое, хотя конкретное, отдельное ощущение непосредственно <<показывает>> мне лишь часть обложки, если книга закрыта, две страницы, если она открыта.
Чувственная деятельность человека уже на ранних этапах развития человеческого общества привела к возникновению формы целостного восприятия предмета, к закреплению и сохранению особой способности образа - <<представлять>>, давать объективный предмет как нечто целое. Хотя мы при помощи различных органов чувств ощущаем пространственную форму, цвет, звук, запах, в то же время действует чувственная способность синтезировать ощущения, превращать их в восприятие, обладающее особым свойством: благодаря восприятию предмет подается сознанию именно в своей целостно-предметной форме, т. е. в виде объективной, независимой от сознания целостности.
\subsection{Восприятие}
Восприятия определяются как целостный образ предмета, находящегося перед нами. Это может быть образ восходящего солнца, горной вершины или музыкальной мелодии. В современной философии (феноменологии) выделяют различные уровни восприятия:
\begin{enumerate}
\item восприятие без интерпретации (что-то мелькает за окном, какой-то предмет лежит на дороге);
\item восприятие конкретного предмета (веревка, а не змея);
\item понимание, что объект существует независимо от сознания воспринимающего;
\item сознание, что именно субъект воспринимает этот предмет;
\item понимание, что восприятие субъекта и сам объект не тождественны, что в объекте могут быть другие стороны и свойства, не воспринимаемые в данный момент.
\end{enumerate}
Уже этот анализ показывает, что восприятие нельзя рассматривать лишь как копирование, бездумное созерцание внешнего мира. Оно пронизано мыслительной деятельностью человека. Влияние духовного облика человека, уровня его культуры на характер восприятия проявляется и в других формах. Оно определяет избирательный характер восприятия. Человек обращает внимание, прежде всего на то, что ему интересно. Не случайно Р. Декарт в работе <<Страсти души>> на первое место ставит удивление, которое служит важнейшим стимулом познания и открытия нового. Размышления придают особую эмоциональную окраску воспринимаемому. Так, выделяют <<закадровое>> мышление, когда ожидание приятной встречи вечером накладывает определенный отсвет на все предметы.
Особенно важна роль теоретической подготовки в восприятиях, относящихся к проведению научных наблюдений и экспериментов. Кроме того, в зависимости от системы ценностей один и тот же предмет может восприниматься разными людьми как красивый или безобразный, вредный или полезный. Могут изменяться и восприятия одного и того же человека. Так, он может видеть в любимом массу достоинств, которые не замечают другие. Но если любовь сменяется равнодушием или даже ненавистью, то даже признанные всеми качества покинутого человека оказываются за пределами восприятия. Восприятие - целостный образ материального предмета, данного посредством наблюдения. Достаточно простого размышления, чтобы увидеть, что восприятие отнюдь не является механическим суммированием ощущений. Восприятие зарождается и существует как форма такого активного синтеза разнообразных проявлений предмета, которая неразрывно связана с другими актами познавательной и практической деятельности, предшествующими данному конкретному наблюдению. Именно поэтому процесс восприятия - процесс активный и по-своему творческий. Благодаря многократной работе механизмов восприятия мы в нашем сознании, в нашей памяти можем удерживать целостный образ предмета и тогда, когда предмет не находится в непосредственном доступе. В этом случае функционирует еще более сложная форма чувственного познания, которая называется представлением.
\subsection{Представление}
Представление - образ ранее воспринятого предмета, сохранившийся в памяти, или создание нового образа с помощью воображения и знания. Представление "беднее" восприятия, так как теряются некоторые качества объекта, проявлявшиеся на уровне восприятия. Здесь более четко выражен избирательный характер познания, так как запоминаются наиболее интересные и значимые для субъекта черты предмета, играющие роль в деятельности человека и его переживаниях. В представлении более отчетливо, чем в восприятии, проявляется активная роль мышления, особенно при создании образов будущего.
Классификация представлений включает:
\begin{itemize}
\item [--] образы-репродукции (мысленное воспроизведение восприятия);
\item [--] образы-предположения (образы героев художественных произведений, описанных пейзажей);
\item [--] образы-модели (модель атома);
\item [--] образы, выражающие цели деятельности и последовательность операций, необходимых для достижения этих целей (посадить сад, вылечить больного);
\item [--] образы-символы и т.д.
\end{itemize}
Особенность чувственного образа - его целостность. Предмет воспринимается как органическое единство составляющих его элементов. В то же время воспринимаются его пространственная ограниченность, длительность как изменение его состояний. Здесь особенно ярко выражается связь восприятий и представлений. Необходимо отметить также избирательность чувственного образа, когда воспринимаются прежде всего значимые для субъекта стороны и свойства предметов. Особенность чувственного образа - включенность в него знаково-языковых структур. Знак служит для замещения предмета, выступает как основа метода формализации, средство получения проверяемого, концентрированного знания. Он сокращает умственные операции, дает возможность передавать машинам отдельные логические операции. Слова, формулы используются как знаки. Широко употребляются предметы-символы для замещения абстрактных идей (например, флаг, голубь, елка). Символы используются в художественном творчестве, в познании социальной реальности. Так, образу Прометея придавалось разное звучание в различные исторические эпохи. В наши дни он становится образом-символом западной цивилизации как активной деятельности.
К чувственному познанию относятся также эмоции: гнев, страх, сомнение, заинтересованность, удивление. Без их влияния невозможен поиск истины. А. Эйнштейн писал, что <<самая прекрасная и глубокая эмоция, которую мы можем испытать, - это ощущение тайны. Если же человек утратил способность удивляться и замирать в священном трепете, то его можно считать мертвецом>>. Трудности в преодолении препятствий, страдания, недовольство собой - необходимые компоненты любой познавательной деятельности.
Чувственное познание включает и интуицию. Она определяется как способность постижения истины путем ее прямого усмотрения без помощи логических аргументов. Ее роль особенно велика в творческом процессе, создании новых научных теорий, когда необходимы внезапные скачки ума, прорывающие сеть сложившихся стереотипов, доказательств и обоснований. Интеллектуальная интуиция рассматривается как внутреннее прозрение. Не случайно в <<Рассуждении о методе>> Декарт ставит интуицию на первый план. К особенностям интуитивной деятельности относят неожиданность решения задачи, неосознанность путей и способов её решения, непосредственное постижение истины на сущностном уровне. Существует стандартизованная интуиция (например, определение врачом характера заболевания пациента по его действиям) и эвристическая (например, осознание Кеккуле структуры молекулы бензола как образа змеи, хватающей себя за хвост).
\section{Методы чувственного познания в науке}
Эмпирический уровень научного познания характеризуется непосредственным исследованием реально существующих, чувственно воспринимаемых объектов. Особая роль чувственного познания в науке заключается в том, что только на этом уровне исследования мы имеем дело с непосредственным взаимодействием человека с изучаемыми природными или социальными объектами. Здесь преобладает живое созерцание (чувственное познание), рациональный момент и его формы (суждения, понятия и др.) здесь присутствуют, но имеют подчиненное значение. Поэтому исследуемый объект отражается преимущественно со стороны своих внешних связей и проявлений, доступных живому созерцанию и выражающих внутренние отношения. На этом уровне осуществляется процесс накопления информации об исследуемых объектах, явлениях путем проведения наблюдений, выполнения разнообразных измерений, поставки экспериментов. Здесь производится также первичная систематизация получаемых фактических данных в виде таблиц, схем, графиков и т.п. Кроме того, уже на втором уровне научного познания — как следствие обобщения научных фактов — возможно формулирование некоторых эмпирических закономерностей. Для эмпирического познания характерна фактофиксирующая деятельность в системе гносеологического отношения <<субъект - объект>>. Основная задача эмпирического познания — собрать, описать, накопить факты, произвести их первичную обработку, ответить на вопросы: <<что есть что?>> <<что и как происходит?>>
Факт — основное понятие эмпирического познания. Он обозначает, фиксирует реальность в статусе объекта исследования. Факт может быть действительно <<упрямой вещью>>, но только во всей своей полноте. Непроверенные факты, факты с большой долей фантазии, надуманные - могут стать основанием для спекуляций, сомнительных выводов, заблуждений и даже лжи. Всё это заставляет исследователя рассматривать факт не как цель, а как отправную точку в познании. В то же время без фактофиксирующей деятельности подлинное познание не может осуществиться. Эту деятельность обеспечивают наблюдение, описание, измерение, эксперимент.
\subsection{Наблюдение}
Исходной формой эмпирического познания считается наблюдение, поскольку оно применяется и в рамках эксперимента и измерений, хотя может проводиться самостоятельно, особенно на первых этапах становления науки. Поэтому целесообразно начать обсуждение методов эмпирического познания именно с анализа функций и особенностей наблюдений в науке.[7, с.39]
Наблюдение — это направленное восприятие объекта познания с целью получения информации о его форме, свойствах и отношениях. Процесс наблюдения не является пассивным созерцанием. Это активная направленная форма гносеологического отношения субъекта к объекту, усиленная дополнительными средствами фиксации информации и ее трансляции. Научное наблюдение представляет собой целенаправленное, систематическое и организованное восприятие изучаемых предметов и явлений. Связь наблюдения с чувственным познанием очевидна, поскольку процесс восприятия деятельности связан с переработкой и синтезом тех ощущений, впечатлений и образов, которые наблюдатель получает от внешнего мира. Все они служат отображением отдельных чувственно воспринимаемых свойств, сторон и отношений наблюдаемых предметов и явлений. Иногда наблюдение может относиться также к восприятию переживаний, чувств и иных психических состояний самого субъекта. Такое наблюдение называется интроспекцией.
Осуществление наблюдения предполагает:
\begin{itemize}
\item [--] цель;
\item [--] выбор методики;
\item [--] план наблюдения;
\item [--] контроль за корректностью и надежностью полученных результатов;
\item [--] обработку, осмысление и интерпретацию полученной информации.
\end{itemize}
Последнее требует особого внимания. С одной стороны, фактофиксирующая деятельность претендует на получение достоверной информации. С другой стороны, эта информация несет на себе печать субъективности (Ф. Бэкон об идолах <<рода>> и <<пещеры>>)[3, c. 18-46]. Иногда исследователь сам себя загоняет в угол, стараясь увидеть то, чего нет в действительности, или же наоборот, не замечает того, что очевидно для всех, кроме него, ибо это противоречит принятой им идее объекта. Элементарное по своей природе наблюдение оказывается далеко не простым. Будучи первичным генератором фактов, наблюдение может быть дорогой к истине, а может проложить путь к заблуждению. Отсюда необходимость особого внимания к наблюдению, четкого выполнения всех требований этой операции познания, а кроме того, осуществления контрольного наблюдения.
Наблюдение в научном исследовании призвано осуществить три основные функции. Первая и важнейшая из них состоит в получении той эмпирической информации, которая необходима для постановки новых проблем, возникающих с обнаружением несоответствия между новыми фактами и старыми способами их объяснения. Эта особенность характерна прежде всего для фактов, которые не могут быть исследованы экспериментально (астрономические, геологические, многие социальные и другие явления и процессы).
Вторая функция наблюдений связана с эмпирической проверкой тех гипотез и теорий, которые нельзя провести с помощью эксперимента. Разумеется, экспериментальное подтверждение или опровержение гипотез предпочтительнее, чем проверка с помощью наблюдений. Однако там, где невозможно поставить эксперимент, единственными свидетельствами могут служит только данные наблюдений. При наблюдениях, которые сопровождаются точными измерениями, результаты проверки гипотез могут оказаться не менее надежными, чем экспериментальные, что подтверждается историей развития астрономии.
Третья функция наблюдений заключается в том, что в процессе проверки гипотез и теорий именно их эмпирически проверяемые следствиями соотносятся с непосредственно наблюдаемыми фактами, которые формулируются на языке наблюдений. Ученый обращается к теории, чтобы целенаправленно вести наблюдения, с другой стороны он вынужден постоянно обращаться к наблюдениям и экспериментам, чтобы проверить свои выводы. Наблюдение как раз и является тем звеном, которое связывает теорию с опытом, теоретические исследования с эмпирическими.
\subsection{Описание}
Описание — это прием фиксации информации наблюдения, его завершающий этап. С помощью описания информация органов чувств переводится на язык знаков, понятий, схем, графиков, обретая форму, удобную для последующей рациональной обработки (систематизации, классификации, обобщения и т.д.). Описание осуществляется не на базе естественного языка с его аморфностью, амбивалентностью, полисемантикой, а на базе искусственного языка, который отличается логической строгостью и однозначностью. Описание может быть ориентировано на качественную или количественную определенность. Количественное описание требует фиксированных измерительных процедур, что обусловливает необходимость расширения фактофиксирующей деятельности субъекта познания за счет включения такой операции познания, как измерение.
\subsection{Измерение}
Измерение — это прием в познании, с помощью которого осуществляется количественное сравнение величин одного и того же качества. Измерение отнюдь не второстепенный прием. Это некая система обеспечения познания. На его значимость указал Д.И. Менделеев, заметив, что знание меры и веса — это единственный путь к открытию законов. В процессе измерения субъект познания, устанавливая количественные отношения между явлениями, открывает некоторые общие связи между ними. Измеряя те или иные физические величины массы, заряда, силы тока, субъект познания вскрывает качественную определенность исследуемого объекта, его существенные свойства.
\subsection{Эксперимент}
Характерная особенность эксперимента как специального эмпирического метода исследования заключается в том, что он обеспечивает возможность активного практического воздействия на изучаемые явления и процессы. Исследователь здесь не ограничивается пассивным наблюдением явлений, а сознательно вмешивается в естественный ход их протекания. Он может осуществить это, либо изолировав исследуемые явления от некоторых внешних факторов, либо изменив пределенные условия, в которых они происходят. И в том и другом случае результаты испытаний должны точно фиксироваться и контролироваться. Таким образом, дополнение простого наблюдения активным воздействием на изучаемый процесс, превращает эксперимент в весьма эффективный метод эмпирического исследования.
Эксперимент — это особый прием познания, представляющий системное и многократно воспроизводимое наблюдение объекта в процессе преднамеренных и контролируемых пробных воздействий субъекта на объект исследования. В эксперименте субъект познания изучает проблемную ситуацию, чтобы получить исчерпывающую информацию. Исследуемый объект наблюдения контролируется в специально заданных условиях, что обеспечивает возможность фиксировать все свойства, связи, отношения, меняя параметры условий. Поскольку экспериментатор задает условия, эксперимент таит в себе опасность переоценки одних свойств и отношений и недооценки других. Все это требует от исследователя особой технологической дисциплины, которая включает:
\begin{itemize}
\item [--] уяснение проблемы и выдвижение рабочей гипотезы ее решения;
\item [--] определение параметров эксперимента и создание экспериментальной установки (обстановки);
\item [--] обеспечение контроля за условиями эксперимента;
\item [--] возможность повторного контроля и эксперимента;
\item [--] фактофиксирующую деятельность субъекта познания и описание полученного результата.
\end{itemize}
Учитывая особые возможности эксперимента, его часто применяют для проверки научных гипотез, и в этом смысле эксперимент, являясь одной из форм практики, выполняет функцию критерия истинности теоретического знания. В области теоретического знания хорошо зарекомендовал себя мысленный эксперимент. Он представляет собой систему продуманных процедур над идеализированными объектами. В практику социальной действительности широко внедряется социологический эксперимент, ориентированный на обеспечение новых форм социальной организации и оптимизации общественного регламента. Специфика социологического эксперимента заключается в том, что субъект познания имеет дело с особым объектом. В качестве объекта познания выступают люди. Это обстоятельство накладывает на экспериментатора повышенную ответственность. Содержание и процедуры социологического эксперимента предполагают обусловленность его не только моральными, но и правовыми нормами.
\section{Заключение}
Всё в мире находится во взаимной связи, которая порождает активный импульс к его саморазвитию. Без связи невозможно самодвижение материи, без самодвижения невозможно развитие. Развитие обусловлено различными видами связи. Каждая наука использует различные методы, которые зависят от характера решаемых в ней задач. Однако своеобразие методов состоит в том, что они относительно независимы от типа проблем, но зато зависимы от уровня и глубины научного исследования, что проявляется, прежде всего в их роли в научно-исследовательских процессах. Иными словами, в каждом научно-исследовательском процессе меняется сочетание методов и их структура. Благодаря этому возникают особые формы (стороны) научного познания, важнейших из которых являются эмпирическая и теоретическая.
На эмпирическом уровне преобладает живое созерцание (чувственное познание), рациональный момент и его формы (суждения, понятия и др.) здесь присутствуют, но имеют подчиненное значение. Поэтому объект исследуется преимущественно со стороны своих внешних связей и отношений, доступных живому созерцанию. Сбор фактов, их первичное обобщение, описание наблюдаемых и экспериментальных данных, их систематизация, классификация и иная фактофиксирующая деятельность — характерные признаки эмпирического познания.
Эмпирическое познание направлено непосредственно (без промежуточных звеньев) на свой объект. Оно осваивает его с помощью таких приемов и средств, как сравнение, измерение, наблюдение, эксперимент. Однако не следует забывать, что опыт никогда, тем более в современной науке, не бывает слепым: он планируется, конструируется теорией, а факты всегда так или иначе теоретически нагружены. Поэтому исходный пункт, начало науки — это, строго говоря, не сами по себе предметы, не голые факты (даже в их совокупности), а теоретические схемы, «концептуальные каркасы действительности». Они состоят из абстрактных объектов («идеальных конструктов») разного рода — постулаты, принципы, определения, концептуальные модели и т.п.
На основе эмпирических данных исследуемые объекты мысленно объединяются, постигается их сущность, «внутреннее движение», законы их существования, составляющие основное содержание теорий — «квинтэссенции» знания на данном уровне.
\newpage
\section{Список литературы}
\begin{enumerate}
\item Философия : [Учеб. для с.-х. и техн. вузов] / В.П. Агафонов, Д.Ф. Казаков, Д.Д. Рачинский. - Москва : МСХА, 2000. - 495 с.
\item Алексеев П.В., Панин А.В. Философия: Учебник. - 3-е изд., перераб. и доп. / П.В. Алексеев, А.В. Панин - М.: ТК Велби, Изд-во Проспект, 2003. - 608 с.
\item Бэкон, Ф. Новый Органон / Ф. Бэкон. Москва : Социально-экономическое издательство, 1958. - 240 с.
\item Голубинцев, В. О. Философия для технических вузов / В.О. Голубинцев, А.А. Данцев, В.С. Любченко. - М.: Феникс, 2003. - 640 c.
\item Канке В.А. Основные философские направления и концепции науки. / В.А. Канке - М.: Логос, 2008. - 400 c.
\item Лешкевич Т. Г. Философия науки: Учеб. пособие. / Т.Г. Лешкевич - М.: ИНФРА-М, 2006. - 272 с.
\item Рузавин Г.И. Методология научного исследования: Учеб. пособие для вузов. / Г.И. Рузавин М.: ЮНИТИ-ДАНА, 1999. 317 с.
\item Спиркин А.Г. Философия / А.Г. Спиркин. М: Гардарики, 2009г.
\item Основы философии: учебное пособие для аспирантов / В.П. Кохановский [и др.]; под ред В.П. Кохановского - Ростов н/Д : Феникс, 2005. - 640 с.
\item Введение в философию: Учеб. пособие для вузов / Авт. колл.: Фролов И. Т. и др. - 3-е изд., перераб. и доп. - М.: Республика, 2003. - 623 с.
\end{enumerate}
\end{document}

416
03-FPGA.tex Normal file
View File

@ -0,0 +1,416 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\input{../fancy-listings-preamble}
\author{Фёдоров Сергей Владимирович}
\title{Проектирование цифровых устройств на программируемых логических интегральных схемах}
\date{2022-09-05}
\begin{document}
\maketitle
\tableofcontents
\section{Введение (2022-09-12)}
\section{Конвейеризация на примере КИХ-фильтра в ц4}
Фактически, КИХ фильтр
\[ y_k = \sum_i h_i x_{k-i}\]
сложить и накопить результаты перемножений в аккумуляторе. Допусти, что x и h находится в памяти ПЛИС.
(1)
у ц4 частота 287(18х18) и 340МГц(9х9). Это означает, что если мы задействуем внутренние регистры, задержка будет около 3,4нс. у памяти тоже есть скорость например 315МГц это скорость между защёлкиванием адреса памяти и получением данных на выходном регистре памяти (около 3,1нс). Задержка аккумулятора - 5нс. Также существует задержка от памяти до умножителя на межсоединениях, например, 1,5-2нс. до аккумулятора тоже есть задержка, например 0,6нс.
(2)
Если не включать промежуточные регистры схема будет работать на 73,5МГц, общая задержка 13,6нс, 2 такта задержки.
Если использовать регистр перед аккумулятором - 5,6нс
С точки зрения баланса лучше использовать регистр перед умножителем, но проще с точки зрения кода поставить регистры на память и получится 3,1, 4,9, 5,6нс, скорость 178,5МГц и 4 такта задержки (глубокий конвейер). Чем глубже конвейер тем сложнее им управлять.
Если хотим 3 такта, задержка будет 8нс, то есть 125МГц. Схема, осуществляющая максимальную задержку называется \textbf{Критическим путём}.
В новых ПЛИС есть регистры межсоединений, что позволяет конвейеризовать даже их. По сути, ц2-4 это очень похожие архитектуры. У современных ПЛИС обычно несколько напряжений питания. В основном, выпускаются в корпусе BGA.
ФАПЧ:
PFD phase frequency detector, обратная связь от M это такая же частота и фаза с минимальным джиттером.
CP charge pump LF loop filter формирует сигнал по уровню которого ГУН стабилизирует схему.
VCO ГУН
У любого ФАПЧ есть время захвата, то есть время стабилизации схемы.
\section{Интеграция компонент в систему на кристалле}
Интерфейсы систем на кристалле и пользовательские модули.
Часто используются спецификации
\begin{itemize}
\item AXI - 4 от ARM
\item Wishbone (часто применяется в свободных системах)
\item Avalon (интел) - эти компоненты возможно соединять с ядром AXI. делится на два разных варианта обмена информацией
\begin{itemize}
\item MM - шинная (периферийные модули отображаются в единое пространство (карту памяти) мастера)
\item ST - поточный (однонаправленный) интерфейс точка-точка.
\end{itemize}
Шину возможно расширить собственными инструкциями.
\end{itemize}
\subsection{Системная шина}
Соежинения компонентов - это не просто проводник, а система связывания по разным протоколам. Network-on-chip. Построена на принципах потоковой передачи точка-тока. Предусмотрено много режимов и подрежимов обмена. генерируется автоматически, от параметров будет зависеть, что именно будет скомпилировано. Такой большой объём потому что нужно осуществлять мультиплексирование данных. На транспорт занимается очень много метса из-за мультиплексирование данных. Чем больше устройств висит на шине, тем больше мультиплексирования.
Например, если есть модуль к окторому прикреплены шины данных, команд, ПДП, там точно понадобится арбитр. QSys реализует
\begin{itemize}
\item арбитраж
\item декодирование адреса
\item мультиплексирование данных
\item управление разрядностью
\item генерацию циклов ожидания
\item обработку сигналов прерывания
\end{itemize}
Смысл в том, что данные приходят в шину, преобразуются в потоки и затем снова приходят в шину ММ. Арбитраж осуществляется не на шине, а на каждом отдельном периферийном модуле.
\begin{itemize}
\item Интерфейс - это группа сигналов ММ или СТ, определяющая связи между компонентами
\item Компонент - логическое устройство с одним или более интерфейсом авалон
\item главное устройство (Мастер) - инициирует передачи
\item подчинённое устройство (Слейв) - отвечает на передачи
\item источник/приёмник - интерфейсы которые посылают/получают потоковые данные в системе
\item передача - чтение или запись блока данных
\end{itemize}
Если говорится Мастер выставляет сигнал на шину слейва, то на самом деле мастер отправил запрос в шину, а шина выставляет адрес на слейва.
Если в модуле есть блочная память и регистры - они разносятся по разным интерфейсам. В отдельные интерфейсы обычно формляются клок и ресет.
\subsection{Дополнительные режимы}
\subsection{Специальные инструкции}
Фактически, это Инструкции, которые могут добавляться в АЛУ процессора и расширять логику процессора. Если многотактовые инструкции - процессор приостановит конвейер.
Внутри таких модулей также можно сделать собственный сопроцессор. Все входы такого модуля обязательные (единственное, чего может не быть - это выхода done). Всего под код специальной инструкции выделено 256 значений. Можно все 256 инструкций засунуть в один модуль, это показывает параметр n.
Задействуются они также как другие инструкции на шине Avalon, их возомжно тактировать и сделать многотактовыми. После интеграции соединяем с \code{custom_instruction_master}. system.h сразу содержит макросы для доступа.
\subsection{Межсоединения Platform Designer}
поддержка переходов между доменами тактовых импульсов. ДТИ - это группа триггеров и связанная с ними логика, которая тактируется одним ТИ.
(1)
Иногда это не очень удобно. Есть два варианта в Platform Designer
\begin{itemize}
\item обмен с квитированием (Handshake)
\item обмен через FIFO (позволяет реализовать конвейерные передачи).
\end{itemize}
Если бы мы не использовали мост, была бы настройка по умолчанию. Обмен с квитированием - медленный обмен и для каждой операции записи/чтения требуется несколько тактов с каждой стороны. Хорошо подходит для регистров и требует мало ресурсов. Обмен через FIFO хорошо подходит для конвейерных передач, но требует памяти для реализации. Используется для обмена с памятью, ПДП, где большой поток на высокой частоте.
По-умолчанию, делается квитирование, чтобы не расзодовать ресурсы там, где это явно не требуется.
Обычно неприемлемо ограничивать частоту системы частотой межсоединений, по умолчанию можно на хэндшейк оставить 1 цикл. Если задержка в шине, можно добавить такт, получив б\'{о}льшую частоту, но латентность. и Верно структурировать эти мосты вручную, а не автоматически, добавляя их только там, где их нужно добавить.
Таким образом при помощи Pipeline Bridge возможно лучше структурировать межсоединения в системе. Желательно такое мостовое межсоединение делать по степени двойки.
\subsection{Порты MM-Slave}
Поддерживает дополнительные режимы обмена и сигналы, которые требуются этим режимам. Конвейеризованные и пакетные передачи.
КП поддерживается только для чтения, для записи они не нужны. КП увеличивают пропускную способность для подчинённых портов, которые требуют несколько тактов для формирования результата после первого доступа, но далее могут формировать результаты каждый такт. Если мы например работаем между ПДП и он-чипРАМ то в он-чипе вход с регистром, если хотим повысить скорость выход тоже снабжаем регистром. Если в межсоединении тоже ковейеризация - то ещё один такт. Такое поведение возможно в три раза ускорить - выставляем адрес, на следующем такте, не дожидаясь ответа выставляем следующие адреса, а данные выставляются на каждом такте, но с первоначальной задержкой. Есть фиксированные латентности или вспомогательные сигналы. Вспомогательные сигналы обычно используются с периферией с переменной латентностью, где мы можем ждать неизвестно сколько. При переменной латентности фазы чтения и передачи данных не совпадают.
ПП позволяют передать адрес и количество данных, а на слова запросы разбираются уже автоматизированно, то есть просто подряд читаем с автоинкрементом адресом.
\subsection{Верификация проекта}
и настройка временн\'{ы}х требований. Большая часть времени уходит именно на этот этап. Методы верификации:
\begin{itemize}
\item временной анализ;
\item моделирование (отдельных модулей и системы в целом);
\item формальная верификация;
\item анализ энергопотребления;
\item анализ целостности сигналов;
\item внутрисхемное тестирование.
\end{itemize}
Основной метод для ПЛИС - функциональное моделирование и временной анализ. Если временн\'{ы}е требования выполнены и на тестбенче проект проходит верификацию, считается готовым\footnote{Для второй лабы нужно будет изменить тестбенч}.
Должны быть проанализированы все требования и все пути распространения сигналов. каждый временной путь имеет начальную и конечную точку. Мы описываем ТИ в точке входа микросхемы SDRAM. Важно понимать, где начинаются и заканчиваются пути. Есть пути ТИ, пути данных и асинхронные пути (но их чаще всего не рассматривают).
Запускающий и защёлкивающий фронт (Launch, latch edge) это фронты по которым срабатывает регистр-источник и по которому защёлкиваются данные (обычно считается следующий после запускающего).
\begin{tikztimingtable}
clk & cCCC \\
data & U2DU \\
\end{tikztimingtable}
Setup and Hold. - время за сколько до ТИ нужно поменять данные и сколько после фронта ТИ нужно удерживать данные
Время прибытия данных - время поступления данных на синхронный вход регистра-приёмника.
Время прибытия ТИ.
Требуемое время предустановки данных - к какому моменту нужно установить на входе триггера. Аналогично нужно установить по удержанию. Схема удовлетворяет требованиям, когда все запасы по всем путям положительные (Setup slack). Разница между временем установки данных и временем установки для триггера.
Setup slack = min setup - max hold.
новый ТИ должен прийти не раньше, чем холд тайм данных. Для асинхронных путей вводятся времена восстановления и снятия (Recovery and Removal). Асинхронный сигнал всегда главнее ТИ, триггер сбрасывается безусловно и сброс может быть подан в любой момент времени, а выводить в окрестности ТИ нежелательно. Асинхронный сброс в больших микросхемах нужно синхронизировать (2дтригера)
Анализ ввода-вывода с общим ТИ. То есть таким же образом мы можем анализировать синхронные внешние схемы, например, память.
Временн\'{ы}е модели (в современных ПЛИС 3). влияют техпроцесс, вариации техпроцесса, дефекты, напряжение питания, температура. При низкой температуре задержки могут увеличиваться. Важно при временных требованиях, что компилятор оптимизирует под них проект, а не просто проверяет валидность
\newpage
\appendix
\setcounter{secnumdepth}{2}
\setcounter{tocdepth}{2}
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Asbuk{subsection}}
\subsection{Семинар 1 (2022-09-05)}
Классификация ПЛИС.
Архитектура функциональных преобразователей влияет на быстродействие комбинационных схем. МУКС - это логика, которая требует достаточно большой объём и мультиплексирование большого кол-ва сигналов может снижать быстродействие. мукс32ч по 32 разряда это 1024 ЛЭ и 6 слоёв логики
(1)
х LUT для вычисления функции от 8 параметров нужны 3-31 таких LE. фактически на 10 входо нужно 5 слоёв логики.
(2)
В пятых циклонах и новее ALM (адаптивные логические модули) архитектура сложнее, чем 1 4вх таблицы перекодировки. и фактически возможно сделать 6тивходовую функцию. делается 4 мультиплексора с двухразрядным выбором, получится всего два слоя логики.
Дополнительные функциональные модули, влияющие на выбор ПЛИС:
\begin{itemize}
\item встроенная блочная память
\item аппаратные умножители (LUT в этом вопросе работают неэффективно)
\item модули ФАПЧ
\item контроллеры памяти (всегда есть выбор реализовать самостоятельно на LUT)
\begin{itemize}
\item поддержка стандартов ввода-вывода
\item аппаратные контроллеры
\end{itemize}
\item контроллеры интерфейсов
\begin{itemize}
\item физический уровень
\item уровень доступа к среде
\end{itemize}
\item процессорные ядра (SoC)
\end{itemize}
\begin{figure}[H]
\centering
\includegraphics[width=12cm]{03-fpga-00-01-cycloneV.png}
\end{figure}
В циклон5 каждый светло-серый квадратик это 10 ALM, серая это встроенная память, чёрные это DSP-blocks аппаратные умножители с бонусом, по периметру ввод-вывод, есть высокоскоростные. зелёным отмечен PCIe.
\subsubsection{Встроенная блочная память}
\begin{itemize}
\item Статическая ОЗУ (с точки зрения архитектуры, внешняя обычно динамическая)
\item Типичный объём 4-20 кбит/блок. циклон4=9кбит, циуклон5=10кбит, стратикс5=20кбит.
\item Конфигурируемая глубина и разрядность. зачем настройка на 9 разрядов? они называют его битом контроля чётности, хотя аппаратного контроля чётности нет. Также для представления данных большей разрядности и точности (родные умножители 9х9 и 18х18). Сопровождение данных служебной информацией. зачем 10 разрядов? не только детектирование, но и восстановление ошибки. АМД практикует блоки большего объёма (18 и 36 кбит), у этого есть и плюсы и минусы - данные обрабатываются параллельно, чем больше объём модуля тем меньше нужно модулей, но тем больше к ним будет попыток одновременных обращений и тем самым увеличить производительность. часто собираются памяти большего объёма из таких блоков, быстродействия падает линейно от величины блока.
В последнее время часть делают блоки разных объёмов, то есть помимо аппаратных блоков статического ОЗУ делают ещё и ОЗУ на LUT. некоторые блоки из ALM сконфигурировать как модули памяти если нужны небольшие блоки памяти (MLAB до 640бит у циклона больше 5го) у зайлинкса можно набирать из слайсов по 32 бита исторически.
\item возможность инициализации при включении (при прошивке)
\item регистровые входы (синхронная запись, чтение происходит с задержкой в 1 или более тактов).
мы работаем по тактам
(3)
поэтому важно, что при защёлкивании данных регистром всегда будет задержка на такт.
\item в некоторых семействах есть возможность реализовать боки меньшего объёма, используя таблицы перекодировки (ALM)
\item обычно вся память двухпортовая, и появляется возможность полная независимость одновременной записи и чтения
\end{itemize}
На памяти часто делается не только память, но и буферы ФИФО.
\subsubsection{Аппаратные умножители}
типичные разрядности 9х9, 18х18, 27х27. могут поддерживаться другие разрядности.
поддержка знакового и беззнакового умножения. в допкоде эти процессы отличаются, поэтому в мегафункции возможно указать знаковость.
отличий в блоках умножителей больше, чем даже в блоках памяти в ц4 умножитель примитивен. иногда приходится выбирать камень не по ЛЭ а по наличию умножителей и другой периферии.
в ц5 умножители имеют другое название и значительно отличаются как по количеству, так и по дополнительных возможностях. Например, возможно сохранить до восьми коэффициентов, но при этом важно понимать, что вся функциональность расставляется квартусом, поэтому информация из таблиц работает не всегда. Такая усложнённая архитектура нужна в основном для ЦОС. например, в НЦ отсчёты симметричны, а для ВЦ антисимметричны, поэтому нам нужны как умножитель+сумматор или сумматор+умножитель. за один такт мы можем делать сразу 4 18-разрядных MAC (multiply and accumulate).
в квартусе мы работаем с умножителями не напрямую, а через функции, например, «multiply adder intel fpga».
Дополнительные возможности:
\begin{itemize}
\item предсумматоры
\item аккумуляторы
\item встроенные коэффициенты
\item поддержка операций с плавающей запятой (10-е поколение)
\end{itemize}
у зайлинкса немного отличается. в одном блоке один умножитель и есть предсумматор. есть возможность над результатом умножения делать какую-то операцию (мини АЛУ с умножителем).
\subsubsection{Модули формирования частоты на основе ФАПЧ (PLL)}
\begin{itemize}
\item умножение, деление и сдвиг фазы входной частоты
\item несколько выходов с разными делителями и сдвигом фазы
\item возможность переконфигурации во время работы.
\end{itemize}
Петля Костаса
задействуется также через мастер мегафункций
\subsubsection{Контроллеры памяти}
SDRAM (DDR 2,3,4, LPDDR 2,3, DDR3L),RLDRAM 2,3, QDR 2,2+,4SRAM
иногда приходится делать контроллеры памяти на логике, но тоже писать самостоятельно не надо, есть мегафункции, которые могут синтезироваться как в логику, так и в использование аппаратного контроллера. в супер-новых есть также поддержки памяти с низкой латентностью
\subsubsection{Контроллеры интерфейсов}
\begin{itemize}
\item физический уровень (при проектировании важно определить поддержку стандартов и проверить, что возможно назначение выводов). дифференциальные и недифференциальные стандарты, стандарты для интерфейсов памяти, гигабитные приёмопередатчики. используется большое число интерфейсов с разными напряжениями питания и поэтому нужно убедиться, что в принципе, скомпилируется в выбранном камне.
\item уровень доступа к среде (PCI, PCIe, Ethernet MAC)
\end{itemize}
\subsubsection{Процессорные ядра}
\begin{itemize}
\item аппаратные ядра
\begin{itemize}
\item ARM Cortex A
\item ARM Cortex M
\end{itemize}
\item программные ядра
\begin{itemize}
\item Nios II
\item Nios V (основан на архитектуре RISC V)
\end{itemize}
\end{itemize}
Программные ядра весьма оптимизированы, чтобы работать на б\'{о}льших частотах и занимать меньше памяти.
Если есть реализация аппаратного ядра это обычно отдельные линейки продуктов, обозначаются как FPGA/SoC.
\subsubsection{Архитектура межсоединений}
(ц4ХБ 33(31))
в ц4 ЛЭ формируются в блоки по 16. в ц5 АЛМ формируются в блоки по 10
в состав блока помимо лэ входит также локальная матрица соединений (она соединяет сигналы входа и вход ЛЭ и также туда уходит выход из ЛЭ) их не сотни а тысячи или десятки. между собой связаны глобальной матрицей соединений
ГМС состоит из строки столбцов. данные могут поступать в ЛМС как со строк так и со столбцов. выходы ЛЭ возможно скоммутировать сразу на глобальную матрицу.
Фактически, мы не особо влияем на распределение сигналов по межсоединениям.
директлинк позволяет перескочить ГМС если лэ соединяется с каким-то ЛЭ из соседнего блока. ИО связаны с торцами столбцами и строками глобальной матрицы ввода-вывода.
\subsection{Семинар 4 (2022-10-17)}
асинхронный сброс возможно сделать тремя способами.
невозможно сделать два управления одним сигналом на входе тригера
делать общующину сброса - плохая идея
По подтверждению сброса ран можно сделать квитирование
\subsection{Семинар 5 (2022-10-31)}
Элемента ввода-вывода. это функциональные блоки для связи со внешним миром.
Если планируется работа с вводом-выводом, кроме Handbook важно на сайте intel скачать Pin connection guidelines, pin information и использовать их. Информация сохраняется в файл с расширением QSF.
Выводы ПЛИС в ц4 8 банков (банк это набор элементов ввода-вывода со своим напряжением питания):
\begin{itemize}
\item питание, земля
\begin{itemize}
\item питание ядра VCCINT. например, C-IV 1,2В;
\item питание элементов ввода-вывода VCCIO (для поддержки стандартов периферии обычно 1,2-3,3В.);
\item у самых современных вроде ц5 есть отдельное напряжение предрайвера VCCPD;
\item вспомогательные напряжения VCC\_AUX (например для ФАПЧ).
\end{itemize}
\item служебные выводы
\begin{itemize}
\item конфигурация
\item JTAG энергозависимое конфигурирование
\item конфигураторы конфигураций
\end{itemize}
\item Пользовательские элементы ввода-вывода
\begin{itemize}
\item выводы двойного назначения (могут быть пользовательские, но возможно и использование специальной функции ПЛИС, которую возможно запросить у квартуса).
\item входы тактовых импульсов
\item Поддерживается большое число как дифференциальных, так ине дифференциальных стандартов. Недифф работают по порогам напряжения LVTTL, LLCMOS. Также бывают недифференциальные с опорой (например HSTL, SSTL для памяти DDR2, DDR3) 0 и 1 определяется по некоторому среднему значению. Дифференциальные интерфейсы в основном LVDS (low voltage differential signaling) используется две линии. Дифференциальные пары надёжнее поскольку даже если будет наводка, разница напряжений не изменится.
\item назначение выводов часто нетривиальная задача: в одном банке должно быть одно напряжение. В банке с дифференциальными выводами не рекомендуется размещать не дифференциальные ВЫводы.
\item истинный LVDS есть только в двух банках, остальное можно сделать, но будет работать хуже.
\end{itemize}
\item Интерфейсы внешней памяти (поддерживаются SDR, DDR, DDR2 SDRAM) существуют как аппаратные так и программные поддержки. Для них подключаются некоторые специфические ядра, например, автокалибровки и автоподстройки интерфейсов памяти (ALTMEMPHY) поскольку нужна не только начальная калибровка, но и подгонка в процессе работы в зависимости от температуры устройства.
\end{itemize}
Сам по себе элемент ИО - это элемент с пятью триггерами внутри. Зачем: для экономии внутренних триггеров (защёлкивание входящих сигналов). 2 - управление временн\'{ы}ми характеристиками (с задержками по входам-выходам). У элементов ИО есть дополнительные настроки, например,
\begin{itemize}
\item подтягивающие регистры,
\item Bus Hold
\item Настройка тока выхода. (если есть стандарт, там есть настройка, какой сигнал трактовать как 0 а какой как 1. когда ток растёт, нагрузочная характеристика меняется, и сигнал может просесть ниже уровня определения логики). в КМОП технике полевые транзисторы можно включать параллельно. Чтобы выходную нагрузку регулировать запараллеливают транзисторы на инвертороподобной структуре на выходе, снижая суммарное сопротивление канала.
\item Последовательное терминирование
\item Управление скоростью нарастания
\item Ограничивающий диод PCI
\item Режим открытого коллектора
\item Программируемые выводы земли
\item Поддержка горячего включения
\end{itemize}
Выводы могут быть программируемой мощности. При этом желательно не ставить в цепь снаружи резистор, поскольку автоматически поставленный в ПЛИС диод не будет включен в схему до включения ПЛИС и есть вероятность сжечь элемент ввода-вывода. Для обеспечения совместимости 5В нужно использовать внешние буферы.
\subsection{Семинар 6 (2022-11-14)}
\textbf{Настройка временн\'{ы}х требований}
При любой работе с периферией квартус не можетзнать, сколько будет времени задержка у внешних устройств. Поэтому мы должны изучить спеку на внешнее устройство и установить временные настройки сетап и холд. Требования настраиваются с помощью языка TCL. При настройке таймингов нужно вычислить задержки распространения сигналов по плате и указать в наносекундах (по-умолчанию, 150пс/дюйм). Для корректного формирования задержек мы должны заложить задержки на ТИ от генератора, входные задержки максимальные и минимальные (для памяти это, например, параметр CAS Latency). Данные от памяти выставляются за какое-то время, и это значение всегда находится в некотором диапазоне, конкретное время мы никогда не знаем, в том числе разные биты одной шины могут меняться в разное время, оэтому максимум (например 6+0,6 и минимум 2,7+0,4). Далее в настройке указывается куда применяется эта настройка.
\begin{verbatim}
# create clocks
create_clock -period 20 [get_ports CLOCK_50]
create_clock -period 20 [get_ports CLOCK2_50]
create_clock -period 20 [get_ports CLOCK3_50]
# use generated
derive_pll_clocks
# set uncertainty
derive_clock_uncertainty
set sdram_clk u0|altpll|sd1|pll7|clk[2]
create_generated_clock -name sdram_clk_pin -source $sdram_clk -offset 0.5 \
[get_ports {DRAM_CLK}]
set_input_delay -clock sdram_clk_pin -max [expr 6 + 0.6] \
[get_ports {DRAM_DQ[*]}]
set_input_delay -clock sdram_clk_pin -min [expr 2.7 + 0.4] \
[get_ports {DRAM_DQ[*]}]
set_output_delay -clock sdram_clk_pin -max [expr 1.5 + 0.6] \
[get_ports {DRAM_RAS_N DRAM_CKE DRAM_DQ[*] DRAM_CAS_N DRAM_DQM[*] DRAM_CS_N \
DRAM_WE_N DRAM_ADDR[*] DRAM_BA[*]}]
set_output_delay -clock sdram_clk_pin -min [expr -0.8 + 0.4] \
[get_ports {DRAM_RAS_N DRAM_CKE DRAM_DQ[*] DRAM_CAS_N DRAM_DQM[*] DRAM_CS_N \
DRAM_WE_N DRAM_ADDR[*] DRAM_BA[*]}]
set_multicycle_path -from [get_clocks {sdram_clk_pin}] -to [get_clocks {u0|altpll|sd1|pll7|clk[2]}] -setup -end 2
\end{verbatim}
\subsection{Семинар 7 (2022-11-28)}
\textbf{Временно анализ (продолжение)}.
Компилятор может переставлять логику регистров, чтобы выравнивать время задержки между триггерами (ретайминг регистров). При понижении температуры чаще всего задержки уменьшаются.
формат SDC подразумевает некоторые термины:
cell - ячейка
pin - вывод cell
net - соединение
port - физический вывод микросхемы.
нетлисты отличаются по внешнему виду.
\code{get_ports} искать физические узлы
\code{get_pins} узлы селлов
\code{get_clocks} искать ТИ по набору параметров. В квартусе есть специальный интерфейс сопоставления портов пинов и текста Name Finder.
Основные настройки и ограничения
\begin{itemize}
\item Clocks - настройка повторяющегося периодического сигнала который может быть задан для любой точки в проекте. Есть два типа - настройка ТИ и настройка относительного ТИ (Generated Clock). \textbf{По умолчанию, считается, что все ТИ связаны}. То есть чтобы верно анализировать нужно разделить проект на тактовые домены при помощи исключений. Если сгенерированы ФАПЧем нужно описывать многотактовые цепи.
\code{create_clock [-name] -preiod [-waveform{RaiseTime FallTime}, <targets>, -add]}
-add нужен, чтобы добавлять настройки и явно указать, что предыдущие настройки не должны быть перетёрты.
\code{create_denerated_clock} значительно больше параметров (это может быть ТИ который формируется на ФАПЧ или методом деления, может быть ТИ, учитывающим задержки по схеме и снаружи). для ТИ на выходе ФАПЧ обычно не создают руками, а пишут \code{derive_pll_clocks}. Делитель на основе регистра - это плохая иедя (ripple clock) из-за задержек сигнала на триггерах и инверторах.
Для повышения точности моделирования возможно задать \code{set_clock_latency} которая водит дополнительную задержку и внутренний джиттер (clock uncertainty) по сетапу и холду \code{derive_clock_uncertainty}.
\item IO. Задержки могут быть как от регистра к регистру, так и в комбинационной логике. \code{set_max_delay}, \code{set_min_delay} где мы нормируем максимальное и минимальное время распространения сигнала через ПЛИС.
\item async paths (skipped)
\item false paths \code{set_false_path} - исключает группу цепей из анализа, \code{set_clock_groups} - описывает связанные группы ТИ, между несвязанными группами все переходы исключаются из анализа. Обязательно указываем какую цепь рвём. Можно исключить задержки по холду и сетапу. Или например не надо анализировать какую-то тестовую логику, тогда это тоже фолс пути.
сетКлокГрупс группы можно добавить с ключом -exclusive это исключение одновременного присутствия ТИ, а asyncronous могут.
\item multicycle paths обязательно нужно прописывать, что если на ФАПЧ есть сдвиг фазы, то защёлкивающий такт не следующий фронт, а через один. Или если у нас есть сложная логика, которая не успевает отработать за такт, тогда надо установить холд на первом такте, а сетап на втором такте.
\end{itemize}
\subsection{Avalon-ST}
\subsection{Проектирование ПЛИС}
\end{document}

112
03-cpas-lab-01-report.tex Normal file
View File

@ -0,0 +1,112 @@
\documentclass[a4paper,fontsize=14bp]{article}
\input{../common-preamble}
\input{../fancy-listings-preamble}
\input{../bmstu-preamble}
\setcounter{secnumdepth}{0}
\numerationTop
\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader
% ... работе, номер, тема, предмет, ?а, кто
\makeReportTitle{лабораторной}{1}{Криптографические преобразования}{Криптографические протоколы и стандарты}{}{Варфоломеев А.А.}
\newpage
\thispagestyle{empty}
\tableofcontents
\newpage
\pagestyle{fancy}
\section{Цель}
Целью лабораторной работы является освоение преобразований и практика ручного преобразования данных. Вариант \code{П_6}.
\begin{enumerate}
\item посчитать многочлен Жегалкина (алгебраическая нормальная форма для $f_i(x_4, x_3, x_2, x_1)$);
\item найти спектр Уолша-Адамара $\forall f_i$;
\item найти статистическую структуру $\forall f_i$;
\item посчитать вероятность $P_i$ изменения выходного бита при изменении одного входного бита;
\item посчитать среднее число изменяющихся выходных бит при изменении одного входного бита.
\end{enumerate}
\section{Выполнение работы}
\begin{table}[h!]
\centering
\begin{tabular}{|c|c|c|c|c|}
\hline
$X_d$ & $X_h$ & $X_4X_3X_2X_1$ & \code{П_6} & $f_4f_3f_2f_1$\\ [0.5ex]
\hline
0 & 0 & 0 0 0 0 & 8 & 0 1 0 0 \\
1 & 1 & 0 0 0 1 & 14 & 1 1 1 0 \\
2 & 2 & 0 0 1 0 & 2 & 0 0 1 0 \\
3 & 3 & 0 0 1 1 & 5 & 0 1 0 1 \\
4 & 4 & 0 1 0 0 & 6 & 0 1 1 0 \\
5 & 5 & 0 1 0 1 & 9 & 1 0 0 1 \\
6 & 6 & 0 1 1 0 & 1 & 0 0 0 1 \\
7 & 7 & 0 1 1 1 & 12 & 1 1 0 0 \\
8 & 8 & 1 0 0 0 & 15 & 1 1 1 1 \\
9 & 9 & 1 0 0 1 & 4 & 0 1 0 0 \\
10 & A & 1 0 1 0 & 11 & 1 0 1 1 \\
11 & B & 1 0 1 1 & 0 & 0 0 0 0 \\
12 & C & 1 1 0 0 & 13 & 1 1 0 1 \\
13 & D & 1 1 0 1 & 10 & 1 0 1 0 \\
14 & E & 1 1 1 0 & 3 & 0 0 1 1 \\
15 & F & 1 1 1 1 & 7 & 0 1 1 1 \\
\hline
\end{tabular}
\caption{Исходные данные}
\label{table:1}
\end{table}
\subsection{Полином Жегалкина}
Поиск полинома осуществляется последовательным поразрядным поиском каждого элемента, при том, что $a_0$ известен, для $f_4$ равен 0. Например: $f(1,0,0,0) = a_{0000} \oplus a_{1000} = 1$, следовательно $a_{1000} = 1$, $f(0,1,0,0) = a_{0000} \oplus a_{0100} = 0$, следовательно $a_{0100} = 0$, и так далее.
Полином Жегалкина для 4-го разряда будет иметь вид
\[f_4 = x_2 \oplus x_3 \oplus x_1x_3 \oplus x_1x_4 \oplus x_2x_3 \oplus x_2x_4 \oplus x_3x_4,\]
поскольку промежуточные значения a будут иметь следующие значения:
\begin{equation*}
\begin{gathered}
a_{0000} = 1; a_{0001} = 0; a_{0010} = 1; a_{0011} = 0\\
a_{0100} = 1; a_{0101} = 1; a_{0110} = 1; a_{0111} = 0\\
a_{1000} = 0; a_{1001} = 1; a_{1010} = 1; a_{1011} = 0\\
a_{1100} = 1; a_{1101} = 0; a_{1110} = 0; a_{1111} = 0\\
\end{gathered}
\end{equation*}
Полином Жегалкина для 3-го разряда будет иметь вид
\[f_3 = x_1 \oplus x_3 \oplus x_4 \oplus x_1x_4 + x_2x_3 + x_2x_4 + x_3x_4 + x_1x_3x_4 + x_2x_3x_4\]
поскольку промежуточные значения a будут иметь следующие значения:
\begin{equation*}
\begin{gathered}
a_{0000} = 0; a_{0001} = 1; a_{0010} = 0; a_{0011} = 0 \\
a_{0100} = 1; a_{0101} = 0; a_{0110} = 1; a_{0111} = 0 \\
a_{1000} = 1; a_{1001} = 1; a_{1010} = 1; a_{1011} = 0 \\
a_{1100} = 1; a_{1101} = 1; a_{1110} = 1; a_{1111} = 0 \\
\end{gathered}
\end{equation*}
Полином Жегалкина для 2-го разряда будет иметь вид
\[f_2 = x_1 \oplus x_2 \oplus x_3 \oplus x_4 \oplus x_2x_4 \oplus x_1x_2x_3 \oplus x_2x_3x_4\]
поскольку промежуточные значения a будут иметь следующие значения:
\begin{equation*}
\begin{gathered}
a_{0000} = 0; a_{0001} = 1; a_{0010} = 1; a_{0011} = 0 \\
a_{0100} = 1; a_{0101} = 0; a_{0110} = 0; a_{0111} = 1 \\
a_{1000} = 1; a_{1001} = 0; a_{1010} = 1; a_{1011} = 0 \\
a_{1100} = 0; a_{1101} = 0; a_{1110} = 1; a_{1111} = 0 \\
\end{gathered}
\end{equation*}
Полином Жегалкина для 2-го разряда будет иметь вид
\[f_1 = x4 \oplus x1x2 \oplus x1x3 \oplus x1x4 \oplus x2x3 \oplus x1x2x3 \oplus x1x2x4 \oplus x1x3x4 \oplus x2x3x4\]
поскольку промежуточные значения a будут иметь следующие значения:
\begin{equation*}
\begin{gathered}
a_{0000} = 0; a_{0001} = 0; a_{0010} = 0; a_{0011} = 1 \\
a_{0100} = 0; a_{0101} = 1; a_{0110} = 1; a_{0111} = 1 \\
a_{1000} = 1; a_{1001} = 1; a_{1010} = 0; a_{1011} = 1 \\
a_{1100} = 0; a_{1101} = 1; a_{1110} = 1; a_{1111} = 0 \\
\end{gathered}
\end{equation*}
\end{document}

53
03-cpas-lab-02-report.tex Normal file
View File

@ -0,0 +1,53 @@
\documentclass[a4paper,fontsize=14bp]{article}
\input{../common-preamble}
\input{../fancy-listings-preamble}
\input{../bmstu-preamble}
\setcounter{secnumdepth}{0}
\numerationTop
\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader
% ... работе, номер, тема, предмет, ?а, кто
\makeReportTitle{лабораторной}{2}{Исследование функциональных характеристик работы пакета программ CrypTool}{Криптографические протоколы и стандарты}{}{Варфоломеев А.А.}
\newpage
\thispagestyle{empty}
\tableofcontents
\newpage
\pagestyle{fancy}
\section{Цель}
Освоение практических навыков работы с программами, реализующими стандартные криптографические алгоритмы, находящимися в свободном доступе или самостоятельно разработанными в соответствии с определенными методиками.
\section{Задание}
В лабораторной работе требуется изучить функции меню интерфейса изучаемых программ и создать результирующие отчеты, содержащие результаты применения криптографических функций к индивидуальной информации.
\section{Выполнение}
\subsection{Шифр Виженера}
На странице нового проекта добавим входной текстовый блок «Text Input». Выберем в меню шифрования, например, шифр Виженера, введём ключ
\begin{verbatim}
AWLIFNAWELFIUNAWEFLIUNAWEFLIUESGTIYTBRC
\end{verbatim}
Введем во входной текстовый блок информацию для шифрования «Ivan I. Ovchinnikov IU3-31M» и запустим выполнение шифрования. Результатом является «Tive A. Sggfgjgkrbh DK3-31F».
\subsection{Шифр Вернама}
Для шифрования Вернама нужно использовать текстовый файл с ключом шифрования. Для Шифрования был выбран текстовый файл со списком авторов приложения CryptoPro. Для шифрования был выбран текст «Tive A. Sggfgjgkrbh DK3-31F», и в результате получен шестнадцатеричный шифрованный текст вида «77 64 7C 46 00 20 5B 54 3B 08 15 15 49 1E 1F 1F 7F 68 4B 2D 4E 68 13 79 5B 58 35». При помощи того же файла со списком авторов зашифрованный текст расшифруется в исходный.
\subsection{RSA}
Добавим блок шифрования RSA. Введем во входной текстовый блок информацию для шифрования «Tive A. Sggfgjgkrbh DK3-31F». В пункте ассиметричного шифрования выберем пункт RSA Encryption, в появившемся окне выберем созданный заранее ключ (RSA-512) и зашифрованный текст будет иметь следующий вид:
\begin{verbatim}
ED 8B 66 1B 4A FD 2D 5D 89 98 97 F3 F4 27 42 33 26 7E F3 D9
BE B2 5A 7B A3 FE 7B 9F 26 72 35 01 ED 84 D1 4D 82 73 52 CE
E0 7F C0 9D 15 3A AF E5 F2 C6 4E 62 D0 38 EB 89 98 02 96 B1
FA 08 67 30
\end{verbatim}
Для расшифрования использвался аналогичный ключ расшифрования и получен текст «Tive A. Sggfgjgkrbh DK3-31F».
\section{Вывод}
Был изучен интерфейс программ CrypTool для зашифрования и расшифрования открытого текста, проведено зашифрование и расшифрование текстов в открытой программе. В результате выполнения лабораторной работы было получено, что открытый начальный текст и расшифрованное сообщение совпадают, изучены такие алгоритмы шифрования как шифр Виженера, Вернама, RSA.
\end{document}

65
03-cpas-lab-03-report.tex Normal file
View File

@ -0,0 +1,65 @@
\documentclass[a4paper,fontsize=14bp]{article}
\input{../common-preamble}
\input{../fancy-listings-preamble}
\input{../bmstu-preamble}
\setcounter{secnumdepth}{0}
\numerationTop
\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader
% ... работе, номер, тема, предмет, ?а, кто
\makeReportTitle{лабораторной}{3}{Исследование функциональных характеристик работы пакета программ Articsoft FileAssurity OpenPGP}{Криптографические протоколы и стандарты}{}{Варфоломеев А.А.}
\newpage
\thispagestyle{empty}
\tableofcontents
\newpage
\pagestyle{fancy}
\section{Цель}
Освоение практических навыков работы с программами, реализующими стандартные криптографические алгоритмы, находящимися в свободном доступе или самостоятельно разработанными в соответствии с определенными методиками.
\section{Задание}
В лабораторной работе требуется изучить функции меню интерфейса изучаемых программ и создать результирующие отчеты, содержащие результаты применения криптографических функций к индивидуальной информации (например, ФИО студента).
\section{Выполнение}
Для начала работы с приложением необходимо создать ключ шифрования интерфейс создания ключа представлен на рис. \hrf{pic:pgp-key-create}.
\begin{figure}[H]
\centering
\includegraphics[width=10cm]{03-cpas-lab-03-key.png}
\caption{Окно создания PGP ключа}
\label{pic:pgp-key-create}
\end{figure}
Далее необходимо Ввести в защищенном текстовом редакторе текст, который требуется зашифровать, например, «Ivan I. Ovchinnikov». Далее необходимо выбрать Ключ и Пользователя и нажать кнопку «Protect Text». В результате выполнения программы, текст будет зашифрован. Размер ключа 1024.
Результат зашифрования текста.
\begin{small}
\begin{verbatim}
-----BEGIN PGP MESSAGE-----
Version: FileAssurity OpenPGP 3.0.0
Comment: website http://www.articsoft.com
hIwDvFuqnc3Y4CUBA/46LIglRz44oJJXaisMwoIHZzFHlRujxkwel41q/RifkYVp
TFuniQXUnAPlvJUGR7YiKvfX530Rlv//9NWWt6sEGcNOjvNGqMd1zf1J01pkv0uo
7inTjlEOEUXSutnJwvWzmHPIZbJ7CiINAkOGDbdmpltcXvU0uTmtQGERYuky0dJI
AT+RIY7Voux7A1y3uA27YVNsuS9X3dbPzdftS+PPXQqyc37OuHBwbqY3/e7xNHdm
gTLagRtaKuSe4JijYRW2wQtzFaUgBtvX
=WIu0
-----END PGP MESSAGE-----
\end{verbatim}
\end{small}
В результате расшифрования было получено сообщение
\begin{verbatim}
The text was successfully unprotected.
The text was encrypted.
\end{verbatim}
и расшифрованный текст (аналогичный исходному) «Ivan I. Ovchinnikov».
\section{Вывод}
Был изучен интерфейс программ FileAssurity OpenPGP для шифрования и дешифрации данных, проведено шифрование и расшифрование текстов в открытой программе с различными размерами ключей. В результате выполнения лабораторной работы было получено, что шифрованное и расшифрованное сообщение совпадают.
\end{document}

View File

@ -0,0 +1,505 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\input{../fancy-listings-preamble}
\usepackage{forest}
\author{Варфоломеев Александр Алексеевич a.varfolomeev@mail.ru}
\title{Криптографические протоколы и стандарты}
\date{2022-09-06}
\setlist[itemize]{leftmargin=*}
\begin{document}
\maketitle
\tableofcontents
\newpage
\sloppy
\section{Введение (2022-09-06)}
Присутствие, 3 ЛР, 3 РК, ДЗ.
\textbf{Криптология} - это наука о создании и анализе систем безопасной связи. Работает в двух основных направлениях:
\begin{enumerate}
\item Криптография - создание систем;
\item Криптоанализ - анализ и дешифровка.
\end{enumerate}
Главный регулятор: ФСБ РФ (\href{fsb.ru}{fsb.ru}).
Безопасность определяется следующими компонентами:
\begin{itemize}
\item подлинность (аутентичность);
\item секретность;
\item целостность - информация не искажена;
\item non-repudiation - неотказуемость - свойства, обеспечивающие невозможность отказа от знакомства с информацией;
\item анонимность - утаивание идентичности при наличии прав;
\end{itemize}
СКЗИ - средства криптографической защиты информации.
КМЗИ - криптографические методы защиты информации
\section{Обработка риска}
\textbf{Риск} - это вероятность от угрозы и тяжести последствий.
Три кита информационной безопасности:
\begin{enumerate}
\item конфиденциальность
\item целостность
\item доступность
\end{enumerate}
\textbf{Протокол} - последовательность действий, с помощью которой два и больше участника решают определённую задачу. По сути, это распределённый алгоритм. \textbf{Криптографический протокол} - это протокол, использующий криптографические функции или примитивы: зашифровать, дешифровать и так далее.
Например, в задаче о волке, козе и капусте - один участник, а значит, это не протокол, а алгоритм.
\textbf{Цикл протокола} - временной интервал, в который активен только один из участников. \textbf{Шаг} - это конкретное законченное действие во время одного цикла.
Литература:
\begin{itemize}
\item Словарь криптографических терминов, 2006;
\item Запечников. Криптографические протоколы и их применение в финансовой и коммерческой деятельности, 2002;
\item Черёмушкин. Криптографические протоколы, 2009.
\item iacr.org
\end{itemize}
Стандартизации:
\begin{itemize}
\item iso.org
\item ietf.org
\item RFC 7801 ГОСТ 34.12 Кузнечик\footnote{\href{https://ru.wikipedia.org/wiki/Кузнечик_(шифр)}{wiki}}
\item RFC 8891 ГОСТ 34.12 Магма\footnote{\href{https://ru.wikipedia.org/wiki/ГОСТ_28147-89}{ГОСТ 28147-89, wiki}}
\item tk26.ru (стандарты разработаны в основном Инфотекс)
\begin{itemize}
\item ГОСТ Р 34.10-2012 Процессы формирования и проверки ЭЦП
\item ГОСТ Р 34.11-2012 Функции хэширования
\item ГОСТ Р 34.12-2015 Блочные шифр\'{ы}
\item ГОСТ Р 34.13-2015 Режимы работы блочных шифр\'{о}в
\end{itemize}
\item Рекомендации и технические спецификации
\end{itemize}
\begin{itemize}
\item (- 1946) Донаучный период развития;
\item 1946 Клод Шеннон. Теория связи в информационных системах. Опирался на теорию информации и доказал, что есть абсолютно (теоретически) стойкие шифры, например, шифр одноразового блокнота;
\item 1976 Практически стойкие шифры Diffie и Hellman New direction in crypto
\begin{itemize}
\item Старая стала называться криптографией с секретным ключом (симметричная, одноключевая криптография). Ключ шифрования такой же как расшифрования. ($K_c = K_d$).
\item Криптография с открытым ключом (асимметричная, двухключевая криптография). Один ключ открытый (для шифрования, второй секретный для расшифрования). по ключу шифрования невозможно найти ключ расшифрования. ($PK_c \neq SK_d$). Асимметрия в том, что все могут шифровать, но расшифровать может только владелец секретного ключа. Потребность возникла из открытого мира.
\end{itemize}
Был предложен Key agreement protocol, который используется до сих пор в системах шифрования.
\item Rivest Shamir Adleman (RSA)
\item 2000+ Квантовый компьютер. И следовательно разработка Post-quantum cryptography. Симметричным оказалось достаточно увеличить вдвое размер ключа, а асимметричным системам этого не удаётся сделать просто. NIST competition объявляет конкурс на замещение асимметричного шифрования. Квантовая криптография занимается разработкой квантовых каналов связи, где любое вмешательство приводит к искажению передаваемой информации.
\end{itemize}
\begin{frm}
(по мнению википедии) \textbf{Шифр} - это (от фр. chiffre «цифра») — система обратимых преобразований, зависящая от некоторого секретного параметра (ключа) и предназначенная для обеспечения секретности передаваемой информации.
(по мнению Варфоломеева) \textbf{Шифр} - это множество обратимых преобразований (отображений) открытого текста, проводимых с целью его защиты. $ \{E_K, E_K^{-1} \} \forall E_K \cdot E_K^{-1} = I \text{тождественное преобразование}$
\end{frm}
\begin{frm}
(по мнению википедии) Ключ - секретная информация, используемая криптографическим алгоритмом при зашифровании/расшифровании сообщений, постановке и проверке цифровой подписи, вычислении кодов аутентичности.
(по мнению Варфоломеева) Ключ - это совокупность данных, определяющая выбор конкретного преобразования из множества преобразований шифра.
\end{frm}
Зашифрование - процесс применения конкретного преобразования шифра к открытому тексту. Результат называется шифрованным текстом (криптограммой). $E_{K_o}(M) = C$
Расшифрование - процесс применения обратного преобразования шифра к шированному тексту для восстановления открытого текста. Не тоже самое, что дешифрование. $E_{K_c}^{-1} = M$
Дешифрование - процесс расшифрования не целевым пользованием.
Стойкость шифра - способность противостоять дешифрованию. Измеряется трудоёмкостью алгоритмов дешифрования (временн\'{а}я $T(n)$ и ёмкостная $S(n)$ сложность).
Имитостойкость - стойкость к имитации и подделке.
Принципы, которые закладываются в пост-квантовые алгоритмы криптографии с открытым ключом:
\begin{itemize}
\item lattice-based crypto (алгебраические решётки);
\item code-based crypto (теория кодирования);
\item hash-based (основанные на хэш-таблица);
\item multy-variate (многопеременные);
\item isogeny (основано на отображении супер-сингулярных эллиптических кривых).
\end{itemize}
\section{Плюсы и минусы симметричной и асимметричной криптографии}
Секретный ключ, симметричный шифр
\begin{itemize}
\item [+] короткие ключи (128-256 бит);
\item [+] высокая скорость (Магма 120Мб/сек, Кузнечик 135Мб/сек);
\item [+] «легче» анализировать (системы строятся из известных блоков, например регистров сдвига, булевых функций, функций К-значной логики);
\item [+] большая история изучения;
\item [+] существуют «совершенно стойкие» шифры.
\item [-] требуется полное доверие сторон;
\item [-] сложнее организовать механизмы ЦП (а именно свойство неотказуемости от информации);
\item [-] не доказана стойкость практически используемых криптосистем (энтропия ключа должна быть больше энтропии открытого текста). Сложной задачей в этом вопросе является доказательство стойкости нижней границы.
\end{itemize}
Асимметричный шифр, открытый ключ
\begin{itemize}
\item [+] не требуется полного доверия (возможно, что два участника доверяют третьему общему участнику, сертификационный центр);
\item [+] только один ключ секретный (либо это ключ зашифрования, либо выработки ЦП) секретность обеспечить сложнее, чем подлинность или целостность;
\item [+] более эффективные алгоритмы цифровой подписи;
\item [-] работает медленнее симметричных;
\item [-] размер ключа обычно больше (Elliptic curve требует б\'{о}льших ключей), Размер ключа влияет на скорость работы алгоритма;
\item [-] история изучения меньше чем у симметричных (с $\approx 1976$);
\item [-] не доказана безопасность. Доказательство сводится к решению задач, например факторизации больших целых чисел или дискретного логарифмирования. Обычно доказывается что атаковать систему не проще, чем решить какую-то известную задачу из теории чисел.
\end{itemize}
\section{Как использовать плюсы и минусы каждой из систем?}
Например, есть два участника А и Б, есть задача передачи открытого текста от А к Б. у А есть открытый ключ Б, для симметричного шифрования есть секретный ключ.
Для А: сначала вырабатывается секретный ключ для симметричного алгоритма, с его помощью шифруется открытый текст. Шифруем открытым ключом участника Б симметричный ключ. отправляем шифрованный текст по каналу связи.
Для Б: применяет свой секретный ключ на шифрованный текст и восстанавливает симметричный ключ, расшифровывает своим симметричным ключом исходный текст.
Получается в протоколе два раунда.
Существует проблема неоптимальности ключа на втором этам е зашифрования, принято решение о создании алгоритмов расширения ключа, например, optimal asymmetric encryption padding. Все расширения дают определённые слабости.
Как передавать ключи по открытому каналу? С помощью алгоритма KEM - key Encapsulation Mechanism, который заключается в том, что участник А сразу вырабатывает случайный секретный параметр большого размера, например, 2048 бит, применяет KDF - key derivation function, в результате применения которой будет малый, но зашифрованный ключ, на котором и происходит шифрования открытого текста. Но для этого нужно, чтобы у участника Б был первый, большой ключ зашифрования. KDF строится например на функции хэширования с добавлением случайных параметров.
Как определить качество функции ключа? нужно, чтобы противник имея на руках малый ключ не смог найти мастер-ключ.
\section{Классификация методов дешифрования по информации, известной противнику}
\begin{enumerate}
\item Cipher text only attack (только по известному шифрованному тексту). Предполагается, что противнику дан шифрованный текст ($C$) и все преобразования ($\{ E_K, E_K^{-1} \}, \{ E_{SK}, E_{PK} \}$). То есть противник знает, как реализован стандарт шифрования).
\begin{frm}
Принцип Керкг\'{о}ффса — правило разработки криптографических систем, согласно которому в засекреченном виде держится только определённый набор параметров алгоритма, называемый ключом, а сам алгоритм шифрования должен быть открытым. Другими словами, при оценке надёжности шифрования необходимо предполагать, что противник знает об используемой системе шифрования всё, кроме применяемых ключей.
То есть секретность шифра должна быть основана только на неизвестности ключа шифрования.
\end{frm}
Найти нужно ключ (k) и открытый текст (M). Часто объём переписки многое говорит противнику.
\item Known plaintext attack. Известного открытого текста и соответствующего шифрованного текста. Дано $M, C=E_k(M)$, найти k. Ситуация возможна, когда открытый текст стал известен со временем или из стороннего источника (семантический анализ).
Делается для дальнейшего использования ключа и дешифрования последующих сообщений или предшествующей переписки.
\item Метод протяжки вероятного слова. Всегда возможно предположить, что где-то в шифрованном тексте стоит известный текст, например, «уважаемый...» или «в ответ на ваш...». этот текст нужно просто подставлять в зашифрованное сообщение и практика показывает, что чаще всего совпадения действительно находятся.
\item Coffee break attack. Методы по выбранному открытому тексту. Противнику доступен алгоритм зашифрования как чёрный ящик и он может получать зашифрованный текст отправляя открытый текст в этот ящик.
\begin{itemize}
\item Adaptive chosen plaintext attack. Противник может отправить открытый текст, а затем адаптировать исходник чтобы получить новый зашифрованный текст и проанализировать его.
\item Non-adaptive chosen plaintext attack. Противник может подойти к шифрующему устройству только один раз
\end{itemize}
\item методы по выбранному шифрованному тексту и соотвтетствующему открытому тексту. В этом классе противник имеет доступ к расшифрованию как к чёрному ящику. задача найти секретный ключ, но не обязательно. Также есть адаптивная и неадаптивная атака. Как правило зная открытый текст задача дешифрования решается более эффективно.
\end{enumerate}
\subsection{Модель предполагаемого противника}
(ИБ - модель угроз и модель нарушителя).
Приказ ФСБ России №378 2014 «Об утверждении Состава и содержания организационных и технических мер по обеспечению безопасности персональных данных при их обработке в информационных системах персональных данных с использованием средств криптографической защиты информации, необходимых для выполнения установленных Правительством Российской Федерации требований к защите персональных данных для каждого из уровней защищенности» \footnote{\href{https://base.garant.ru/70727118/53f89421bbdaf741eb2d1ecc4ddb4c33}{ГАРАНТ}}
СКЗИ имеет класс (КС1, КС2, КС3, КВ, КА). Раньше нужно было получить лицензию на разработку СКЗИ и тогда описание классов раскрывалось. \textbf{Нарушитель классифицируется}
В модель противника кроме класса добавляется \textbf{модель анализа протоколов Dolev-Yao}.
\begin{itemize}
\item attackers
\item advesaries
\item enemies
\item intruders
\item imposters
\item eavesdroppers (подслушиватель)
\end{itemize}
Злоумышленник просматривает открытые каналы связи и \textbf{может} стать участником протокола, получить сообщения из протокола, стать авторизованным пользователем (insider), посылать сообщения. но при этом \textbf{не может} угадывать случайные числа, расшифровать без ключа, угадывать ключи, найти секретный ключ по открытому ключу, иметь доступ к закрытым ресурсам.
\begin{frm}
Все криптографические примитивы с точки зрения этой модели - идеальны.
\end{frm}
\textbf{Вычислительные возможности}.
\subsection{Классификация криптографических примитивов и протоколов}
Методы классификации:
\begin{itemize}
\item иерархический: описывает иерархию, чтобы описать объект нужно от корня дерева привести объект к листу.
\item фасетный (списочный): списки независимых свойств, фактически нужно определить объект к местоположению в списках (например, рост, вес, цвет волос).
\end{itemize}
Криптографические примитивы (иерархия)
\begin{itemize}
\item КП без ключа - гсп
\item КП с секретным ключом
\item КП с открытым ключом
\end{itemize}
\subsection{Криптографические примитивы}
\begin{itemize}
\item Без ключа
\begin{itemize}
\item \textbf{генераторы случайной последовательности.} Проверяется: статистическими тестами Пример: «Соболь» Информзащита (Энтропия 400 бит) Используют: физические величины. требование: равновероятность независимость (следующего значения от предыдущего). применение: генерация ключей, генерация начальных векторов, генерация параметров криптосистем
\item \textbf{One way function Однонаправленная функция без ключа} Каждый может вычислять эту функцию существует полиномиальный алгоритм. Для любого у случайно выбранного из области значений найти праобраз вычислительно. невозможно не существует или неизвестен полиномиальный алгоритм. Применяется: в парольных системах, облегчает обеспечение безопасности.
\item \textbf{Hash functions Функции хэширования без ключа} это однонаправленные функции + дополнительные требования, которые к ним предъявляются. где х это однонаправленный вектор неизвестной длины. у - двоичный вектор фиксированной длины (ГОСТ 34.11-2012 Функции хэширования 256 и 512 бит). невозможно найти $x_1 \neq x_2$, такое, что $H(x_1) = H(x_2)$ (Collision) Коллизий избежать невозможно, но их должно быть невозможно найти за полиномиальное время (Сильная Strong collision-free function). Для любого $x_1$ невозможно найти $\neq x_2$ как в предыдущем пункте, но для $\forall x_1$. Если это сделать сложнее - функция называется слабой.
\end{itemize}
\item С секретным ключом (симметричные или одноключевые)
\begin{itemize}
\item \textbf{Блочные} Для шифрования каждого блока (64-128 бит) используется один и тот же ключ
\item \textbf{Поточные} Открытый текст также делится на сегменты 1-128 бит и каждый шифруется своим ключом (KeyStream в русскоязычной литературе Гамма режим гаммирования) считался схожим с одноразовым блокнотом One Time Pad. Бывают
\begin{itemize}
\item \textbf{Синхронные} Знаки синхронного ключа не зависят от знаков открытого и шифрованного текста. Обычно есть генератор, который формирует гамму которая поступает на блок наложения гаммы куда также поступают знаки шифрованного текста. Самый простой блок наложения текста - это сумматор.
\item \textbf{Самосинхронизирующиеся} каждый знак открытого потока зависит от фиксированного числа знаков шифрованного текста. например ГОСТ 34.13-2015 каждый знак это функция от предыдущего знака шифрованного текста. Возникает необходимость вычислить первый знак и он равен начальному вектору нужен генератор случайных чисел
\end{itemize}
Обеспечивают секретность или конфиденциальность, но затем появились шифры, которые обеспечивают и шифрование и аутентификацию Authenticated Encryption Mode. Они обеспечивают более экономичные шифры, чем эти шифры по отдельности. Можем действовать тремя способами:
\begin{itemize}
\item \textbf{Encrypt then MAC} (Зашифр и МАС от него. Если код без ключа то только контроль целостности. МАС контролирует имитостойкость, если МАС не совпал сразу запрашиваем текст повторно).
\item \textbf{Encrypt and MAC} (зашифровали и МАС от открытого текста) Получатель должен сначала расшифровать а потом уже проверять код аутентификации. Плюс в том что мы контролируем целостность открытого текста. Но МАС идёт в открытом виде.
\item \textbf{MAC then Encrypt}. Сначала МАС открытого текста, затем шифруется на ключе.
\end{itemize}
\item Authentication Encryption with Associated Data (AEAD). на входе есть открытый текст и АД. на выходе есть шифрованный текст и некоторый вектор. нужно обеспечить секретность для ОТ а для АД нужно обеспечить только подлинность и целостность
\item \textbf{Хэш-функция с СК} Фактически это ХФ но зависит от ключа. разница в том что нужен ключ для вычисления значения хэша. Любую ХФ можно превратить в ХФ с ключом. Например вход это вектор произвольной длины его возможно разбить на две части и в начале будет стоять ключ тогда ХФ превращается в ХФ с ключом. Часто алгоритм используется с алгоритмом ЭЦП и ослабляет его. Придумали стандарт HMAC - The Keyed-Hash Message Authentication Code - Код аутентификации сообщения на основе ключевой функции. $HMAC(text,k)=H((K_0\oplus opad)||H(K_0\oplus ipad)||text)$ где ipad и opad - это константы а К это ключ. В итоге получаются 256 или 512 бит. MD5 при этом не рекомендуется. Вычисление подтверждает целостность данных
\item \textbf{Format Preserving Encryption} Шифрование сохраняющее формат. Должно сохранять формат входных данных
\item \textbf{Deniable Encryption} два текста два ключа, в результате один шифрованный текст, но если расшифровываем не тем ключом - получаем не тот текст. Расшифрование по принуждению
\item\textbf{ ГПСЧ и последовательностей}. На основе зерна (Seed). Требование чтобы последовательность была похожа на случайную, равновероятна и независима. Например регистры сдвига с обратной связью. Если используются с целью безопасности должны быть непредсказуемые (по части последовательности нельзя предсказать следующие знаки). Рекомендации: ANSI X9.17, ГОСТ-Р ИСО 28640-2012 (Статистические методы генерации случайных чисел), Р 1323856.1.006-2017 Механизмы выработки псевдослучайных последовательностей, рекомендации.
\end{itemize}
\item \textbf{С открытым ключом} (асимметричные, двухключевые)
Есть как Public Key так и Secret Key. (Открытый и закрытый ключ).
\begin{itemize}
\item \textbf{Шифры с открытым ключом} - открытый ключ шифрования и секретный ключ расшифрования. Отсюда асимметрия - все шифруют, только один может расшифровать. Как только появился PK, возникает проблема управления открытыми ключами (PKManagement). Способы:
\begin{itemize}
\item PKI - Инфраструктура открытых ключей. Для обеспечения секретности, подлинности и неискажённости используются сертификаты открытого ключа (фактически цифровая подпись удостоверяющего центра) Certification Authority. X.509 v3 описывает поля сертификата RFC 5280. инфраструктура RFC 2459 определяет несколько вариантов: иерархический, сетевой, мост, итд.
\item Identity-based crypto (ID-based encryption) - смысл в том, что открытый ключ $\approx$ идентификатору пользователя (телефон, почта, адрес, фио, и так далее). тогда закрытый ключ должен получаться некоторым key generation center, то есть закрытый ключ выдаётся пользователю некоторым центром (депонирование секретного ключа, нужно доверие центру генерации секретных ключей).
\item Certificateless encryption (бессертификатное шифрование, цифровые подписи итд) подвид id-based, но SK разбивается на две части - SKпользователя и SKцентра. Избавляемся от проблемы депонирования (потенциальной компрометации центра генерации ключей)
\end{itemize}
Основные принципы построения этих щифров
\begin{itemize}
\item на основе алгебраических групп с неизвестным, трудноопределимым порядком. АГ - это множество с одной бинарной операцией, которая всюду определена, в которой есть нейтральный элемент, в которой выполнен ассоциативный закон, $a\cdot a^{-1}=e$. RSA, Rabin, и другие
\item на основе алгебраических групп с трудноопределяемым порядком элементов. ПЭ - это минимальная гамма, такая что а в степени гамма даёт нейтральный элемент. ElGamal, Damgaid, и другие. Основаны на Discrete logarithm problem, DLP.
\item Создание пост-квантовых систем post quantum crypto - стойкость для симметричных можно обеспечить удвоением размера ключа, а для асимметричных нужно использовать разные системы решёток, хэширования, итд.
\end{itemize}
Многое в криптографии зависит от АГ. В них обычно рассматриваются какие-то труднорешаемые задачи, лежащие в основе стойкости криптосистем с ОК. Например задача дискретного логарифмирования. Если в качестве группы выбрать группу точек эллиптической кривой с опреацией сложения этих точек, то задача дискретного логарифмирования окажется сложной.
Кроме секретности ключам предъявляют требования, например:
\begin{itemize}
\item fully homomorphic encryption полностью гомоморфное шифрование, чтобы можно было зная шифрованный текст, можно было построить такой шифрованный текст, который является результатом зашифрования некоторй функции от открытого текста без знания ключа. Тогда возможно отправить законному пользователю не шифрованный текст.
\item functional encryption по тому же шифрованному тексту должны найти функцию от открытого текста без знания ключа. Может использоваться в системах голосования (если функция это подсчёт голосов, а открытый текст сами голоса, можно без раскрытия самого текста посчитать их сумму)
\end{itemize}
\item \textbf{цифровая подпись}. Реализуемые требования безопасности - подлинность, целостность, неотказуемость (никакой секретности). В российских документах называется шифровальным средством, хотя фактически это просто криптографическое средство. Состоит как правило из трёх алгоритмов:
\begin{itemize}
\item алгоритм выработки параметров,
\item алгоритм выработки ЦП
\item алгоритм проверки ЦП
\end{itemize}
На сегодняшний день - самый используемый на практике примитив. Если не нужна неотказуемость достаточно рассчитать message authentication code. Задействованы и открытый (включ проверки) и закрытый ключ (ключ выработки). Получается, что все могут проверять ЦП, но подписывать может только обладатель SK. Аналогично возникает проблема управления открытыми ключами, как в шифрах. Различают два вида ЦП
\begin{itemize}
\item Digital Signature with appendix (ЦП с приложением). Выработка происходит по следующему алгоритму: Пользователь А имеет документ и преобразует его с помощью хэш-функции и вырабатывает хэш-код (по ГОСТ длиной 256 или 512) и подписывается хэш-кодом от выработки и получаем ЦП размером 512 бит. Получается текст и ЦП существуют как единое целое. Пользователь Б (проверяющий) получает ключ, текст, ключ пользователя А. Вычисляет хэш, и проверяет полученное сообщение полученным хэшем.
\item Digital signature with message recovery (ЦП с восстановлением сообщения). Для проверки не нужно даже само сообщение. Преобразуем ОТ так, чтобы внести в него некоторую структурность (например, чтобы состояло из двух одинаковых половин), далее пользователь А применяет к этому тексту свой СК выработки ЦП и получает подпись. Тогда ЦП существует сама по себе. Проверяющий получает ЦП и ОК проверки ЦП. он должен применить ОК на ЦП и получить равенство половин полученного сообщения, тогда ЦП считается корректной. Обычно используется на небольших размерах исходных документов (например, команды в системах).
\end{itemize}
\item \textbf{Blind Signature (подпись вслепую)}
Цифровая подпись обеспечивает подлинность, целостность, неотказуемость.
К подписи вслепую прибавляется требование анонимности и неотслеживаемости. Отсюда требования можно расшифровать следующим образом:
\begin{enumerate}
\item Подписывающий не знает содержимого сообщения;
\item Не может определить, кому и когда он подписал документ.
\end{enumerate}
В классическом протоколе ЦП есть подписывающий и проверяющий, а здесь возникают следующие роли
\begin{itemize}
\item Запрашивающий ЦП;
\item нотариус (проставляющий ЦП);
\item проверяющий ЦП.
\end{itemize}
Фактически, нотариус просто может вести учёт хэшей, которыми он подписал документы, и когда, но не может знать, что именно за документы он подписывает.
\textbf{Протокол.}
\begin{enumerate}
\item автор сообщения запрашивает подпись имея хэш и собственный ключ (затенения) код документа (отправляет нотариусу)
\item нотариус не зная ключа затенения (не может найти ни хэш ни тем более текст). подписывает значение h. формирует секретный ключ ЦП
\item зная СКЦП и КЗ применяет преобразование подписи. ПП и КЗ должны быть перестановочными. это даст возможность переставить эти преобразования и получим тождественное преобразование, а именно ЦП от нашего хэша под документом.
\item для проверки нужны документ, цп и открытый ключ нотариуса. При этом нотариус тоже может быть проверяющим.
\end{enumerate}
\end{itemize}
\end{itemize}
Протоколы (фасет)
\textbf{E-voting}
требования:
\begin{enumerate}
\item только имеющий право голоса может голосовать
\item никто не может голосовать более одного раза
\item никто не может определить, кто конкретно за что голосовал (тайна голосования)
\item никто не может подменить чей-либо выбор
\item можно точно узнать, голосовал ли я
\item точно можно определить, кто голосовал
\end{enumerate}
анонимность - не только невозможность идентифицировать персону, но и имеет право на эту анонимность. Чтобы осуществить проверку публикуются все данные голосования.
\textbf{Протокол анонимных электронных чеков}
Система платежей с электронными чеками. Участники
\begin{itemize}
\item [] А - клиент
\item [] B - банк
\item [] S - shop магазин
\item []ЭЧ - это совокупность данных номер, сумма, ЦП банка.
\end{itemize}
Протокол
\begin{itemize}
\item А кладёт чек на копирку и в конверт, на конверте пишет ИД и ЦП, отправляет в банк.
\item Б видит только что это клиент А, и его ЦП. проверяет ЦП и из счёта пользователя А вычитает 100р
\item Б подписывает своей ЦП факт списания и возвращает конверт пользователю А.
\item А извлекает номер чека, сумму и ЦП банка. и несёт его в магазин.
\item М проверяет ЦПб по сумме и номеру чека, но есть проблема копирования чека (проблема повторной платы). обращается в банк и предъявляет номер чека. Банк проверяет свою ЦП и если она корректная то заносит номер чека в свою БД.
\item На счёт магазина кладётся 100р.
\end{itemize}
Cut-and-Choose Technique.
один делит, а второй выбирает.
\textbf{S-box (S-блок)}
используются в стандарте шифрования и представляют из себя
\[S_{n\times m}-box\]
схема из N входов и M выходов, система их M булевых функциий от N переменных. в DES $S_{6\times 4}$, ГОСТ Магма $S_{4\times 4}$.
\[f_i(x_4, x_3, x_2, x_1), i = 1...4;\]
П\_6
\begin{enumerate}
\item посчитать многочлен Жегалкина (алгебраическая нормальная форма для $f_i(x_4, x_3, x_2, x_1)$)
\[f_i(x_n, ..., x_1) = a_0 \oplus \sum_{i=1}^n a_i x_i \oplus \sum a_{ij}x_i x_j \oplus ... \oplus a_{12...n}x_1 x_2...x_n\]
n = 4. если положим все $х = 0 = а_0$, $а(0, ..., 1) = a_0 \oplus a$. это позволит убедиться, что все функции зависят от всех переменных.
\item найти спектр Уолша-Адамара $\forall f_i$
\[\forall f(x) \to f^{*}{x} = (-1)^{f_x} \]
\[ f^{*}(x) = 2^{-n}\sum z_a \cdot (-1)^{(a, x)} \]
\[ (a, x) = a_1x_1\oplus a_2x_2 \oplus ... \oplus a_nx_n \]
\[ \{z_a\} = \sum_x(-1)^{f(x)\oplus(a,x)} \]
$Z_0$ возможно найти следующим образом: $a = 0000$, поэтому произведение $= 0$, значит это $\sum (-1) ^{f(x)} = 0$.
нужно построить таблицу где будет $a0=15$, и $z0-...$
$z_1 = a_1(=1)(0001 a_4...a_1). (a*x = x_1) = \sum(-1)^{f(x)}$
\item найти статистическую структуру $\forall f_i$
\[ \{\Delta_a \} = 2^{n-1} - ||f(x)\oplus(a,x) ||\]
вес функции (число единиц, которое она принимает на всех наборах). она характеризует насколько функция близка к линейной.
\[ \Delta_0 = 2^3 = ||f(x)|| = 8 - 8 \]
\item посчитать вероятность $P_i$ изменения выходного бита при изменении одного входного бита.
\item посчитать среднее число изменяющихся выходных бит при изменении одного входного бита.
\[M = 0\cdot P_0 + 1\cdot P_1 + ... + 4\cdot P_4\]
\end{enumerate}
\section{Алгоритм блочного шифрования с длиной блока n=128}
Кузнечик (US = AES) Кузьмин-Нечаев
В магме основная структура это петля Фестеля, а в Кузнечике SP-сеть.
Значение параметров
\textbf{Нелинейное преобразование }Вектор превращаем в число и превращаем по подстановке в другое число и затем обратно в вектор. Эта подстановка фиксирована
\[ \pi:Vec_8; \pi' Int_8: V_8 \to V_8 \]
\[ \pi' = (\pi'/0, \pi'/1, ..., \pi'/255): Z_{2^8} \to Z_{2^8} = \{0,1,2,...,255\} \]
\textbf{Линеое преобразование} $l = V_8\to V_{16}$ это декартово произведение.
\[ l(a_{15},...,a_0) = \nabla(148\cdot\Delta(a_{15}) + 32\cdot\Delta(a_{14}) + ... + 148\cdot\Delta(a_{1}) + 1\cdot\Delta(a_{1}))\]
\textbf{Преобразования}
\[ X[k] : V_{128} \to V_{128}; x[k](a) = a\oplus K; k,a \in V_{128} (2) \]
\[ S(a):S(a_{15}||...||a_0) = \pi(a_{15} || ... ||\pi(a_0)) a_i\in V_8 (3)\]
\[ S^{-1}: S^{-1}\cdot S = I \text{тождественно}\]
\[ S^{-1}(a) = \pi^{-1}(a_{15})||...||\pi^{-1}(a_0) (4)\]
\[ R(a):R(a_{15}||...||a_0) = l(a_{15}, ..., a_0) || a_{15} || a_1 (5)\]
\[ l(a) = R^{16}(a) (6)\]
\[ R^{-1}(a) = R^{-1}(a_{15}||...||a_0) = a_{14}||a_{13}||...a|l(a_{14},...,a_0,a_{15}) (7)\]
\[ L^{-1} = (R^{-1})^{16} (a) (8)\]
\[ F[k](a, a_0)=LSX[k](a_1)\oplus a_0, a_1 = (A, B)(9)\]
\textbf{Алгоритм развёртывания ключа}
Получаем 10 ключей из исходного ключа длиной 256
\textbf{Базовый алгоритм шифрования}
Алгоритм зашифрования $E_{K_1...K_{10}}(a) = X[k_{10}]LSX[K_9]...LSX[K_1](a)$
Алгоритм расшифрования $D_{K_1...k_{10}}(a) = X[K_1]S^{-1}L^{-1}X[K_1]...S^{-1}L^{-1}X[K_{10}](a)$
Кузнечик быстрее и лучше ложится на аппаратную основу. Размер блока 128 - это параметр стойкости алгоритма.
\section{Открытое распределение ключей. Шарада Меркля}
R.Merkle - Secure communication over insecure channel изложил протокол.
Два пользователя А и Б. не имеют никакой общей секретной информации, между ними открытый канал. То есть, что делать когда нет ключей. Злоумышленник Ж.
\begin{enumerate}
\item А формирует серию открытых текстов ($10^6$). Зашифровать все эти тексты шифром с энтропией 20 бит, например, DES (размер ключа 56 бит). 20 бит будут информативными, а все остальные возьмём и зашифруем тексты. Они будут называться шарадами Меркля. Шарады Меркля передаются по открытому каналу.
\item Б выбирает шараду и начинает дешифровать методом полного опробования ключей. Должен получить истинный ключ шифрованного текста. Мат ожидание получения такого ключа случайным образом $2^{20}\frac{1}{2^{30}}$.
\item Канал открытый и злоумышленник видит полученный открытый ключ. Пользователь А перебирает все ключи ($10^6$) и находит нужный (по статистическому анализу языка СЕНОВАЛИТР TETRISHONDA).
\end{enumerate}
Работа пользователей А и Б $O(n)$, а злоумышленника $O(n^2)$.
Этой же цели служит трёхэтапный протокол Шамира.
По постановлению №313 Без лицензии можно использовать ключ длиной 56 бит. Как увеличить стойкость? шифровать ключом по ГОСТ (256 бит) но из них различаем только 56 бит и следующие $\delta$ бит, остальные будем полагать нулями. Информативными будут только 56 бит. Шифруем на ключе по ГОСТ. Всё зависит от того, как определено понятие ключа.
Работа пользователей А$O(1)$ и Б $O(2^\delta)$, а злоумышленника $O(2^{\delta+56})$.
\subsection{All or Nothing}
Остаётся вопрос, насколько точно дано определение ключа (просто или однозначно).
Применяется AON (All or nothing) transform. К нему предъявляются следующие требования (свойства):
\begin{itemize}
\item обратимость
\item полиномиальность прямого и обратного преобразования (быстрота)
\item экспоненциальная сложность восстановления ОТ в случае отсутствия хотя бы одного знака псевдотекста
\item случайность (вариативность) преобразования. Чтобы оно не передавало закономерности открытого текста, чтобы противник не строил критерий по знакам псевдотекста.
\end{itemize}
Преобразованный севдотекст шифруем на слабом ключе (с энтропией 56 бит). Для расшифрования нужен метод полного опробования ключей. Возможно оценить трудоёмкость метода полного опробования ключей (для ГОСТ это $2^{256}$) то есть нам нужно перебрать вообще все возможные ключи. Машина может понять, удачно ли расшифрован текст - статистический критерий. При этом нужно расшифровать только часть текста на длину критерия. Идея АОН преобразования заключается в том, чтобы ОТ преобразовать в псевдотекст и в методе полного опробования нужно будет раскручивать на всю длину псевдотекста.
Важно, что AON это не шифрование, а преобразование. Берём блок открытого текста, прибавили вектор полученный из зашифрования на ключе и получили блок псевдотекста. К ключу прибавили столько векторов сколько блоков ОТ, где каждый блок это зашифрованный на некотором известном постоянном ключе псевдоблока с прибавленным индексом. Длина псевдотекста увеличилась на один блок, но блок может быть достаточно большим, соответственно для этого и исходные векторы должны быть большие.
\begin{enumerate}
\item [ГОСТ] Режим простой замены (Electronic code book ECB)
\item [ГОСТ] Режим гаммирования (counter CTR)
\item [ГОСТ] Режим гаммирования с обратной связью по выходу (output feedback OFB)
\item Режим простой замены с зацеплением (Cipher blockchain CBC)
\item Режим гаммирования с обратной связью по шифр-тексту (Cipher feedback CFB)
\item [ГОСТ] Режим выработки имитовставки (Message auth code MAC)
\end{enumerate}
для DES не применяется 2 и 6.
\textbf{Например режим CBC}
Зашифрование
\[c_i = E_K(M_i\oplus C_{i-1}), i=\overline{1, s}\]
\[C_1 = E_K(M_1\oplus C_0) \]
Нужно взять Initial Vector $С_0$
Расшифрование
\[ E_K^{-1} (C_i) = M_i\oplus C_{i-1} \to E_K^{-1}(C_i)\oplus C_{i-1} = M_i \]
\end{document}
% конспект приказа на 1 лист а4 от руки к 4.10
%%% Приказ утверждает состав и содержание мер по обеспечению безопасности персональных данных в системах с использованием средств криптографической защиты информации (СКЗИ) (далее, меры). Устанавливает ответственных за исполнение мер операторов СКЗИ, а также определяет соответствие эксплуатации СКЗИ, документации и требований.
% Документ разделяет защищённость данных на 4 уровня, и предлагает следующие меры
% для 4: организовать режим обеспечения безопасности помещений, в которых размещена информационная система (двери, замки, правила доступа в рабочее и нерабочее время, перечень лиц, имеющих доступ в помещение); обеспечить сохранность носителей персональных данных (хранить съёмные носители в сейфах, вести журналы учёта носителей информации), определить перечень лиц, которым разрешён доступ к персональной информации (разработать соответствующий документ и поддерживать его в актуальном состоянии), использовать СЗИ, прошедшие оценку соответствия требованиям законодательства РФ (для предотвращения атак необходимо получить исходные данные для формирования предположений о векторе атаки, утвердить такой список предположений у руководителя, использовать СКЗИ класса КС1 или выше).
% для 3: СКЗИ класса KB и выше в случаях, когда для информационной системы актуальны угрозы 2 типа; СКЗИ класса КС1 и выше в случаях, когда для информационной системы актуальны угрозы 3 типа.
% для 2: СКЗИ класса КА в случаях, когда для информационной системы актуальны угрозы 1 типа; СКЗИ класса KB и выше в случаях, когда для информационной системы актуальны угрозы 2 типа; СКЗИ класса КС1 и выше в случаях, когда для информационной системы актуальны угрозы 3 типа. обеспечение информационной системы автоматизированными средствами, регистрирующими запросы пользователей на получение персональных данных, а также факты предоставления персональных данных по этим запросам в электронном журнале сообщений; обеспечение информационной системы автоматизированными средствами, исключающими доступ к содержанию электронного журнала сообщений лиц, не указанных в утвержденном руководителем оператора списке; обеспечение периодического контроля работоспособности автоматизированных средств (не реже 1 раза в полгода).
% для 1: СКЗИ класса КА в случаях, когда для информационной системы актуальны угрозы 1 типа; СКЗИ класса KB и выше в случаях, когда для информационной системы актуальны угрозы 2 типа. автоматическая регистрация в электронном журнале безопасности изменения полномочий сотрудника оператора по доступу к персональным данным, создание отдельного структурного подразделения, ответственного за обеспечение безопасности персональных данных, обеспечение периодического контроля работоспособности автоматизированных средств (не реже 1 раза в месяц). оборудовать окна Помещений металлическими решетками или ставнями, охранной сигнализацией или другими средствами, препятствующими неконтролируемому проникновению посторонних лиц в помещения;
%Угрозы 1-го типа актуальны для информационной системы, если для нее в том числе актуальны угрозы, связанные с наличием недокументированных (недекларированных) возможностей в системном программном обеспечении, используемом в информационной системе.
%Угрозы 2-го типа актуальны для информационной системы, если для нее в том числе актуальны угрозы, связанные с наличием недокументированных (недекларированных) возможностей в прикладном программном обеспечении, используемом в информационной системе.
%Угрозы 3-го типа актуальны для информационной системы, если для нее актуальны угрозы, не связанные с наличием недокументированных (недекларированных) возможностей в системном и прикладном программном обеспечении, используемом в информационной системе.
% СКЗИ КС1 применяются для нейтрализации атак без привлечения специалистов в области разработки и анализа СКЗИ, атак вне контролируемого пространства, атак на этапе разработки или модернизации СКЗИ, атак непосредственно на СКЗИ, а именно персональные данные, парольную информацию, программные или аппаратные компоненты СКЗИ; программные или аппаратные компоненты среды функционирования (СФ), включая программное обеспечение BIOS, данные, передаваемые по каналам связи; получение из находящихся в свободном доступе источников информации об информационной системе, в которой используется СКЗИ, а именно: общие сведения, сведения об информационных технологиях, базах данных, АС, ПО, используемых в информационной системе, содержание конструкторской документации на СКЗИ; содержание находящейся в свободном доступе документации на аппаратные и программные компоненты СКЗИ и СФ; общие сведения о защищаемой информации, сведения о каналах связи, все возможные данные, передаваемые в открытом виде, сведения о нарушениях правил, неисправностях и сбоях аппаратных компонентов СКЗИ и СФ. применение находящихся в свободном доступе или используемых за пределами контролируемой зоны АС и ПО, включая аппаратные и программные компоненты СКЗИ и СФ, специально разработанных АС и ПО; использование на этапе эксплуатации в качестве среды переноса от субъекта к объекту (от объекта к субъекту) атаки действий, осуществляемых при подготовке и (или) проведении атаки каналов связи, не защищенных от несанкционированного доступа к информации организационными и техническими мерами; каналов распространения сигналов, сопровождающих функционирование СКЗИ и СФ;
% СКЗИ КС2 применяются для нейтрализации атак из КС1 и не менее чем одной из следующих: проведение атаки при нахождении в пределах контролируемой зоны; проведение атак на этапе эксплуатации СКЗИ на следующие объекты: документацию на СКЗИ и компоненты СФ; Помещения, в которых находится совокупность программных и технических элементов систем обработки данных; получение в рамках предоставленных полномочий, а также в результате наблюдений следующей информации: сведений о физических мерах защиты объектов, сведений о мерах по обеспечению контролируемой зоны объектов, сведений о мерах по разграничению доступа в Помещения; использование штатных средств, ограниченное мерами, реализованными в информационной системе, в которой используется СКЗИ, и направленными на предотвращение и пресечение несанкционированных действий.
% СКЗИ КС3 применяются для нейтрализации атак из КС2 и не менее чем одной из следующих: физический доступ к системам, на которых реализованы СКЗИ и СФ; возможность располагать аппаратными компонентами СКЗИ и СФ.
% СКЗИ КВ применяются для нейтрализации атак из КС3 и не менее чем одной из следующих: атак с привлечением специалистов в области анализа сигналов, и использования недокументированных возможностей прикладного ПО; проведение лабораторных исследований СКЗИ, используемых вне контролируемой зоны; проведение работ по созданию способов и средств атак в научно-исследовательских центрах, специализирующихся в области разработки и анализа СКЗИ.
% СКЗИ КА применяются для нейтрализации атак из КВ и не менее чем одной из следующих: атак с привлечением специалистов в области недокументированных возможностей системного ПО; возможность располагать сведениями, содержащимися в конструкторской документации на аппаратные и программные компоненты СФ; возможность располагать всеми аппаратными компонентами СКЗИ и СФ.

290
03-fpga-lab-01-report.tex Normal file
View File

@ -0,0 +1,290 @@
\documentclass[a4paper,fontsize=14bp]{article}
\input{../common-preamble}
\input{../fancy-listings-preamble}
\input{../bmstu-preamble}
\setcounter{secnumdepth}{4}
\numerationTop
\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{1}{Знакомство с интегрированной системой \\ проектирования Quartus Prime}{Проектирование цифровых устройств на \\ программируемых логических интегральных схемах}{}{С.В. Фёдоров}
\newpage
\thispagestyle{empty}
\tableofcontents
\newpage
\pagestyle{fancy}
\section{Цель}
Реализовать проект управления семафором на базе ПЛИС Intel PSG в САПР Quartus Prime. Получить практические навыки работы в САПР Quartus Prime. Получить представление о базовом маршруте проектирования ПЛИС. Ознакомиться со средствами ввода проекта, его компиляции, анализа и моделирования. Получить навыки применения языка описания аппаратного состава SystemVerilog для описания цифровых схем.
\section{Задачи}
Реализовать проект управления железнодорожным семафором на базе ПЛИС Intel PSG в САПР Quartus Prime.
Семафор работает следующим образом: после прохода поезда загорается красный свет (рис. \hrf{timing:semafor}). Через время $t_1$ красный свет гаснет и загорается желтый. После этого через время $t_2$ в дополнение к желтому загорается зеленый свет. После этого через время $t_3$ желтый свет гаснет и до следующего прохода поезда горит зеленый свет. Времена $t_1 - t_3$ регулируются с внешнего входа. Должно быть реализовано 3 набора времен $t_1 - t_3$. 4е время присутствует в системе, но оно ограничивается следующим проходом поезда через семафор.
\begin{figure}[H]
\begin{tikztimingtable}
line & LHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLH\\
strobe & 3l N(A1)5h 21Ll 5h 4L \\
red & 3h 5h 6H N(A2) 15Ll 5h 4H \\
yellow & 3l 5l 6L 4H N(A3)3H N(A4)8Ll 5l 4L \\
green & 3l 5l 6L 4L 11Hh 5l 4L \\
& 3s N(B1)5s 6S N(B2)4S N(B3)3S N(B4)8Ss 5s 4S \\
\extracode
\makeatletter
\begin{pgfonlayer}{background}
\node [anchor=south east,inner sep=0pt] at (6, -10) {$t_1$};
\node [anchor=south east,inner sep=0pt] at (12, -10) {$t_2$};
\node [anchor=south east,inner sep=0pt] at (16, -10) {$t_3$};
\foreach \n in {1,...,4}
\draw [help lines] (A\n) -- (B\n);
\end{pgfonlayer}
\end{tikztimingtable}
\caption{Временн\'{а}я диаграмма работы семафора}
\label{timing:semafor}
\end{figure}
Входы системы:
\begin{itemize}
\item \code{line} тактовый импульс;
\item \code{strobe} сигнал прохода поезда с активным высоким уровнем;
\item \code{divider[1..0]} двухразрядное двоичное число выбора режима работы семафора.
\end{itemize}
Выходы системы:
\begin{itemize}
\item \code{red} красный;
\item \code{yellow} желтый;
\item \code{green} зеленый.
\end{itemize}
Структурная схема реализации приведена на рис. \hrf{pic:struct}. Модуль \code{dec} реализует двоичный счётчик до 3, который формирует номер состояния системы от 0 до 3. Значение 0 соответствует красному свету, 1 - желтому и так далее. Разрешение счёта (смены состояния) формируется дополнительным счётчиком-делителем, сравнивающим свое значение со значением, поступающим из модуля \code{periodrom}.
Модуль \code{periodrom} реализует ПЗУ, формирующее значения для счетчика-делителя, определяющего моменты переключения состояния. Два младших бита адреса формируются выходом модуля \code{dec}, на который выводится значение счетчика состояния. Два старших бита адреса задаются с входов ПЛИС и определяют выбор одного из четырех наборов времен t1-t3.
Модуль \code{comm} реализует специальный дешифратор двухразрядного двоичного кода, представляющего номер состояния системы в значения на выходных линиях.
\begin{figure}[H]
\centering
\includesvg[width=100mm]{./pics/03-fpga-01-01-struct.svg}
\caption{Структурная схема реализации}
\label{pic:struct}
\end{figure}
\section{Выполнение работы}
По шагам из методического материала был создан проект в САПР Quartus Prime, схема верхнеуровневого модуля имеет вид, представленный на рис. \hrf{pic:top-scheme}
\begin{figure}[H]
\centering
\includegraphics[width=17cm]{03-fpga-01-01-scheme.png}
\caption{Схема верхнего уровня проекта семафора}
\label{pic:top-scheme}
\end{figure}
Далее был создан проект с верхнеуровневым модулем на языке Verilog, проведено моделирование, результаты которого показаны на рис. \hrf{pic:modelsim-first}.
\begin{figure}[H]
\centering
\includegraphics[width=23cm,angle=90]{03-fpga-01-02-first-modelsim.png}
\caption{Результат моделирования базового проекта}
\label{pic:modelsim-first}
\end{figure}
Technology Map Viewer (Post-Fitting) демонстрирует, почему зелёный сигнал срабатывает быстрее (его формирование не создержит дополнительной компбинационной логики, как следствие, временн\'{ы}х задержек).
\begin{figure}[H]
\centering
\includegraphics[width=17cm]{03-fpga-01-02-glitched-modelsim.png}
\caption{Логика формирования выходных сигналов}
\label{pic:comb-logic}
\end{figure}
\section{Индивидуальное задание}
В результате исправления кода модуля \code{dec} и объединения в нём всей логики работы семафора, в Technology Map Viewer (рис. \hrf{pic:tmv}) видно, что все выходы семафора формируются на регистрах.
\begin{figure}[H]
\centering
\includegraphics[width=17cm]{03-fpga-01-03-tmv.png}
\caption{Формирование выходов семафора на регистрах}
\label{pic:tmv}
\end{figure}
Индивидуальным заданием было создание временн\'{ы}х задержек семафора, представленных в таблице \hrf{table:miffile}.
\begin{table}[h!]
\centering
\begin{tabular}{|c|c|c|c|}
\hline
100 & 100 & 30 & 10 \\
\hline
200 & 100 & 50 & 10 \\
\hline
150 & 100 & 30 & 10 \\
\hline
100 & 100 & 50 & 10 \\
\hline
\end{tabular}
\caption{Данные для заполнения файла инициализации памяти}
\label{table:miffile}
\end{table}
\section{Выводы}
В отчётах компилятора (рис. \hrf{pic:reports}) видно, что финальный проект (рис. \hrf{pic:rpt-fin}) задействует на 3 регистра и на 2 логических элемента меньше, чем стартовый (рис. \hrf{pic:rpt-start}).
\begin{figure}[H]
\centering
\begin{subfigure}[b]{0.48\textwidth}
\centering
\includegraphics[width=\textwidth]{03-fpga-01-03-rpt.png}
\caption{Финальный проект}
\label{pic:rpt-fin}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.48\textwidth}
\centering
\includegraphics[width=\textwidth]{03-fpga-01-03-rpt1.png}
\caption{Начальный проект}
\label{pic:rpt-start}
\end{subfigure}
\caption{Отчёты компиляции}
\label{pic:reports}
\end{figure}
Исходные коды проекта представлены в листингах \hrf{src:dec} и \hrf{src:tb} приложения \hrf{appendix:src}, а снимок экрана с результатами Gate-Level моделирования на рис. \hrf{pic:model-fin} приложения \hrf{appendix:modeling}
\newpage
\appendix
\setcounter{secnumdepth}{4}
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Asbuk{subsection}}
\subsection{Исходные коды проекта}
\label{appendix:src}
\begin{lstlisting}[language=Verilog,style=VerilogStyle,caption={Исходный код семафора},label={src:dec}]
module dec
#(m = 8)
(
input logic clk, clr,
input logic [1:0]divider,
output logic red, yellow, green
);
logic [m-1:0] cntdiv;
logic enacnt;
logic [m-1:0] divisor; // divisor interconnection
logic [1:0] contr; // new contr
logic [2:0] colors; // new colors counter
// colors out
assign red = colors[2];
assign yellow = colors[1];
assign green = colors[0];
//ROM from top-level
periodrom b2v_inst2
( .clock(clk),
.address({divider, contr}),
.q(divisor)
);
// count colors
always @ (posedge clk or posedge clr) begin
if (clr) begin
colors <= 3'b100;
end else begin
if (enacnt) begin
case (colors)
3'b100: colors <= 3'b010;
3'b010: colors <= 3'b011;
3'b011: colors <= 3'b001;
default: colors <= 3'b100;
endcase
end
end
end
always_ff @(posedge clk or posedge clr) begin
if (clr) begin
cntdiv <= 0;
end else begin
if (cntdiv == divisor)
cntdiv <= 0;
else
cntdiv <= cntdiv + 1;
end
end
// we don't enable counters, if color is green
always_comb begin
enacnt = ((cntdiv == divisor) && !(colors == 3'b001));
end
always_ff @(posedge clk or posedge clr) begin
if (clr) begin
contr <= 0;
end else begin
if (enacnt) begin
if (contr != 3) begin
contr <= contr + 1;
end
end
end
end
endmodule
\end{lstlisting}
\begin{lstlisting}[language=Verilog,style=VerilogStyle,caption={Исходный код тестового стенда},label={src:tb}]
`timescale 1 ns/1 ns
module semafor_tb();
// Wires and variables to connect to UUT (unit under test)
logic clk, train;
logic [1:0] div;
logic r, y, g;
// Instantiate UUT
dec my_sem(.clk(clk), .clr(train), .divider(div),
.red(r), .yellow(y), .green(g));
// Clock definition
initial begin
clk = 0;
forever #10 clk = ~clk;
end
// Strob and divisor definition
initial begin
div = 0;
train = 0;
repeat (4)
begin
#200 train=1;
#80 train=0;
wait ({r,y,g}==3'b001);
#80 div=div+1;
end
$stop;
end
endmodule
\end{lstlisting}
\subsection{Моделирование финального проекта}
\label{appendix:modeling}
\begin{figure}[H]
\centering
\includegraphics[width=23cm,angle=90]{03-fpga-01-03-modelsim-final.png}
\caption{Результат Gate-Level моделирования}
\label{pic:model-fin}
\end{figure}
\end{document}

426
03-mas-lab-01-report.tex Normal file
View File

@ -0,0 +1,426 @@
\documentclass[a4paper]{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\input{../fancy-listings-preamble}
\numerationTop
\begin{document}
\fontsize{14pt}{14pt}\selectfont % Вполне очевидно, что мы хотим 14й шрифт, все его хотят
\thispagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{Лабораторной работе}{1}{Табулярное Q-обучение игрового агента в Toytext}{Мультиагентные интеллектуальные системы}{}{В.Э. Большаков}
\newpage
\thispagestyle{empty}
\tableofcontents
\newpage
\pagestyle{fancy}
\sloppy
\section{Цель}
Целью работы является разработка мультиагентной интеллектуальной системы на языке программирования Python для игры FrozenLake-v1 с размером карты 8x8. В ходе работы требуется исследовать влияние параметров learning rate, discount factor lambda, total episodes на исход игры. Обосновать выбор лучших параметров. Провести сравнительный эксперимент по определению количества побед и скорости обучения с помощью агента обученного табулярным Q-learning и случайно действующим агентом (random).
\subsection{Описание игры}
Агент управляет движением персонажа в мире, состоящем из сетки. Некоторые плитки сетки являются проходимыми, а другие приводят к тому, что агент падает в ледяную воду и проигрывает. Кроме того, направление движения агента является неопределенным и только частично зависит от выбранного направления. Агент вознаграждается за то, что он нашел путь к цели.
\begin{figure}[H]
\centering
\includegraphics[width=0.4\textwidth]{03-mas-lab-01-frozenLakeScreenshot.png}
\caption{Скриншот игры FrozenLake}
\label{fig:frozenLake}
\end{figure}
\subsection{Легенда}
Наступила зима. Вы и ваши друзья бросали фрисби в парке, и вдруг вы сделали сумасшедший бросок, который отправил фрисби на середину озера. Вода в основном замерзла, но есть несколько мест, где лед растаял. Если вы наступите на одну из этих дыр, вы попадете в замерзшую воду. В настоящее время ощущается нехватка фрисби, поэтому абсолютно необходимо, чтобы вы прошли по льду озера и забрали диск. Однако лед скользкий, поэтому вы не всегда будете двигаться в том направлении, в каком собираетесь.
Поверхность описывается с использованием сетки, как показано ниже:
Для карты размером "4x4":
\begin{verbatim}
[
"SFFF",
"FHFH",
"FFFH",
"HFFG"
]
\end{verbatim}
Для карты размером "8x8":
\begin{verbatim}
[
"SFFFFFFF",
"FFFFFFFF",
"FFFHFFFF",
"FFFFFHFF",
"FFFHFFFF",
"FHHFFFHF",
"FHFFHFHF",
"FFFHFFFG",
]
\end{verbatim}
Где соответствующие символы на карте обозначают следующее:
\begin{itemize}
\item S: начальное положение, безопасная клетка
\item F: замерзшее озеро, безопасная клетка
\item H: прорубь, проигрыш при попадании сюда
\item G: цель, где находится фрисби
\end{itemize}
Эпизод игры завершается, когда вы попадаете в прорубь (проигрыш, награда = 0), либо когда вы добираетесь до фрисби (выигрыш, награда = 1).
\subsection{Понятие среды (Environment)}
Чтобы понять основы импорта пакетов Gym, загрузки среды и других важных функций, связанных с OpenAI Gym, вот пример среды Frozen Lake.
Загрузка среды Frozen Lake:
\begin{lstlisting}[language=Python,style=PyCodeStyle,caption={Блок программы на языке Python}]
import gym
env = gym.make('FrozenLake-v1', desc=None, map_name="4x4", is_slippery=True)
\end{lstlisting}
Далее разберемся, как сбрасывать состояние среды. Пока агент в обучении с подкреплением учится, он многократно повторяет действия и эпизоды обучения. Из-за этого необходимо, чтобы в начале каждого эпизода среда была в начальном состоянии. Сбросить состояние среды можно следующим образом:
\begin{lstlisting}[language=Python,style=PyCodeStyle,caption={Блок программы на языке Python}]
import gym
env = gym.make('FrozenLake-v1', desc=None, map_name="4x4", is_slippery=True)
s = env.reset() print(s)
\end{lstlisting}
\begin{verbatim}
0 #initial state is 0
\end{verbatim}
После совершения какого-либо действия может возникнуть необходимость показать статус агента в среде. Визуализация среды:
\begin{lstlisting}[language=Python,style=PyCodeStyle,caption={Блок программы на языке Python}]
env.render()
\end{lstlisting}
\begin{verbatim}
SFFF
FHFH
FFFH
HFFG
\end{verbatim}
\subsection{Описание среды}
Так как мир игры представляет собой сетку 4х4, существует 16 возможных состояний.
Узнать количество состояний можно так:
\begin{lstlisting}[language=Python,style=PyCodeStyle,caption={Блок программы на языке Python}]
print(env.observation_space)
\end{lstlisting}
\begin{verbatim}
Discrete(16)
\end{verbatim}
Для клетки с дырой во льду предусмотрен штраф 10 очков. Для клетки с целью награда в 100 очков. Для того, чтобы маршруты не были излишне длинными, за каждый переход на соседнюю ледяную клетку существует штраф 1 очко.
\subsection{Описание агента}
У агента есть 4 действия: пойти влево, вниз, направо, вверх. Задача агента дойти до цели, не упав в ледяную воду. Для агента будет лучше, если он сможет дойти до цели наиболее коротким маршрутом.
Посмотреть действия агента:
\begin{lstlisting}[language=Python,style=PyCodeStyle,caption={Блок программы на языке Python}]
print(env.action_space)
\end{lstlisting}
\begin{verbatim}
Discrete(4)
\end{verbatim}
\subsection{Q-обучение игрового агента для FrozenLake-v1}
Q-таблица для агента (для карты размером 4x4) будет иметь 16 строк (по числу возможных состояний в игре) и 4 столбца (по числу доступных агенту действий):
\begin{lstlisting}[language=Python,style=PyCodeStyle,caption={Блок программы на языке Python}]
print("Number of actions : ", env.action_space.n)
print("Number of states : ", env.observation_space.n)
\end{lstlisting}
\begin{verbatim}
Number of actions : 4
Number of states : 16
\end{verbatim}
\subsection{Алгоритм Q-обучения}
Обновление таблицы Q будет происходить по следующей формуле:
\[ Q_{new}(s_t, a_t) = Q(s_t, a_t) + \alpha\cdot(r_t + \gamma\cdot max_aQ(s_{t + 1}, a) - Q(s_t, a_t)) \]
Для обучения будет использована $\varepsilon$-жадная стратегия. Это значит, что агент выбирает свои действия таким образом, что с определенной вероятностью он выберет лучшее действие в данном состоянии среды, в другом же случае ходит случайным образом. Это позволяет найти компромисс между стратегиями исследования среды и использования накопленных знаний.
Например, $\varepsilon$-жадная стратегия может быть реализована так:
\begin{lstlisting}[language=Python,style=PyCodeStyle,caption={Блок программы на языке Python}]
def epsilon_greedy(state, epsilon):
if np.random.uniform(0, 1) < epsilon:
action = env.action_space.sample()
else:
action = np.argmax(Q[state, :])
return action
\end{lstlisting}
Параметр $\varepsilon$ будет уменьшаться для того, чтобы постепенно агент начал делать более обоснованный выбор, вместо случайных действий. Со временем агент достаточно исследует среду, после чего лучше делать самые выгодные действия всё чаще, а случайные всё реже. Пора начать использовать полученную ранее информацию о среде.
\section{Экспериментальная часть}
Выполнение разработанной программы делится на два этапа: этап обучения и этап игры.
В процессе этапа обучения можно включить вывод информации о ходах, принимаемых агентом. Агент может сделать ход в одном из 4 различных направлений, подобные действия в выводе программы выглядят следующим образом:
\begin{figure}[H]
\centering
\begin{subfigure}[b]{0.30\textwidth}
\includegraphics[width=\textwidth]{03-mas-lab-01-initialState.png}
\caption{Начальное}
\label{pic:state-init}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.32\textwidth}
\includegraphics[width=\textwidth]{03-mas-lab-01-rightMove.png}
\caption{После действий агента}
\label{pic:state-after}
\end{subfigure}
\caption{Состояния среды}
\label{pic:states}
\end{figure}
На приведённых рисунках агент осуществляет случайный переход (в данном случае агент осуществляет движение вправо) с целью исследовать окружающую его среду, таким образом агент осуществляет переход из состояния, приведённого на рисунке \hrf{pic:state-init} в состояние \hrf{pic:state-after}.
Агент осуществляет ход вправо и попадает на безопасную клетку, за счёт этого действия происходит обновление матрицы состояний Q, учитывающее штраф в -1 единицу.
По ходу действий агента, он может попасть на клетку проруби и проиграть, тогда обновление матрицы состояний Q учтёт штраф в размере 10 штрафных единиц. Если агнет в результате своих действий попадает на клетку с фрисби, то алгоритм оценивает его действия в 100 поощряющих единиц и обновляет матрицу состояний с учётом данного факта, что приводит к закреплению соответствующих значений в матрице состояний.
После того как алгоритм вернет идентификатор успешного окончания обучения, или число шагов превысит максимальное значение - алгоритм закончит обучение и будет сформирована матрица состояний, являющаяся численным отображением вероятностей на игровой карте. Значения матрицы соответствуют вероятностям победы при нахождении в данной клетке. Каждая клетка отображает 4 вероятности для каждого из направлений, то есть агент всегда делает ход в направлении наибольшей вероятности, что в совокупности приводит его к победе.
Матрица состояний будет иметь следующий вид:
\begin{figure}[H]
\begin{small}
\begin{verbatim}
[[3.72503070e-01 3.72021394e-01 3.73252576e-01 3.72769500e-01]
[3.78044111e-01 3.78190119e-01 3.78897886e-01 3.79553241e-01]
[3.92140099e-01 3.92508656e-01 3.92181150e-01 3.91273172e-01]
[4.10530706e-01 4.10892760e-01 4.09736098e-01 4.19185894e-01]
...
[5.56639598e-02 1.66467536e-01 2.62878380e-01 1.56094241e-01]
[2.80415038e-02 2.08575331e-01 5.97742895e-01 4.83463168e-02]
[0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]
\end{verbatim}
\end{small}
\end{figure}
Каждый элемент отображает вероятность от 0 до 1, определяющее направление победы (направление в сторону максимума вероятности победы).
\subsection{Исследование влияния параметров на исход игры}
Анализ графика \ref{fig:learn_win_rate} показал, что большие значения фактора скорости обучения снижают эффективность обучения, это можно объяснить сильным косвенным влиянием обновления на значения матрицы состояний, не относящийся к текущей ячейке в которой в данный момент располагается агент.
\begin{figure}[H]
\begin{center}
\input{pics/03-mas-lab-01-win_rate-learning_rate.pgf}
\end{center}
\caption{Зависимость относительного числа побед от фактора обучения}
\label{fig:learn_win_rate}
\end{figure}
Анализ графика \ref{fig:gamma_win_rate} позволяет сказать о том, что коэффициент штрафа сильно влияет на относительное значение побед, так как данный фактор определяет насколько сильно агент стремится к сиюминутной награде (локально-оптимальное решение, жадный алгоритм), по сравнению с большой наградой, которую он мог бы получить в результате победы.
\begin{figure}[H]
\begin{center}
\input{pics/03-mas-lab-01-win_rate-gamma.pgf}
\end{center}
\caption{Зависимость относительного числа побед от коэффициента штрафа}
\label{fig:gamma_win_rate}
\end{figure}
По графику \ref{fig:episodes_win_rate} можно сказать, что количество эпизодов обучения в целом не влияет, однако, существует некоторый провал графика в районе 10000 эпизодов обучения, это связано с корректировкой весов матрицы состояния после её выхода на стабильное состояние, другими словами уже скорректированная матрица состояния проходит этап докорректировки, что влечёт за собой повторное изменение значений матрицы, которые уже занимали близкие к требуемым значения. При дальнейшем увеличении эпизодов обучения корректировки не так сильно влияют на матрицу состояния, а элементы матрицы принимают свои требуемые значения.
\begin{figure}[H]
\begin{center}
\input{pics/03-mas-lab-01-win_rate-episodes.pgf}
\end{center}
\caption{Зависимость относительного числа побед от количества итераций обучения}
\label{fig:episodes_win_rate}
\end{figure}
\subsection{Сравнение Q-learning и Random агентов}
Следующим этапом было проведение сравнение агентов, обученных табулярным Q-learning и случайно действующим (random) алгоритмами. В результате сравнения, приведённого в таблицах \hrf{tab:tab_10000} - \hrf{tab:tab_20000}, можно сказать что агент, обученный табулярным алгоритмом показывает большее количество побед, хотя время обучения такого агента выше. Случайно действующий агент не учитывает информацию об окружающей его среде, а основывается исключительно на заученной информации, на тех вероятностях, доставляющих его к цели. В свою очередь агент, обученный табулярным способом учитывает особенности окружающей его среды (например - проскальзывание, которое также имеет вероятностную природу), таким образом при принятии решения агент будет основываться также на предполагаемой вероятности ошибиться, то есть оказаться после выбранного действия в требуемой клетке, даже при наибольшей вероятности благоприятного исхода.
\begin{table}[H]
\centering
\caption{Сравнение табулярного и случайного алгоритмов для 10 000 эпизодов обучения}
\label{tab:tab_10000}
\begin{tabular}{|c|c|c|}
\hline
Эпизоды обучения = 10 000 & Количество побед {[}-{]} & Скорость обучения {[}сек.{]} \\ \hline
Q-learning & 910 & 16.352 \\ \hline
Random & 413 & 11.629 \\ \hline
\end{tabular}
\end{table}
\begin{table}[H]
\centering
\caption{Сравнение табулярного и случайного алгоритмов для 20 000 эпизодов обучения}
\label{tab:tab_20000}
\begin{tabular}{|c|c|c|}
\hline
Эпизоды обучения = 20 000 & Количество побед {[}-{]} & Скорость обучения {[}сек.{]} \\ \hline
Q-learning & 943 & 34.477 \\ \hline
Random & 368 & 20.272 \\ \hline
\end{tabular}
\end{table}
\section{Выводы}
По результатам лабораторной работы можно сделать следующие выводы:
\begin{itemize}
\item Увеличение фактора скорости обучения негативно сказывается на относительном проценте побед.
\item Увеличение коэффициента штрафа оказывается положительную динамику на относительное число побед.
\item Число обучающих эпох не оказывается существенного влияния на относительную величину побед.
\item Агент, обученный табулярным алгоритмом показал большую приспособленность к изменчивым факторам окружающей среды.
\item Агент, обученный случайным алгоритмом обучился быстрее, но процент побед оказался меньше.
\end{itemize}
\newpage
\appendix
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Alph{subsection}}
\subsection{Полный листинг программы}
\label{appendix:fulls}
\begin{lstlisting}[language=Python,style=PyCodeStyle,caption={Полный код программы на языке Python}]
import gym
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import time
def calculation(episodes, learn_rate, gamma):
environment = gym.make('FrozenLake-v1', map_name="8x8",
is_slippery=True)
environment.reset()
qtable = np.zeros((environment.observation_space.n, environment.action_space.n))
epsilon_decay = 1 / episodes
epsilon = 1.0
max_step = 1000000
epsilon_final = 0.0001
start_time = time.time()
for _ in range(episodes):
state = environment.reset()[0]
done = False
step = 0
# Until the agent gets stuck in a hole or reaches the goal, keep training it
while not done and step < max_step:
# Generate a random number between 0 and 1
rnd = np.random.random()
# If random number < epsilon, take a random action
if rnd < epsilon:
action = environment.action_space.sample()
# Else, take the action with the highest value in the current state
else:
action = np.argmax(qtable[state])
# Implement this action and move the agent in the desired direction
new_state, reward, done, info, res = environment.step(action)
# Update Q(s,a)
qtable[state, action] = qtable[state, action] + \
learn_rate * (reward + gamma * np.max(qtable[new_state]) - qtable[state, action])
# Update our current state
state = new_state
step += 1
# Update epsilon
epsilon = max(epsilon - epsilon_decay, epsilon_final)
print("--- %s seconds ---" % (time.time() - start_time))
episodes_win = 100
nb_success = 0
print(qtable)
# Evaluation
for _ in range(episodes_win):
state = environment.reset()[0]
done = False
# Until the agent gets stuck or reaches the goal, keep training it
while not done and step < max_step:
# Choose the action with the highest value in the current state
action = np.argmax(qtable[state])
# Implement this action and move the agent in the desired direction
new_state, reward, done, info, res = environment.step(action)
# Update our current state
state = new_state
# When we get a reward, it means we solved the game
nb_success += reward
step += 1
# Let's check our success rate!
print(f"Success rate = {nb_success / episodes_win * 100}%")
print("win = ", nb_success)
print("lose = ", episodes_win - nb_success)
return nb_success / episodes_win * 100
learning_rate = [0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5]
win_rate_learning_rate = []
total_episodes = [5000, 10000, 20000, 30000, 40000, 50000, 60000]
win_rate_total_episodes = []
gamma_total = [0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 0.99]
win_rate_gamma_total = []
for gamma in gamma_total:
result = calculation(10000, 0.1, gamma)
while result < 0.1:
result = calculation(10000, 0.1, gamma)
win_rate_gamma_total.append(result)
print(gamma_total[win_rate_gamma_total.index(max(win_rate_gamma_total))])
max_gamma = gamma_total[win_rate_gamma_total.index(max(win_rate_gamma_total))]
for rate in learning_rate:
result = calculation(10000, rate, max_gamma)
while result < 0.1:
result = calculation(10000, rate, max_gamma)
win_rate_learning_rate.append(result)
print(learning_rate[win_rate_learning_rate.index(max(win_rate_learning_rate))])
max_learning_rate = learning_rate[win_rate_learning_rate.index(max(win_rate_learning_rate))]
for episodes in total_episodes:
result = calculation(episodes, max_learning_rate, max_gamma)
while result < 0.1:
result = calculation(episodes, max_learning_rate, max_gamma)
win_rate_total_episodes.append(result)
matplotlib.use("pgf")
matplotlib.rcParams.update({
"pgf.texsystem": "pdflatex",
'font.family': 'serif',
'text.usetex': True,
'pgf.rcfonts': False,
})
plt.title('win_rate (learning_rate)')
plt.xlabel('learning_rate [-]')
plt.ylabel('win_rate [%]')
plt.grid(True)
plt.plot(learning_rate, win_rate_learning_rate)
plt.show()
plt.savefig('win_rate (learning_rate).pgf')
plt.title('win_rate (gamma)')
plt.xlabel('gamma [-]')
plt.ylabel('win_rate [%]')
plt.grid(True)
plt.plot(gamma_total, win_rate_gamma_total)
plt.show()
plt.savefig('win_rate (gamma).pgf')
plt.title('win_rate (total)')
plt.xlabel('episodes [count]')
plt.ylabel('win_rate [%]')
plt.grid(True)
plt.plot(total_episodes, win_rate_total_episodes)
plt.show()
plt.savefig('win_rate (episodes).pgf')
\end{lstlisting}
\end{document}

114
03-mas-lab-02-report.tex Normal file
View File

@ -0,0 +1,114 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\input{../fancy-listings-preamble}
\begin{document}
\pagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{1}{Разработка программы «Глубокое Q-обучение игрового агента Atari»}{Мультиагентные интеллектуальные системы}{}{Большаков В.Э.}
\newpage
\tableofcontents
\newpage
\section{Цель работы}
\section{Задание}
\section{Работа и результат}
\section{Выводы}
\newpage
\appendix
\setcounter{secnumdepth}{3}
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Asbuk{subsection}}
\subsection{Перевод оригинальной статьи Model dynamics}
Чтобы сделать Ваше ожидание не таким скучным, наш код сохраняет лучшие веса модели. В файле \code{/03_dqn_play.py} у нас есть программа, которая может загрузить этот файл модели и сыграть один эпизод, отображая динамику модели. Код очень простой, но наблюдение за тем, как несколько матриц с миллионом параметров играет в пинг-понг с нечеловеческой точностью, глядя только на пиксели, может показаться магией.
\begin{lstlisting}[language=Python,style=PyCodeStyle]
import gym
import time
import argparse
import numpy as np
import torch
from lib import wrappers
from lib import dqn_model
DEFAULT_ENV_NAME = 'PongNoFrameskip-v4'
FPS = 25
\end{lstlisting}
В самом начале мы импортируем уже знакомые PyTorch и Gym модули. Параметр FPS устанавливает примерную скорость демонстрируемых фреймов.
\begin{lstlisting}[language=C,style=CCodeStyle]
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-m', '--model', required=True, help='Model file to load')
parser.add_argument(
'-e', '--env', default=DEFAULT_ENV_NAME,
help=f'Environment name to use, default={DEFAULT_ENV_NAME}')
parser.add_argument(
'-r', '--record', help='Directory to store video recording')
parser.add_argument(
'--no-visualize', default=True, action='store_false', dest='visualize',
help='Disable visualization of the game play')
args = parser.parse_args()
\end{lstlisting}
Скрипт принимает имя файла сохранённой модели и позволяет уточнить Gym-окружение (конечно, модель и окружение, должны соответствовать). В дополнение, возможно передать ключ \code{-r} с именем несуществующей директории, которая будет использована для сохранения видео Вашей игры (используя обёртку монитора). По умолчанию, скрипт просто показывает кадры, но если, например, нужно загрузить видео игры на YouTube, ключ \code{-r} может оказаться полезен.
\begin{lstlisting}[language=Python,style=PyCodeStyle]
env = wrappers.make_env(args.env)
if args.record:
env = gym.wrappers.Monitor(env, args.record)
net = dqn_model.DQN(env.observation_space.shape, env.action_space.n)
net.load_state_dict(
torch.load(args.model, map_location=lambda storage, loc: storage))
\end{lstlisting}
Код выше должен быть понятен без комментариев: мы создаём окружение и модель, затем загружаем веса из файла, путь до которого передан в аргументах.
\begin{lstlisting}[language=C,style=CCodeStyle]
state = env.reset()
total_reward = 0.0
while True:
start_ts = time.time()
if args.visualize:
env.render()
state_v = torch.tensor(np.array([state], copy=False))
q_vals = net(state_v).data.numpy()[0]
action = np.argmax(q_vals)
\end{lstlisting}
Это почти точная копия метода \code{play_step()} класса \code{Agent} из тренировочного кода без выбора эпсилон-жадной стратегии. Мы просто передаём наши наблюдения агенту и выбираем действие с максимальной наградой. Единственное, что здесь есть нового, это метод \code{render()} в окружении, который является стандартным способом в \code{Gym}, чтобы показать текущие наблюдения (для этого понадобится GUI).
\begin{lstlisting}[language=C,style=CCodeStyle]
state, reward, done, _ = env.step(action)
total_reward += reward
if done:
break
if args.visualize:
delta = 1/FPS - (time.time() - start_ts)
if delta > 0:
time.sleep(delta)
print(f'Total reward: {total_reward:.2f}')
\end{lstlisting}
Остальной код также примитивен, мы передаём действие окружению, считаем конечную награду и останавливаем цикл, когда заканчивается эпизод.
\subsection{Перевод оригинальной статьи Deep Q-Learning Agent}
Исследователи обнаружили много советов и приемов для того, чтобы сделать DQN обучение более стабильным и эффективным. Однако основа, позволяющая \code{DeepMind} успешно обучить DQN на наборе из 49 игр Atari и продемонстрировать эффективность этот подход применялся к сложным средам. Оригинальная бумага (без мишени
сети) был опубликован в конце 2013 года (Игра в Atari с Deep Reinforcement
Изучаем 1312.5602v1, Mnih и др.), а для тестирования использовали семь игр. Потом,
в начале 2015 года была опубликована исправленная версия статьи с 49 различными играми.
опубликовано в Nature (Контроль на уровне человека с помощью глубокого обучения с подкреплением
doi:10.1038/nature14236, Mnih и др.) Алгоритм для DQN из предыдущего
бумаги имеет следующие этапы:
\end{document}

View File

@ -0,0 +1,105 @@
\documentclass[russian]{beamer}
\usepackage[russian]{babel}
\usepackage{fontspec}
\usepackage{svg}
%\setbeamertemplate{note page}{\pagecolor{yellow!5}\insertnote}
%\setbeameroption{show notes on second screen=right}
\logo{\includesvg[height=1cm]{pics/03-mmt-lab-01-bmstu.svg}}
\usefonttheme{serif}
\usetheme[width=3\baselineskip]{Berkeley}
\usecolortheme{seahorse}
\setmainfont{IBM Plex Sans}
\title{Мультимедиа технологии в корпоративных информационных системах}
\author{И.И. Овчинников}
\institute[МГТУ]{МГТУ им. Н.Э. Баумана}
\date{2022}
\begin{document}
\frame{\titlepage}
\note{Мультимедиа технологии в корпоративных информационных системах}
\section{Введение}
\begin{frame} \frametitle{Мультимедиа}
\begin{block}{Термины}
\textbf{Мультимедиа} (англ. multimedia) — данные, или содержание, которые представляются одновременно в разных формах: звук, анимированная компьютерная графика, видеоряд.
\textbf{Мультимедиа} — это современные компьютерные технологии, позволяющие объединить в программно-аппаратной системе различные типы мультимедиа данных (изображения, звук, видео, тактильные ощущения и т. д.) для создания единой информационной среды в целях воздействия через органы чувств на восприятие человека.
\end{block}
\end{frame}
\note{Однозначного определения термина ММ не существует, однако все определения сводятся к тому, что мультимедиа - это технология одновременного воздействия на множество органов чувств и восприятие человека. Мультимедийность обычно связывают с компьютерной техникой, но воздействовать на органы чувств человека возможно не только с помощью неё}
\begin{frame} \frametitle{Информационные системы}
\begin{block}{Термины}
Корпоративная Информационная Система — это автоматизированная система, предназначенная для комплексной автоматизации всех видов хозяйственной деятельности компаний, а также корпораций, требующих единого управления
\end{block}
% \begin{examples}
% \end{examples}
\end{frame}
\note{корпоративная информационная система - это масштабируемая система управления крупными, часто территориально рассредоточенными предприятиями, имеющими несколько уровней управления, построенная посредством интегрированных информационных технологий и систем}
\section{Существующие решения}
\begin{frame} \frametitle{Задачи информационных систем}
\begin{itemize}
\item бухгалтерский учет;
\item финансовое планирование и финансовый анализ;
\item управление договорными отношениями;
\item расчеты с поставщиками и покупателями;
\item многое другое...
\end{itemize}
\end{frame}
\note{Корпоративные информационные системы решают задачи: бухучёт, финансовые и другие планирования, управление закупками и продажами; анализ рынка; управление себестоимостью; и кадрами. Среди выполняемых задач есть и задачи требующие мультимедийности, например, проведение ежедневных стендапов команды}
\begin{frame} \frametitle{Системы ведения электронных архивов EDMS}
\begin{block}{Термины}
EDMS - Electronic Document Management System - специализированная система управления электронными документами.
\end{block}
В отличие от простой базы данных электронный архив позволяет хранить один и тот же документ в нескольких представлениях.
\end{frame} \note{системы управления электронными документами представляют собой базу данных гипертекстовых документов. Документы могут быть текстовыми, графическими, видео, звуковыми и другими файлами, подготовленными в разных приложениях. В отличие от простой базы данных электронный архив позволяет хранить один и тот же документ в нескольких представлениях. Кроме того, на каждый документ может быть заведена учетная карточка, содержащая название документа, имя автора, ключевые поля и т.д}
\begin{frame} \frametitle{Приложения реального времени}
\begin{itemize}
\item видеоконференции
\item прослушивание аудиоматериалов;
\item просмотр видеоматериалов;
\item прочее.
\end{itemize}
\end{frame} \note{() требует при построении интрасети использования ATM-технологии. Необходимость в многофункциональных интегрированных сетях возникла с появлением мультимедиа приложений и приложений с голосовой телефонией. Такая сеть дешевле, ибо она заменяет три отдельные сети для голоса, видео и цифровых данных корпорации. Одной из систем, реализующей многофункциональную интегрированную сеть, является система Bay SIS компании Bay Networks}
\begin{frame} \frametitle{Системы видео-конференц связи}
\end{frame} \note{С помощью нее удается проводить конференции, вести переговоры, семинары, лекции.
Подобная система активного общения двух и больше абонентов удаленных друг от друга
очень удобна. При этом между участниками беседы возможно ведение диалога, обмен
аудиовизуальной информацией в режиме реального времени.
Современные ВКС уникальны, ведь для создания условий по принятию правильного и
рационального решения при минимальном количестве времени на раздумья. А учитывая
изменчивость в бизнес-сфере такая реакция обязательна. Это касается бизнеса,
государственных и силовых структур}
\begin{frame} \frametitle{Интерактивные и мультимедийные системы обучения}
\end{frame} \note{}
\begin{frame} \frametitle{Величина рынка развития мультимедиа в корпоративном секторе}
\end{frame} \note{}
\section{Пути развития}
\begin{frame} \frametitle{Применение в КИС AR/VR}
\end{frame} \note{}
\begin{frame} \frametitle{Применение систем для контроля логистики}
\end{frame} \note{}
\begin{frame} \frametitle{Применение мультимедиа в обучении}
\end{frame} \note{}
\begin{frame} \frametitle{Интеграция КИС и интернета вещей}
\end{frame} \note{}
\section*{Выводы}
\begin{frame} \frametitle{Выводы}
\end{frame} \note{}
\begin{frame} \frametitle{Спасибо за внимание}
\end{frame}
\end{document}

View File

@ -0,0 +1,339 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\input{../fancy-listings-preamble}
\author{Алфимцев Александр Николаевич}
\title{Мультиагентные интеллектуальные системы}
\date{2022-09-05}
\begin{document}
\maketitle
\tableofcontents
\section{Лекция 1}
по числителям
RL, MARL
\section{Лекция 2}
\subsection{Dynamic Programming}
семейство алгоритмов исп для вычисления оптимальных стратегий при условии что имеется идеальная модель окружающей среды в виде MDP. в управлении это решение задачи через решение меньших подзадач.
уравнение оптимальности Беллмана. недостаточно понять в каком мы состоянии, надо ещё понять что делать в этом состоянии. алгоритмы получаются преобразованием уравнений бэллмана в правила поведения.
Весь РЛ можно условно разбить на задачи управления и задачи предсказания.
\begin{enumerate}
\item оценивание стратегии или состояния. оценку мы делаем до некоторого порога и с некоторой точностью, это называется итеративным оцениванием стратегии.
\item важно что за шаг нужно не только поощрять, но и наказывать за неверный выбор
\item теорема получения стратегий. идея в том чтобы понимать не только награду, но и будущие награды на каждом этапе. более оптимальные стратегии должны быть не хуже, чем текущая выбранная стратегия. если мы смогли улучшить стратегию, значит мы можем пересчитать ценности следующих шагов и получить ещё более хорошую стратегию. это называется итерацией по стратегиям
\item стратегия стабилизируется если является жадной для текущей системы ценностей, а ценности стабилизируются когда мы подобрали оптимальную стратегию
\end{enumerate}
не очень хорошо подходит для больших алгоритмов, несмотря на сложность О(н+к). эти методы обычно работают в 100 раз быстрее линейных алгоритмов.
\subsection{monte-carlo}
антагоничны ДП. не говорим о среде, а есть группа методов, которые усредняют опыт. хорошо подходит об эпизодических алгоритмов. в некотором роде инкрементны. термин означает более широкий класс алгоритмов в которых присутствует значимый случайный компонент.
обучается на эпизодах. любое действие это замаскированное обучение. состояния оцениваются также, а потом награды усредняются. чтобы улучшить стратегию мы делаем её жадной относительно текущей ценности.
алгоритм стремится к идеальному алгоритму, но его не достигает. усреднённая оценка нужна для подсчёта совместных действий. Если действие не даёт результата - мы не получим никакой информации.
\subsection{Temporal Difference}
выполняет обновление старой оценки ценностей до новой оценки ценностей. делается для максимизации выгоды от цели. МК всегда стремится толкьо вверх, а ТД может меняться в зависимости от текущих предсказаний.
один из видов - Q-обучение, алгоритм SARSA
Существует проблема переоценки, для решения придумали алгоритм двойного обучения. всё это будет табличное обучение с различными эвристиками. Если есть модель среды мы можем значительно улучшить все возможные решения. но если среда динамическая - это смерть модельных алгоритмов.
Есть возможность решить практическую любую задачу полным перебором древа решений (брутфорс). если мы идём только в глубину - это монтекарло.
\subsection{RL обучение с моделью}
\subsection{Теория игр в мультиагентном обучении с подкреплением}
\begin{itemize}
\item поиска экстремума стратегий
\item
\item
\end{itemize}
Совокупность математических методов нахождения оптимальных стратегий в играх. Под игрой понимается роцесс в котором один или несколько акторов достигают цели. Сточки зрения машинного обучения ТИ это матрица. Дилемма заключённого. Алгоритм может получиться жадным, трусливым, агрессивным, в зависимости от того, какие коэффициенты получатся в таблице взаимодействия агентов. Вопрос выбора стратегии ``довериться или обмануть''. Вступает в силу равновесие Нэша.
РН - это состояние в котором несколько игроков находят действие, и знают, что отклонение не принесёт ни им ни партнёру выгоды, и знают, что если партнёр отклонится - таже не будет достигнут профит. Movie: Beautiful mind.
Замена Q-таблиц - это матрицы (Матричные игры). Стохастические игры - это пространственные методы решения таких задач.
Один из первых алгоритмов - алгоритм частотного максимума Ку-значений, подсчитывал частоту получения максимальной награды при выполнении определённого действия. Помогал найти максимально полезное действие для мультиагентных систем.
Конечный автомат в обучении заменял Ку-обучение, и первая попытка перейти от матриц к стохастическим играм.
Созависимое обучение - первый алгоритм joint action Learning - каждый агент смотрит не на отдельные действия, а на результат именно совместных действий, самый простой - это минимакс. Количество состояний-действий увеличивается экспоненциально от количества агентов. Подход интуитивного решения был возможен к использованию только если не было необходимости кооперации агентов.
Матричная игра - это кортеж (н,а1,...,аи,р1,...,ри) где н - количество агентов, а - множество действий итого агента, р - функция наград итого агента.
Необходимо найти действие, приводящее к макимальной награде. Также применима игра с нулевой суммой. стратегия считается лучшей если совокупность наград лучше чем при предыдущей принятой стратгии. Равновесие Нэша в матричной игре - это множество оптимальных стратегий. В системе оптимальные индивидуальные стратегии приводят к совместному провалу. улучшение результата одного ухудшит результат другого - это оптимальность по Парето. Часто совпадает с равновесием Нэша.
Рациональный алгоритм - способный сходиться к стратегии, отвечающей лучше всего стратегиям других агентов, которые во время обучения сходятся к стационарным стратегиям. Алгоритм обладает свойством сходимости в том случае, если стратегия обучаещегося агента обязательно сходится к стационарной стратегии. Стационарная стратегия это такая стратегия, которая не изменяется со временем.
Если все агенты пришли к стационарной стратегии, то система приходит к MDP. Пространство действий уменьшается со временем, также улучшается стратегия. Алгоритм PHC развили до Win or learn fast WoLF-PHC, алгоритм обладает свойством сходимости, заставляющем учиться быстрее. При добавлении параметра сходимости агенты меняют поведение не более оптимальное.
Марковский процесс принятия решений - это много сотояний и один агент. Стохастические игры - это соединение МДП и матричных игр.
Стохастическая игра - классифицируется на полностью кооперативные, конкурентные, игра с общей суммой. расширяет Ку-обучения. Использование совместных действий агентов. Введение понятия Нэш-Ку - это ожидаемая сумма дисконтированных наград при условии что все агенты следуют равновесной стратегии Нэша. Обновление Ку-значений зависит от действий всех агентов. Матрицы наград получаются после каждого шага суммированием всех матриц всех агентов.
Часто ставят знак равенства между теорией игр и машинным обучением.
\newpage
\section{Нейросетевое обучение мультиагентных систем}
\begin{itemize}
\item IQL - независимое ку-обучение, но не с таблицей, а с нейросетью
\item CDQN - центральное (централизованное) обучение (проигрывает децентрализованным системам).
\item VDN - представитель класса рекуррентных нейросетей.
\item MADDPG - полиси градиент, потом добавили детерминистик итд. максимально прощающая ошибки сеть.
\end{itemize}
Успехи такого обучения связаны с развитием нейросетей. Нейросеть - это простые компьютерные процессоры обработки данных, объединённые по принципу биологической.
Применяются глубокое обучение DL, получается глубокое обучение с подкреплением DRL. для аппроксимации оптимальных стратегий агентов или ценностей нейросети. Мультиагентное обучение применяет несколько приёмов:
\begin{itemize}
\item прямая коммуникация
\item дистилляция стратегий
\item разделение параметров
\item моделирование оппонента
\item и другие
\end{itemize}
Коммуникация между агентами возникла совсем недавно, обычно рассматриваются независимые. Решают задачи координации. Агентов мотивируют к коммуникации. Начинается всё с Табула Раса (ничего незнающих) агентов, и агенты нашли способ общаться (трёхслойный отправитель, четырёхслойный получатель).
Классика мультиагентного обучения - это развитие централизованного обучения - ЦО с децентрализованным исполнением. Информация в таком алгоритме при исполнении удаляется. Агент таким образом может моделировать как поведение врага так и друга (DRON). алгоритм много щадействовал из теории игр, но многое задавалось в ручную. в глубоком обучении всё ещё также применяется табулярное обучение, но стараются минимизировать и заменять на нейросети. Идея толерантности заключается в том, что никакой агент не знает, имеет ли смысл взаимодействовать с другими агентами. Так предлагается исправить проблему затенения действий (сверхобобщение) когда мы не понимаем что делаем, но награда кортежу агентов приходит (ничему не учимся) - это обратная проблема переобучения, стараемся уменьшить шум от неоптимальных стратегий агентов.
недостаток алгоритмов основанных на толерантности - излишний оптимизм. Вводят гистерезис, который позволяет улучшить мультиагентное взаимодействие. гистерезисное обучение позволяет даже деградацию локальной стратегии ради общей награды.
Централизованное обучение подвержено ограничениям, поэтому нужно декомпозировать. Qmix показал себя в этом лучше всего.
\subsection{IQL}
в современных алгоритмах глубокого обучения добавляется нелинейная аппроксимация максимизации функции наград и минимизации функции потерь с помощью нейронной сети. Параметров нейросети намного меньше, чем комбинаций состояний-действий при табличном способе.
Алгоритм независимого глубокого обучения с использованием полносвязной нейронной сети IQN, основан на алгоритме DQN. главные инновации:
\begin{itemize}
\item глубокие нейросети;
\item использование буфера воспроизведения;
\item целевая нейросеть.
\end{itemize}
Основан на алгоритме вычислении ценности. При обучении с подкреплением есть ряд ограничений в доказательной базе и нестабильность обучения. В обучении с учителем есть идеальный вариант, здесь же есть набор из состояний-действий-реакций-сред, на выборке из которого производится обучение. Алгоритм реализует идею независимого обучения, то есть у каждого агента обинаковые нейросети внутри.
\subsection{CDQN}
\section{Эволюционное обучение}
Генетические алгоритмы. Машинное обучение (МО) может быть использовано с оптимизацией, а не только МО и оптимизация сами по себе.
Эволюция - это необратимое развитие за счёт постепенного изменения материи. ЭА могут быть использованы в МО. Алгоритмов довольно много, но иногда их путают с nature-inspired.
\begin{itemize}
\item InGA
\item CoE - КоЭволюция
\end{itemize}
Для мультиагентных задач первый генетический алгоритм обучал за 300 поколений агентов в мире из 1000 измерений.
есть также алгоритм работающий по принципу иммунной системы, удаляя неэффективных агентов специальными клетками-лейкоцитами.
В 2017 алгоритм IS инвариантен к частотности действий, легко распараллеливался, на момент создания был самым эффективным.
Эволюционная теория игр Replicator Dynamics.
\subsection{Нейроэволюция}
Любое обучение где задействуется или нейросеть или генетический алгоритм. В отличие от обучения с учителем нужна только оценка среды в момент времени. Противопоставляют градиентному спуску в глубоком обучении. Функция награды заменяется на фитнес-функцию.
Генетический Алгоритм - это эвристический алгоритм поиска используемый для решения задач оптимизации путём случайного подбора комбинирования и вариации искомых параметров с использованием принципов биологической эволюции.
Если агент воскрешается в следующем поколении то он считается успешным и эволюционирует дальше, если нет то просто умирает. Генетический алгоритм направляется функцией приспособленности в сторону оптимального решения путём назначения истории некоторого оценочного скалярного значения.
\appendix
\setcounter{secnumdepth}{2}
\setcounter{tocdepth}{2}
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Asbuk{subsection}}
\subsection{Семинар 1 (2022-09-06)}
Expectation-Maximization Algorithm. Алгоритм используется для нахождения оценок максимального правдоподобия параметров там, где модель зависит от ненаблюдаемых скрытых или скрытых переменных
\subsection{Семинар 2 (2022-09-27)}
0.4
Разработка нового мультиагентного окружения
- быть как джим путём максимального переиспользования джима
- стандартизировать своё решение
- сделать универсальный АПИ - много агентов
- агенты могут умирать и создаваться
- в каждом эпизоде среды могут участвовать разные агенты
- удобно для начинающих
- изменяемый апи
описаны бенефиты моделирования окружений для АПИ
описаны проблемы состояния гонки когда например два участника одновременно анализируют среду, один ходит а анализ второго сразу становится неактуальным, это особенно очевидно когда мы находимся в среде преследователя
\subsection{Семинар 3 (2022-10-11)}
Теория игр. Действия можно называть стратегиями
Оценка рациональности аудитории. написать число ближайшее к половине среднего арифместического.
Игра в мафию Ч Мф Мн. Ночь
Мн слева, Мф сверху
\begin{tabular}{|c|c|c|}
\hline
& Мф & Ч \\
\hline
Мн & Ч & Мф \\
\hline
Ч & Мн & = \\
\hline
\end{tabular}
\[S_{Mf} = \{Mn,Ch\}\]
\[S_{Mn} = \{Mf,Ch\}\]
Смысл как в дуэли трёх лиц треугольник A0.9 -- B0.9 -- C0.01; сильные понимают угрозу от сильных и в итоге выигрывает слабейший. Важно, что игры такого рода играются один раз, то есть никакого сетапа быть не может и мы ничего не знаем о решении других участников. По парето доминирует итог, когда оба выигрывают, но это нужна предварительная кооперация. хотя предпочтительное поведение - признаваться.
\textbf{Игра в нормальной форме}
Ограниченное число игроков.
Множество стратегий каждого игрока.
Профиль стратегий - это декартово произведение всех стратегий. (все возможные комбинации всех элементов множества)
\textbf{Доминирующая стратегия.}
Стратегия игрока считается слабо доминирующей, если вне зависимости от того как поступают другие игроки получаемая выгода лучше других вариантов. Рациональные игроки не пользуются стратегиями над которыми идёт доминация. В начальной игре Равновесие Нэша достигается когда все люди напишут единицу. Но вопрос в том, насколько далеко мы предполагаем, что зайдут все остальные. В группе вышло число 12,5.
\textbf{Равновесие Нэша}
Множество игроков
Множество стратегий
Функция выгоды (декартово произведение множества стратегий)
По нэшу доминирует не стратегия, а исход.
Исход называется равновесием Нэша если для любого игрока и для любой стратегии выполняется выгода игрока при выборе стратегии при том что никто не изменит свою стратегию будет больше выгоды любой другой стратегии.
Иногда в Нэша может входить и слабая стратегия (Олигополия Бертрана).
Две фирмы выпускают однородный продукт. фирмы не кооперируют. предельные издержки фирм одинаковые.цена выбирается независимо и одновременно.
Когда мы выбираем продавать по себестоимости - мы выходим в 0 и эта стратегия не лучше любой другой стратегии. Равновесие нэша достигается в точке себестоимости. Олигополия - это неразрешимость в которой компании конкурируют и нацелены на получение прибыли - они работают за себестоимость и не получают выгоды.
\subsection{Семинар 4 (2022-10-25)}
\subsection{Лабораторная работа 1}
\href{https://drive.google.com/drive/folders/1KoUxtNMcKU__8GqzRT-gRPZoTO-Scc-6}{GDrive}
\subsubsection{Введение в обучение с подкреплением}
Считается, что обучение с подкреплением сформировалось из трёх основных направлений:
\begin{enumerate}
\item обучение путём проб и ошибок: торндайк и кошки, павлов и собаки пытались путём системы вознаграждений добиться нужного поведения;
\item задача оптимального управления: динамическое программирование, марковский процесс принятия решений, уравнение Беллмана;
\item обучение на временн\'{ы}х разностях.
\end{enumerate}
Объединение идей было произведено Барто и Саттоном, в 1992 алгоритм впервые победил человека в нарды, были сделаны первые попытки игры в шахматы и го. С 2013 выделяют самый активный рост по четырём направлениям:
\begin{itemize}
\item алгоритмы - backpropagation, CNN, LSTM;
\item вычислитеьные ресурсы - закон Мура, GPU;
\item данные - ImageNet и другие;
\item инфраструктура - Linux, git, AWS, другие облачные решения.
\end{itemize}
Основными толчками к развитию считаются
\begin{itemize}
\item [2012] Deep Learning: AlexNet $\to$ LeNet
\item [2013] Reinforcement Learning (обучение с подкреплением): DQN $\to$ Q-Learning (по сути, ничего нового, наращивается инфраструктура).
\itemо17] DeepMind (побеждает atari, го, шахматы, SC2), OpenAI (создают RL toolkit, побеждают в Dota2, развивают направление robo-hands)
\end{itemize}
\begin{frm}
\textbf{OpenAI Gym} - набор сред для обучения с подкреплением и исследований.
\end{frm}
В 2017 MIT включили обучение с подкреплением в топ10 прорывных технологий, описана проблема конструктивной возможности но программной недостаточности
Обучение бывает:
\begin{itemize}
\item обучение с учителем это отличать одно от другого
\item обучение без учителя это классификация и кластеризация
\item обучение с подкреплением - это некоторый вход в ИИ
\end{itemize}
На примере игры в пинг-понг
\begin{itemize}
\item в обучении с учителем - нужен датасет (по сути, нужно заставить человека играть несколько часов), долго, дорого, ИИ не сможет превзойти человека, потому что человек составляет разметку нейросети, изобрести новое невозможно, есть разметка правильных ответов и готовый датасет;
\item обучение с подкреплением - применяется в задачах где требуется оптимизировать последовательности решений в неопределённых обстоятельствах, нужна только среда для взаимодействий, без разметки, только сигнал для подкрепления - хорошо/плохо.
\end{itemize}
\subsubsection{Агент и окружающая среда}
\begin{itemize}
\item агент взаимодействует со средой получая информацию (наблюдение)
\item отдаёт в среду действие
\item получает от среды ответ (награда или штраф)
\end{itemize}
\noindent Обычно представляют в виде MDP\footnote{Марковский процесс принятия решений (англ. Markov decision process (MDP)) — спецификация задачи последовательного принятия решений для полностью наблюдаемой среды с марковской моделью перехода и дополнительными вознаграждениями. Назван в честь Андрея Маркова, служит математической основой для того, чтобы смоделировать принятие решения в ситуациях, где результаты частично случайны и частично под контролем лица, принимающего решения. \href{https://ru.wikipedia.org/wiki/Марковский_процесс_принятия_решений}{wiki}}
\begin{verbatim}
создаём среду
цикл по эпизодам, для каждого эпизода:
сбрасываем среду (встаём на старт для каждого эпизода)
внутри создаём цикл по шагам, для каждого шага:
агент выбирает действие на основе состояния,
среда ему возвращает награды или шаг done
\end{verbatim}
По сути, единственное, что можно использовать при таком алгоритме - это награды от среды, это позволит получить результат.
В представлении работы агента существуют следующие понятия:
\begin{itemize}
\item накопленная награда, есть как рекурсивное представление $G_{t} = R_{t+1} + G_{t+1}$, так и нерекурсивное $G_{t} = R_{t+1} + R_{t+2} + ...$ то есть мы вычисляем награды в текущем состоянии среды и все потенциально возможные новые награды;
\item policy - стратегия агента, собственно, мозги $А = \pi(S)$
\item value - ценность состояния - математическое ожидание всех будущих накопленных наград $v(s) = \mathbb{E}[G_{t}|S_{t} = s]$. По сути, показывает все будущие награды, но мы не знаем функцию среды, поэтому фактически, перед нами стоит задача восстановления функции ценности среды (сейчас награды нет, но где-то в этой среде она точно есть);
\item дисконтирующий множитель - это $\gamma$ в следующей степени для награды каждого следующего состояния. Так горизонт интереса агента можно регулировать. Обычно, $\gamma = [0,95, 0,99]$ чтобы агент мог смотреть далеко вперёд;
\end{itemize}
Таким образом, MDP - это математическое ожидание от награды на следующем шаге плюс гамма умноженная на накопленную награду следующих шагов, другими словами, ценность это ближайшая награда плюс ценность следующего состояния.
\[v_\pi(S) = \mathbb{E}[R_{t+1} + \gamma v_\pi(S_{t+1} | S_t = s_1A_t \sim\pi(S))] \]
Если мы знаем функцию среды мы можем сразу идти по всем состояниям с наилучшей наградой.
\subsubsection{Q-learning}
Например, мир сетка
\begin{itemize}
\item мир 10х10, 100 клеток;
\item возможны движения в 4х направлениях;
\item динамика детермининрованная - никаких случайностей;
\item награды +1 в центре -1 в некоторых клетках
\item есть препятствия, не преграждающие пути в центр
\end{itemize}
Агент сначала ходит случайно, а потом постепенно формирует сетку с наградами (как вес в нейросети), то есть мы понимаем не только финальную награду, но и то что в награду можно попасть из соседней клетки в которой награды нет. Этот метод основан на Q-обучении.
Q-value - это ценность каждого действия из конкретного состояния
\[ q_\pi(s,a) = \mathbb{E}[R_{t+1} + \gamma q_\pi(S_{t+1}, A_{t+1}) | S_t = s, A_t = a] \]
\[ Q: S \times A \to R \]
Составляется Q-таблица (метод носит название табулярное Q-обучение) в которой с помощью коэффициентов описывается, что будет если из состояния пойти в направлении. Такую таблицу лучше заменить на нейросеть, потому что состояний может быть бесконечно много, а бесконечность хранить в компьютере не очень удобно.
Агент ничего не знает о среде - надо исследовать и в какой-то момент надо начать использовать знания чтобы получать награды, возникает дилемма исследования-использования: Если агент только учится - он никогда не достигнет ценности, если совсем не исследует - не учится, всё время движется только по Q-таблице, не понимает ценности среды. Для решения дилеммы вводится \textbf{эпсилон-жадная стратегия}. $\varepsilon$ это вероятность случайного действия агента. Поскольку $\varepsilon$ постоянно линейно падает то агент постепенно начинает действовать из таблицы, а не случайно исследовать.
Классическое правило Q-обучения
\[ Q_{new}(S_t, a) = Q(S_t,a) + \alpha[r_t + \gamma \max Q(s_{t+1}, a) - Q(s_t, a)] \]
Происходит корректировка ценностей, которая на каждом шаге складывается из текущей оценки плюс скорости обучения [награда за действие А в состоянии $S_t$ плюс дисконтирующий коэффициент, умноженный на максимальную ожидаемую награду в следующем состоянии $S_{t+1}$ минус текущая оценка]
В работе есть строки
\begin{lstlisting}[language=Python,style=PyCodeStyle]
if done and (reward == 0):
reward = -10 # fell into the hole
elif done and (reward == 1):
reward = 100 # goal achieved
else:
reward = -1 # step on ice
\end{lstlisting}
есть среды в которых уже есть такие условиях (например, такси) чтобы агент не слонялся без дела и если закончил без победы мы скажем что он плохо справляется.
В среде FrozenLake есть параметр «скользкий лёд», при котором мы не идём куда приказали, имитируя поведение, будто мы поскользнулись.
\end{document}

View File

@ -0,0 +1,89 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\input{../fancy-listings-preamble}
\author{Видьманов Дмитрий Александрович}
\title{Мультимедиа технологии}
\date{2022-09-19}
\begin{document}
\maketitle
\tableofcontents
\href{https://clck.ru/zMr8G}{https://clck.ru/zMr8G}
\section{Задание}
Для зачёта автоматом:
\begin{enumerate}
\item Нужно ходить на пары (можно не на все, но и не пропускать все подряд)
\item Защитить 4 ЛР
\item Написать РК в декабре
\end{enumerate}
Лабораторные работы
\begin{enumerate}
\item Доклад. Презентация на 15 минут. Каждые 2 недели на семинарах по 3 человека. Выбрать тему по ссылке clck.ru/xrszx
\item Веб презентация
\item Мультимедиа приложение (Десктоп/моб/веб) Для работы с мультимедиа содержимым (текст, звук, видео)
\item Веб приложение. Делается по методичке (Возможно свое показывать, которое делал давно) Может реализовывать любой функционал, самое главное, чтобы включалось в веб браузере
\end{enumerate}
Все ЛР желательно связывать с дипломом \href{https://docs.google.com/spreadsheets/d/1zAawbTE4Dg9kiGCXfcQhoYgJExelFik8bTUjr5UTAao/}{https://docs.google.com/spreadsheets/d/1zAawbTE4Dg9kiGCXfcQhoYgJExelFik8bTUjr5UTAao/}
Моя тема: Мультимедиа технологии в корпоративных информационных системах.
\section{Что такое мультимедиа}
ММ в русскоязычной литературе такого слова нет, поэтому используется англицизм. Определение размыто. ММ находится на стыке большого количества технологий и понятий.
ММ как идея имеется ввиду комплексный эффект воздействия на чувства человека. выражает художественное определение информации. по мере развития компьютерной техники стало возможно обрабатывать большое количество разнообразной информации (от цифр и текста к видеоинформации в реальном времени). Была предложена идея all digital как концепция полного погружения в цифровое пространство.
ММ как программно-аппаратное обеспечение. Позволяет работать с различными данными которые могут обладать разной природой. ММ периферия, ММ ПК, программный ММ инструментарий.
ММ как продукт. это совмещение ММ как идеи и ММ как ПАО. это продукт, составленный из различных типов информации с возможностью прямого доступа к этим данным, ассоциируется с носителями информации. Возможно заметить что одними из первых с переизбытком информации столкнулись архивные работники, библиотекари и пр, которые начали использовать способы каталогизации. ММ продукт наследует эти свойства, предоставляя дружественные системы доступа к информации.
\begin{frm} Мультимедиа — это современные компьютерные тех- нологии, позволяющие объединить в программно-аппа- ратной системе различные типы мультимедиа-данных (изображения, звук, видео, тактильные ощущения и т. д.) для создания единой информационной среды в целях воздействия через органы чувств на восприятие человека.\end{frm}
ММ данные - это сообщения (информация). Правила интерпретации сообщения не формализуемы. Одно и тоже сообщение может быть интерпретируемо пользователями (получателями) многовариантно. невозможно предсказать результат получения такого сообщения каждым пользователем.
Тип данных - это такое множество значений и их отображений, которые могут воздействовать на органы чувств.
Мультимедиа продукт
\begin{itemize}
\item линейный - пользователь не может управлять показом содержимого
\item нелинейный - возможность интерактивного взаимодействия с продуктом
\end{itemize}
Среда носитель (канал связи) используется
\begin{enumerate}
\item механические движение
\item механическое давление жидкостей и газов
\item волны в воздухе и жидкостях
\item электрические токи
\item световые волны (просто визуальная информация)
\item пучки световых волн (лазеры итд)
\end{enumerate}
Сигнал - это изменение во времени величины, которая осуществляет передачу информацию. При передаче информации всегда существует индивидуальная вариабельность.
\section{Аппаратные и программные средства}
для построения мм-системы нужна дополнительная аппаратная поддержка. В том числе обеспечивающие виртуальную реальность.
аппаратные
ср-ва звукозаписи и воспроизведение, манипуляторы, и др...
программные - системные (управление устройствами в системе, машинные команды), инструментальные (приложения которые позволяют манипулировать мм-файлами) и прикладные (пакеты программ для создания мультимедийного контента).
Аппаратные:
\begin{itemize}
\item Звуковые средства: обычно представлено в виде звуковой карты ПК.
\item Видео средства: до видеокарт хранилось на магнитной плёнке. с развитием видеокодеков стало возможным редактировать видео в режиме реального времени.
\end{itemize}
Программные
\begin{itemize}
\item для изображений (растровая гимп, пейнт, векторная инкскейп, илюстратор)
\item для видео (...)
\end{itemize}
\end{document}

491
03-system-engineering.tex Normal file
View File

@ -0,0 +1,491 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\input{../fancy-listings-preamble}
\author{Девятков Владимир Валентинович}
\title{Системная инженерия}
\date{2022-09-05}
\begin{document}
\maketitle
\tableofcontents
\newpage
\section{Системная инженерия}
Системная инженерия - Полный набор технических и управленческих усилий, необходимых для преобразования совокупности потребностей и ожиданий клиента и имеющихся ограничений в реализацию и поддержку этой реализации на протяжении ее существования. Целостное и согласованное понимание потребностей заинтересованных сторон. Исследование возможностей реализации. Документирование требований к реализации. Синтез, верификация, валидация и развитие решений при при осуществлении реализации во всей полноте от исследования замысла системы до её ликвидации.
Стандартизация
\begin{itemize}
\item International Council on Systems Engineering, INCOSE: развивает междисциплинарный подход и средства для обеспечения реализации успешных систем (см. Guide to the Systems Engineering Body of Knowledge, SEBOK).
\item ISO/IEC/IEEE 24765:2010: междисциплинарный подход - полный набор технических и управленческих усилий, необходимых для преобразования совокупности потребностей и ожиданий клиента и имеющихся ограничений в решение для поддержки этого решения на протяжении его жизни
\end{itemize}
Авторские определения
\begin{itemize}
\item Sage A.P. ... проектирование, производство и сопровождение заслуживающих доверия систем с учетом стоимостных и временных ограничений
\item Д. Хитчинс, бывший президент, INCOSE ... искусство и наука создания эффективных систем на основе целостного подхода к системе и принципам её жизни
\item А. И. Левенчук , президент российского отделения INCOSE ... это про то, как создать что угодно (от зубочистки до марсохода) в соответствии с требованиями заказчика, и при этом соблюсти бюджет и сроки
\item Н. П. Бусленко, Большая советская энциклопедия, 1976 . Научно-техническая дисциплина, охватывающая вопросы проектирования, создания, испытания и эксплуатации сложных систем (больших систем, большого масштаба (large scale systems))
\end{itemize}
Что такое успешная система?
\begin{itemize}
\item Система успешна тогда и только тогда, когда с ее помощью добиваются успеха все ключевые стейкхолдеры (заинтересованные стороны) (Д. Хитчинс)
\item Система успешна тогда и только тогда, когда в выигрыше окажутся все критически важные заинтересованные стороны (стейкхолдеры) (Б. Боэм)
\end{itemize}
В США
\begin{itemize}
\item 1940-е: Появление очень сложных проектов: морские операции на Тихом океане, ядерный проект.
\item 1950-1960-е:
\begin{itemize}
\item Увеличение числа сложных проектов: например, космический проект.
\item Появление первых работ, описывающих подходы к созданию сложных систем
\item СИ впервые появилась как метод ведения работ в МО США по созданию МБР (межконтинетальных баллисьтических ракет) на базе двух уже сверхсложных инженерных проектов:
\begin{itemize}
\item атомного проекта,
\item проекта создания баллистических ракет.
\end{itemize}
\end{itemize}
\item 1965 - А. Д. Холл «Методология системной инженерии» :
Системная инженерия многоаспектна. Цель процесса СИ является оптимальное проведение границ между человеческими интересами, системой и ее окружением. В окружении выделяются:
\begin{itemize}
\item Физическое и техническое окружение.
\item Деловое и экономическое окружение.
\item Социальное окружение.
\item СИ исследует потребности рынка и возможность изменения этих потребностей как в настоящем, так и в будущем.
\end{itemize}
\end{itemize}
В СССР
\begin{itemize}
\item 1920 - План ГОЭЛРО, описывавший развитие электроэнергетики. К плану были привязаны:
\begin{itemize}
\item Проекты по индустриализации.
\item Проекты по развитию инфраструктуры.
\item Планы развития территорий.
\end{itemize}
Размеры:
\begin{itemize}
\item В разработке участвовало более 200 учёных и инженеров.
\item Период от 10 до 15 лет.
\end{itemize}
\item 1962 - появляется термин «Системотехника» в результате перевода книги «System Engineering: An Introduction to the Design of Large-scale Systems».
\item 1960-1980:
\begin{itemize}
\item Создается научная школа системотехники, включая НИИ, кафедры и дисциплины в ВУЗах.
\item Ведутся работы по выполнению больших и сверхбольших проектов.
\end{itemize}
\item Системотехника 80-х
Теория:
\begin{itemize}
\item Научные школы.
\item Специализированные издания, публикации.
\item Подготовка специалистов.
\end{itemize}
Практика:
\begin{itemize}
\item Свелась к разработке ПО для АСУ.
\item Практически не влияла на управление производством, разработку, внедрение.
\end{itemize}
\end{itemize}
Поколения СИ
\begin{itemize}
\item Классическая системная инженерия
\begin{itemize}
\item Использование диаграмм
\item Предназначены для чтения и интерпретации только людьми, описание системы нельзя формально проверить
\end{itemize}
\item Системная инженерия на основе моделей (model-based systems engineering)
\begin{itemize}
\item Использование формальных моделей
\item Модели могут быть непосредственно обработаны (проверены, оптимизированы) компьютером
\item Позволяет достигать принципиально другой сложности систем
\end{itemize}
\end{itemize}
\subsection{Системная инженерия как процесс}
\begin{itemize}
\item Формулировка потребностей (требований заказчика)
Формулировка потребностей включает изложение «принципов» (principles) и «концепций» (concepts), как набора компонентов, взаимодействующих между собой для достижения целей. Этими компонентами могут быть :
\begin{itemize}
\item «Железо» hardware, ПО, firmware
\item Люди (не только пользователи)
\item Информация (например, структуры БД)
\item «Техники» (techniques)
\item Здания, помещения и другая инфраструктура (facilities)
\item Сервисы (services)
\end{itemize}
\item Постановка задачи
Системный инженер поддерживает междисциплинарный подход и переводит потребности заказчика в задания исполнителям, помогает оценивать соответствие результатов разработки этим потребностям. Системный инженер учитывает взаимодействие с окружающей средой, которая может представлять собой:
\begin{itemize}
\item другие системы,
\item пользователей,
\item физический окружающий мир.
\end{itemize}
\item Обеспечение реализации системы
Системные инженеры для обеспечения реализации успешных систем анализируют выполнение процессов жизненного цикла, начиная с раннего этапа концептуального принятия решений (conceptual design), на всем жизненном цикле системы, включая производство, развертывание/внедрение (deployment) эксплуатацию и вывод из нее. Системный инженер должен анализировать, составлять ТЗ (specify), разрабатывать архитектуру (design) и проверять на соответствие потребностям следующие характеристики системы:
\begin{itemize}
\item Функциональность.
\item Интерфейсы.
\item Производительность.
\item Физичекое состояние.
\item Баланс между ценой и соответствием потребностям
\end{itemize}
\item Обеспечение взаимодействия компонентов
Системный инженер помогает обеспечить взаимодействие компонентов системы (fit together) для достижения общих целей системы, а также удовлетворения потребностей заказчиков и других заинтересованных лиц, которые получают (принимают, acquire) систему и далее ее используют.
\end{itemize}
\subsection{Главные свойства системной инженерии}
Целостность (holistic) — это ключевое свойство, отличающее СИ от всех остальных инженерных дисциплин. Целостность включает:
«Междисциплинарность» - полнота охвата всех необходимых дисциплин. Целостность всех действий по созданию системы. Целостность/полнота проблемы. Охват всего жизненного цикла системы «от рождения до смерти».
Параллельность выполнения самых разных практик, а не последовательное выполнение их во времени. Разнесение:
\begin{itemize}
\item Нужд пользователей и требований к реализации.
\item Проверки и приёмки.
\item Синтеза и аналитики.
\end{itemize}
СИ как единое целое это
\begin{itemize}
\item Область применения: Большие (сложные) системы, весь их жизненный цикл.
\item Философия (мировоззрение): Системный взгляд на все.
\item Средства: Совокупность практик, процессов, методов.
\end{itemize}
\subsection{Будущее системной инженерии}
Поискориентированная системная инженерия (search-based systems engineering) на основе интеллектуального компьютерного рассуждения при поиске и обосновании требований, архитектуры, методов, практик и т.п.:
\begin{itemize}
\item Искусственная интеллектуальная генерация вариантов инженерных решений.
\item Искусственное интелектуальное умение оценить варианты.
\item Искусственные интеллектуальные гибридные рассуждения при достижении целей.
\end{itemize}
Цели и контракты
\begin{itemize}
\item Формалные синтез и оптимизация архитектуры, соответсвующей контрактам и целям
\item Искусственное воображение
\item Использовние методов ИИ (например, вариации «генетических алгоритмов» или «обучаемых нейронных сетей»)
\item Порождающее проектирование (generative design)
\item Пока больше используется для визуализации данных, но может быть применено для вычисления оптимальной формы объектов
\end{itemize}
\section{Концептуальные аспекты инженерии знаний}
Знания основа интеллектуальности систем. Знания в системах искусственного интеллекта обычно хранятся в базах знаний. Знания содержат информацию как о конкретных (константных) фактах в той или иной предметной области (среде, мире), так и о более общих законах и свойствах, позволяющих получать (рассуждать, выводить) новые знания. Понятие "знание" имеет два аспекта: декларативный и процедурный.
\textbf{Декларативные знания} не содержат в явном виде описание процедур, которые необходимо выполнить в процессе вывода.
Вывод на основе декларативных знаний осуществляется по определенной стратегии вывода специальной машиной вывода (решателем).
Например, вывод (поиск решения) может быть организован как поиск в пространстве состояний, и сводится к нахождению последовательности состояний ведущих из начального состояния (начальных) в целевое состояние.
\textbf{Процедурные знания} - это знания, представляемые в виде процедур, с помощью которых осуществляется вывод. Вывод на основе процедурных знаний также может осуществляться машиной вывода, организующей вызов процедур в соответствии с определенной стратегией.
Сочетание преимуществ декларативного и процедурного подхода к представлению знаний по-разному воплощается в различных языках и моделях представления знаний.
ИИ функционирует на основе знаний
ИИ занимается созданием специализированных моделей и языков для представления знаний в ЭВМ,
ИИ занимается созданием специальных средств, позволяющих пополнять и обобщать знания.
ИИ занимается созданием программных и аппаратных средств для работы со знаниями;
ИИ занимается созданием методов формирования планов достижения целей и решения сложных задач, не поддающихся решению другими методами, кроме как на основе использования знаний
ИИ занимается созданием средств восприятия мультимодальной информации (зрительной, слуховой, тактильной и др),
ИИ занимается развитием методов мультимодальной обработки и формирования ответных реакций на воздействия внешней среды,
ИИ занимается развитием методов адаптации искусственных систем к среде путем обучения.
Какое представление знаний нам необходимо?
Насколько представление знаний должно быть понятным и ясным?
Насколько представление знаний должен быть лаконичным?
Насколько оно должно быть вычислительно эффективным (способным порождать новые знания)?
Насколько оно должно быть модульным?
Насколько оно должно быть доступным из разных мест?
Какова должна быть охватываемая область представления?
Какова должна быть неделимая часть?
Каков должен быть уровень детализации?
Должен ли быть базовый словарь?
Насколько легко можно знания модифицировать?
Могут ли быть изменены отдельные элементы без влияния на другие?
Как представлять отдельные модули?
Каков должен быть механизм извлечения знаний?
Каковы должны быть отношения между старыми и новыми знаниями?
Какова должна быть форма обобщения и специализации знаний?
Какова должна быть процедура поиска необходимых знаний?
Как знания должны быть организованы: иерархически, на базе отношений, ассоциативно?
Какие отношения возможны между группами знаний?
Нужны ли оба механизма работы со знаниями: синтаксический и семантический?
Какой нужен механизм вывода?
Нужно ли поддерживать дедуктивный, индуктивный и абдуктивный выводы?
Нужно ли продолжать вывод, если информация стала неопределенной?
Нужно ли продолжать вывод, если информация отсутствует?
Должны ли все знания быть явно представленными или решатель может дополнять их?
Какие знания должны быть представлены обязательно явно?
Может ли структура представления знаний расширяться и модифицироваться?
Может ли решатель модифицироваться?
\subsection{Дедукция, абдукция, индукция}
\begin{table}[H]
\centering
\begin{tabular}{|r|c|c|c|}
\hline
Последовательность логических действий & Дедукция & Абдукции & Индукция \\ [0.5ex]
\hline\hline
Логический шаг №1 & Анализ заранее заданной гипотезы & Анализ и точная оценка фактов & Анализ и точная оценка частных фактов \\
Логический шаг №2 & Вывод следствий из гипотезы и их сопоставление с фактами & Выбор гипотезы для объяснения фактов & Движение мысли от частного к общему\\
\hline
\end{tabular}
\caption{Table to test captions and labels.}
\label{table:1}
\end{table}
Абдукция это «обратная» дедукция, так сказать, дедукция, поставленная с ног на голову. Если в дедукции рассуждение развивается от посылки к следствию, то в случае абдукции в противоположном направлении, то есть от следствия к посылке. Нормальное дедуктивное рассуждение таково «Все люди смертны, Сократ человек, следовательно, Сократ смертен». Здесь налицо логически необходимый вывод.
В случае абдукции силлогизм приобретает следующую форму: «Все люди смертны, Сократ смертен, следовательно, Сократ человек». Может показаться, что здесь все нормально, но если вдуматься, то становится ясно, что вывод неправильный: из того, что Сократ смертен, вовсе не следует, что Сократ человек, ведь смертны и кошки, и собаки, и бабочки, и, может быть, деревья.
Трудности обмена знаниями
Представление знаний даже об одних и тех же вещах и на одном и том же языке может быть различным.
Это приводит к трудностям обмена знаниями между людьми, организациями и программами, и, в частности, к трудностям формирования однозначно понимаемых требований и спецификаций для сложных систем.
Несмотря на достаточно продвинутый уровень развития сложных систем, возможности повторного использования и распространения знаний ограничены.
Это приводит к повторным усилиям по извлечению и необходимых знаний.
\begin{verbatim}
Источник -> Структурирование -> Представление
файлы графы Модели
Хаос Извлечение Формализация
\end{verbatim}
\subsection{Стандартизация знаний}
Ответ на многие из поставленных вопросов может быть получен путем стандартизации знаний?
Стандартизация устранит или сведет к минимуму концептуальную и терминологическую путаницу и установит однозначное понимание языка, используемого для представления знаний
Такой язык должен служить средством
стандартизации представления знаний,
коммуникации между людьми, имеющими различный взгляд на одни и те же вещи,
взаимодействия между программными системами путем трансляции в него и из него,
обеспечения возможности повторного использования благодаря формальной спецификации,
автоматизации проверки корректности знаний,
адекватного представления других языков представления знаний.
Трудности извлечения знаний
организационные неувязки;
неудачный метод извлечения, не совпадающий со структурой знаний в данной области;
неадекватная модель (язык) для представления знаний.
неумение наладить контакт с источником знаний;
терминологический разнобой;
отсутствие целостной системы знаний в результате извлечения только «фрагментов»;
упрощение «картины мира» и др.
Концептуальные графы
Авторы идеи - Новак и Говин (Novak and Gowin). 1960-ые. Большой вклад внес David Ausubel.
Этапы
выделение концептов — базовых понятий данной предметной области(обычно не более 15-20 понятий);
определение отношений и взаимодействий базовых понятий;
уточнение, удаление лишних связей, снятие противоречий.
Типичные ошибки:
• Целые предложения вместо отдельных концептов
• Линейность
• Слишком много пересекающихся отношений
• Слишком много концептов
• Неверно определенные типы отношений
“Хороший” граф обычно получается после 2-3 итераций.
Software: CmapTools
Основные виды отношений
родо-видовые ("класс-подкласс", "элемент-множество", "часть - целое" и т.п.),
• функциональные (определяемые обычно глаголами, ’’производит”, “влияет”...),
• атрибутивные (иметь свойство, иметь значение),
• причинно-следственные (если-то)
• количественные (больше, меньше, равно...),
• пространственные (далеко от , близко от, за, под, над),
• временные (раньше, позже, в течение...),
• логические (и, или, не),
• лингвистические (синонимия, антонимия) и др.
\subsection{Формализация}
Теория
Это тройка = {L, S, С}, где
L язык формальной модели с присущими ему синтаксисом, т.е. L = {T, G},
S совокупность начальных знаний, сформулированных на языке L;
C абстрактная машина или машина вывода, которая, используя правила вывода P и определенную стратегию вывода, осуществляет формирование в языке L новых знаний, начиная с начальных.
Таким образом машина вывода является двойкой С = {P, Ω}, где Ω - стратегия вывода, согласно которой абстрактная машина C, используя правила вывода P осуществляет вывод.
Правила вывода не обязательно являются правилами логического вывода, поскольку формальные модели могут быть не только логическими.
Язык
Формальный язык L в соответствии с современными представлениями требует рассмотрения двух его неотъемлемых частей: синтаксиса и семантики.
Синтаксис языка описывает допустимые в языке предложения, состоящие из цепочек терминальных символов, принадлежащих определенному терминальному алфавиту.
Синтаксис языка позволяет отличать предложения, принадлежащие языку, от предложений, ему не принадлежащих.
Семантика языка определяет смысл предложений языка.
Без семантики предложения языка являются ничего незначащими цепочками символов
Формализацией задачи будем называть создание для ее решения формальной модели.
Формальным решением задачи будем называть осуществление решения задачи с помощью формальной модели.
Онтологии
Онтологией называются представленные на некотором формальном знаний о некоторой области интересов (среде, мире).
Онтологии хранятся в базах знаний. Онтологии непременно сопутствует некоторая концепция этой области интересов.
Чаще всего эта концепция выражается посредством определения базовых объектов (индивидуумов, атрибутов, процессов) и отношений между ними.
Определение этих объектов и отношений между ними обычно называется концептуализацией.
Концептуализация может быть явной или ментальной, т.е. существующей только в чьей-то голове. Однако мы будем полагать, что онтология является явным представлением некоторой концептуализации. Онтология может иметь несколько уровней представления знаний.
Уровни онтологий
неформальная на каком-либо естественном языке,
полуформальная на каком-либо структурированном подмножестве естественного языка,
слабоформализованная на каком-либо языке из области искусственного интеллекта с формальным синтаксисом,
формализованная на каком-либо языке из области искусственного интеллекта с формальным синтаксисом, семантикой, значимым и полным механизмом вывода.
Следующее определение онтологии, суммирует различные определения онтологий:
Онтологией является общепринятая и общедоступная концептуализация определенной области знаний (мира, среды), содержащая базис для моделирования этой области знаний, определяющая протоколы для взаимодействия между модулями системы искусственного интеллекта, использующими знания из этой области, и наконец, включающая соглашения о представлении теоретических основ данной области знаний.
Этапы формирования Онтологии
Определение цели и постановка задачи. На этом этапе особенно важно понять зачем нужна онтология, как и кем она будет использоваться.
Построение. Этот этап разбивается на три подэтапа: формализация понятий, кодирование и интеграция.
Процесс формализации понятий: 1) выявление основных объектов и отношений предметной области, 2) текстовое описание этих объектов и отношений, 3) сопоставление этим объектам и отношениям термов.
Процесс кодирования в каком-либо формальном языке результатов предыдущего подэтапа. Обычно кодирование включает 1) описание с использованием введенных термов необходимых утверждений, 2) выбор формального языка для кодирования, 3) кодирование в выбранном языке.
Процесс интеграции выполняется параллельно двум упомянутым и требует тщательного обдумывания, каким образом вновь создаваемая онтология будет интегрироваться с уже существующими.
Оценка. На этом этапе осуществляется обдумывание и формирование вопросов, на которые онтология должна давать ответы, выбирается программная среда для реализации онтологии.
Документирование. На этом этапе осуществляется тщательное составление руководства к онтологии на естественном языке.
\section{Методологии разработки мультиагентных систем}
методологии рмас сравнительно новая область
терминология не всегда однозначна, первоисточник в английском
поведение формируется описанием не действий, но целями
достижение связано с рассуждениями и планированием
интеллектуальное поведение
каждый агент способен на своё собственное ип, вместе достигая цели.
разработчику не нужно описывать поведение
инструментальные средства развиваются с конца 20в.
\begin{itemize}
\item Методология Gaia
Гайя это некая энергетическая всеобъемлющая сущность. система имеет микро и макро уровни, но минус в том, что она не развивалась. два этапа - выделение роли и налаживание взаимодействия
роли - обязательства(не прямое указание, но формулировка возможностей) разрешения активности протоколы.
м не подходила для систем в открытой среде, известны улучшения, позволяющие системе работать в интернете
\item Методология MaSE
формирование целей
разработка сценариев
\item Методология UML
используется для моделирования базового уровня агентных систем
Диаграммы архитектуры, ролей и протоколов, онтологий.
сложностью считается сложность точного описания модели на языке.
\item Методология, основанная на графовых представлениях
компоненты, сообщения. каналы связи. недостатком является чрезмерная вычислительная затрата на обработку графа.
\end{itemize}
\subsection{Тенденции}
\begin{enumerate}
\item концептуализация
\item структуризация
\item бихевиоризация
\item формализация
\item реализация
\end{enumerate}
Концептуализация - постановка задачи, получение информации о среде. составление словаря терминов где сущностей должно быть столько же или больше, чем категорий в системе, не должно быть неоднозначностей. источником информации являются заказчики системы, эксперт или эксперимент со средой. итог шага - текстовый документ на естественном языке.
Структуризация - определение ролей и моделируются компоненты системы
бихевиоризация - определение активности ролей, создаются взаимодействия объектов, диаграммы поведений и состояний.
на этапах формализации и реализации - создаются или принимается решение об использовании исчислений, переход к программированию.
\section{Онтологизация}
Онтология - часто общепринятое и общедоступное, однозначно понимаемое описание знаний на естественном или частично формализованном языке. Создаются для уменьшения путаницы и неоднозначности. Используют декларативные языки, например OWL. Большинство логик для описания декларативных знаний могут быть переведены в логику предикатов первого порядка. В каждом случае разрабатывают свой метод рассуждений. Помимо самого языка нас всегда интересуют исчисления (язык, знания, правила рассуждения). Для описания используются Т-бокс и А-бокс. Термины, ограничения. Высказывания, утверждения.
Используются все механизмы логики - концептуальная конъюнкция, отрицание (множество всех объектов, которые не удовлетворяют требованиям) и другие.
\subsection{Доказательства}
помимо обычных логик (модус поненс, дедукция, абдукция, итд) есть метод табло, в котором в процессе описываются секвенты, объединяющиеся в табло. Годится для доказательства в любых декларативных системах.
\section{Извлечение знаний в языке нитей}
интеллектуальное поведение может быть представлено без явного использования символического представления, предлагаемого ИИ.
ИП может быть реализовано без явного абстрактного вывода (рассуждения) того типа, которое предлагает символическое представление ИИ.
КА - это множеств входов, множество выходов, множество состояний и функции перехода и выхода.
ИП - это процесс непрерывного анализа (восприятия) и отображения его в реакцию (выходное действие). Пара вход(анализ) реакция(выход) то есть кортеж действий называются нитями. выполнение нити - это порядок действий. Агент определяется множеством нитей. Процесс выполнения агентом нити - это поведение.
Множество пар входных и выходных действий должно удовлетворять:
\begin{itemize}
\item для любой нити из множества S начало такой нити также должно принадлежать множеству S.
\item если нити одинаковые, то реакции на них также должны быть одинаковые
\item нити находятся в отношении R, если нити удовлетворяют первым двум пунктам.
\end{itemize}
Процессные выражения нитей возможно представить в виде графа переходов (автоматы Мура). Отношение R разбивает множество нитей на классы эквивалентности.
Любые две нити восприятия находятся в отношении R если реакции на эти нити одинаковы и обе они принадлежат множеству S.
\section{Извлечение знаний в языке процессных графов переходов}
Стратегии поиска (на графах возможно осуществлять поиск). Оценить стратегию возможно по некоторым критериям (время, сложность, итд.)
Слепой и направленный поиск. Самый простой - это слепой поиск в ширину. Возможен также монотонный поиск в ширину.
Поиск в глубину, итеративный поиск в глубину. У поисков в глубину нет полноты.
Все стратегии слепого поиска экспоненциальны по сложности, поэтому нужно вводить критерий выбора
двунаправленный поиск.
\newpage
\appendix
\setcounter{secnumdepth}{2}
\setcounter{tocdepth}{2}
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Asbuk{subsection}}
\subsection{Семинар 1 (2022-09-06)}
что-то тут точно было
\subsection{Литература}
Батоврин В. К. Толковый словарь по системной и программной инженерии. — М.:ДМК Пресс.— 2012 г. — 280 с. ISBN 978 -5-94074 94074-818 -2
Лоусон , Гарольд «Бад». Путешествие по системному ландшафту / Пер. с англ. В. Батоврин . — М.: ДМК Пресс — 2013. ISBN 978-5-94074-923-3
Косяков А., Свит У., Сеймур С., Бимер С. Системная инженерия. Принципы и практика / Пер. с англ. В. Батоврин. — М.: ДМК Пресс, 2014. — 636 с.
Шамие Кетлин. Системная инженерия для «чайников»: ограниченная серия от IBM. — John Wiley \& Sons, Inc., 2014. — 69 с. (NB! Скачивается официально)
На английском
- INCOSE (International Council on Systems Engineering) http://www.incose.org
- The Guide to the Systems Engineering Body of Knowledge (SEBoK) http://www.sebokwiki.org
На русском языке
- Systems Engineering Thinking Wiki http://sewiki.ru
- Российское отделение INCOSE http://incose-ru.liveiournal.com
- А. И. Левенчук , президент/директор по исследованиям Российского отделения INCosE http://ailev.liveiournal.com
- А. И. Левенчук . Системноинженерное мышление http://techinvestlab.ru/files/systems engineering thinking/thin king 2015.pdf
- В. Мизгулин. Системная инженерия требований http://urse.ru/wp-content/uploads/2017/02/Системная-инженерия-требований.pdf
\subsection{Альфа}
abstract level progress health attribute
всего Альф 8.
\begin{frm}
Альфа - это некоторый элемент, который требуется для отслеживания успешности системы.\end{frm}
Альф помогает отслеживать
\begin{itemize}
\item альфа стейкхолдеров - это некоторые роли в нашем проекте. лица, чьи действия могут влиять на успешность системы. именно с ними нужно согласовывать требования к системе.
\begin{itemize}
\item внешние - заказчик или пользователи
\item внутренние - разработчики системы
\end{itemize}
для анализа стейкхолдеров понадобится их определить, то есть явно в проект не будет входить бухгалетрия и юридический отдел. Будет по большей части влиять на успешность проекта в целом. Выделение механизмов вовлечения стейкхолдеров в проект (4 стратегии - полноценное партнёрство, временная консультация, поддержка, временные работники.) анкета и луковая диаграмма
\item возможностей зависит от временн\'{о}го интервала и показывает всё, что возможно сделать с системой.
\item определения системы - воплощение системы, архитектурное и неархитектурное описание, требоваиня ТЗ. финансовая группа может формировать баланс и отчётность
\item воплощения системы - 4д модели всей системы, изготовление отдельных частей, сборка, верификация и валидация
\item альфа команды - сотрудничество между людьми с определёнными компетенциями.
\item альфа работы - системы отслеживания задач
\item альфа технологий - практика на рабочих продуктах, раскладывается как в жизненных циклах.
\end{itemize}
все альфы можно описать на схеме OMG Essence.
\end{document}

View File

@ -0,0 +1,444 @@
\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\input{../fancy-listings-preamble}
\author{Баскаков Сергей Сергеевич}
\title{Беспроводные технологии в информационных системах}
\date{2022-09-05}
\begin{document}
\maketitle
\tableofcontents
\section{Введение (2022-09-05)}
...
\section{Беспроводные мобильные эпизодические и сенсорные сети (2022-09-12)}
Основные особенности, которые необходимо учитывать при проектировании
Беспроводные сенсорные сети имеют ряд ключевых отличий от других типов беспроводных сетей передачи информации, таких как локальные беспроводные сети и мобильные эпизодические сети. Перечислим основные особенности БСС и требования, которые к ним предъявляются:
\begin{itemize}
\item большие масштабы сети - количество узлов в сети может достигать десятков тысяч;
\begin{frm} Сети обычно существуют вплоть до 16-разрядной маршрутизации и мэш топологию (смешанную) \end{frm}
\item ограниченные ресурсы узлов - емкость автономного источника питания, вычисли- тельная мощность и память микропроцессора, пропускная способность каналов связи и прочие ресурсы очень ограничены, поэтому сетевые протоколы и алгоритмы должны быть оптимизированы под эти условия;
\begin{frm} Несимметричность вероятности битовой ошибки между двумя одинаковыми устройствами связана с чувствительностью приёмника, мощностью передатчика. В т.ч. разброс реального устройства и паспортных сведений, при передаче это например температура среды (даже в разных углах одной комнаты) при приёме это может быть помеховый шум (например, роутер стоит в том же углу). Диаграмма направленности чаще всего не влияет так как выставляется симметрично. Но хороший протокол должен учитывать асимметрию.
Мощность увеличивать не только неэффективно (для в два раза большей мощности обычно нужно в четыре раза большее потребление), но есть и нормативные ограничения для разных частотных диапазонов.\end{frm}
\item размещение узлов - расположение узлов в пространстве может быть случайным (например, выброска узлов с летательного аппарата над некоторой территорией) или детерминированным (например, ручной монтаж в заранее известные места), а их распределение по площади (объёму) покрытия сети может быть как равномерным, так и неравномерным;
\begin{frm} Невозможно проектировать систему под каждые условия эксплуатации, даже если размещение детерминировано, не факт, что оно равномерно. Для обеспечения высокой надёжности нужно, чтобы устройства стояли максимально кучно, но тогда и помех будет больше.\end{frm}
\item сложная топология - в общем случае сеть имеет многоячейковую топологию, все или большинство узлов неподвижны; (по умолчанию мы не знаем топологию, поэтому алгоритмы и протоколы должны не требовать пуско-наладочных работ при изменении)
\item виды трафика - в зависимости от решаемой прикладной задачи требуется поддержка типов трафика
\begin{itemize}
\item «многие-к-одному» (все узлы сети передают данные одной базовой станции (например, системы сбора показаний датчиков)),
\item «один-ко-многим» (один узел сети передает данные остальным узлам (например, передача базовой станцией параметров режима работы узлов))
\item «многие-ко-многим» (обмен информацией между произвольными парами узлов (например, системы с децентрализованным хранением данных внутри сети на основе распределенных хэш-таблиц));
\end{itemize}
\begin{frm} наиболее массовое применение это !м2м. в трафике много-к-одному существует централизация, то чем ближе к шлюзу, тем больше нагрузка на устройство. А чем больше нагрузка, тем больше энергопотребление, а это грозит выходом из строя устройств и полной неработоспособностью сети. Когда считают срок службы считают по наиболее нагруженному узлу. Также важно равномерно балансировать нагрузку между устройствами. Возможно сделать в системе такой протокол, который агрегирует пакеты от подключенных к нему, что позволяет сэкономить трафик и энергопотребление.\end{frm}
\item модель генерации сообщений - узлы могут инициировать передачу пакетов по времени (периодически), по событию или по запросу от внешнего потребителя информации, а также возможны различные комбинации перечисленных вариантов;
\begin{frm} периодически - возникают коллизии, слишком много данных в единицу времени, нужно разносить передачу по времени, делая фиксацию показаний датчика в единый срез времени; по событию, по запросу\end{frm}
\item разнородность узлов и соединений - узлы могут иметь разные энергетические ресурсы, объемы памяти и т.п., а беспроводные каналы отличаются скоростью передачи данных, надежностью, дальностью связи и т.п.;
\begin{frm} логичнее пускать б\'{о}льшую часть трафика через устройства имеющие меньшие ограничения по питанию\end{frm}
\item самоорганизация и отказоустойчивость - узлы должны самостоятельно настраиваться на этапе развертывания системы, а также в процессе работы адаптироваться к условиям окружающего пространства и текущему режиму эксплуатации;
\begin{frm} это связано как с размерами сетей, так и с необходимостью учитывать изменения в сети (разрядилась батарейка, устройство перенесено, и так далее)\end{frm}
\item масштабируемость - количество служебного сетевого трафика и требуемый объем памяти узлов должны минимально или совсем не зависеть от общего размера сети;
\begin{frm} затраты памяти и объёма трафика не должны не зависеть от масштаба сети. Подход как в протоколах маршрутизации не работает из-за размеров сети и объёма памяти устройств, поэтому каждое устройство знает только о локальных соседях, но не факт, что маршрут, например, в этом случае будет оптимальным. \end{frm}
\item время жизни сети - требуется обеспечить длительный (до нескольких лет) срок эксплуатации сети при автономных источниках электропитания узлов.
\end{itemize}
\subsubsection{Нерешённые проблемы}
\begin{itemize}
\item Необходимо решать проблемы потребления, точности, цены, измеряемых параметров как системы, так устройств и датчиков.
\item Проблема избегания калибровки.
\item Решать проблемы новых источников энергии.
\item Локализация узлов - измерение расстояний между устройствами и координат каждого.
\item Прихода, поиска отправления и хранения информации.
\item Маршрутизация пакетов (текущие ad hoc решения неоптимальны и не учитывают надёжность узлов, а перенос алгоритмов из математики или проводных сетей не работает)
\item Информационная безопасность (также нельзя взять готовые из-за ограниченности ресурсов)
\item Имитационное и натурное моделирование
\end{itemize}
\section{Общие принципы проектирования}
Узел подсети интернета вещей - это устройство которое измеряет физические параметры и далее по радиоканалу передаёт эти данные на шлюз
\subsection{Аппаратное обеспечение беспроводного сенсорного узла}
WTIS-рис7.2
\begin{itemize}
\item вычислительная подсистема - реализуется на базе микроконтроллеров с ограниченными объемами памяти и небольшими тактовыми частотами, но с малым энергопотреблением и низкой стоимостью. Типовые технические характеристки применяемых микроконтроллеров таковы:
\begin{itemize}
\item 8-разрядное (например, семейство МК Atmel AVR),
\item или 16-разрядное (например, семейство МК Texas Instruments MSP430)
\item или 32-разрядное (например, семейства МК ARM Cortex-M3 и Cortex-M0) ядро;
\item тактовая частота - в диапазоне 1-100 МГц;
\item объем ПЗУ (память программ) - порядка 10-500 кБ;
\item объем ОЗУ (память данных) - порядка 1-100 кБ.
требования возрастают в сетях где необходимо хранить информацию о соседях. Если выходим за пределы - скорее всего речь о шлюзе, есть возможность поставить ОС и запитаться от 220В.
\end{itemize}
\begin{frm} Важно, чтобы контроллер мог переходить в режимы энергосбережения и таких режимов было немало. Важный параметр - это скорость перехода из спящего режима в активный режим. Если переключаемся часто - долгий переход может съесть всё сохранение энергии. В режиме сна должно сохраняться содержимое оперативной памяти.\end{frm}
\item измерительная подсистема - состоит из датчиков (внутренних и/или внешних), цепей коммутации и нормализации сигналов датчиков, аналого-цифрового преобразователя, источника опорного напряжения и других блоков, которые необходимы для согласования сигналов датчиков и их преобразования в цифровую форму для первичной обработки и последующей передачи точке сбора (базовой станции).
\begin{frm} Задача системы в том, чтобы подать питание на датчик, снять сигнал, модифицировать, оцифровать и передать далее. Иногда под датчиками понимают видео- фотокамеры, но не для систем с низким потреблением. \end{frm}
В БСС используются следующие виды датчиков:
\begin{itemize}
\item пассивные датчики: температура, влажность, давление, вибрация, ускорение, деформация и т.п.;
\item массив пассивных датчиков: видеокамеры (видимая или инфракрасная область), биохимические, акустические и т.д.;
\item активные датчики: радары, сонары и т.д.
\end{itemize}
Одной из основных тенденций является более широкое применение интегральных полупроводниковых MEMS-датчиков для повышения надежности и точности, уменьшения габаритов, стоимости и энергопотребления. То есть возможно, что потребление подсистемы будет определяться потреблением одного датчика.
\item подсистема управления питанием
Задача подсистемы управления питанием заключается в реализации импульсного режима: электропитание подается на отдельные компоненты узла (например, приемопередатчик, датчики и т.д.) только при возникновении необходимости взаимодействия в этим элементом, а в остальные моменты времени питание отсутствует. Таким образом, узел б\'{о}льшую часть времени находится в режиме пониженного энергопотребления (режим «сна»), и за счет этого достигается длительный срок службы элементов питания.
В подавляющем большинстве случаев применяются химические источники тока (батареи и аккумуляторы), поскольку они применимы практически во всех условиях эксплуатации, доступны и просты в использовании. Главный их недостаток - необходимость периодической замены по мере их истощения, что увеличивает затраты ресурсов на обслуживание БСС.
В качестве дополнительного или альтернативного источника может использоваться солнечная энергия, механическая вибрация и т.д., что теоретически позволяет обеспечить неограниченное время жизни узла без замены элементов питания. Но эти варианты мало распространены из-за того, что доступны только в определенных условиях эксплуатации и/или преобразователи этих видов энергии в электрическую относительно дороги.
Даже у обычной батарейки есть множество нюансов (саморазряд, снижение напряжения от пиковых нагрузок, и так далее). Иногда возможно использовать альтернативные источники энергии. Но альтернатив или нет или требуют дополнительного обслуживания.
\item подсистема передачи данных. Как правило применяются маломощные радиочастотные каналы связи со следующими параметрами:
\begin{itemize}
\item диапазон частот - нелицензируемые диапазоны частот (433 МГц, 868 МГц (европейский), 916 МГц (американский) и 2,4 ГГц);
\item мощность передатчика - порядка 1-100 мВт (мощность ограничена для снижения энергопотребления и обеспечения соответствия разрешенным нормам для нелицензируемых частотных диапазонов);
\item применяется цифровая пакетная передача данных с манипуляциями OOK/ASK, FSK и PSK;
\item скорость передачи данных - от 1 кбит/с до 1 Мбит/с;
\item ток потребления интегрального приемопередатчика в активном режиме (передача или прием) порядка 20 мА, в дежурном режиме (режим «сна») - порядка 0,1 мкА.
\end{itemize}
\begin{frm} По факту это всегда поиск баланса между потреблением тока и шириной полосы - чем быстрее передадим, тем меньше съедим батарейки, чем медленнее передаём тем дальше можем передать. Как правило считается, что именно эта подсистема больше всего потребляет, поэтому наша задача как можно меньше принимать и передавать данные (задача решается протокольными решениями).\end{frm}
Наиболее широкое распространение в БСС получил стандарт IEEE 802.15.4 частотного диапазона 2,4 ГГц.
В специальных условиях эксплуатации могут использоваться оптические и инфракрасные каналы связи, а также ультразвуковые колебания.
\item подсистема исполнительных устройств В подавляющем большинстве случаев БСС применяются для сбора данных от датчиков (системы мониторинга различного рода), но иногда в состав сенсорного узла могут быть включены исполнительные устройства, например, для управления клапанами и задвижками, выдачи сигналов подрыва и т.п.
\end{itemize}
\subsubsection{Программное обеспечение беспроводного сенсорного узла}
Встроенное программное обеспечение беспроводных сенсорных узлов является достаточно сложным в разработке и отладке, поскольку доступные аппаратные ресурсы (объем памяти и вычислительная мощность микроконтроллеров) ограничены и, как правило, нет возможности полноценно применять традиционные средства отладки: внутрисхемные эмуляторы, вывод диагностической информации и т.п.
\begin{frm} Устройства сами по себе весьма примитивны, но разработка ПО затруднена в связи с практической невозможностью отладки. Проблемы могут возникнуть спустя недели эксплуатации. Перепрошивка занимает очень много времени. \end{frm}
Поскольку беспроводной узел должен выполнять разнообразный набор функций (опрос датчиков и обработка результатов измерений, передача и прием данных по радиоканалу, маршрутизация пакетов и т.д.) целесообразно использование операционных систем (в том числе операционных систем реального времени). Но применение таких распространенных операционных систем, как Windows Embedded, Linux, MicroC/OS-II и т.д. невозможно из-за малых ресурсов микроконтроллеров и слишком больших накладных расходов на функционирование подобных систем. Поэтому в БСС применяются более простые операционные системы с ограниченными возможностями, но с гораздо меньшими аппаратными требованиями (например, scmRTOS или TinyOS).
Протоколы сетевого взаимодействия узлов БСС должны в полной мере учитывать особенности таких сетей. В частности, возникают следующие сложности:
\begin{itemize}
\item поддержка различных топологий («точка-точка», «звезда», многоячейковая сеть);
\item множественный доступ к среде с минимизацией активности в радиоканале (сделать так, чтобы устройства просыпались в нужные отрезки времени, передавали данные и засыпали обратно);
\item маршрутизация пакетов с оптимизацией сетевого трафика по энергопотреблению, латентности (задержки передачи), баланса сетевой нагрузки и другим критериям;
\item временная синхронизация между узлами сети (синхронизация часов каждого узла (не обязательно астрономическое) в том числе для множественного доступа к среде);
\item защита от несанкционированного доступа к сети (и в целом, защита от внешних вмешательств) реализовать стойкие алгоритмы шифрования не получится, поскольку мы ограничены мощностями и объёмом хранения данных;
\item ограниченные объем памяти и вычислительная мощность узлов.
\end{itemize}
Программную часть условно возможно разделить на две части - это прикладная часть и сетевая часть. прикладная часть отвечает за бизнес задачу (опрос, обсчёт, итд), а сетевая часть на вход часто получает просто массив данных и ему без разницы что именно он передаёт, знает только куда. Сетевых стеков существует достаточно много, но условно их можно разделить на три группы
\begin{itemize}
\item стандартные (ZigBee). Патентованные алгоритмы (как правило от группы разработчиков чипов).
\item проприетарные решения - также патентованные решения разработки конкретных вендоров и часто это несовместимые решения, хотя часто есть технические преимущества
\item специализированные решения для сетей с конкретными топологиями или конкретными чипами.
\end{itemize}
В сетевом стеке нужно учитывать как стек рассматривает устройства, все ли устройства равнозначны или есть только оконечные-и-ретрансляторы. также возможность посчитать среднее потребление устройства, также масштаб сети
\newpage
\section{Широкополосные и сверширокополосные средства связи}
\subsection{Основные принципы и методы расширения спектра сигнала}
Расширение спектра - это способ передачи при котором используется гораздо более широкая полоса, чем нужно для передачи данных. Обеспечивает лучшую совместимость, лучшую помехозащищённость и так далее.
\[ C = W \log_2(1+\frac{S}{N}) = W \log_2(1+\frac{S}{N_0W})\]
C - пропускная способность канала, W - ширина полосы, S/N уровень сигнал/шум.
Классические системы стремятся уменьшить ширину и увеличить уровень сигнала, уменьшив уровень помехи. Работают на допущении, что шум Гауссовский. Широкополосные и сверхширокополосные системы стремятся сделать ширину полосы как можно больше, что позволяет работать когда мощность помехи много больше мощности сигнала, как преднамеренные, так и непреднамеренные.
\begin{itemize}
\item метод непосредственной модуляции несущей псевдослучайной последовательностью (расширение спектра методом прямой последовательности) (direct-sequence spread spectrum (DSSS));
\item метод псевдослучайной перестройки рабочей частоты (расширение спектра скачкообразной перестройкой частоты) (frequency-hopping spread spectrum (FHSS));
\item метод псевдо-временн\'{о}й импульсной модуляции;
\item метод линейно-частотной модуляции (chirp spread spectrum (CSS));
\item совместное использование различных методов.
\end{itemize}
Системы радиосвязи с расширенным спектром обладают следующими преимуществами относительно традиционных узкополосных систем:
\begin{itemize}
\item высокая энергетическая скрытность сигналов от радиотехнической разведки;
\begin{frm}
Уровень сигнала может быть значительно ниже уровня шума. Усложняем перехват. В коммерческих системах позволяет нам уменьшить число помех для других устройств в этой полосе. Это и следующее - части свойства помехозащищённости системы связи.
\end{frm}
\item повышенная помехоустойчивость при воздействии организованных и непреднамеренных помех;
\begin{frm}
Допустим мощность полезного сигнала как для узкополосной системы. За счёт расширения спектра можем более эффективно демодулировать, что позволяет избегать преднамеренных помех. Для коммерческих систем это б\'{о}льшая совместимость с другими устройствами. Повышение помехоустойчивости (снижение вероятности битовой ошибки).
\end{frm}
\item возможность обеспечения множественного доступа в многопользовательских системах;
\begin{frm}
Применение позволяет абонентам в одной системе меньше мешать друг другу.
\end{frm}
\item высокая разрешающая способность при измерении дальности и времени распространения сигналов.
\begin{frm}
Если у нас есть время за которое сигнал прошёл из А в Б, мы можем замерить задержку и сделать высокую точность синхронизации устройств, а также измерить расстояние между устройствами. Есть проблема, в том что опираемся на скорость света ($3\times10^8$м/с), а значит есть мы хотим точность 1м, значит нужно мерить с точностью $0,3$нс.
\end{frm}
\end{itemize}
\subsubsection{Метод расширения спектра прямой модуляцией псевдослучайной последовательностью}
ФМС в общем виде можно записать
\[s(t) = \sum_{k=1}^L u[t - (k-1)\tau_c]\cos(2\pi f_ct+\theta_K+\theta_0)\]
\[u[t-(k-1)\tau_c] =
\begin{cases}
1, (k-1)\tau_c\leq t \leq k\tau_c;
0, t \notin[(k-1)\tau_c;k\tau_c];
\end{cases}
\]
Расширение спектра это перемножение полезного сигнала на ПСП. Как следствие надо передавать сигнал в nраз быстрее, где n это длина ПСП. Расширение спектра возможно производить не только битовое, но и по парам, тройкам и так далее бит, то есть иметь собственную ПСП на сочетания бит (00,01,10,11).
\subsubsection{Коэффициент расширения спектра}
Квадрат мат ожидания делёный на дисперсию.
\[ \frac{M^2[z(T_b)]}{D[z(T_b)]}\]
\begin{frm}
Коэффициент расширения спектра (выигрыш при обработке, коэффициент защиты, усиление обработки) сигнала характеризует меру увеличения отношения сигнал/помеха в результате свертывания (сжатия) расширенной полосы частот радиосигнала и приведения ее к полосе частот информационного сигнала.
\end{frm}
Таким образом, коэффициент равен длине кодовой последовательности. Измеряется в абсолютных величинах. Если нужны дБ то нужно взять 10 десятичных логарифмов от разов.
\subsubsection{Псевдослучайные последовательности}
К этим последовательностям предъявляются следующие требования:
\begin{itemize}
\item последовательности должны быть псевдослучайными для обеспечения хороших спектральных свойств при расширении спектра; то есть нельзя вообще случайную взять и нельзя и нежелательно брать не шумоподобные ПСП.
\item функция автокорреляции последовательностей должна иметь низкий уровень боковых лепестков по отношению к главному для обеспечения надежной синхронизации и уменьшения влияния межсимвольных и многолучевых помех; Основной лепесток должен быть как можно больше, а боковые как можно меньше.
\item функция взаимной корреляции последовательностей должна иметь низкий уровень для различимости абонентов в многопользовательских системах; чтобы не мешать другим пользователям, мы должны чужие ПСП воспринимать как шум.
\item апериодическая функция взаимной корреляции последовательностей должна иметь низкий уровень для уменьшения влияния взаимных помех;
\item число кодовых последовательностей, выбранных для реализации, должно быть большим и допускать при необходимости свое увеличение для повышения скрытности сигналов системы радиосвязи;
\item используемые последовательности не должны допускать (или минимизировать вероятность) несанкционированного восстановления;
\item последовательности должны достаточно просто генерироваться на практике.
\end{itemize}
В простейшем случае используются авто-корелляционные функции на основе М-последовательности.
Последовательности Голда и Касами
на основе функций автокорелляций удовлетворяющим условий возможно создать семейство последовательностей
Последовательности Уолша-Адамара
В отличие от указанных выше (асинхронных), ортогональные. взаимная корреляция даёт нулевое значение
\[ \sum_{k=1}^{m-1} u_i (k)u_j(k) = 0, i \neq j\]
Матрица адамара считается как все дублирующиеся элементы и последний инверсия. Коды Уолша-Адамара это строки в такой матрице.
первого порядка 0
второго порядка 0001
четвёртого порядка 0000 0101 0011 0110
Используются в некоторых стандартах сотовой связи. Чтобы оргогональность соблюдалась должна быть точность синхронизации. если синхронизации не будет ортогональность не гарантируется. Смещение не должно превышать одной длительности символа.
Все последовательности опираются на регистры сдвига с линейной обратной связью. Существуют также нелинейные ПСП.
Расширение спектра прямой модуляцией ПСП используется для 802.11x (WiFi), IEEE 802.15.4 (ZigBee), CDMAOne, GPS, ГлоНАСС.
\subsection{Метод псевдослучайной перестройки рабочей частоты (ППРЧ)}
frequency-hopping spread spectrum
скачки происходят по псевдослучайному закону в некотором диапазоне десятки-сотни раз в секунду.
Если наблюдаем помеху на одной из частот - просто исключаем её из закона переключения частот.
\begin{itemize}
\item Межсимвольная (межбитовая) - $n (n \geq 2)$ информационных символов передаются
на одной частоте, т.е. $T_h = nT_s$;
\item Посимвольная (побитовая) - передача каждого символа ведется на своей рабочей
частоте, т.е. $T_h = T_s$;
\item Внутрисимвольная (внутрибитовая) - выполняется разнесение символов на независимые частотные элементы (субсимволы), каждый из которых передается поочередно на своей частоте, т.е. $T_h = T_s/L, где L$ - число скачков рабочей частоты внутри одного символа (уровень разнесения).
\end{itemize}
ППРЧ делят на быструю (более 1000 скачков в секунду), среднюю и медленную (менее 100-300 скачков в секунду).
У гибридных систем коэффициент расширения спектра равен сумме коэффициентов расширения спектра ПСП и ППРЧ в дБ.
\subsection{Сверхширокополосные сигналы (ultra wide band - UWB)}
Не синусоидальные сигналы. Не было коммерческого применения. Требует применения принципиально другой элементной базы. Малоизучено влияние на другие радиосистемы (лучше не разрешать, чем разрешить и получить проблемы совместимости).
ширина полосы больше 500МГц, либо система у которой ширина полосы не менее чем 20\% от центральной частоты.
например у БТ коэффициент равен 0,03.
Time Domain
В основе лежит импульс «моноцикл гаусса» - первая производная от распределения гаусса.
\[ V(t) = A \frac{\sqrt{2e}}{\tau} t \exp\left(-\frac{t^2}{\tau^2}\right)\]
A - амплитуда импульса;
$\tau$ - временная константа, характеризующая скорость затухания импульса (длительность
импульса $2\tau\pi$ ).
Спектральная плотность мощности данного сигнала описывается следующим выражением:
\[G(\omega) = A\sqrt{2\pi e}\tau^2\omega\exp\left( -\frac{\tau^2\omega^2}{2} \right) \]
Можно показать, что центральная частота такого сигнала равна 1/($2\tau\pi$). Ширина
полосы по уровню -3 дБ ограничена частотами 0.319 и 1.922 от центральной, т.е. составляет
порядка 160\% от центральной частоты. Например, для импульса длительностью 0,5 нс
центральная частота равна 2 ГГц, а ширина полосы - примерно 3,2 ГГц. Важно, что здесь нет понятия несущей, есть только понятие центральной частоты. СШП сигналы называют сигналом без несущей.
Такой сигнал сам по себе - имеет не очень хороший гребенчатый спектр, поэтому предлагается использовать позиционную импульсную модуляцию.
Чтобы приенить такую систему для более чем пары - нужно применить некоторую модуляцию, пожохую на ППРЧ. Тогда возможно в одном диапазоне создать пары из сотен тысяч устройств. Фундаментальная проблема в том, что полоса огромная, а значит мы не можем делать чистую ППРЧ.
Из-за очень широкой полосы мы можем достаточно точно выяснить расстояние между устройствами.
\section{Множественный доступ к среде передачи данных}
До этого нами рассматривались беспроводные системы связи, состоящие только из одного передатчика и одного приемника. Однако большинство реальных систем являются многопользовательскими (множество передатчиков и приемников), поэтому вопрос управления доступом к общему каналу связи для передачи информации имеет одно из наиболее важных значений.
Описанные далее методы множественного доступа представляют собой основу большинства реальных протоколов управления доступом к среде передачи данных, применяемых в современных проводных и беспроводных сетях связи (космическая и мобильная сотовая связь, проводные и беспроводные локальные сети и т.д.). Следовательно, иметь представление об общих принципах распределения (разделения) ресурсов системы связи между множеством пользователей (абонентских станций) полезно как для понимания логики функционирования существующих систем связи, так и для проектирования и разработки новых.
В многопользовательских системах можно выделить два типа каналов связи: нисходящий (downlink, например, радиовещание) и восходящий (uplink, например, сотовая или вайфай сеть). рис(5.1,76). Такое разделение важно для синхронизации, систем только с одним типом канала чрезвычайно мало.
В нисходящем канале, который также называется широковещательным или прямым, один отправитель передает информацию нескольким приемникам. Поскольку все сигналы передаются от одного абонента, в этом случае достаточно просто реализовать координацию действий и синхронизацию между пользователями, хотя она и может быть нарушена при значительном влиянии эффектов многолучевого распространения радиоволн. Кроме того, в нисходящем канале как полезный сигнал, так и помехи подвержены влиянию одного и того же канала, т.е. для $k$-го пользователя соответствующая импульсная характеристика канала $h_k(t)$ изменяет как полезный сигнал $s_k(t)$, так и посторонние сигналы $s_j(t)(j\neq k)$, предназначенные другим абонентам. Примерами нисходящих беспроводных каналов являются системы радио- и телевизионного вещания, передача данных от базовой станции к мобильному абоненту в системах сотовой связи, а также сигналы от глобальных навигационных спутниковых систем.
В восходящем канале (обратный канал) множество передатчиков отправляют данные одному получателю. При этом даже при одинаковой выходной мощности всех передатчиков мощность принимаемых сигналов будет разная в зависимости от характеристики $h_k(t)$ соответствующей линий связи. Примерами такого рода каналов является передача клиентами данных точке доступа в беспроводных локальных сетях, абонентами - базовой станции в системах сотовой связи, наземными терминалами - орбитальному спутнику.
К системам может предъявляться требование справедливости (все пользователи должны иметь равный доступ). Мы не можем одновременно и передавать и принимать потому что наш собственный сигнал будет много мощнее любого другого передатчика. Основная проблема многопользовательского доступа - возникновение коллизий. Значит нужно делить сигналы. Есть ресурсы для этого - частота, время, пространство, код.
\subsection{Множественный доступ с временным разделением}
Time-division multiple access (TDMA). Идея в том, чтобы имеющееся время выделить для тех или иных пользователей. Вся передача делится на фреймы. паузы между фреймами могут быть, может не быть. как правило число слотов во фрейме равно числу абонентов.
\begin{itemize}
\item При TDMA все или группа пользователей передает на одной частоте, но в различные интервалы времени. Число интервалов в одном фрейме зависит от метода манипуляции, доступной ширины полосы и т.д.
\item Данные передаются в цифровом виде небольшими порциями и с предварительной буферизацией.
\item Приемопередатчики пользователей могут быть выключены в течение интервалов времени, в которых они не используются, поэтому возможно значительное снижение среднего энергопотребления устройств.
\item Для функционирования TDMA-схемы необходимо постоянно поддерживать синхронизацию между пользователями, что приводит к дополнительным накладным расходам ресурсов системы. Поэтому расписание может меняться во время работы, а также значительно экономить энергию конечных клиентов.
\item В случае необходимости пользователю может быть предоставлено несколько временных интервалов, что позволяет гибко распределять пропускную способность между пользователями в зависимости от их требований и приоритета
\end{itemize}
Может получиться так, что в структуре энергозатрат синхронизация будет занимать больше места, чем передача полезных данных.
\subsection{Множественный доступ с частотным разделением}
frequency-division multiple access (FDMA)
То есть необходимо разделить частоты так, чтобы полосы не пересекались с некоторым запасом (защитные интервалы) из-за несовершенства передатчиков. Подканалов фиксированное число.
\begin{itemize}
\item Если частотный канал не используется, то он не может быть задействован другими пользователями для увеличения пропускной способности, что снижает эффективность использования частотных ресурсов.
\item Метод частотного разделения в основном применяется в системах с узкополосными каналами пользователей (ширина полосы порядка нескольких десятков кГц).
\item Длительность передачи символа, как правило, больше среднего разброса временных задержек многолучевых компонент сигнала, поэтому межсимвольная интерференция мала и не требуется применение мер по ее устранению.
\item Для аналоговых систем связи метод частотного разделения проще в реализации, чем метод временного разделения. Однако по мере развития методов цифровой обработки сигналов разница в сложности реализации этих методов снижается.
\item Поскольку при частотном разделении возможна непрерывная передача сигналов, затраты на передачу служебных данных (например, для синхронизации) существенно меньше по сравнению с TDMA.
\item При частотном разделении в приемопередатчиках должны использоваться относительно сложные и дорогостоящие полосовые фильтры для снижения помех по соседнему каналу
\end{itemize}
\subsection{Множественный доступ с кодовым разделением}
code-division multiple access (CDMA)
Испольуются ППРЧ или прямая модуляция кодовой последовательностью.
\subsection{Множественный доступ с пространственным разделением}
\section{Случайный множественный доступ к среде}
\subsection{Методы ALOHA и Slotted ALOHA}
Если два пользователя передают сообщение одновременно, чаще всего возникает коллизия. Возможно использовать выражения для Пуассоновского распределения.
\[ P_s = P_r[x(2\tau) = 0] = e^{-\lambda\tau} = e ^{-G} \]
Это упрощение, где причина потери пакета - это только коллизия.
По мере увеличения нормированного трафика пропускная способность растёт, но при достижении 0,5 коллизий становится всё больше, и пропускная способность системы начинает падать.
slotted aloha позволяет сократить количество коллизий за счёт того, что они могут возникнуть только в слоте конкретного пользователя. При этом нужно понимать, что длительность слота не всегда равна длине сообщения потому что длина сообщений тоже не всегда равна для всех клиентов.
\subsection{Методы CSMA}
если нужно передать пакет, сначала проверяем, занят ли канал. В этом случае добавляется новый параметр $\tau_d$ - задержка (время) распространения сигнала
по каналу между любой парой пользователей системы.
\textbf{Ненастойчивый CSMA}
При ненастойчивом CSMA (nonpersistent CSMA) пользователь, который имеет пакет
для передачи по каналу, действует по следующему алгоритму:
\begin{enumerate}
\item Если проверка состояния канала показала, что канал свободен, то пользователь передает пакет.
\item Если обнаружено, что канал занят, то пользователь переносит передачу пакета на более позднее время в соответствии с некоторым распределением задержек. По истечении интервала ожидания пользователь снова проверяет состояние канала и повторяет описанные действия с п.1.
\end{enumerate}
\textbf{1-настойчивый CSMA}
Этот метод (1-persistent CSMA) отличается от предыдущего тем, что при его создании
ставилась задача достижения высокой пропускной способности за счет того, что канал
никогда не остается свободным при наличии пользователей с предназначенными для передачи пакетами. В данном случае пользователи выполняют следующие действия:
\begin{enumerate}
\item Если обнаружен свободный канал, то пользователь передает пакет.
\item Если канал занят, то пользователь остается в режиме ожидания до тех пор, пока канал не освободится, а затем передает пакет.
\end{enumerate}
\textbf{p-настойчивый CSMA}
Недостаток метода 1-настойчивый CSMA заключается в том, что если два и более
пользователя имеют пакеты для передачи, то как только освободится канал они все начнут передачу, что приведет к коллизии. Для уменьшения вероятности коллизий в таких ситуациях был предложен метод p-настойчивый CSMA (p-persistent CSMA), при котором пользователь, имеющий пакет для передачи, поступает следующим образом:
\begin{enumerate}
\item Если канал свободен, то пакет передается с вероятностью p или с вероятностью (1p) передача откладывается на время t.
\item Если по истечению интервала времени t канал обнаруживается свободным, то шаг 1 повторяется. Если же канал занят, то пользователи переносят ретрансляцию пакетов согласно некоторому распределению задержек.
\item Если по истечению задержки канал обнаруживается занятым, то пользователи ждут его освобождения и повторяют шаги 1 и 2.
\end{enumerate}
\subsection{Метод CSMA/CA (collision avoidance)}
используем любой CSMA в схеме А -- В -- С. Каждый узел видит только ближайших соседей.
\begin{itemize}
\item А обнаруживает, что канал свободен и начинает передачу
\item С обнаруживает свободный канал, так как не видит устройство А (не доходит канал) и передаёт данные
\item на В в итоге коллизия.
\end{itemize}
Возникает проблема \textbf{скрытого терминала} (скрытой станции, hidden terminal) для решения придумали предварительно посылать RTS (ready to send) пакет. В отвечает пакетом о готовности (Clear to send), получается некоторый Handshake. После окончания передачи В отправляет пакет подтверждения.
Проблема \textbf{открытого терминала}.
А -- В -- С -- Д
Каждый узел видит только ближайших соседей. Допустим В хочет передать узлу А, проверил свободен ли канал и передаёт. В этот же момент С хочет передать Д. С точки зрения логики всё хорошо, но при использовании CSMA/CA возникает ситуация, когда В передаёт RTS пакет, который принимает и С. С переходит в блокировку, поскольку думает, что его часть канала будет занята. В любом случае нужно блокировать потому что тогда возникнет коллизия по CTS или по данным.
\subsection{Метод автоматического запроса повторной передачи}
ARQ (Automatic repeat request)
А -- В
Если за таймаут пакет подтверждения не получен, передача не инициируется. Бесконечно переспрашивать смысла нет. Сеть при этом может быть любой сложности, важно, чтобы отправитель получил подтверждение. Используется на разных уровнях, мы будем рассматривать MAC уровень, то есть два соседних устройства.
В общем случае у нас есть две вероятности битовой ошибки - как данных от А к Б, так и пакета подтверждения в обратную сторону. У нас есть явление, которое называется асимметрия связи, всегда вероятности битовой ошибки при передачи и приёме разные.
\[ \Psi(\beta, L) = (1-\beta)^L \]
где L - длина пакета в битах.
\[ P_s = \Psi(\beta_{AB}L_d)\Psi(\beta_{BA}L_a) \]
\[P_l = 1 - P_s\]
Вероятность того, что будет сделано ровно К попыток
\[ Pr[X=k] = \begin{cases} P_l^{K-1}(1-P_l), 1\leq K < N\\ P_l^{K-1}, K = N \end{cases} \]
Количество попыток передать
\[ \mu_d(N) = \frac{N}{Z_k=1} kP_r[X=K] = \frac{1-P_l^N}{1-P_l} \]
\[\mu_d=\lim_N\to\infty \mu_d(N) = \frac{1}{\Psi(\beta_{AB}, L_d)\Psi(\beta_{BA}, L_a)} \]
\[ \mu_a = \mu_d \Phi(\beta_{AB}, L_d) = \frac{1}{\Psi(\beta_{BA}, L_a)} \]
Итоговая вероятность того, что пакет будет успешно передан
\[ P_s = 1 - P_l^N = 1 - [1-\Psi(\beta_{AB}, L_d)\Psi(\beta_{BA}, L_a)]^N \]
На практике N ограничивают до 5-10, потому что иначе считается, что сети нет.
N=30, R=50, L=125*8, $T_s$=1мин $P_x \leq 1\%$
\begin{equation*}
\begin{gathered}
\tau = \frac{8L}{R}\\
G = \lambda\tau\\
\lambda = \frac{N}{T_s}\\
P_c=\frac{G}{1+G}; a = \frac{\tau_d}{\tau}\approx 0\\
G=\frac{P_c}{1-P_c}\\
\frac{N}{T_s}\frac{8L}{R}=\frac{P_c}{1-P_c}=R\geq\frac{N8L(1-P_c)}{T_sP_c}=\frac{30*8*125(1-0.01)}{60*0.01}=49500\\
R\geq 49500bps
\end{gathered}
\end{equation*}
\end{document}
% sergey.baskakov@mail.ru

2
pdfit.sh Normal file
View File

@ -0,0 +1,2 @@
#!/bin/sh
inkscape -D --export-filename=$1.pdf $1.svg --export-latex

BIN
pics/00-ped-01-pragma.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

203
pics/01-dis-00-async.svg Normal file
View File

@ -0,0 +1,203 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
inkscape:version="1.1.2 (b8e25be8, 2022-02-05)"
sodipodi:docname="01-dis-00-async.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="0.64052329"
inkscape:cx="397.33138"
inkscape:cy="560.47923"
inkscape:window-width="1312"
inkscape:window-height="942"
inkscape:window-x="368"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<marker
style="overflow:visible;"
id="marker4198"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path3932" />
</marker>
<marker
style="overflow:visible;"
id="Arrow2Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow2Lend"
inkscape:isstock="true">
<path
transform="scale(1.1) rotate(180) translate(1,0)"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
style="stroke:context-stroke;fill-rule:evenodd;fill:context-stroke;stroke-width:0.62500000;stroke-linejoin:round;"
id="path3950" />
</marker>
<marker
style="overflow:visible;"
id="marker1215"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path1213" />
</marker>
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path948" />
</marker>
<inkscape:path-effect
effect="bspline"
id="path-effect859"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="m 13.218358,169.77329 c 44.199152,0 88.398042,0 132.596662,0"
id="path857"
inkscape:path-effect="#path-effect859"
inkscape:original-d="m 13.218358,169.77329 c 44.199152,2.6e-4 88.398042,2.6e-4 132.596662,0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#Arrow1Lend)"
d="m 14.044506,143.74965 h 40.894296 l 6.356702,23.72354"
id="path861" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-mid:url(#marker1215)"
d="m 91.28929,168.53407 6.384371,-23.8268 h 44.836769"
id="path863" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="15.283727"
y="136.7274"
id="text3298"><tspan
sodipodi:role="line"
id="tspan3296"
style="stroke-width:0.264583"
x="15.283727"
y="136.7274">клиент</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="14.044505"
y="183.81779"
id="text7468"><tspan
sodipodi:role="line"
id="tspan7466"
style="stroke-width:0.264583"
x="14.044505"
y="183.81779">сервер</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="4.5438108"
y="161.09874"
id="text7934"><tspan
sodipodi:role="line"
id="tspan7932"
style="stroke-width:0.264583"
x="4.5438108"
y="161.09874">запрос</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="79.723228"
y="180.92628"
id="text8400"><tspan
sodipodi:role="line"
id="tspan8398"
style="stroke-width:0.264583"
x="79.723228"
y="180.92628">ответ</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="57.417244"
y="132.59666"
id="text3223"><tspan
sodipodi:role="line"
id="tspan3221"
style="stroke-width:0.264583"
x="57.417244"
y="132.59666">возврат</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-mid:url(#marker4198)"
d="m 61.295504,167.47319 v -23.31047 l 36.378155,0.54455 v 0 0"
id="path3847" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1215)"
d="m 106.98609,144.98887 6.69418,24.98301"
id="path4239" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="118.13908"
y="154.48956"
id="text5335"><tspan
sodipodi:role="line"
id="tspan5333"
style="stroke-width:0.264583"
x="118.13908"
y="154.48956">подтверждение</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="118.13908"
y="167.71869"
id="tspan5337">получения</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

BIN
pics/01-dis-00-concept.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

426
pics/01-dis-00-dce.svg Normal file
View File

@ -0,0 +1,426 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg71260"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
sodipodi:docname="01-dis-00-dce.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview71262"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="2.5620932"
inkscape:cx="342.4934"
inkscape:cy="375.86455"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="-8"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs71257">
<inkscape:path-effect
effect="bspline"
id="path-effect134329"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect134325"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<marker
style="overflow:visible;"
id="marker134315"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path134313" />
</marker>
<inkscape:path-effect
effect="bspline"
id="path-effect134311"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<marker
style="overflow:visible;"
id="marker134301"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path134299" />
</marker>
<inkscape:path-effect
effect="bspline"
id="path-effect134297"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path56656" />
</marker>
<inkscape:path-effect
effect="bspline"
id="path-effect134285"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect134281"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<rect
x="143.43741"
y="253.11336"
width="159.2448"
height="123.92211"
id="rect81608" />
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;text-anchor:middle;text-align:center"
x="59.573311"
y="91.908897"
id="text73136"><tspan
sodipodi:role="line"
id="tspan73134"
style="stroke-width:0.264583;text-anchor:middle;text-align:center"
x="52.20219"
y="91.908897">клиент</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;white-space:pre;inline-size:0;stroke-width:0.264583"
x="60.680214"
y="70.945404"
id="text77912"><tspan
id="tspan77910"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
x="60.680214"
y="70.945404">машина
</tspan><tspan
style="stroke-width:0.264583"
x="60.680214"
y="76.237068"
id="tspan77914">клиента</tspan></text>
<text
xml:space="preserve"
transform="scale(0.26458333)"
id="text81606"
style="line-height:1.25;font-family:sans-serif;font-size:16px;white-space:pre;shape-inside:url(#rect81608)" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;text-anchor:middle;text-align:center"
x="113.5495"
y="67.692459"
id="text104510"><tspan
sodipodi:role="line"
id="tspan104508"
style="stroke-width:0.264583;text-anchor:middle;text-align:center"
x="96.246178"
y="67.692459">машина службы</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583;text-anchor:middle;text-align:center"
x="96.246178"
y="72.984123"
id="tspan104512">каталогов</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;text-anchor:middle;text-align:center"
x="113.12223"
y="86.797112"
id="text107720"><tspan
sodipodi:role="line"
id="tspan107718"
style="stroke-width:0.264583;text-anchor:middle;text-align:center"
x="96.76252"
y="86.797112">сервер службы</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583;text-anchor:middle;text-align:center"
x="96.76252"
y="92.088776"
id="tspan107722">каталогов</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="162.75104"
y="62.374134"
id="text124196"><tspan
sodipodi:role="line"
id="tspan124194"
style="stroke-width:0.264583"
x="162.75104"
y="62.374134">машина</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="162.75104"
y="67.665794"
id="tspan124198">сервера</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="162.44122"
y="80.342842"
id="text126764"><tspan
sodipodi:role="line"
id="tspan126762"
style="stroke-width:0.264583"
x="162.44122"
y="80.342842">сервер</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="162.64777"
y="99.344231"
id="text128730"><tspan
sodipodi:role="line"
id="tspan128728"
style="stroke-width:0.264583"
x="162.64777"
y="99.344231">DCE-демон</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="130.73782"
y="116.79659"
id="text131392"><tspan
sodipodi:role="line"
id="tspan131390"
style="stroke-width:0.264583"
x="130.73782"
y="116.79659">таблица</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="130.73782"
y="122.08826"
id="tspan131394">конечных</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="130.73782"
y="127.37991"
id="tspan131396">точек</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.00455028;stroke-dasharray:0.00910056, 0.00455028;paint-order:stroke markers fill"
id="rect134016"
width="34.594925"
height="44.818497"
x="44.508694"
y="59.482613" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.233851;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke markers fill"
id="rect134097"
width="36.734711"
height="45.82233"
x="41.94141"
y="61.768948" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.205;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke markers fill"
id="rect134234"
width="26.230179"
height="17.968706"
x="47.503475"
y="85.712799" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.205;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke markers fill"
id="rect134236"
width="44.508694"
height="46.987133"
x="91.392555"
y="61.031643" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.205;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke markers fill"
id="rect134238"
width="37.279903"
height="17.142557"
x="94.180809"
y="80.755905" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.205;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke markers fill"
id="rect134240"
width="38.725658"
height="54.112656"
x="143.54311"
y="55.042072" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.205;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke markers fill"
id="rect134242"
width="28.811892"
height="14.147775"
x="149.22289"
y="73.527115" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.205;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke markers fill"
id="rect134244"
width="31.806677"
height="12.598748"
x="146.22809"
y="91.805634" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 141.37448,117.00313 c 6.26498,-5.23229 12.52992,-10.46455 18.79485,-15.6968"
id="path134279"
inkscape:path-effect="#path-effect134281"
inkscape:original-d="m 141.37448,117.00313 c 6.26521,-5.23201 12.53016,-10.46427 18.79485,-15.6968" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="m 69.912724,89.430457 c 8.571535,-0.309814 17.142815,-0.619619 25.71384,-0.929415"
id="path134283"
inkscape:path-effect="#path-effect134285"
inkscape:original-d="m 69.912724,89.430457 c 8.571545,-0.309539 17.142825,-0.619345 25.71384,-0.929415" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker134301)"
d="m 151.59805,78.79381 c -7.64165,1.30803 -15.28351,2.616096 -22.92559,3.924199"
id="path134295"
inkscape:path-effect="#path-effect134297"
inkscape:original-d="m 151.59805,78.79381 c -7.6416,1.30833 -15.28346,2.616398 -22.92559,3.924199" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker134315)"
d="m 66.91794,97.382128 c 21.10147,2.168667 42.20265,4.337302 54.42266,4.199552 12.22001,-0.13774 15.55896,-2.581717 19.32828,-5.748643 3.76932,-3.166927 7.96882,-7.056621 12.16839,-10.946389"
id="path134309"
inkscape:path-effect="#path-effect134311"
inkscape:original-d="m 66.91794,97.382128 c 21.101446,2.1689 42.20263,4.337532 63.30355,6.505912 3.33934,-2.44381 6.67829,-4.887776 10.01703,-7.332061 4.19994,-3.889591 8.39943,-7.779289 12.59875,-11.669331" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker134301)"
d="m 64.232961,101.51286 c 28.261397,0.48192 56.522519,0.96384 84.783379,1.44576"
id="path134323"
inkscape:path-effect="#path-effect134325"
inkscape:original-d="m 64.232961,101.51286 c 28.261392,0.48219 56.522519,0.96411 84.783379,1.44576" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker134301)"
d="m 174.52364,80.549373 c 4.57855,2.754013 9.15678,5.507836 9.38035,8.382059 0.22358,2.874223 -3.90708,5.86895 -8.03786,8.863768"
id="path134327"
inkscape:path-effect="#path-effect134329"
inkscape:original-d="m 174.52364,80.549373 c 4.5785,2.75409 9.15673,5.507913 13.7347,8.261475 -4.13055,2.995109 -8.26121,5.989833 -12.39221,8.984352" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="185.47011"
y="88.191231"
id="text137193"><tspan
sodipodi:role="line"
id="tspan137191"
style="stroke-width:0.264583"
x="185.47011"
y="88.191231">1</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="137.65681"
y="77.967667"
id="text140961"><tspan
sodipodi:role="line"
id="tspan140959"
style="stroke-width:0.264583"
x="137.65681"
y="77.967667">2</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="83.337624"
y="86.435669"
id="text143033"><tspan
sodipodi:role="line"
id="tspan143031"
style="stroke-width:0.264583"
x="83.337624"
y="86.435669">3</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="83.95723"
y="107.81224"
id="text146103"><tspan
sodipodi:role="line"
id="tspan146101"
style="stroke-width:0.264583"
x="83.95723"
y="107.81224">4</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="138.3797"
y="92.941582"
id="text147769"><tspan
sodipodi:role="line"
id="tspan147767"
style="stroke-width:0.264583"
x="138.3797"
y="92.941582">5</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

BIN
pics/01-dis-00-distrans.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

262
pics/01-dis-00-division.svg Normal file
View File

@ -0,0 +1,262 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
inkscape:version="1.1.2 (b8e25be8, 2022-02-05)"
sodipodi:docname="01-dis-00-division.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="0.64052329"
inkscape:cx="396.55076"
inkscape:cy="560.47923"
inkscape:window-width="1087"
inkscape:window-height="942"
inkscape:window-x="593"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<inkscape:path-effect
effect="bspline"
id="path-effect4037"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="stroke-width:0.765;stroke-dasharray:none;fill:none;stroke:#000000;stroke-opacity:1;stroke-miterlimit:4;stroke-dashoffset:0"
id="rect846"
width="24.371347"
height="22.305981"
x="15.283728"
y="52.047287" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect846-0"
width="24.371347"
height="22.305981"
x="15.077191"
y="85.093185" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect846-2"
width="24.371347"
height="22.305981"
x="15.490266"
y="118.13908" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect846-8"
width="24.371347"
height="22.305981"
x="49.362309"
y="52.047287" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect846-0-3"
width="24.371347"
height="22.305981"
x="49.155773"
y="85.093193" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect846-2-9"
width="24.371347"
height="22.305981"
x="49.568848"
y="118.13908" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect846-05"
width="24.371347"
height="22.305981"
x="83.647423"
y="51.634216" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect846-0-2"
width="24.371347"
height="22.305981"
x="83.440887"
y="84.680115" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect846-2-2"
width="24.371347"
height="22.305981"
x="83.853966"
y="117.72601" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect846-23"
width="24.371347"
height="22.305981"
x="119.17178"
y="51.634216" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect846-0-9"
width="24.371347"
height="22.305981"
x="118.96523"
y="84.680115" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect846-2-97"
width="24.371347"
height="22.305981"
x="119.37831"
y="117.72601" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect846-03"
width="24.371347"
height="22.305981"
x="154.69611"
y="52.047291" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect846-0-98"
width="24.371347"
height="22.305981"
x="154.48958"
y="85.093185" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect846-2-6"
width="24.371347"
height="22.305981"
x="154.90265"
y="118.13908" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 5.783032,41.720444 c 10.604854,10.742579 21.207078,21.482494 27.059047,27.334271 5.851969,5.851776 6.953497,6.815614 7.710328,7.642089 0.756832,0.826476 1.169905,1.514932 2.065143,1.78864 0.895237,0.273708 2.27215,0.136016 3.993517,0.136228 1.721367,2.11e-4 3.786737,0.137903 5.852022,0.206655 2.065286,0.06875 4.130656,0.06875 6.678052,0.206573 2.547396,0.137821 5.576603,0.413203 9.363003,0.550764 3.786401,0.137561 8.330212,0.137561 10.600795,0.276576 2.270582,0.139015 2.270582,0.414395 2.615776,1.103075 0.345194,0.68868 1.033648,1.790208 2.892867,3.786478 1.85922,1.99627 4.888428,4.887786 7.779815,7.91711 2.891387,3.029325 5.645209,6.196223 8.054953,8.743377 2.40973,2.54716 4.47511,4.47484 5.98967,5.92064 1.51456,1.4458 2.47839,2.40964 3.2357,3.16694 0.7573,0.75731 1.30806,1.30807 5.43878,1.51326 4.13071,0.20519 11.84142,0.0675 17.21151,0.1365 5.37009,0.069 8.3993,0.34438 10.87763,0.48194 2.47833,0.13756 4.40601,0.13756 5.85177,0.13756 1.44576,0 2.4096,0 3.37302,0.82771 0.96343,0.82771 1.92727,2.48001 3.44233,4.26971 1.51505,1.7897 3.58043,3.71738 7.16044,6.88422 3.58002,3.16684 8.67459,7.57296 11.77272,10.18898 3.09812,2.61603 4.19965,3.44217 6.19601,5.30122 1.99637,1.85904 4.88789,4.75056 7.77675,7.63943"
id="path4035"
inkscape:path-effect="#path-effect4037"
inkscape:original-d="m 5.783032,41.720444 c 10.604871,10.742562 21.207095,21.482478 31.806676,32.219749 1.104175,0.966486 2.205704,1.930323 3.304588,2.891517 0.415721,0.691103 0.828794,1.379559 1.239223,2.065369 1.379556,-0.135045 2.756469,-0.272737 4.130736,-0.413075 2.068015,0.140338 4.133385,0.27803 6.196105,0.413075 2.068015,0.0026 4.133385,0.0026 6.196105,0 3.031855,0.278027 6.061062,0.553411 9.087623,0.826146 4.546457,0.0026 9.090268,0.0026 13.631433,0 0.0026,0.27803 0.0026,0.55341 0,0.826148 0.691103,1.104175 1.379556,2.205704 2.065367,3.304591 3.031855,2.89416 6.061062,5.785678 9.087623,8.674547 2.756471,3.169544 5.510294,6.336442 8.261469,9.500699 2.06802,1.93032 4.13339,3.858 6.19611,5.78303 0.96649,0.96648 1.93032,1.93032 2.89152,2.89151 0.55341,0.55342 1.10417,1.10418 1.65229,1.6523 7.71336,-0.13505 15.42407,-0.27274 23.13213,-0.41308 3.03185,0.27803 6.06106,0.55342 9.08762,0.82615 1.93032,0.003 3.858,0.003 5.78303,0 0.96649,0.003 1.93033,0.003 2.89152,0 0.96648,1.65494 1.93032,3.30724 2.89151,4.95689 2.06802,1.93032 4.13339,3.858 6.19611,5.78303 5.09722,4.40876 10.1918,8.81488 15.28373,13.21836 1.10417,0.82879 2.2057,1.65494 3.30459,2.47844 2.89416,2.89416 5.78568,5.78568 8.67454,8.67455" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="21.892906"
y="35.937412"
id="text5119"><tspan
sodipodi:role="line"
id="tspan5117"
style="stroke-width:0.264583"
x="21.892906"
y="35.937412">1</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="57.417244"
y="40.06815"
id="text5849"><tspan
sodipodi:role="line"
id="tspan5847"
style="stroke-width:0.264583"
x="57.417244"
y="40.06815">2</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="88.397774"
y="40.48122"
id="text6051"><tspan
sodipodi:role="line"
id="tspan6049"
style="stroke-width:0.264583"
x="88.397774"
y="40.48122">3</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="123.92211"
y="41.720444"
id="text6187"><tspan
sodipodi:role="line"
id="tspan6185"
style="stroke-width:0.264583"
x="123.92211"
y="41.720444">4</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="163.99026"
y="41.720444"
id="text6301"><tspan
sodipodi:role="line"
id="tspan6299"
style="stroke-width:0.264583"
x="163.99026"
y="41.720444">5</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="188.77469"
y="69.809456"
id="text6877"><tspan
sodipodi:role="line"
id="tspan6875"
style="stroke-width:0.264583"
x="188.77469"
y="69.809456">ui</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="187.12239"
y="102.02921"
id="text7431"><tspan
sodipodi:role="line"
id="tspan7429"
style="stroke-width:0.264583"
x="187.12239"
y="102.02921">app</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="187.12239"
y="135.48817"
id="text8293"><tspan
sodipodi:role="line"
id="tspan8291"
style="stroke-width:0.264583"
x="187.12239"
y="135.48817">res</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="18.175243"
y="154.48956"
id="text9485"><tspan
sodipodi:role="line"
id="tspan9483"
style="stroke-width:0.264583"></tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

BIN
pics/01-dis-00-ejb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
pics/01-dis-00-platform.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

366
pics/01-dis-00-proxy.svg Normal file
View File

@ -0,0 +1,366 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg153809"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
sodipodi:docname="01-dis-00-proxy.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview153811"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="2.5620932"
inkscape:cx="259.35825"
inkscape:cy="476.17316"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="-8"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs153806">
<inkscape:path-effect
effect="bspline"
id="path-effect219247"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="38.20932"
y="90.772949"
id="text158721"><tspan
sodipodi:role="line"
id="tspan158719"
style="stroke-width:0.264583"
x="38.20932"
y="90.772949">клиент</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="37.383171"
y="138.48297"
id="text160405"><tspan
sodipodi:role="line"
id="tspan160403"
style="stroke-width:0.264583"
x="37.383171"
y="138.48297">ОС клиента</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="39.138737"
y="114.52468"
id="text165113"><tspan
sodipodi:role="line"
id="tspan165111"
style="stroke-width:0.264583"
x="39.138737"
y="114.52468">заместитель</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="83.544159"
y="85.609528"
id="text169695"><tspan
sodipodi:role="line"
id="tspan169693"
style="stroke-width:0.264583"
x="83.544159"
y="85.609528">клиент</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="83.544159"
y="90.901192"
id="tspan169697">обращается </tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="83.544159"
y="96.192856"
id="tspan169699">к серверу</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="83.027809"
y="112.14951"
id="text172943"><tspan
sodipodi:role="line"
id="tspan172941"
style="stroke-width:0.264583"
x="83.027809"
y="112.14951">тот же интерфейс</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="83.027809"
y="117.44118"
id="tspan172945">что и у объекта</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="123.92211"
y="90.153336"
id="text180821"><tspan
sodipodi:role="line"
id="tspan180819"
style="stroke-width:0.264583"
x="123.92211"
y="90.153336">сервер</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="165.02295"
y="93.457924"
id="text184923"><tspan
sodipodi:role="line"
id="tspan184921"
style="stroke-width:0.264583"
x="165.02295"
y="93.457924">объект</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="164.81641"
y="100.48018"
id="text188479"><tspan
sodipodi:role="line"
id="tspan188477"
style="stroke-width:0.264583"
x="164.81641"
y="100.48018">состояние</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="164.81641"
y="105.77184"
id="tspan188481">(данные)</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="163.99026"
y="113.59527"
id="text194131"><tspan
sodipodi:role="line"
id="tspan194129"
style="stroke-width:0.264583"
x="163.99026"
y="113.59527">метод</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="125.05806"
y="123.40578"
id="text198227"><tspan
sodipodi:role="line"
id="tspan198225"
style="stroke-width:0.264583"
x="125.05806"
y="123.40578">интерфейс</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="123.50904"
y="137.96663"
id="text202431"><tspan
sodipodi:role="line"
id="tspan202429"
style="stroke-width:0.264583"
x="123.50904"
y="137.96663">скелетон</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="123.92211"
y="150.7719"
id="text206773"><tspan
sodipodi:role="line"
id="tspan206771"
style="stroke-width:0.264583"
x="123.92211"
y="150.7719">ОС сервера</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="81.06572"
y="160.78894"
id="text210713"><tspan
sodipodi:role="line"
id="tspan210711"
style="stroke-width:0.264583"
x="81.06572"
y="160.78894">передача параметров после</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="81.06572"
y="166.0806"
id="tspan210715">маршаллинга по сети</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.205;paint-order:stroke markers fill"
id="rect215655"
width="40.584492"
height="62.37413"
x="17.039289"
y="83.750694" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.205;paint-order:stroke markers fill"
id="rect215657"
width="40.687763"
height="15.696792"
x="17.039289"
y="130.42802" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.205;paint-order:stroke markers fill"
id="rect215659"
width="28.708626"
height="7.1255212"
x="23.855007"
y="92.941582" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.205;paint-order:stroke markers fill"
id="rect215765"
width="32.323017"
height="8.8810844"
x="23.132128"
y="108.22531" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.205;paint-order:stroke markers fill"
id="rect216078"
width="18.278511"
height="5.6797638"
x="30.257648"
y="104.61092" />
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.205;paint-order:stroke markers fill"
id="rect219148"
width="36.453754"
height="71.255219"
x="107.60571"
y="83.440895" />
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.205;paint-order:stroke markers fill"
id="rect219172"
width="36.350494"
height="9.2941589"
x="107.70897"
y="145.40195" />
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.205;paint-order:stroke markers fill"
id="rect219174"
width="24.26808"
height="5.9895687"
x="112.14951"
y="133.83588" />
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.205;paint-order:stroke markers fill"
id="rect219176"
width="31.909946"
height="54.112656"
x="109.5678"
y="91.18602" />
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.205;paint-order:stroke markers fill"
id="rect219178"
width="25.300764"
height="21.170027"
x="113.38873"
y="93.767731" />
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.205;paint-order:stroke markers fill"
id="rect219180"
width="19.72427"
height="4.2340055"
x="115.97044"
y="95.523293" />
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.205;paint-order:stroke markers fill"
id="rect219182"
width="4.3372741"
height="7.9516692"
x="114.93776"
y="104.30111" />
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.205;paint-order:stroke markers fill"
id="rect219184"
width="4.9568844"
height="8.3647423"
x="122.88943"
y="104.19785" />
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.205;paint-order:stroke markers fill"
id="rect219186"
width="4.1307373"
height="9.2941589"
x="131.66725"
y="103.57823" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 112.56259,112.76912 h -2.16864 v 13.94124 h 29.4315 v -14.76739 h -0.82615"
id="path219225" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 38.72566,99.7573 -0.103267,4.75035"
id="path219227" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 39.138735,102.23574 68.157163,89.22392"
id="path219229" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 46.987134,106.67629 15.386997,1.85883"
id="path219231" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 131.56398,94.59388 24.57788,-2.168639"
id="path219233" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 132.69993,97.485395 18.27851,2.375175"
id="path219235" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 133.83588,108.84492 22.40925,3.30459"
id="path219237" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 36.143948,146.33136 v 27.57267"
id="path219239" />
<path
style="fill:none;stroke:#000000;stroke-width:0.28529px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 127.63978,174.73018 V 154.79937"
id="path219241" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 8.2614743,174.93672 H 152.21766"
id="path219243" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 39.448538,163.16412 c 15.834806,4.78486 31.669299,9.56963 45.885951,9.2597 14.216652,-0.30993 26.815141,-5.71421 39.413761,-11.11853"
id="path219245"
inkscape:path-effect="#path-effect219247"
inkscape:original-d="m 39.448538,163.16412 c 15.834756,4.78503 31.669249,9.5698 47.503479,14.35431 12.599262,-5.40422 25.197753,-10.8085 37.796233,-16.21314" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

BIN
pics/01-dis-00-rpc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

261
pics/01-dis-00-rpc.svg Normal file
View File

@ -0,0 +1,261 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg118037"
sodipodi:docname="01-dis-00-rpc.svg"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview118039"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="2.5620932"
inkscape:cx="488.4678"
inkscape:cy="379.76761"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="-8"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs118034">
<marker
style="overflow:visible"
id="marker142251"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="scale(0.8) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path142249" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lstart"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="scale(0.8) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path45477" />
</marker>
<marker
style="overflow:visible;"
id="marker119121"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path119119" />
</marker>
<marker
style="overflow:visible"
id="DotL"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="DotL"
inkscape:isstock="true">
<path
transform="scale(0.8) translate(7.4, 1)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt"
d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
id="path45538" />
</marker>
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path45480" />
</marker>
<marker
style="overflow:visible"
id="DotM"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="DotM"
inkscape:isstock="true">
<path
transform="scale(0.4) translate(7.4, 1)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt"
d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
id="path45541" />
</marker>
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:none;stroke:#000000;stroke-width:0.26458299;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:2.11666389,2.11666389;stroke-dashoffset:0"
d="M 69.864766,110.02953 H 104.74732"
id="path118195" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458299;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:2.11666389,2.11666389;stroke-dashoffset:0"
d="M 99.963419,89.99698 H 135.14497"
id="path118197" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458299;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:2.11666389,2.11666389;stroke-dashoffset:0"
d="M 129.96241,109.92185 H 160.2604"
id="path118199" />
<circle
id="path118379"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="160.06107"
cy="90.036057"
r="0.39687499" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#DotL)"
d="M 135.14497,89.99698 H 160.2604"
id="path118769" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#DotL);marker-end:url(#marker119121)"
d="m 129.96241,109.92185 5.36665,-20.028619"
id="path118771" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="M 69.864766,90.295972 H 99.863758"
id="path118966" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Lstart);marker-end:url(#DotL)"
d="m 129.96241,109.92185 h -24.9161"
id="path118968" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#DotL);marker-end:url(#marker119121)"
d="m 99.963419,89.99698 5.278761,19.70062"
id="path118970" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="70.562416"
y="88.402344"
id="text120574"><tspan
sodipodi:role="line"
id="tspan120572"
style="stroke-width:0.264583"
x="70.562416"
y="88.402344">клиент</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="70.26342"
y="108.03624"
id="text123020"><tspan
sodipodi:role="line"
id="tspan123018"
style="stroke-width:0.264583"
x="70.26342"
y="108.03624">сервер</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="99.764099"
y="87.505363"
id="text126786"><tspan
sodipodi:role="line"
id="tspan126784"
style="stroke-width:0.264583"
x="99.764099"
y="87.505363">rpc call</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="104.84698"
y="115.7104"
id="text128770"><tspan
sodipodi:role="line"
id="tspan128768"
style="stroke-width:0.264583"
x="104.84698"
y="115.7104">запрос</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="130.16174"
y="115.51107"
id="text132224"><tspan
sodipodi:role="line"
id="tspan132222"
style="stroke-width:0.264583"
x="130.16174"
y="115.51107">ответ</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="135.0453"
y="82.721474"
id="text137022"><tspan
sodipodi:role="line"
id="tspan137020"
style="stroke-width:0.264583"
x="135.0453"
y="82.721474">завершение</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="135.0453"
y="88.013138"
id="tspan137024">вызова</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker142251)"
d="m 116.50772,109.8302 21.92617,13.75369"
id="path138597" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="120.09564"
y="123.2849"
id="text140735"><tspan
sodipodi:role="line"
id="tspan140733"
style="stroke-width:0.264583"
x="120.09564"
y="123.2849">вызов</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="120.09564"
y="128.57655"
id="tspan140737">локальной</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="120.09564"
y="133.86821"
id="tspan140739">процедуры</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.7 KiB

BIN
pics/01-dis-00-spo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

155
pics/01-dis-00-sync.svg Normal file
View File

@ -0,0 +1,155 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
inkscape:version="1.1.2 (b8e25be8, 2022-02-05)"
sodipodi:docname="01-dis-00-sync.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="0.64052329"
inkscape:cx="397.33138"
inkscape:cy="560.47923"
inkscape:window-width="1312"
inkscape:window-height="942"
inkscape:window-x="368"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<marker
style="overflow:visible;"
id="marker1215"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path1213" />
</marker>
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path948" />
</marker>
<inkscape:path-effect
effect="bspline"
id="path-effect859"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="m 13.631432,168.121 c 44.199152,0 88.398038,0 132.596658,0"
id="path857"
inkscape:path-effect="#path-effect859"
inkscape:original-d="m 13.631432,168.121 c 44.199152,2.6e-4 88.398038,2.6e-4 132.596658,0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#Arrow1Lend)"
d="m 14.044506,143.74965 h 40.894296 l 6.356702,23.72354"
id="path861" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-mid:url(#marker1215)"
d="m 91.28929,168.53407 6.384371,-23.8268 h 44.836769"
id="path863" />
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:0.765,3.06;stroke-dashoffset:0"
d="M 54.938802,143.74965 H 97.89847"
id="path1256" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="15.283727"
y="136.7274"
id="text3298"><tspan
sodipodi:role="line"
id="tspan3296"
style="stroke-width:0.264583"
x="15.283727"
y="136.7274">клиент</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="59.895691"
y="136.31432"
id="text4436"><tspan
sodipodi:role="line"
id="tspan4434"
style="stroke-width:0.264583"
x="59.895691"
y="136.31432">ожидание</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="14.044505"
y="183.81779"
id="text7468"><tspan
sodipodi:role="line"
id="tspan7466"
style="stroke-width:0.264583"
x="14.044505"
y="183.81779">сервер</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="4.5438108"
y="161.09874"
id="text7934"><tspan
sodipodi:role="line"
id="tspan7932"
style="stroke-width:0.264583"
x="4.5438108"
y="161.09874">запрос</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="104.92072"
y="160.68567"
id="text8400"><tspan
sodipodi:role="line"
id="tspan8398"
style="stroke-width:0.264583"
x="104.92072"
y="160.68567">ответ</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

236
pics/01-dis-01-rmi.svg Normal file
View File

@ -0,0 +1,236 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
sodipodi:docname="01-dis-01-rmi.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="2.5620932"
inkscape:cx="283.55722"
inkscape:cy="410.21147"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="-8"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<inkscape:path-effect
effect="bspline"
id="path-effect32968"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<marker
style="overflow:visible;"
id="marker32921"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path32919" />
</marker>
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path32566" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lstart"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="scale(0.8) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path32563" />
</marker>
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="62.219227"
y="92.321968"
id="text4448"><tspan
sodipodi:role="line"
id="tspan4446"
style="stroke-width:0.264583"
x="62.219227"
y="92.321968">локальный</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="62.219227"
y="97.613632"
id="tspan4450">объект о1</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="60.928379"
y="116.89985"
id="text9044"><tspan
sodipodi:role="line"
id="tspan9042"
style="stroke-width:0.264583"
x="60.928379"
y="116.89985">ссылка</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="120.61752"
y="89.120659"
id="text13374"><tspan
sodipodi:role="line"
id="tspan13372"
style="stroke-width:0.264583"
x="120.61752"
y="89.120659">удалённый</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="120.61752"
y="94.412323"
id="tspan13376">объект о2</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="122.01165"
y="118.19072"
id="text23334"><tspan
sodipodi:role="line"
id="tspan23332"
style="stroke-width:0.264583"
x="122.01165"
y="118.19072">копия</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="122.01165"
y="123.48238"
id="tspan23336">локального</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="122.01165"
y="128.77405"
id="tspan23338">объекта о1</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 48.019819,87.158552 V 100.68672 H 77.45132 V 86.848746 Z"
id="path27333" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 49.568846,111.01356 h 21.686369 v 9.60396 H 49.878652 Z"
id="path27337" />
<circle
id="path27339"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="49.568844"
cy="111.01356"
r="0.39687499" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 45.025034,82.71801 h 36.350488 v 41.41064 H 45.747913 Z"
id="path27341" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 106.77955,84.0605 v 13.011822 h 28.70863 v -13.83797 z"
id="path27345" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 104.19784,80.239567 V 99.7573 h 34.18185 V 80.859179 Z"
id="path27349" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 107.2959,113.1822 h 28.81189 v 17.86543 H 107.2959 Z"
id="path27706" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 104.61092,110.49722 h 35.00799 v 43.68254 h -35.21453 z"
id="path27710" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 108.43185,135.69471 h 27.67594 v 14.66412 h -27.05633 z"
id="path27712" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="84.680107"
y="136.83067"
id="text31014"><tspan
sodipodi:role="line"
id="tspan31012"
style="stroke-width:0.264583"
x="84.680107"
y="136.83067">передача</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="84.680107"
y="142.12233"
id="tspan31016">копии</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker32921);marker-start:url(#Arrow1Lstart)"
d="m 55.455145,100.37691 v 10.63665"
id="path32559" />
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#Arrow1Lend);marker-start:url(#Arrow1Lstart)"
d="m 62.99374,100.68672 v 10.01703"
id="path32561" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="M 69.499651,114.21488 108.32858,92.218705"
id="path32962" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 69.396384,117.93255 41.720446,23.95827"
id="path32964" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="m 109.87761,138.58623 c -6.16142,-6.09257 -12.323103,-12.18541 -12.478098,-19.41439 -0.154995,-7.22898 5.696768,-15.59355 11.548678,-23.958351"
id="path32966"
inkscape:path-effect="#path-effect32968"
inkscape:original-d="M 109.87761,138.58623 C 103.71619,132.49366 97.554506,126.40082 91.392559,120.30772 97.244817,111.94307 103.09658,103.5785 108.94819,95.213489" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.2 KiB

BIN
pics/01-dis-rpt-pldeix1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
pics/01-dis-rpt-plerr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
pics/01-dis-rpt-plerr2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
pics/01-dis-rpt-plfg1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

BIN
pics/01-dis-rpt-plperr1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
pics/01-dis-rpt-plprim1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

473
pics/01-ess-00-arrayrow.svg Normal file
View File

@ -0,0 +1,473 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
inkscape:version="1.1.2 (b8e25be8, 2022-02-05)"
sodipodi:docname="01-ess-00-arrayrow.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="0.75356151"
inkscape:cx="344.36472"
inkscape:cy="249.48196"
inkscape:window-width="1022"
inkscape:window-height="942"
inkscape:window-x="658"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path1456" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lend-1"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1456-4" />
</marker>
<marker
style="overflow:visible"
id="marker1767"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1765" />
</marker>
<marker
style="overflow:visible"
id="marker1771"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1769" />
</marker>
<marker
style="overflow:visible"
id="marker1775"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1773" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lend-5"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1456-3" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lend-4"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1456-49" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lend-8"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1456-2" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lend-7"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1456-48" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lend-2"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1456-25" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lend-52"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1456-1" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lend-6"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1456-0" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lend-85"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1456-9" />
</marker>
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect846"
width="68.570229"
height="102.02921"
x="23.557053"
y="49.609467" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 23.743262,57.542493 H 91.90039"
id="path1170" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 23.743262,65.08447 H 92.179721"
id="path1172" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 23.743262,72.90578 H 92.179721"
id="path1174" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 23.743262,80.727091 H 92.179721"
id="path1176" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 23.463929,87.989734 H 91.90039"
id="path1178" />
<ellipse
id="path1180"
style="fill:#000000;stroke:none;stroke-width:4.41218;stroke-miterlimit:4;stroke-dasharray:none"
cx="30.159666"
cy="94.922211"
rx="1.7852932"
ry="1.8443749" />
<ellipse
id="path1182"
style="fill:#000000;stroke:none;stroke-width:8.98438;stroke-miterlimit:4;stroke-dasharray:none"
cx="36.025646"
cy="95.201538"
rx="1.7852932"
ry="1.8443749" />
<ellipse
id="path1184"
style="fill:#000000;stroke:none;stroke-width:4.52036;stroke-miterlimit:4;stroke-dasharray:none"
cx="43.068039"
cy="94.89267"
rx="1.8443749"
ry="1.8739157" />
<path
style="fill:none;stroke:#800080;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="M 25.760756,53.863398 H 37.302913"
id="path1365" />
<path
style="fill:none;stroke:#800080;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="M 41.150299,53.863398 H 52.859733"
id="path1367" />
<path
style="fill:none;stroke:#800080;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="M 57.041674,53.863398 H 69.085663"
id="path1369" />
<path
style="fill:none;stroke:#800080;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="m 72.933048,53.696121 h 13.38221"
id="path1371" />
<path
style="fill:none;stroke:#800080;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-1)"
d="M 25.336654,61.641808 H 36.878811"
id="path1365-7" />
<path
style="fill:none;stroke:#800080;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-1)"
d="M 40.726197,61.641808 H 52.435631"
id="path1367-1" />
<path
style="fill:none;stroke:#800080;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-1)"
d="M 56.617572,61.641808 H 68.661561"
id="path1369-3" />
<path
style="fill:none;stroke:#800080;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-1)"
d="m 72.508946,61.474531 h 13.38221"
id="path1371-8" />
<g
id="g2740"
transform="translate(26.262589,2.6764422)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.965;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1948"
width="14.385877"
height="27.433533"
x="127.96739"
y="87.653481" />
<path
style="fill:none;stroke:#800080;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="m 130.142,91.835421 h 9.7021"
id="path2554" />
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 128.30194,96.017362 h 13.54949 v -0.167278"
id="path2655" />
</g>
<g
id="g2740-1"
transform="translate(19.236928,-2.3418869)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.965;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1948-5"
width="14.385877"
height="27.433533"
x="127.96739"
y="87.653481" />
<path
style="fill:none;stroke:#800080;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-4)"
d="m 130.142,91.835421 h 9.7021"
id="path2554-5" />
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 128.30194,96.017362 h 13.54949 v -0.167278"
id="path2655-5" />
</g>
<g
id="g2740-9"
transform="translate(12.378544,-7.1929379)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.965;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1948-8"
width="14.385877"
height="27.433533"
x="127.96739"
y="87.653481" />
<path
style="fill:none;stroke:#800080;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-8)"
d="m 130.142,91.835421 h 9.7021"
id="path2554-2" />
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 128.30194,96.017362 h 13.54949 v -0.167278"
id="path2655-0" />
</g>
<g
id="g2740-5"
transform="translate(5.5201613,-12.211267)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.965;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1948-83"
width="14.385877"
height="27.433533"
x="127.96739"
y="87.653481" />
<path
style="fill:none;stroke:#800080;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-7)"
d="m 130.142,91.835421 h 9.7021"
id="path2554-0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 128.30194,96.017362 h 13.54949 v -0.167278"
id="path2655-6" />
</g>
<g
id="g2740-2"
transform="translate(-1.6727767,-17.396874)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.965;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1948-2"
width="14.385877"
height="27.433533"
x="127.96739"
y="87.653481" />
<path
style="fill:none;stroke:#800080;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2)"
d="m 130.142,91.835421 h 9.7021"
id="path2554-7" />
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 128.30194,96.017362 h 13.54949 v -0.167278"
id="path2655-1" />
</g>
<g
id="g2740-10"
transform="translate(-8.5311597,-22.247925)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.965;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1948-1"
width="14.385877"
height="27.433533"
x="127.96739"
y="87.653481" />
<path
style="fill:none;stroke:#800080;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-52)"
d="m 130.142,91.835421 h 9.7021"
id="path2554-8" />
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 128.30194,96.017362 h 13.54949 v -0.167278"
id="path2655-7" />
</g>
<g
id="g2740-0"
transform="translate(-15.556821,-27.433532)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.965;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1948-9"
width="14.385877"
height="27.433533"
x="127.96739"
y="87.653481" />
<path
style="fill:none;stroke:#800080;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-6)"
d="m 130.142,91.835421 h 9.7021"
id="path2554-56" />
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 128.30194,96.017362 h 13.54949 v -0.167278"
id="path2655-2" />
</g>
<g
id="g2740-4"
transform="translate(-22.582482,-32.451861)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.965;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1948-3"
width="14.385877"
height="27.433533"
x="127.96739"
y="87.653481" />
<path
style="fill:none;stroke:#800080;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-85)"
d="m 130.142,91.835421 h 9.7021"
id="path2554-9" />
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 128.30194,96.017362 h 13.54949 v -0.167278"
id="path2655-05" />
</g>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 97.522861,104.88308 H 126.29461"
id="path3069" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 97.690139,110.23596 H 126.12733"
id="path3071" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 118.9344,100.36658 12.38433,7.1501"
id="path3073" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 131.31873,107.51668 -11.7023,6.75632"
id="path3075" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -0,0 +1,148 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg66873"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
sodipodi:docname="01-ess-00-burstanswer.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview66875"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="5.1241863"
inkscape:cx="348.64072"
inkscape:cy="343.85947"
inkscape:window-width="2540"
inkscape:window-height="1337"
inkscape:window-x="12"
inkscape:window-y="50"
inkscape:window-maximized="0"
inkscape:current-layer="layer1" />
<defs
id="defs66870">
<marker
style="overflow:visible;"
id="Arrow1Send"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Send"
inkscape:isstock="true">
<path
transform="scale(0.2) rotate(180) translate(6,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path45492" />
</marker>
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path45480" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lstart"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="scale(0.8) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path45477" />
</marker>
<inkscape:path-effect
effect="bspline"
id="path-effect66918"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 55.042072,80.084664 h 4.90525 l 1.229342,-4.587962 1.234122,4.605811 h 41.941954"
id="path66910" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 55.093705,87.571627 H 69.96436 l 1.015886,-3.791342 1.049266,3.915918 h 3.098268 l 1.08829,-4.061547 1.134991,4.235841 h 2.68197 l 1.161137,-4.333428 1.151975,4.299228 h 2.747042 l 1.14913,-4.28861 1.152655,4.301776 h 17.62902"
id="path66912" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 55.042072,95.006953 h 14.870655 l 0.05163,-4.801982 6.196104,0.05163 v 4.595445 -4.595445 l 5.111787,-0.103267 v 4.956884 -4.956884 l 5.00852,0.103267 v 4.750348 h 18.588318"
id="path66914"
sodipodi:nodetypes="cccccccccccc" />
<path
style="fill:none;stroke:#0000ff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Send)"
d="m 70.067627,85.557891 c -0.688297,-1.376594 -1.376752,-2.753506 -0.318175,-3.493761 1.058577,-0.740255 3.863981,-0.843522 4.810444,0.09458 0.946464,0.938105 0.03428,2.917378 -0.705747,2.926062 -0.740023,0.0087 -1.307988,-1.953376 -0.111677,-2.908764 1.196311,-0.955387 4.156615,-0.903755 5.275186,0.08599 1.118572,0.989745 0.395707,2.917383 -0.292676,2.883027 -0.688384,-0.03435 -1.342404,-2.030838 -0.111674,-3.003439 1.23073,-0.972601 4.345931,-0.920968 5.516136,0.103199 1.170206,1.024168 0.395708,3.02065 -0.490587,2.951872 -0.886295,-0.06878 -1.884536,-2.202949 -0.507525,-3.20997 1.377012,-1.007021 5.129024,-0.886543 6.316452,-0.02595 1.187427,0.860592 -0.189458,2.46122 -1.566352,4.06186"
id="path66916"
inkscape:path-effect="#path-effect66918"
inkscape:original-d="m 70.067627,85.557891 c -0.688192,-1.376646 -1.376646,-2.753559 -2.065367,-4.130736 2.805779,-0.103005 5.611183,-0.206272 8.416377,-0.309806 -0.91196,1.979615 -1.824145,3.958889 -2.736614,5.937935 -0.567724,-1.961875 -1.13569,-3.923935 -1.70393,-5.886299 2.960685,0.0519 5.920989,0.103532 8.881086,0.1549 -0.72263,1.927982 -1.445493,3.85562 -2.168639,5.783033 -0.65378,-1.996297 -1.307801,-3.99278 -1.962099,-5.989569 3.115593,0.0519 6.230794,0.103534 9.345792,0.154903 -0.774263,1.996829 -1.54876,3.993311 -2.323539,5.989569 -0.998016,-2.133992 -1.996257,-4.268163 -2.994784,-6.402642 3.752426,0.120745 7.504438,0.241223 11.256258,0.36144 -1.376674,1.600956 -2.753558,3.201585 -4.130736,4.801981" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="54.938801"
y="78.845444"
id="text70834"><tspan
sodipodi:role="line"
id="tspan70832"
style="stroke-width:0.264583"
x="54.938801"
y="78.845444">rx</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="55.558414"
y="86.487305"
id="text72818"><tspan
sodipodi:role="line"
id="tspan72816"
style="stroke-width:0.264583"
x="55.558414"
y="86.487305">tx</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="55.403511"
y="93.92263"
id="text74780"><tspan
sodipodi:role="line"
id="tspan74778"
style="stroke-width:0.264583"
x="55.403511"
y="93.92263">irq</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -0,0 +1,241 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg80142"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
sodipodi:docname="01-ess-00-burstwrite.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview80144"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="5.1241863"
inkscape:cx="325.5151"
inkscape:cy="391.57437"
inkscape:window-width="2295"
inkscape:window-height="1378"
inkscape:window-x="208"
inkscape:window-y="30"
inkscape:window-maximized="0"
inkscape:current-layer="layer1" />
<defs
id="defs80139">
<marker
style="overflow:visible;"
id="Arrow1Mend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="scale(0.4) rotate(180) translate(10,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path45486" />
</marker>
<marker
style="overflow:visible;"
id="marker91461"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Send"
inkscape:isstock="true">
<path
transform="scale(0.2) rotate(180) translate(6,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path91459" />
</marker>
<marker
style="overflow:visible;"
id="Arrow1Send"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Send"
inkscape:isstock="true">
<path
transform="scale(0.2) rotate(180) translate(6,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path45492" />
</marker>
<inkscape:path-effect
effect="bspline"
id="path-effect91375"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect91371"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect91367"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path45480" />
</marker>
<inkscape:path-effect
effect="bspline"
id="path-effect91361"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="57.210709"
y="89.585358"
id="text81551"><tspan
sodipodi:role="line"
id="tspan81549"
style="stroke-width:0.264583"
x="57.210709"
y="89.585358">CPU</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="75.179413"
y="82.563103"
id="text83415"><tspan
sodipodi:role="line"
id="tspan83413"
style="stroke-width:0.264583"
x="75.179413"
y="82.563103">cache</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="99.963844"
y="89.430458"
id="text86767"><tspan
sodipodi:role="line"
id="tspan86765"
style="stroke-width:0.264583"
x="99.963844"
y="89.430458">ОЗУ</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="99.499123"
y="100.06711"
id="text89125"><tspan
sodipodi:role="line"
id="tspan89123"
style="stroke-width:0.264583"
x="99.499123"
y="100.06711">ПДП</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;paint-order:stroke markers fill;stroke-opacity:1"
id="rect91129"
width="11.617699"
height="6.1961055"
x="56.281296"
y="85.093185" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-opacity:1;paint-order:stroke markers fill"
id="rect91320"
width="15.180458"
height="6.3510084"
x="73.682022"
y="78.122566" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-opacity:1;paint-order:stroke markers fill"
id="rect91322"
width="12.13404"
height="6.5059109"
x="98.466454"
y="84.576843" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-opacity:1;paint-order:stroke markers fill"
id="rect91324"
width="12.030772"
height="5.6797638"
x="98.363174"
y="95.936363" />
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.06, 2.12;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
d="m 67.950624,88.501042 c 10.017306,0.06885 20.034341,0.137694 30.051114,0.206538"
id="path91359"
inkscape:path-effect="#path-effect91361"
inkscape:original-d="m 67.950624,88.501042 c 10.017304,0.06911 20.034339,0.137956 30.051114,0.206538"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
d="m 63.716619,84.989915 c 3.304719,-1.41139 6.609309,-2.822725 9.913771,-4.234005"
id="path91365"
inkscape:path-effect="#path-effect91367"
inkscape:original-d="m 63.716619,84.989915 c 3.304855,-1.411071 6.609445,-2.822406 9.913771,-4.234005" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
d="m 88.96575,79.723225 c 3.80404,1.514732 7.60776,3.029336 11.41116,4.543813"
id="path91369"
inkscape:path-effect="#path-effect91371"
inkscape:original-d="m 88.96575,79.723225 c 3.803985,1.514869 7.607705,3.029474 11.41116,4.543813"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
d="m 104.24948,90.979485 c 0.0861,1.549305 0.17213,3.098329 0.25817,4.647079"
id="path91373"
inkscape:path-effect="#path-effect91375"
inkscape:original-d="m 104.24948,90.979485 c 0.0863,1.549292 0.17237,3.098316 0.25817,4.647079" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
sodipodi:docname="01-ess-00-cacheflush.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="1.2810466"
inkscape:cx="223.64526"
inkscape:cy="453.53542"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="-8"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<marker
style="overflow:visible;"
id="marker11116"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path11114" />
</marker>
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path10849" />
</marker>
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="36.350487"
y="89.843529"
id="text4082"><tspan
sodipodi:role="line"
id="tspan4080"
style="stroke-width:0.264583"
x="36.350487"
y="89.843529">CPU</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="57.004169"
y="73.73365"
id="text5328"><tspan
sodipodi:role="line"
id="tspan5326"
style="stroke-width:0.264583"
x="57.004169"
y="73.73365">cache</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="84.473572"
y="89.636993"
id="text7270"><tspan
sodipodi:role="line"
id="tspan7268"
style="stroke-width:0.264583"
x="84.473572"
y="89.636993">ОЗУ</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="84.88665"
y="106.98609"
id="text9020"><tspan
sodipodi:role="line"
id="tspan9018"
style="stroke-width:0.264583"
x="84.88665"
y="106.98609">ПДП</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-dasharray:none;paint-order:stroke markers fill;stroke-miterlimit:4;stroke-dashoffset:0"
id="rect10717"
width="18.175243"
height="8.6745481"
x="47.91655"
y="67.950623" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke markers fill"
id="rect10719"
width="14.664117"
height="6.4026423"
x="28.915157"
y="85.093185" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke markers fill"
id="rect10721"
width="15.903338"
height="9.7072315"
x="76.212105"
y="82.821274" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke markers fill"
id="rect10723"
width="16.729485"
height="9.2941589"
x="77.244781"
y="101.61613" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="M 85.712794,101.82267 V 92.115438"
id="path10758" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="M 83.853964,82.614743 66.150113,72.39342"
id="path10760" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker11116)"
d="M 48.329624,72.287899 35.834145,84.783379"
id="path10762" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458299;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:1.05833194,2.11666389;stroke-dashoffset:0"
d="M 76.625174,87.571627 H 43.99235"
id="path10764" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

BIN
pics/01-ess-00-code.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

BIN
pics/01-ess-00-conv.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

BIN
pics/01-ess-00-drv.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 KiB

View File

@ -0,0 +1,186 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
inkscape:version="1.1.2 (b8e25be8, 2022-02-05)"
sodipodi:docname="01-ess-00-economics.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="0.64052329"
inkscape:cx="397.33138"
inkscape:cy="560.47923"
inkscape:window-width="1312"
inkscape:window-height="942"
inkscape:window-x="368"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<inkscape:path-effect
effect="bspline"
id="path-effect1254"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect1137"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path862" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lstart"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="scale(0.8) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path859" />
</marker>
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-start:url(#Arrow1Lstart);marker-end:url(#Arrow1Lend)"
d="M 41.720444,50.808067 V 145.40195 H 170.18637"
id="path857" />
<path
style="fill:none;stroke:#000000;stroke-width:0.291283px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 42.970618,59.486823 c 9.272913,23.730112 18.545686,47.459867 40.91854,61.432207 22.372852,13.97234 57.844192,18.18741 93.315922,22.40252"
id="path1135"
inkscape:path-effect="#path-effect1137"
inkscape:original-d="m 42.970618,59.486823 c 9.273057,23.730056 18.545832,47.459807 27.818326,71.189277 35.473036,4.21554 70.944376,8.43061 106.416136,12.64545" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 45.438107,109.87761 c 0.550788,7.02254 1.101553,14.04479 22.788475,17.96886 21.686922,3.92407 64.508048,4.7502 107.329748,5.57634"
id="path1252"
inkscape:path-effect="#path-effect1254"
inkscape:original-d="m 45.438107,109.87761 c 0.551029,7.02252 1.101796,14.04477 1.652296,21.06676 42.823096,0.82643 85.644217,1.65256 128.465927,2.47844" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="16.936022"
y="61.134911"
id="text1954"><tspan
sodipodi:role="line"
id="tspan1952"
style="stroke-width:0.264583"
x="16.936022"
y="61.134911">1kk</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="14.044505"
y="116.89986"
id="text3080"><tspan
sodipodi:role="line"
id="tspan3078"
style="stroke-width:0.264583"
x="14.044505"
y="116.89986">100k</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="52.460358"
y="161.09874"
id="text4478"><tspan
sodipodi:role="line"
id="tspan4476"
style="stroke-width:0.264583"
x="52.460358"
y="161.09874">1k</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="122.68289"
y="159.03339"
id="text6464"><tspan
sodipodi:role="line"
id="tspan6462"
style="stroke-width:0.264583"
x="122.68289"
y="159.03339">2k</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="174.73018"
y="159.03339"
id="text7236"><tspan
sodipodi:role="line"
id="tspan7234"
style="stroke-width:0.264583"
x="174.73018"
y="159.03339">3k</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="49.981918"
y="49.155769"
id="text8802"><tspan
sodipodi:role="line"
id="tspan8800"
style="stroke-width:0.264583"
x="49.981918"
y="49.155769">общая стоимость</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="117.31293"
y="173.90404"
id="text10690"><tspan
sodipodi:role="line"
id="tspan10688"
style="stroke-width:0.264583"
x="117.31293"
y="173.90404">кол-во единиц</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

@ -0,0 +1,137 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg156823"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
sodipodi:docname="fon-neyman.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview156825"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="5.1241863"
inkscape:cx="298.87672"
inkscape:cy="328.8327"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="-8"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs156820" />
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="fill:none;stroke:#000000;stroke-width:0.162934;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="rect156882"
width="33.044697"
height="13.526959"
x="34.130814"
y="76.729042" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="44.405422"
y="85.248093"
id="text158835"><tspan
id="tspan158833"
style="stroke-width:0.264583"
x="44.405422"
y="85.248093"
sodipodi:role="line">Ядро</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.162934;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="rect156882-8"
width="33.044697"
height="13.526959"
x="93.355263"
y="76.0578" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="102.39065"
y="84.267044"
id="text158835-1"><tspan
id="tspan158833-2"
style="stroke-width:0.264583"
x="102.39065"
y="84.267044"
sodipodi:role="line">Память</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 73.862744,78.303285 -6.505911,4.827799 7.142591,4.123778"
id="path187989" />
<path
style="fill:none;stroke:#000000;stroke-width:0.260797px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 86.788601,78.238058 6.32104,4.827799 -6.939628,4.123778"
id="path187989-1" />
<path
style="fill:none;stroke:#000000;stroke-width:0.261993px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 71.102229,80.523362 H 89.5374 l -0.0329,0.128592"
id="path188126" />
<path
style="fill:none;stroke:#000000;stroke-width:0.269623px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 70.945409,85.041551 h 18.82067"
id="path188128" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="80.09272"
y="70.42907"
id="text194834"><tspan
sodipodi:role="line"
id="tspan194832"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
x="80.09272"
y="70.42907">шина</tspan><tspan
sodipodi:role="line"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
x="80.09272"
y="75.720734"
id="tspan194836">инструкций</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="80.497742"
y="91.826813"
id="text194834-4"><tspan
sodipodi:role="line"
id="tspan194832-4"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
x="80.497742"
y="91.826813">шина</tspan><tspan
sodipodi:role="line"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
x="80.497742"
y="97.118477"
id="tspan194836-3">данных</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="33.045898"
y="65.162376"
id="text207118"><tspan
sodipodi:role="line"
id="tspan207116"
style="stroke-width:0.264583"
x="33.045898"
y="65.162376">фон-Нейман</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

156
pics/01-ess-00-harvard.svg Normal file
View File

@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg212857"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
sodipodi:docname="harvard.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview212859"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="3.6233469"
inkscape:cx="286.61346"
inkscape:cy="385.83112"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="-8"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs212854" />
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="fill:none;stroke:#000000;stroke-width:0.201171;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="rect156882"
width="33.006458"
height="20.644859"
x="10.862647"
y="82.033134" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="21.118137"
y="90.533066"
id="text158835"><tspan
id="tspan158833"
style="stroke-width:0.264583"
x="21.118137"
y="90.533066"
sodipodi:role="line">Ядро</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.205017;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="rect156882-8"
width="33.002613"
height="21.444254"
x="70.08902"
y="81.363815" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="79.103363"
y="89.552017"
id="text158835-1"><tspan
id="tspan158833-2"
style="stroke-width:0.264583"
x="79.103363"
y="89.552017"
sodipodi:role="line">Память</tspan></text>
<g
id="g280624">
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 50.575459,83.588262 -6.505911,4.827799 7.142591,4.123778"
id="path187989" />
<path
style="fill:none;stroke:#000000;stroke-width:0.260797px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 63.501316,83.523035 6.32104,4.827799 -6.939628,4.123778"
id="path187989-1" />
<path
style="fill:none;stroke:#000000;stroke-width:0.261993px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 47.814944,85.808339 h 18.435171 l -0.0329,0.128592"
id="path188126" />
<path
style="fill:none;stroke:#000000;stroke-width:0.269623px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 47.658124,90.326528 h 18.82067"
id="path188128" />
</g>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 50.371505,94.787991 -6.505911,4.827799 7.142591,4.12378"
id="path187989-5" />
<path
style="fill:none;stroke:#000000;stroke-width:0.260797px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 63.297362,94.722764 6.32104,4.827799 -6.939628,4.123777"
id="path187989-1-7" />
<path
style="fill:none;stroke:#000000;stroke-width:0.261993px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 47.61099,97.008068 h 18.435171 l -0.0329,0.128592"
id="path188126-7" />
<path
style="fill:none;stroke:#000000;stroke-width:0.269623px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 47.45417,101.52626 H 66.27484"
id="path188128-3" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="56.805435"
y="75.714043"
id="text194834"><tspan
sodipodi:role="line"
id="tspan194832"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
x="56.805435"
y="75.714043">шина</tspan><tspan
sodipodi:role="line"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
x="56.805435"
y="81.005707"
id="tspan194836">инструкций</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="56.918369"
y="108.43017"
id="text194834-4"><tspan
sodipodi:role="line"
id="tspan194832-4"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
x="56.918369"
y="108.43017">шина</tspan><tspan
sodipodi:role="line"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
x="56.918369"
y="113.72183"
id="tspan194836-3">данных</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="9.7586136"
y="70.44735"
id="text207118"><tspan
sodipodi:role="line"
id="tspan207116"
style="stroke-width:0.264583"
x="9.7586136"
y="70.44735">гарвард</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

267
pics/01-ess-00-irq.svg Normal file
View File

@ -0,0 +1,267 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
inkscape:version="1.1.2 (b8e25be8, 2022-02-05)"
sodipodi:docname="01-ess-00-irq.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="2.8836715"
inkscape:cx="198.70502"
inkscape:cy="267.71427"
inkscape:window-width="1189"
inkscape:window-height="942"
inkscape:window-x="490"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<inkscape:path-effect
effect="bspline"
id="path-effect15623"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path942" />
</marker>
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:none;stroke:#000000;stroke-width:0.328047;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="m 24.791508,42.426016 v 39.29129 h 71.264939"
id="path857" />
<path
style="fill:#000000;stroke:#00ab06;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 27.51665,76.936557 h 55.253437 v 0 0 0"
id="path1536" />
<path
style="fill:none;stroke:#ffd40a;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 27.84685,61.967498 H 82.439887"
id="path1542" />
<path
style="fill:#000000;stroke:#00ab06;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0"
d="m 31.148848,76.82649 c -0.07309,-0.730895 -0.146466,-1.464672 -0.183298,-2.106847 -0.03683,-0.642174 -0.03683,-1.192504 -0.03683,-1.449329 0,-0.256825 0,-0.220135 0.03771,-0.146552 0.03771,0.07358 0.111083,0.18365 0.441862,0.366266 0.330778,0.182616 0.917801,0.439438 1.155475,0.58523 0.237674,0.145792 0.127607,0.182481 -0.166422,0.365999 -0.294028,0.183518 -0.770984,0.513719 -1.24849,0.8443"
id="path15621"
inkscape:path-effect="#path-effect15623"
inkscape:original-d="m 31.148848,76.82649 c -0.07073,-0.731131 -0.144108,-1.464908 -0.220131,-2.201333 0.0026,-0.547688 0.0026,-1.098018 0,-1.650998 0.0026,0.03933 0.0026,0.07602 0,0.110067 0.07602,0.112713 0.1494,0.222779 0.220131,0.3302 0.589669,0.259466 1.176692,0.516289 1.761066,0.770464 -0.10742,0.03934 -0.217487,0.07603 -0.3302,0.110067 -0.474308,0.332846 -0.951264,0.663046 -1.430866,0.9906" />
<path
style="fill:none;stroke:#00ab06;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 27.98546,71.774472 c -0.25433,-0.02442 -0.540308,-0.173389 -0.628552,0.179586 -0.01693,0.06775 0.0041,0.139798 0,0.209516 -0.0076,0.128463 -0.07226,0.470159 0,0.59862 0.163153,0.290049 0.852292,0.436226 0.987724,0.02993"
id="path20806" />
<path
style="fill:none;stroke:#00ab06;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 29.003111,72.133644 c 0,-0.402539 -0.01344,-0.133471 0.209519,-0.897929 0.0028,-0.0096 -0.0021,0.02019 0,0.02993 0.01783,0.08031 0.03097,0.162412 0.05986,0.239445 0.06118,0.163148 0.144803,0.317119 0.209515,0.478896 0.117655,0.294135 0.190804,0.729562 0.419034,0.957792"
id="path20808" />
<path
style="fill:none;stroke:#00ab06;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 38.95,77.031685 c 0,-0.151609 0,-0.30322 0,-0.454829 0,-0.964314 0.01582,-0.863116 -0.04135,-1.777974 -0.01794,-0.287134 -0.10236,-0.728649 -0.04135,-1.033703 7.94e-4,-0.0044 0.13326,0.0082 0.206743,0 1.503714,-0.167079 0.427532,-0.109749 2.108755,-0.206743 1.609278,-0.09284 3.226263,-0.124044 4.83774,-0.124044 1.491675,0 2.941621,0.01881 4.424256,0.206742 1.837444,0.232916 0.951534,0.216686 2.770331,0.289436 0.234119,0.0094 0.468611,0 0.702918,0 0.01378,0 0.03699,-0.01307 0.04135,0 0.01307,0.03923 0.0016,0.08273 0,0.124045 -0.01214,0.303291 -0.01447,0.607319 -0.04135,0.909661 -0.0283,0.318431 -0.09115,0.633018 -0.124044,0.951008 -0.03514,0.33973 0,0.690753 0,1.033705"
id="path26233" />
<path
style="fill:none;stroke:#00ab06;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 38.247079,71.532376 c -0.1655,0.193082 -0.379079,0.38635 -0.41348,0.661569 -0.01244,0.09957 0.05096,0.19425 0.0827,0.289439 0.147849,0.443545 0.261996,0.563486 0.744268,0.620223 0.09582,0.01127 0.209161,0.05352 0.289438,0 0.108188,-0.07213 0.139843,-0.21929 0.20674,-0.330785 0.05717,-0.09528 0.115697,-0.19005 0.165394,-0.289438 0.0195,-0.03898 0.05282,-0.082 0.04135,-0.124045 -0.04694,-0.172111 -0.231944,-0.458713 -0.372134,-0.578874 -0.08207,-0.07035 -0.295066,0.112787 -0.41348,-0.124044"
id="path29816" />
<path
style="fill:none;stroke:#00ab06;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 39.983703,72.193945 c 0.151612,-0.220522 0.303715,-0.440708 0.45483,-0.661569 0.02806,-0.04101 0.0827,-0.07435 0.0827,-0.124045 0,-0.04594 -0.0827,-0.0046 -0.0827,0.04135 0,0.249602 -0.01514,0.141734 0.0827,0.454829 0.112614,0.360365 0.194632,0.700852 0.248089,1.075052"
id="path29818" />
<path
style="fill:#00ab06;stroke:#c3bfff;stroke-width:1.665;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1"
d="m 31.838108,76.204722 c 0.830006,-0.03924 1.655128,0.04337 2.480893,0.0827 0.481324,0.02291 0.965808,-0.02188 1.447186,0 0.304157,0.01384 0.605536,0.06821 0.909661,0.0827 0.452549,0.02154 0.912794,-0.03475 1.364491,0 0.572666,0.04405 0.06735,0.04135 0.248089,0.04135"
id="path41638" />
<path
style="fill:none;stroke:#ffd40a;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 44.945487,61.980942 c 0,-1.233051 0.0085,0.242324 -0.372134,-3.183811 -0.01826,-0.16438 0,-0.330785 0,-0.496178 0,-0.01378 0.01379,-0.04135 0,-0.04135 -0.04358,0 0.0059,0.09871 0.04135,0.124045 0.07523,0.05374 0.164679,0.08415 0.248089,0.124044 1.671082,0.799214 -0.127738,-0.04884 1.240443,0.537525 0.124804,0.05349 0.837155,0.434454 0.826966,0.454832 -0.03319,0.06639 -0.142507,0.04551 -0.206743,0.0827 -1.324647,0.766902 0.221594,7.9e-5 -1.281792,0.661572 -0.124249,0.05467 -0.276149,0.0694 -0.372134,0.165391 -0.0097,0.0097 0.01336,0.038 0,0.04135 -0.246512,0.06163 -0.104622,-0.06077 -0.20674,0.04135"
id="path52788" />
<path
style="fill:none;stroke:#ffd40a;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 43.167514,56.109499 c -1.253863,-0.374415 -1.668553,1.507352 -0.45483,1.571231 0.152025,0.008 0.317085,0.02347 0.45483,-0.04135 0.114977,-0.05411 0.165393,-0.192958 0.248089,-0.289438"
id="path52790" />
<path
style="fill:none;stroke:#ffd40a;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 44.077175,55.778714 c 0.250172,-0.536083 0.272357,-1.099854 1.157751,-0.496178 0.137125,0.09349 0.03497,0.330335 0.04135,0.496178 0.0074,0.192815 0.04843,0.392091 0,0.578874 -0.126005,0.486024 -0.616437,1.075052 -1.157748,1.075052 -0.07422,0 0.133715,-0.06942 0.20674,-0.0827 0.232117,-0.0422 0.467519,-0.067 0.702919,-0.0827 0.178779,-0.01193 0.3586,-0.0094 0.537527,0 0.138735,0.0073 0.45483,0.128882 0.45483,-0.124044"
id="path52792" />
<path
style="fill:none;stroke:#1e0eff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 45.400317,73.806525 c 0.02207,0.553861 -0.06148,1.102339 -0.0827,1.653929 -0.0034,0.08965 0.06358,0.699805 0,0.826963 -0.04359,0.08717 -0.02064,-0.194201 -0.04135,-0.289435 -0.03754,-0.172702 -0.525915,-1.725015 -0.661569,-1.860669 -0.0097,-0.0097 0.0011,0.0276 0,0.04135 -0.01281,0.17925 -0.01707,0.359471 -0.04135,0.537528 -0.05847,0.428818 -0.148267,0.852977 -0.20674,1.281795 -0.02429,0.178056 -0.0061,0.361309 -0.04135,0.537525 -0.0085,0.04274 -0.03169,-0.08154 -0.04135,-0.124045 -0.05931,-0.260956 -0.09261,-0.52809 -0.165391,-0.785614 -0.277318,-0.981274 -0.257884,-0.992722 -0.744267,-1.695278 -0.0079,-0.01132 0,0.02757 0,0.04135 0,0.20674 0.02016,0.41447 0,0.620223 -0.04888,0.498552 -0.09702,0.99976 -0.206743,1.488535 -0.04322,0.192545 -0.170352,0.356143 -0.248089,0.537528 -0.0054,0.01267 0.0036,0.05464 0,0.04135 -0.237271,-0.869997 -0.485164,-1.741257 -0.744268,-2.604936 -0.0079,-0.02641 0.0052,0.05562 0,0.0827 -0.05007,0.262884 -0.102939,0.525391 -0.165391,0.785614 -0.02304,0.09598 -0.41039,1.645679 -0.537528,1.984713 -0.0069,0.01826 -0.03132,-0.02463 -0.04135,-0.04135 -0.07301,-0.121682 -0.146513,-0.24365 -0.20674,-0.372134 -0.455689,-0.972137 -0.343739,-0.748572 -0.620223,-1.61258 -0.03985,-0.124534 -0.07548,-0.250732 -0.124044,-0.372134 -0.0073,-0.0181 -0.03893,-0.06069 -0.04135,-0.04135 -0.05986,0.478867 0.04135,0.964595 0.04135,1.447187 0,0.220953 -0.01696,0.441967 -0.04135,0.661572 -0.0034,0.03063 -0.02209,0.106762 -0.04135,0.08269 -0.06557,-0.08196 -0.08682,-0.191294 -0.124045,-0.289435 -0.467153,-1.231586 -0.233092,-0.507635 -0.413482,-1.364491 -0.02342,-0.111218 -0.04386,-0.223975 -0.0827,-0.330787 -0.01699,-0.0467 -0.05513,-0.165392 -0.0827,-0.124045 -0.04587,0.06881 0,0.165394 0,0.248089 0,0.151612 0.0056,0.303324 0,0.454832 -0.01783,0.481719 -0.124045,0.968121 -0.124045,1.447186 0,0.01378 0.01217,-0.04783 0,-0.04135 C 39.357487,76.77301 39.15674,76.90764 38.95,77.031685"
id="path61060" />
<path
style="fill:none;stroke:#f8d7fe;stroke-width:5.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 31.217885,65.123406 c 0.923444,0.05513 1.845567,0.140896 2.770331,0.165393 2.14935,0.05694 4.300212,0 6.450317,0 1.433901,0 2.86626,0.04135 4.300214,0.04135"
id="path66704" />
<text
xml:space="preserve"
style="font-size:2.82222px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;fill:#e04dfa;fill-opacity:1"
x="25.685587"
y="46.558064"
id="text68820"><tspan
sodipodi:role="line"
style="font-size:2.82222px;stroke-width:0.264583;fill:#e04dfa;fill-opacity:1"
x="25.685587"
y="46.558064"
id="tspan74214">задержка</tspan><tspan
sodipodi:role="line"
style="font-size:2.82222px;stroke-width:0.264583;fill:#e04dfa;fill-opacity:1"
x="25.685587"
y="50.085842"
id="tspan74218">решение</tspan><tspan
sodipodi:role="line"
style="font-size:2.82222px;stroke-width:0.264583;fill:#e04dfa;fill-opacity:1"
x="25.685587"
y="53.613621"
id="tspan74220">программиста</tspan></text>
<path
style="fill:none;stroke:#d824f8;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 36.634499,65.082057 c 0.530476,0.08662 -0.04168,0.267927 -0.0827,0.165393 -0.05881,-0.147015 0.301842,-0.289438 0.330785,-0.289438 0.04135,0 0,0.0827 0,0.124045 0,0.06891 0.04305,0.152929 0,0.206742 -0.07752,0.0969 -0.359127,0.137049 -0.454829,0.04135 -0.06164,-0.06164 -0.06837,-0.162105 -0.0827,-0.248089 -0.05016,-0.300956 0.399823,-0.550807 0.496179,-0.165391 0.08398,0.335901 -0.20682,0.249758 -0.330788,-0.0827 -0.298712,-0.801092 -0.639291,-1.587095 -0.909658,-2.398193 -0.594903,-1.784705 -0.248828,-1.50975 -0.661572,-3.638643 -0.122174,-0.630161 -0.317694,-1.244084 -0.496179,-1.860669 -1.489773,-5.146487 0.604306,2.520066 -0.702918,-2.563588 -0.08886,-0.345567 -0.0827,-0.189499 -0.0827,-0.124044"
id="path76053" />
<path
style="fill:none;stroke:#6b61ff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 34.856528,76.080677 c 0.601977,-0.541295 0.660852,0.330428 0,0 0.03484,-0.363003 0.503095,0.266798 0.372134,0.248089 -0.780682,-0.111527 -0.0075,-1.117822 -0.909661,0.620223 -1.345994,2.593203 -2.47599,5.303624 -3.969428,7.814808 -1.622449,2.728121 -1.612577,0.799669 -1.612577,1.61258"
id="path81392" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;fill:#6b61ff;fill-opacity:1"
x="24.602177"
y="88.774574"
id="text84300"><tspan
sodipodi:role="line"
id="tspan84298"
style="stroke-width:0.264583;fill:#6b61ff;fill-opacity:1"
x="24.602177"
y="88.774574">4-6</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583;fill:#6b61ff;fill-opacity:1"
x="24.602177"
y="94.066238"
id="tspan84896">тактов</tspan></text>
<path
style="fill:none;stroke:#0f04b1;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 42.836729,75.377759 c 0.392684,0.04363 2.303182,0.172177 -0.496178,0.372134 -0.07403,0.0053 0.01574,-0.174718 0.0827,-0.206743 0.47552,-0.22742 1.154068,-0.401601 1.1991,-0.04135 0.01302,0.104156 -0.184571,0.119484 -0.289439,0.124045 -0.22203,0.0097 -0.499438,0.0693 -0.661572,-0.0827 -0.130714,-0.122545 -0.130071,-0.414298 0,-0.537525 0.19658,-0.186235 0.523598,-0.275095 0.785617,-0.206743 0.156099,0.04072 0.25649,0.321691 0.165394,0.454832 -0.146228,0.213715 -0.446977,0.29141 -0.702921,0.330785 -0.134165,0.02064 -0.424342,-0.04009 -0.372134,-0.165394 0.01003,-0.02405 0.900652,-0.724633 0.992357,-0.0827 0.0061,0.04246 -0.659157,0.829066 -0.702919,0.04135 -0.05456,-0.982038 1.785316,0.04732 -0.165394,-0.04135 -0.549566,-0.02498 0.212643,-0.361802 0.24809,-0.330785 0.212828,0.186222 0.411723,0.39211 0.578876,0.620223 1.005748,1.37255 1.873557,2.846792 2.935722,4.176167 1.133168,1.418244 2.368576,2.755038 3.638639,4.052123 0.676712,0.69111 1.463527,1.265079 2.191454,1.902016 0.09656,0.08449 0.206743,0.2048 0.206743,0.330787"
id="path85921" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;fill:#0f04b1;fill-opacity:1"
x="45.772453"
y="86.913902"
id="text92870"><tspan
sodipodi:role="line"
id="tspan92868"
style="stroke-width:0.264583;fill:#0f04b1;fill-opacity:1"
x="45.772453"
y="86.913902">время</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583;fill:#0f04b1;fill-opacity:1"
x="45.772453"
y="92.205566"
id="tspan92872">разрешения</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583;fill:#0f04b1;fill-opacity:1"
x="45.772453"
y="97.497223"
id="tspan92874">вложенного</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583;fill:#0f04b1;fill-opacity:1"
x="45.772453"
y="102.78889"
id="tspan92876">прерывания</tspan></text>
<path
style="fill:none;stroke:#ffd40a;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 54.010255,61.71417 c 0,-0.717925 0,-1.435854 0,-2.153782 0,-0.469413 -0.148442,-0.962917 0,-1.408242 0.01746,-0.05239 0.110487,-0.0021 0.165674,0 0.717968,0.02659 1.43541,0.07179 2.153785,0.08284 1.076764,0.01656 2.154325,0.03417 3.230674,0 6.880135,-0.218419 -2.74446,-0.165677 3.893378,-0.165677 0.331351,0 0.759754,-0.234299 0.994053,0 0.195252,0.195252 -0.01254,0.552538 0,0.828379 0.04324,0.951238 0.248515,1.885958 0.248515,2.816484"
id="path94549" />
<path
style="fill:none;stroke:#00ab06;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 65.938899,76.873491 c 0.393859,-0.874803 -0.551402,-2.155058 0,-2.982161 0.214434,-0.321652 0.773155,0 1.15973,0 0.883605,0 1.767625,0.02717 2.65081,0 3.190078,-0.09816 6.412627,-0.454742 9.609188,-0.248513 0.389691,0.02514 0.772242,0.11724 1.159729,0.165674 0.0548,0.0069 0.116279,-0.02469 0.165674,0 0.09879,0.04939 0,0.220903 0,0.331354 0,0.552251 0,1.104503 0,1.656754 0,0.581856 0.08284,1.158352 0.08284,1.739596 0,0.02761 0,-0.05523 0,-0.08284 0,-0.138065 0,-0.276127 0,-0.41419"
id="path94551" />
<path
style="fill:none;stroke:#ffd40a;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 52.022147,55.087146 c -0.110451,0.303739 -0.480851,0.624674 -0.331351,0.911217 0.255452,0.489617 0.7933,0.846246 1.325406,0.994053 0.394468,0.109575 0.100751,-2.420212 -0.828378,-1.49108"
id="path94553" />
<path
style="fill:none;stroke:#ffd40a;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 53.486616,54.836954 c -0.03503,-1.060604 1.135514,-0.839928 1.086858,0.230547 -0.0067,0.147259 -0.164362,0.705466 -0.197612,0.79044 -0.06086,0.155533 -0.315233,0.451694 -0.26348,0.658704 0.0075,0.03012 0.03975,-0.04908 0.06587,-0.06587 0.128294,-0.08247 0.260117,-0.159776 0.395222,-0.230544 0.270412,-0.141645 0.526409,-0.197612 0.823378,-0.197612"
id="path94670" />
<path
style="fill:none;stroke:#b10062;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.8509804"
d="m 59.546674,45.648059 c -0.285842,0.570378 0.592334,0.761998 0.625766,0.461092 0.02056,-0.185118 0.08455,-0.616429 -0.131738,-0.724572 -0.07856,-0.03928 -0.175654,0 -0.263483,0 -0.170265,0 -0.175212,0.01053 -0.296415,0.131739"
id="path94672" />
<path
style="fill:none;stroke:#b10062;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 60.304182,44.330654 c 0.15081,0 0.371462,-0.04419 0.494027,0.09881 0.13181,0.153778 -0.226539,0.449067 -0.263482,0.559898 -0.0035,0.01042 0.02368,0.0059 0.03294,0 0.113059,-0.07195 0.203266,-0.185156 0.329351,-0.230547 0.475678,-0.171244 1.346546,-0.106583 1.317405,0.592833 -0.02122,0.509193 -0.589479,0.52696 -0.955119,0.52696 -0.274373,0 -0.26348,0.05132 -0.26348,-0.06587"
id="path94674" />
<path
style="fill:none;stroke:#b10062;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 69.789492,43.573146 c -0.06587,0.07685 -0.161579,0.135962 -0.19761,0.230548 -0.04447,0.116731 -0.110035,0.669179 -0.03293,0.823378 0.120592,0.241183 0.668554,0.673782 0.955119,0.428154 0.389306,-0.33369 0.400556,-1.269161 -0.131741,-1.48208 -0.112588,-0.04503 -0.247248,0.0054 -0.362286,-0.03294"
id="path94676" />
<path
style="fill:none;stroke:#b10062;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 71.139832,42.420418 c -0.06971,0.492535 0.131742,0.961099 0.131742,1.449144 0,0.08783 0,0.175654 0,0.263482 0,0.01098 -0.01098,0.03294 0,0.03294 0.02455,0 0.04275,-0.02469 0.06587,-0.03294 0.130778,-0.04671 0.261249,-0.0952 0.395221,-0.131741 0.141309,-0.03854 0.306287,-0.01757 0.428157,-0.09881 0.0091,-0.0061 0.0033,-0.02246 0,-0.03293 -0.05177,-0.16568 -0.116989,-0.32712 -0.164674,-0.494025 -0.04024,-0.140835 -0.05857,-0.287322 -0.09881,-0.428157 -0.0043,-0.01492 -0.03294,-0.04846 -0.03294,-0.03294 0,0.462375 0.317355,0.932752 0.494028,1.350338 0.173119,0.409194 0.164674,0.253474 0.164674,0.461092"
id="path94678" />
<path
style="fill:none;stroke:#b10062;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:2.1199999, 2.1199999;stroke-dashoffset:0"
d="M 60.487594,46.994209 V 61.883461"
id="path94713" />
<path
style="fill:none;stroke:#b10062;stroke-width:0.26458299;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:2.11666389, 2.11666389;stroke-dashoffset:0"
d="M 71.142716,45.505282 V 76.819246"
id="path94715" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;fill:#b10062;fill-opacity:1"
x="60.254948"
y="40.94545"
id="text118114"><tspan
sodipodi:role="line"
id="tspan118112"
style="stroke-width:0.264583;fill:#b10062;fill-opacity:1"
x="60.254948"
y="40.94545">OSQPost</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;fill:#b10062;fill-opacity:1"
x="74.213623"
y="47.319912"
id="text119108"><tspan
sodipodi:role="line"
id="tspan119106"
style="stroke-width:0.264583;fill:#b10062;fill-opacity:1"
x="74.213623"
y="47.319912">(eventqueue)</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -0,0 +1,5 @@
\begin{tikztimingtable}
iTL0 & LLHHGHHGHH GHHGHHLLLLLLHHGHHGHH GHHGHHLLLL \\
iSerial & HHLL LL ;[dotted] 2H; LL LLLLHHLLLL LL ;[dotted] 2H; LL LLLLLL \\
main & LLLLLLLL LL LLHHLLHHLL LL LL LL LLHHHH \\
\end{tikztimingtable}

665
pics/01-ess-00-memory.svg Normal file
View File

@ -0,0 +1,665 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg272163"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
sodipodi:docname="memory.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview272165"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="1.8116734"
inkscape:cx="251.97698"
inkscape:cy="308.00253"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="-8"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs272160">
<linearGradient
id="linearGradient332717"
inkscape:swatch="solid">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop332715" />
</linearGradient>
<inkscape:path-effect
effect="bspline"
id="path-effect332628"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect330905"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect330901"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect330897"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<pattern
inkscape:collect="always"
patternUnits="userSpaceOnUse"
width="30.066020"
height="5.1805778"
id="Wavy"
inkscape:stockid="Wavy"
inkscape:isstock="true">
<path
style="fill:black;stroke:none;"
d="M 7.597,0.061 C 5.079,-0.187 2.656,0.302 -0.01,1.788 L -0.01,3.061 C 2.773,1.431 5.173,1.052 7.472,1.280 C 9.770,1.508 11.969,2.361 14.253,3.218 C 18.820,4.931 23.804,6.676 30.066,3.061 L 30.062,1.788 C 23.622,5.497 19.246,3.770 14.691,2.061 C 12.413,1.207 10.115,0.311 7.597,0.061 z "
id="path122850" />
</pattern>
<inkscape:path-effect
effect="bspline"
id="path-effect322831"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect322827"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect322823"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect322819"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect322815"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect315018"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect315014"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect306206"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect306202"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect300859"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect300855"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<rect
x="568.28535"
y="359.47171"
width="195.54324"
height="110.06626"
id="rect296538" />
<pattern
patternUnits="userSpaceOnUse"
width="108.34238"
height="108.3424"
patternTransform="translate(384.92559,85.202705)"
id="pattern332630">
<path
style="fill:none;stroke:#000000;stroke-width:0.999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 107.98883,0.35355291 C 72.110402,36.231985 36.231981,72.110409 0.35355296,107.98884"
id="path332626"
inkscape:path-effect="#path-effect332628"
inkscape:original-d="M 107.98883,0.35355291 C 72.111399,36.232982 36.232986,72.111414 0.35355296,107.98884" />
</pattern>
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="fill:none;stroke:#000000;stroke-width:0.20386;stroke-miterlimit:4;stroke-dasharray:none"
id="rect272189"
width="40.851749"
height="17.306551"
x="22.895229"
y="100.96616" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="38.622391"
y="110.39394"
id="text273592"><tspan
sodipodi:role="line"
id="tspan273590"
style="stroke-width:0.264583"
x="38.622391"
y="110.39394">ядро</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.176944;stroke-miterlimit:4;stroke-dasharray:none"
id="rect272189-5"
width="30.728634"
height="17.333467"
x="100.90107"
y="99.661842" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#0000ff;fill-opacity:1"
x="115.44611"
y="103.67782"
id="text273592-7"><tspan
sodipodi:role="line"
id="tspan273590-8"
style="text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#0000ff;fill-opacity:1"
x="115.44611"
y="103.67782">память</tspan><tspan
sodipodi:role="line"
style="text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#0000ff;fill-opacity:1"
x="115.44611"
y="108.96948"
id="tspan286590">программы</tspan><tspan
sodipodi:role="line"
style="text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#0000ff;fill-opacity:1"
x="115.44611"
y="114.26114"
id="tspan286592">Flash</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.177569;stroke-miterlimit:4;stroke-dasharray:none"
id="rect272189-5-7"
width="30.947075"
height="17.332842"
x="100.69485"
y="134.87669" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#ff0500;fill-opacity:1"
x="115.6777"
y="139.40352"
id="text273592-7-4"><tspan
sodipodi:role="line"
id="tspan273590-8-3"
style="text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#ff0500;fill-opacity:1"
x="115.6777"
y="139.40352">память</tspan><tspan
sodipodi:role="line"
style="text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#ff0500;fill-opacity:1"
x="115.6777"
y="144.69518"
id="tspan286592-4">данных</tspan><tspan
sodipodi:role="line"
style="text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#ff0500;fill-opacity:1"
x="115.6777"
y="149.98685"
id="tspan297500">SRAM</tspan></text>
<g
id="g280624"
transform="matrix(1.4198302,0,0,0.49336965,1.5058681,64.738941)">
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 50.575459,83.588262 -6.505911,4.827799 7.142591,4.123778"
id="path187989" />
<path
style="fill:none;stroke:#000000;stroke-width:0.260797px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 63.501316,83.523035 6.32104,4.827799 -6.939628,4.123778"
id="path187989-1" />
<path
style="fill:none;stroke:#000000;stroke-width:0.261993px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 47.814944,85.808339 h 18.435171 l -0.0329,0.128592"
id="path188126" />
<path
style="fill:none;stroke:#000000;stroke-width:0.269623px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 47.658124,90.326528 h 18.82067"
id="path188128" />
</g>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="83.552208"
y="98.311539"
id="text282434"><tspan
sodipodi:role="line"
id="tspan282432"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
x="83.552208"
y="98.311539">шина</tspan><tspan
sodipodi:role="line"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
x="83.552208"
y="103.6032"
id="tspan282436">инструкций</tspan></text>
<text
xml:space="preserve"
transform="scale(0.26458333)"
id="text296536"
style="line-height:1.25;font-family:sans-serif;font-size:16px;white-space:pre;shape-inside:url(#rect296538)" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 52.240915,122.90234 4.647081,-4.64708 4.724529,4.72453"
id="path300843" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 96.142335,135.41894 4.593585,2.65211 -4.479663,2.58634"
id="path300847" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 58.604832,119.94628 c 0,5.80051 0,11.60075 6.695502,14.40607 6.695501,2.80533 20.085703,2.616 33.475918,2.42668"
id="path300853"
inkscape:path-effect="#path-effect300855"
inkscape:original-d="m 58.604832,119.94628 c 2.64e-4,5.80051 2.64e-4,11.60075 0,17.40073 13.391007,-0.18907 26.781209,-0.37839 40.17142,-0.56798" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 55.145341,119.79138 c 0.08604,6.48782 0.172117,12.97766 7.392575,16.22188 7.220458,3.24421 21.574482,3.24421 35.92853,3.24421"
id="path300857"
inkscape:path-effect="#path-effect300859"
inkscape:original-d="m 55.145341,119.79138 c 2.65e-4,6.48896 0.172379,12.97766 0.25817,19.46609 14.354863,2.7e-4 28.708887,2.7e-4 43.062935,0" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="79.9814"
y="129.93286"
id="text282434-2"><tspan
sodipodi:role="line"
id="tspan282432-9"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
x="79.9814"
y="129.93286">шина</tspan><tspan
sodipodi:role="line"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
x="79.9814"
y="135.22452"
id="tspan282436-2">данных</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="36.66029"
y="142.71696"
id="text304671"><tspan
sodipodi:role="line"
id="tspan304669"
style="stroke-width:0.264583"
x="36.66029"
y="142.71696">IO</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 39.138735,143.74965 c 0,4.61292 0,9.22558 0,13.83797"
id="path306200"
inkscape:path-effect="#path-effect306202"
inkscape:original-d="m 39.138735,143.74965 c 2.65e-4,4.61292 2.65e-4,9.22558 0,13.83797" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 27.262865,157.58762 c 0,-3.09778 0,-6.19584 4.044894,-7.745 4.044894,-1.54915 12.13409,-1.54915 16.178638,0.0517 4.044548,1.60083 4.044548,4.80208 4.044548,8.00314"
id="path306204"
inkscape:path-effect="#path-effect306206"
inkscape:original-d="m 27.262865,157.58762 c 2.65e-4,-3.09778 2.65e-4,-6.19584 0,-9.29415 8.089788,2.6e-4 16.178984,2.6e-4 24.26808,0 2.64e-4,3.20165 2.64e-4,6.4029 0,9.60396" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="24.681154"
y="161.71835"
id="text308424"><tspan
sodipodi:role="line"
id="tspan308422"
style="stroke-width:0.264583"
x="24.681154"
y="161.71835">GP</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="35.007999"
y="161.71835"
id="text311068"><tspan
sodipodi:role="line"
id="tspan311066"
style="stroke-width:0.264583"
x="35.007999"
y="161.71835">TMR</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;fill:#00ff00;fill-opacity:1"
x="46.05772"
y="161.71835"
id="text312488"><tspan
sodipodi:role="line"
id="tspan312486"
style="stroke-width:0.264583;fill:#00ff00;fill-opacity:1"
x="46.05772"
y="161.71835">UART</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.26458299;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:0.26458299,0.52916597;stroke-dashoffset:0"
d="m 35.885778,122.34727 2.36828,-4.10198 2.336462,4.04687"
id="path315004" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458299;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:0.26458299,0.52916597;stroke-dashoffset:0"
d="m 35.575972,135.33328 2.124409,3.67958 2.280332,-3.94966"
id="path315006" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458299;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:0.26458299,0.52916597;stroke-dashoffset:0"
d="m 36.970096,120.54007 -0.645427,15.92916"
id="path315008" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458299;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:0.26458299,0.52916597;stroke-dashoffset:0"
d="m 39.577626,120.48844 -0.64543,16.29059"
id="path315010" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458299;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:0.26458299,0.52916597;stroke-dashoffset:0"
d="m 36.402121,133.75843 c 2.831284,-2.69359 5.662562,-5.38718 8.894187,-6.3854 3.231625,-0.99822 6.863159,-0.30117 10.494461,0.39583"
id="path315012"
inkscape:path-effect="#path-effect315014"
inkscape:original-d="m 36.402121,133.75843 c 2.831541,-2.69332 5.662816,-5.38691 8.493828,-8.08075 3.631944,0.69734 7.263477,1.39439 10.89482,2.09118" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458299;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:0.26458299,0.52916597;stroke-dashoffset:0"
d="m 38.983832,134.42968 c 2.771075,-2.11703 5.542115,-4.23404 9.169595,-4.82347 3.627479,-0.58944 8.11096,0.34856 12.594226,1.28652"
id="path315016"
inkscape:path-effect="#path-effect315018"
inkscape:original-d="m 38.983832,134.42968 c 2.771299,-2.11674 5.542336,-4.23375 8.313108,-6.35101 4.483925,0.9383 8.967406,1.8763 13.450713,2.81406" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.26458299;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke markers fill"
id="rect315122"
width="16.795015"
height="78.279381"
x="138.88747"
y="90.254951" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;fill:#0000ff;fill-opacity:1"
x="140.49396"
y="165.32137"
id="text317656"><tspan
sodipodi:role="line"
id="tspan317654"
style="stroke-width:0.264583;fill:#0000ff;fill-opacity:1"
x="140.49396"
y="165.32137">Flash</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;fill:#ff0000;fill-opacity:1"
x="141.22417"
y="148.81844"
id="text320168"><tspan
sodipodi:role="line"
id="tspan320166"
style="stroke-width:0.264583;fill:#ff0000;fill-opacity:1"
x="141.22417"
y="148.81844">RAM</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;fill:#00ff00;fill-opacity:1"
x="140.93208"
y="130.2709"
id="text321998"><tspan
sodipodi:role="line"
id="tspan321996"
style="stroke-width:0.264583;fill:#00ff00;fill-opacity:1"
x="140.93208"
y="130.2709">IO</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 139.03352,160.0638 c 5.54992,0 11.09958,0 16.64897,0"
id="path322813"
inkscape:path-effect="#path-effect322815"
inkscape:original-d="m 139.03352,160.0638 c 5.54992,2.6e-4 11.09958,2.6e-4 16.64897,0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 139.03352,150.717 c 5.54992,0 11.09958,0 16.64897,0"
id="path322817"
inkscape:path-effect="#path-effect322819"
inkscape:original-d="m 139.03352,150.717 c 5.54992,2.7e-4 11.09958,2.7e-4 16.64897,0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 138.88747,142.97669 c 5.64729,0 11.29431,0 16.94106,0"
id="path322821"
inkscape:path-effect="#path-effect322823"
inkscape:original-d="m 138.88747,142.97669 c 5.64729,2.7e-4 11.29431,2.7e-4 16.94106,0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 139.03352,133.19177 c 5.54992,0 11.09958,0 16.64897,0"
id="path322825"
inkscape:path-effect="#path-effect322827"
inkscape:original-d="m 139.03352,133.19177 c 5.54992,2.7e-4 11.09958,2.7e-4 16.64897,0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 138.88747,122.67663 c 5.59861,0 11.19695,0 16.79502,0"
id="path322829"
inkscape:path-effect="#path-effect322831"
inkscape:original-d="m 138.88747,122.67663 c 5.59861,2.7e-4 11.19695,2.7e-4 16.79502,0" />
<circle
id="path322866"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="141.80835"
cy="116.2142"
r="0.39687499" />
<circle
id="path322868"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="144.83875"
cy="116.03165"
r="0.39687499" />
<circle
id="path322870"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="148.23427"
cy="115.8856"
r="0.39687499" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="158.89545"
y="167.95015"
id="text324788"><tspan
sodipodi:role="line"
id="tspan324786"
style="stroke-width:0.264583"
x="158.89545"
y="167.95015">0</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="158.82242"
y="159.62567"
id="text326596"><tspan
sodipodi:role="line"
id="tspan326594"
style="stroke-width:0.264583"
x="158.82242"
y="159.62567">0FFF</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="158.45732"
y="150.42493"
id="text328382"><tspan
sodipodi:role="line"
id="tspan328380"
style="stroke-width:0.264583"
x="158.45732"
y="150.42493">1FFF</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="159.4066"
y="143.19577"
id="text329870"><tspan
sodipodi:role="line"
id="tspan329868"
style="stroke-width:0.264583"
x="159.4066"
y="143.19577">2FFF</tspan></text>
<circle
id="path330675"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="160.0638"
cy="133.41084"
r="0.39687499" />
<circle
id="path330677"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="162.1084"
cy="133.33781"
r="0.39687499" />
<circle
id="path330679"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="164.29906"
cy="133.19177"
r="0.39687499" />
<rect
style="fill:url(#Wavy);stroke:none;stroke-width:0.264583;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke markers fill;fill-opacity:1.0"
id="rect330818"
width="16.64897"
height="9.3467999"
x="139.03352"
y="150.717" />
<rect
style="fill:url(#Wavy);stroke:none;stroke-width:0.264583;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke markers fill;fill-opacity:1.0"
id="rect330846"
width="16.79501"
height="9.7849207"
x="139.03352"
y="133.19177" />
<path
style="fill:none;stroke:#ff0000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 131.66725,145.19541 c 2.37547,0.51641 4.75065,1.03275 7.12552,1.54902"
id="path330895"
inkscape:path-effect="#path-effect330897"
inkscape:original-d="m 131.66725,145.19541 c 2.37543,0.5166 4.75061,1.03295 7.12552,1.54902" />
<path
style="fill:none;stroke:#0000ff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 127.02016,116.79659 c 3.16717,3.16716 6.33406,6.33406 7.83132,14.21701 1.49726,7.88295 1.32515,20.48145 1.70397,26.97008 0.37882,6.48864 1.30823,6.86728 2.23732,7.2458"
id="path330899"
inkscape:path-effect="#path-effect330901"
inkscape:original-d="m 127.02016,116.79659 c 3.16717,3.16716 6.33407,6.33406 9.5007,9.5007 -0.17185,12.59926 -0.34396,25.19776 -0.51634,37.79624 0.9297,0.37892 1.8591,0.75757 2.78825,1.13595" />
<path
style="fill:none;stroke:#00ff00;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 58.553198,160.2726 c 24.853532,0.0344 49.706802,0.0688 62.184932,-1.46287 12.47813,-1.53172 12.5814,-4.62971 13.06332,-10.10303 0.48192,-5.47331 1.34247,-13.32156 2.27205,-17.22866 0.92957,-3.9071 1.92782,-3.87267 2.9258,-3.83826"
id="path330903"
inkscape:path-effect="#path-effect330905"
inkscape:original-d="m 58.553198,160.2726 c 24.853532,0.0347 49.706802,0.0691 74.559802,0.10327 0.10354,-3.09785 0.2068,-6.19584 0.30981,-9.29416 0.86085,-7.84829 1.7214,-15.69654 2.58171,-23.5452 0.99854,0.0347 1.99679,0.0691 2.99478,0.10327" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 26 KiB

288
pics/01-ess-00-mutex.svg Normal file
View File

@ -0,0 +1,288 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
sodipodi:docname="00-ess-00-mutex.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="1.8116734"
inkscape:cx="241.48944"
inkscape:cy="384.17521"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="-8"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<inkscape:path-effect
effect="bspline"
id="path-effect8372"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect8198"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<marker
style="overflow:visible"
id="EmptyDiamondL"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="EmptyDiamondL"
inkscape:isstock="true">
<path
transform="scale(0.8)"
style="fill-rule:evenodd;fill:context-fill;stroke:context-stroke;stroke-width:1.0pt"
d="M 0,-7.0710768 L -7.0710894,0 L 0,7.0710589 L 7.0710462,0 L 0,-7.0710768 z "
id="path8006" />
</marker>
<marker
style="overflow:visible"
id="DotL"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="DotL"
inkscape:isstock="true">
<path
transform="scale(0.8) translate(7.4, 1)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt"
d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
id="path7961" />
</marker>
<inkscape:path-effect
effect="bspline"
id="path-effect1504"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path862" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lend-9"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path862-7" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lend-8"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path862-3" />
</marker>
<inkscape:path-effect
effect="bspline"
id="path-effect1504-9"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<marker
style="overflow:visible"
id="Arrow1Lend-0"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path862-37" />
</marker>
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:none;stroke:#000000;stroke-width:0.21042;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="M 41.307371,74.559805 V 92.941583 H 122.23944"
id="path857" />
<path
style="fill:none;stroke:#000000;stroke-width:0.21042;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend-9)"
d="m 41.349734,101.45961 v 18.38178 H 122.2818"
id="path857-7" />
<path
style="fill:none;stroke:#000000;stroke-width:0.21042;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend-8)"
d="m 41.414844,126.76037 v 18.38178 h 80.932066"
id="path857-9" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="28.916636"
y="91.423294"
id="text4337"><tspan
sodipodi:role="line"
id="tspan4335"
style="stroke-width:0.264583"
x="28.916636"
y="91.423294">Task1</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.21042;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend-0)"
d="M 41.398537,47.239297 V 65.621075 H 122.3306"
id="path857-1" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="29.06123"
y="64.102783"
id="text4337-5"><tspan
sodipodi:role="line"
id="tspan4335-7"
style="stroke-width:0.264583"
x="29.06123"
y="64.102783">Mutex</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="29.580076"
y="118.11893"
id="text4337-4"><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="29.580076"
y="118.11893"
id="tspan6394">Task2</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="30.815203"
y="144.87526"
id="text13504"><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="30.815203"
y="144.87526"
id="tspan13506">Task3</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#DotL)"
d="m 41.476387,138.01122 h 8.47053"
id="path7898" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 41.330342,81.200248 H 53.305918 V 92.737695"
id="path8168" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DotL)"
d="m 53.305918,81.200248 h 7.302183"
id="path8170" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 67.034018,92.737695 V 80.762119 h 19.4238 v 12.267663"
id="path8172" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DotL)"
d="m 67.034018,80.762117 7.740313,0.146045"
id="path8174" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#EmptyDiamondL)"
d="M 86.457818,80.762117 89.962867,74.3362"
id="path8176" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 51.845482,65.573584 V 52.721745 h 14.458317 v 12.559749"
id="path8186" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#EmptyDiamondL)"
d="m 66.303799,52.721745 4.962673,-8.595603"
id="path8188" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458299;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:1.05833194,2.11666389;stroke-dashoffset:0"
d="M 53.74405,144.87526 V 129.2486"
id="path8192" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458299;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:1.05833194,2.11666389;stroke-dashoffset:0"
d="M 67.326107,145.02131 V 130.41695"
id="path8194" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="m 53.74405,137.86517 c 3.212905,-9.15191 6.425866,-18.30398 3.797131,-28.79482 C 54.912445,98.579503 46.442254,86.750443 44.519183,77.69543 42.596113,68.640417 47.220735,62.360667 51.845482,56.080747"
id="path8196"
inkscape:path-effect="#path-effect8198"
inkscape:original-d="m 53.74405,137.86517 c 3.213224,-9.1518 6.426184,-18.30387 9.638879,-27.4562 C 54.912495,98.579467 46.442303,86.750408 37.971339,74.920374 42.596411,68.640637 47.221033,62.360886 51.845482,56.080747"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="m 66.449844,55.642618 c 7.05899,9.785221 14.117765,19.570143 13.070902,30.791161 -1.046862,11.221019 -10.198744,23.877871 -13.630658,32.738041 -3.431914,8.86016 -1.143941,13.92291 1.14393,18.98544"
id="path8370"
inkscape:path-effect="#path-effect8372"
inkscape:original-d="m 66.449844,55.642618 c 7.059038,9.785186 14.117815,19.570107 21.176324,29.354766 -9.151985,12.65763 -18.303867,25.314486 -27.456199,37.971336 2.288326,5.06321 4.576297,10.12596 6.864049,15.18854" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 86.749907,119.60972 v -13.7281 h 21.614453 v 14.02019"
id="path8407" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

145
pics/01-ess-00-readmem.svg Normal file
View File

@ -0,0 +1,145 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
sodipodi:docname="01-ess-00-readmem.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="2.5620932"
inkscape:cx="315.17199"
inkscape:cy="505.4461"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="-8"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs2" />
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 30.051113,100.17038 h 9.913768 l 2.679054,9.99836 2.707521,-10.1046 h 14.854036 l 2.664108,9.94258 2.661097,-9.93135 h 14.70887"
id="path44" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 30.051113,110.36601 h 9.913768 l 2.679054,-9.99836 2.707521,10.1046 h 14.854036 l 2.664108,-9.94258 2.661097,9.93135 h 14.708869"
id="path44-4" />
<circle
id="path996"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="30.877262"
cy="105.3338"
r="0.39687499" />
<circle
id="path998"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="32.736092"
cy="105.3338"
r="0.39687499" />
<circle
id="path1000"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="35.111263"
cy="105.23053"
r="0.39687499" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="36.453751"
y="114.52469"
id="text5250"><tspan
sodipodi:role="line"
id="tspan5248"
style="stroke-width:0.264583"
x="36.453751"
y="114.52469">Row</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="36.453751"
y="119.81635"
id="tspan5252">Address</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="36.453751"
y="125.10801"
id="tspan5254">Select</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="57.727051"
y="114.73122"
id="text11044"><tspan
sodipodi:role="line"
id="tspan11042"
style="stroke-width:0.264583"
x="57.727051"
y="114.73122">Column</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="57.727051"
y="120.02289"
id="tspan11046">Address</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="57.727051"
y="125.31454"
id="tspan11048">Select</tspan></text>
<path
style="fill:none;stroke:#0000ff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 80.239565,100.07537 2.768277,10.33135 2.77487,-10.35597 2.707487,10.10448 2.656046,-9.9125 2.653006,9.90115 2.731532,-10.194209"
id="path12021" />
<path
style="fill:none;stroke:#0000ff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 80.239566,110.46102 2.768277,-10.33135 2.77487,10.35597 2.707487,-10.10448 2.656046,9.9125 2.653004,-9.90115 2.73153,10.19421"
id="path12021-9" />
<path
style="fill:none;stroke:#0000ff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 81.646289,110.98415 2.768277,10.33135 2.77487,-10.35597 2.707487,10.10448 2.656046,-9.9125 2.653006,9.90115 2.731532,-10.19421"
id="path12021-7" />
<path
style="fill:none;stroke:#0000ff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 81.64629,121.3698 2.768277,-10.33135 2.77487,10.35597 2.707487,-10.10448 2.656046,9.9125 2.653004,-9.90115 2.73153,10.19421"
id="path12021-9-2" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 80.033031,93.871001 V 129.39534"
id="path12185" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 98.001737,93.354659 V 129.60188"
id="path12187" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="82.924545"
y="129.1888"
id="text14721"><tspan
sodipodi:role="line"
id="tspan14719"
style="stroke-width:0.264583"
x="82.924545"
y="129.1888">burst</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
pics/01-ess-00-rows1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
pics/01-ess-00-rows2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

294
pics/01-ess-00-s-d-aram.svg Normal file
View File

@ -0,0 +1,294 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg22181"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
sodipodi:docname="01-ess-00-s-d-ram.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview22183"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="5.1241863"
inkscape:cx="358.20321"
inkscape:cy="429.53161"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="-8"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs22178">
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path45480" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lstart"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="scale(0.8) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path45477" />
</marker>
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="fill:none;stroke:#000002;stroke-width:0.264583;paint-order:stroke markers fill;stroke-opacity:1"
id="rect22207"
width="20.292246"
height="11.204624"
x="53.493046"
y="98.879517" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="57.933586"
y="105.7985"
id="text24138"><tspan
sodipodi:role="line"
id="tspan24136"
style="stroke-width:0.264583"
x="57.933586"
y="105.7985">Ядро</tspan></text>
<rect
style="fill:none;stroke:#000002;stroke-width:0.264583;stroke-opacity:1;paint-order:stroke markers fill"
id="rect22207-3"
width="20.292246"
height="11.204624"
x="53.622131"
y="114.03416" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="59.301891"
y="120.95315"
id="text24138-1"><tspan
sodipodi:role="line"
id="tspan24136-2"
style="stroke-width:0.264583"
x="59.301891"
y="120.95315">АЦП</tspan></text>
<rect
style="fill:none;stroke:#000002;stroke-width:0.264583;stroke-opacity:1;paint-order:stroke markers fill"
id="rect31027"
width="20.343882"
height="41.926983"
x="94.903687"
y="85.661163" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="96.969055"
y="126.24565"
id="text33693"><tspan
sodipodi:role="line"
id="tspan33691"
style="stroke-width:0.264583"
x="96.969055"
y="126.24565">Данные</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 95.006953,121.49531 H 115.2992"
id="path36638" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="96.685066"
y="119.7674"
id="text33693-2"><tspan
sodipodi:role="line"
id="tspan33691-3"
style="stroke-width:0.264583"
x="96.685066"
y="119.7674">Данные</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 94.722966,115.01705 H 115.01521"
id="path36638-7" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 94.7746,108.97585 h 20.29225"
id="path36638-5" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="96.839973"
y="107.83989"
id="text33693-9"><tspan
sodipodi:role="line"
id="tspan33691-2"
style="stroke-width:0.264583"
x="96.839973"
y="107.83989">Коэфф</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 94.877868,103.08955 H 115.17012"
id="path36638-9" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="96.891602"
y="101.85032"
id="text33693-7"><tspan
sodipodi:role="line"
id="tspan33691-33"
style="stroke-width:0.264583"
x="96.891602"
y="101.85032">Результ</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 94.929503,97.099978 H 115.22175"
id="path36638-0" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="96.839973"
y="96.067284"
id="text33693-0"><tspan
sodipodi:role="line"
id="tspan33691-8"
style="stroke-width:0.264583"
x="96.839973"
y="96.067284">Результ</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 94.877868,91.316946 H 115.17012"
id="path36638-6" />
<circle
id="path36932"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="102.70045"
cy="88.604309"
r="0.39687499" />
<circle
id="path36934"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="104.55928"
cy="88.449402"
r="0.39687499" />
<circle
id="path36936"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="107.03773"
cy="88.449402"
r="0.39687499" />
<rect
style="fill:none;stroke:#000002;stroke-width:0.264583;stroke-opacity:1;paint-order:stroke markers fill"
id="rect22207-0"
width="20.292246"
height="11.204624"
x="128.38847"
y="87.907249" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="129.57607"
y="94.774597"
id="text24138-0"><tspan
sodipodi:role="line"
id="tspan24136-4"
style="stroke-width:0.264583"
x="129.57607"
y="94.774597">Ethernet</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Lstart);marker-end:url(#Arrow1Lend)"
d="m 128.05285,93.457926 -12.65038,1.290857"
id="path45475"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="M 140.29016,99.240958 115.2992,118.44888"
id="path45885" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="M 73.940193,102.44228 94.85205,99.86057"
id="path45887" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="M 94.903686,106.72792 73.888559,106.52138"
id="path45889" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="m 73.991829,119.68811 20.860221,5.16342"
id="path45891" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="78.897079"
y="105.95341"
id="text49613"><tspan
sodipodi:role="line"
id="tspan49611"
style="stroke-width:0.264583"
x="78.897079"
y="105.95341">чтение</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="75.592491"
y="99.860565"
id="text51975"><tspan
sodipodi:role="line"
id="tspan51973"
style="stroke-width:0.264583"
x="75.592491"
y="99.860565">запись</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="M 94.903686,118.65542 73.785293,110.08414"
id="path56894" />
<circle
id="path56896"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="100.68671"
cy="112.04624"
r="0.39687499" />
<circle
id="path56898"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="102.44228"
cy="112.09788"
r="0.39687499" />
<circle
id="path56900"
style="fill:#000000;stroke:none;stroke-width:0.264583"
cx="103.99131"
cy="111.94297"
r="0.39687499" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

218
pics/01-ess-00-sdram.svg Normal file
View File

@ -0,0 +1,218 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg57035"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
sodipodi:docname="01-ess-00-sdram.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview57037"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="5.1241863"
inkscape:cx="324.83206"
inkscape:cy="300.92583"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="-8"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs57032">
<marker
style="overflow:visible;"
id="Arrow2Send"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow2Send"
inkscape:isstock="true">
<path
transform="scale(0.3) rotate(180) translate(-2.3,0)"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
style="stroke:context-stroke;fill-rule:evenodd;fill:context-stroke;stroke-width:0.62500000;stroke-linejoin:round;"
id="path45510" />
</marker>
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path45480" />
</marker>
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000002;stroke-width:0.31486;paint-order:stroke markers fill"
id="rect57061"
width="21.068533"
height="22.256119"
x="81.193924"
y="71.125244" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="77.812759"
y="63.200275"
id="text58935"><tspan
sodipodi:role="line"
id="tspan58933"
style="stroke-width:0.264583"
x="77.812759"
y="63.200275">cols</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="70.738876"
y="67.640816"
id="text61051"><tspan
sodipodi:role="line"
id="tspan61049"
style="stroke-width:0.264583"
x="70.738876"
y="67.640816">r</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="70.738876"
y="72.93248"
id="tspan61053">o</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="70.738876"
y="78.224144"
id="tspan61055">w</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="70.738876"
y="83.5158"
id="tspan61057">s</tspan></text>
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000002;stroke-width:0.31486;paint-order:stroke markers fill"
id="rect57061-0"
width="21.068533"
height="22.256119"
x="79.722343"
y="69.318047" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000002;stroke-width:0.31486;paint-order:stroke markers fill"
id="rect57061-1"
width="21.068533"
height="22.256119"
x="78.586388"
y="67.76902" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000002;stroke-width:0.31486;paint-order:stroke markers fill"
id="rect57061-6"
width="21.068533"
height="22.256119"
x="77.347168"
y="66.581436" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000002;stroke-width:0.31486;paint-order:stroke markers fill"
id="rect57061-8"
width="21.068533"
height="22.256119"
x="75.798141"
y="64.877502" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 75.850659,68.00226 h 21.06676"
id="path64415" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 75.644123,70.893775 H 96.969052"
id="path64417" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 75.747392,73.785293 H 96.762516"
id="path64419" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 75.747392,76.315368 H 96.814149"
id="path64421" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 75.592489,79.671592 h 21.32493"
id="path64423" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 75.799026,83.440888 H 96.659249"
id="path64425" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 79.361786,64.852573 V 87.055284"
id="path64427" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 82.666376,64.800937 V 87.106918"
id="path64429" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 86.125869,64.749303 V 86.952015"
id="path64431" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 89.32719,64.69767 V 87.106918"
id="path64433" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 93.509562,65.007476 V 87.106918"
id="path64435" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="105.07562"
y="61.547981"
id="text66243"><tspan
sodipodi:role="line"
id="tspan66241"
style="stroke-width:0.264583"
x="105.07562"
y="61.547981">banks</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#Arrow2Send)"
d="m 104.14621,61.083274 -7.279536,3.794228"
id="path66728" />
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#Arrow2Send)"
d="m 106.15994,62.270861 -7.744239,4.310574"
id="path66730" />
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#Arrow2Send)"
d="m 108.27695,62.890473 -8.622028,4.878546"
id="path66732" />
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#Arrow2Send)"
d="m 109.4129,62.632301 -8.62202,6.685745"
id="path66738" />
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#Arrow2Send)"
d="m 111.01356,62.529034 -8.7511,8.596209"
id="path66740" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

View File

@ -0,0 +1,5 @@
\begin{tikztimingtable}
iTL0 & LLHHLLLLLLHHLLLLLLHHLLLLLLLL \\
iSerial & LLLLLHHLLLLLLLHHLLLLLLLHHLLL \\
main & HHLLHLLHHHLLHHLLHHLLHHHLLHHH \\
\end{tikztimingtable}

302
pics/01-ess-00-tasks.svg Normal file
View File

@ -0,0 +1,302 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
sodipodi:docname="00-ess-00-tasks.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="1.8116734"
inkscape:cx="241.48944"
inkscape:cy="384.17521"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="-8"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<inkscape:path-effect
effect="bspline"
id="path-effect1504"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path862" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lend-9"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path862-7" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lend-8"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path862-3" />
</marker>
<inkscape:path-effect
effect="bspline"
id="path-effect1504-9"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#Arrow1Lend)"
d="M 41.307371,74.559805 V 92.941583 H 169.67003"
id="path857" />
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend-9)"
d="m 41.374561,101.45961 v 18.38178 H 169.73722"
id="path857-7" />
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend-8)"
d="m 41.477829,126.76037 v 18.38178 H 169.84049"
id="path857-9" />
<path
style="fill:none;stroke:#000000;stroke-width:0.665;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="M 41.307371,92.941581 H 53.45196 v -9.112549 h 10.44212 v 9.054705"
id="path1305" />
<path
style="fill:none;stroke:#000000;stroke-width:0.665;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 41.695451,135.38243 h 11.902554 v 9.7119"
id="path1424" />
<path
style="fill:none;stroke:#000000;stroke-width:0.665;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 64.697318,145.09433 v -10.22306 h 12.413708 v 10.07701"
id="path1426" />
<path
style="fill:none;stroke:#000000;stroke-width:0.665;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="M 77.768221,119.60972 V 108.65645 H 105.22442"
id="path1428" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 63.89408,83.829032 v -6.644984 l 2.154142,2.154142 -2.232183,1.288754"
id="path1430" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 46.879999,144.94828 v -16.86803 l 2.04461,2.04461 -1.898565,1.89856"
id="path1432" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 77.768219,108.65645 v -8.32449 l 2.336699,2.3367 -2.425001,1.40007"
id="path1434" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 106.31974,79.009594 c -2.19065,2.190656 -4.3813,4.381308 -4.14849,6.243438 0.23282,1.86213 2.88868,3.395492 2.92502,4.907725 0.0363,1.512234 -2.54655,3.003471 -2.53303,4.502592 0.0135,1.499121 2.62317,3.005804 2.69783,4.46923 0.0747,1.463431 -2.38537,2.883731 -2.37841,4.308141 0.007,1.4244 2.48066,2.85259 2.57121,4.22834 0.0906,1.37575 -2.20177,2.69922 -2.15853,4.04774 0.0433,1.34851 2.42179,2.72176 2.4415,4.08348 0.0197,1.36171 -2.31913,2.71204 -2.33174,4.05516 -0.0126,1.34313 2.30073,2.67874 2.48256,3.90921 0.18184,1.23047 -1.76757,2.35596 -1.85353,3.43189 -0.086,1.07593 1.69127,2.10202 1.68224,3.13315 -0.009,1.03114 -1.80405,2.06749 -1.76295,3.12764 0.0411,1.06014 1.91802,2.14379 1.83492,3.27525 -0.0831,1.13147 -2.12594,2.31091 -2.04988,3.53434 0.0761,1.22342 2.27076,2.49054 2.27613,3.75439 0.005,1.26385 -2.17831,2.5246 -2.21255,3.76565 -0.0342,1.24106 2.0807,2.46212 4.19536,3.68302"
id="path1502"
inkscape:original-d="m 106.31974,79.009594 c -2.19039,2.190919 -4.38104,4.381571 -6.571955,6.571961 2.656235,1.533692 5.312095,3.067055 7.967755,4.600186 -2.58274,1.491562 -5.16564,2.982799 -7.748855,4.473803 2.610025,1.507008 5.219675,3.013694 7.829115,4.520141 -2.45988,1.420635 -4.91992,2.840935 -7.38028,4.261015 2.47405,1.42851 4.94775,2.85669 7.42122,4.28464 -2.29214,1.32379 -4.58446,2.64726 -6.87709,3.97049 2.37889,1.37357 4.75743,2.74682 7.13575,4.11983 -2.33867,1.35064 -4.67751,2.70097 -7.01666,4.05106 2.3137,1.33593 4.62704,2.67154 6.94016,4.00691 -1.94922,1.1258 -3.89863,2.25129 -5.84834,3.37654 1.77756,1.02639 3.55479,2.05247 5.33179,3.07831 -1.79483,1.03666 -3.58985,2.07301 -5.38516,3.10912 1.87727,1.08396 3.7542,2.1676 5.63091,3.25101 -2.04267,1.17975 -4.08552,2.35919 -6.12868,3.53839 2.19505,1.26743 4.38975,2.53454 6.58422,3.80141 -2.1835,1.26106 -4.36718,2.52181 -6.55117,3.78232 2.11528,1.22137 4.23022,2.44243 6.34493,3.66325"
inkscape:path-effect="#path-effect1504" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 111.10192,79.571879 c -2.19065,2.190655 -4.38131,4.381306 -4.14849,6.243437 0.23282,1.862132 2.88868,3.395493 2.92502,4.907726 0.0363,1.512233 -2.54655,3.00347 -2.53303,4.502592 0.0135,1.499122 2.62317,3.005803 2.69783,4.469231 0.0747,1.463425 -2.38537,2.883735 -2.37841,4.308145 0.007,1.4244 2.48066,2.85259 2.57121,4.22834 0.0905,1.37575 -2.20177,2.69922 -2.15853,4.04774 0.0432,1.34851 2.42179,2.72176 2.4415,4.08348 0.0197,1.36171 -2.31913,2.71204 -2.33174,4.05516 -0.0126,1.34313 2.30073,2.67874 2.48256,3.90921 0.18184,1.23047 -1.76757,2.35596 -1.85353,3.43189 -0.086,1.07593 1.69127,2.10202 1.68224,3.13315 -0.009,1.03114 -1.80405,2.06749 -1.76295,3.12764 0.0411,1.06014 1.91802,2.14379 1.83492,3.27525 -0.0831,1.13147 -2.12594,2.31091 -2.04988,3.53434 0.0761,1.22342 2.27076,2.49054 2.27613,3.75439 0.005,1.26385 -2.17831,2.5246 -2.21255,3.76565 -0.0342,1.24106 2.0807,2.46212 4.19536,3.68302"
id="path1502-4"
inkscape:original-d="m 111.10192,79.571879 c -2.19039,2.190919 -4.38104,4.381571 -6.57196,6.571961 2.65624,1.533692 5.3121,3.067055 7.96776,4.600186 -2.58274,1.491562 -5.16564,2.982799 -7.74886,4.473803 2.61003,1.507008 5.21968,3.013694 7.82912,4.520139 -2.45988,1.420642 -4.91992,2.840942 -7.38028,4.261022 2.47405,1.42851 4.94775,2.85669 7.42122,4.28464 -2.29214,1.32379 -4.58446,2.64726 -6.87709,3.97049 2.37889,1.37357 4.75743,2.74682 7.13575,4.11983 -2.33867,1.35064 -4.67751,2.70097 -7.01666,4.05106 2.3137,1.33593 4.62704,2.67154 6.94016,4.00691 -1.94922,1.1258 -3.89863,2.25129 -5.84834,3.37654 1.77756,1.02639 3.55479,2.05247 5.33179,3.07831 -1.79483,1.03666 -3.58985,2.07301 -5.38516,3.10912 1.87727,1.08396 3.7542,2.1676 5.63091,3.25101 -2.04267,1.17975 -4.08552,2.35919 -6.12868,3.53839 2.19505,1.26743 4.38975,2.53454 6.58422,3.80141 -2.1835,1.26106 -4.36718,2.52181 -6.55117,3.78232 2.11528,1.22137 4.23022,2.44243 6.34493,3.66325"
inkscape:path-effect="#path-effect1504-9" />
<path
style="fill:none;stroke:#000000;stroke-width:0.665;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 110.11688,108.65645 h 13.28997 v 10.80722"
id="path1661" />
<path
style="fill:none;stroke:#000000;stroke-width:0.665;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 124.13707,145.16735 v -11.09931 h 13.14392 v 11.24535"
id="path1663" />
<path
style="fill:none;stroke:#000000;stroke-width:0.665;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="M 137.57308,92.737693 V 81.34629 h 29.64685"
id="path1665" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 137.57308,81.346288 v -7.886351 l 2.70181,2.701806 -2.88008,1.662814"
id="path1667" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 137.28099,134.06804 v -5.98779 l 2.26368,2.26367 -2.23529,1.29055"
id="path1669" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 53.45196,83.829032 v -7.594267 l 2.701806,2.701806 -3.162379,1.825802"
id="path1671" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="28.916636"
y="91.423294"
id="text4337"><tspan
sodipodi:role="line"
id="tspan4335"
style="stroke-width:0.264583"
x="28.916636"
y="91.423294">Task1</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="29.580076"
y="118.11893"
id="text4337-4"><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="29.580076"
y="118.11893"
id="tspan6394">Task2</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="30.815203"
y="144.87526"
id="text13504"><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="30.815203"
y="144.87526"
id="tspan13506">Task3</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="57.979313"
y="151.00908"
id="text19905"><tspan
sodipodi:role="line"
id="tspan19903"
style="stroke-width:0.264583"
x="57.979313"
y="151.00908">захват</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="57.979313"
y="156.30074"
id="tspan19907">ресурса А</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="51.407349"
y="70.393021"
id="text24465"><tspan
sodipodi:role="line"
id="tspan24463"
style="stroke-width:0.264583"
x="51.407349"
y="70.393021">IRQ1</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="73.898064"
y="68.348412"
id="text28165"><tspan
sodipodi:role="line"
id="tspan28163"
style="stroke-width:0.264583"
x="73.898064"
y="68.348412">запрос</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="73.898064"
y="73.640076"
id="tspan28167">ресурса А</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="85.87365"
y="100.478"
id="text32851"><tspan
sodipodi:role="line"
id="tspan32849"
style="stroke-width:0.264583"
x="85.87365"
y="100.478">IRQ2</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="147.65009"
y="64.259186"
id="text39707"><tspan
sodipodi:role="line"
id="tspan39705"
style="stroke-width:0.264583"
x="147.65009"
y="64.259186">захват</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="147.65009"
y="69.55085"
id="tspan39709">ресурса А</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
x="141.51627"
y="152.46954"
id="text42011"><tspan
sodipodi:role="line"
id="tspan42009"
style="stroke-width:0.264583"
x="141.51627"
y="152.46954">освобождение</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="141.51627"
y="157.7612"
id="tspan42013">ресурса А</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

BIN
pics/01-ess-01-tasks.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Some files were not shown because too many files have changed in this diff Show More