Параллельная обработка односвязных кольцевых списков в памяти ОС Windows
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
?ожно отнести к недостаткам такой организации данных.
Пул памяти (куча) - распределяемая процессом область виртуальной памяти, используемая им для захвата и освобождения блоков памяти, размер которых может быть меньше размера виртуальной страницы. Для работы с кучей используется ряд функций, описанных в разделе Аналитический обзор.
Суть синхронизации потоков заключается в том, чтобы в конкретный момент времени к общему для потоков ресурсу имел доступ только один из них. Это очень важная задача при проектировании многопоточных программ, так как одновременный доступ нескольких потоков к критической секции может привести к нежелательным последствиям, например, к потере данных.
Отчет по данной работе состоит из нескольких основных разделов. В разделе Аналитический обзор отражена расширенная постановка задачи проекта, а также методы достижения ее реализации (в общем). Раздел Выполнение работы конкретизирует описанные методы, а также содержит подробное описание алгоритмов работы программы, а также результаты ее работы, свидетельствующие о ее корректной работе. В Выводах сформулированы основные результаты выполнения данной работы, а также цели, которых посредством данного КП удалось достичь. Также данный отчет содержит список использованных источников информации и 2 приложения: формулировка задания и код программы с комментариями.
1. АНАЛИТИЧЕСКИЙ ОБЗОР
.1 Постановка задачи
Результатом выполнения проектного задания должна была стать программа, разработанная для платформы ОС Windows, которая реализовывала бы параллельную обработку односвязного кольцевого списка. За параллельную обработку должны отвечать 5 потоков:
-главный, инициализирующий структуру списка и освобождающий после его использования память;
-поток, добавляющий элементы в список;
поток, удаляющий элементы из списка;
поток, изменяющий существующие элементы;
поток, читающий информацию списка (выводящий список на экран).
.2 Общий обзор методов реализации задачи
Таким образом, первым этапом написания программы стала реализация структуры списка, а также функций, работающих с ним. Главная задача - синхронизация потоков, работающих со списком. Для этого я использовала выделение дополнительной кучи для списка. Это несет в себе ключевой смысл: каждый раз, когда какой либо поток получает доступ к списку (а значит и к куче), то он как критический раздел блокируется, а значит любой другой поток, также пытающийся получить доступ к списку будет приостановлен до момента его освобождения. Более того в программе мною были использованы методы обеспечения многопоточности.
2. ВЫПОЛНЕНИЕ ПРОЕКТА
.1 Функционал кольцевого списка
К структуре списка применимы следующие методы:
-InitialList - инициализация списка;
-AddElem - добавление узла в конец списка;
EraseElem - удаление элемента из списка; так как реализованный мною список имеет всего 2 поля: указатель на следующий элемент и целое число (непосредственно данные), то поиск элемента для его удаления производится по этому самому числу, при эьтом считается, что элементы в списке не повторяются (для формализации задачи);
ChangeElem - изменение данных уже существующего узла; поиск элементы аналогичен поиску при удалении;
Print - вывод на экран всех узлов списка.
.2 Описание функций API для работы с пулом памяти в ОС Windows и их роль в проекте
В постановке задачи есть немаловажный пункт - обеспечение исключения возможности перекрытия разных потоков друг другом. Реализовывать его предлагается посредством создания под список отдельной кучи, а все операции со списком осуществлять при помощи функций API работы с пулом памяти. В своей программе я использовала следующие функции:
-HeapCreate. Создает дополнительную кучу в процессе. Принимает 3 параметра: параметр fdwOptions модифицирует способ выполнения операций над кучей. В нем можно указать 0, НЕАР_NO_SERIALIZE, НЕАР_GENERATE_EXCEPTIONS, HEAP_CREATE_ENABLE_EXECUTE или комбинацию этих флагов. Второй параметр функции HeapCreate - dwInitiallSize - определяет количество байтов, первоначально передаваемых куче. При необходимости функция округляет это значение до ближайшей большей величины, кратной размеру страниц. И последний параметр, dwMaximumSize, указывает максимальный объем, до которого может расширяться куча (предельный объем адресного пространства, резервируемого под кучу). Если он больше 0, вы создадите кучу именно такого размера и нс сможете его увеличить. А если этот параметр равен 0, система резервирует регион и, если надо, расширяет его до максимально возможного объема. При успешном создании кучи HeapCreate возвращает описатель, идентифицирующий новую кучу. В своей программе этой функцией я создавала кучу для объекта структуры кольцевого списка.
HeapAlloc. Выделяет блок памяти из кучи. Я использовала эту функцию при создании нового элемента списка. Принимает 3 параметра: параметр hHeap идентифицирует описатель кучи, из которой выделяется память. Параметр dwBytes определяет число выделяемых в куче байтов. Параметр fdwFlags позволяет указывать флаги, влияющие на характер выделения памяти. В настоящее время поддерживается только три флага: HEAP_ZERO_MEMORY, HEAP_GENERATE_EXCEPTIONS и HEAP_NO_SERIALIZE.
Примечание. Для выделения больших блоков памяти (от 1 Мб) рекомендуется использовать функцию VirtualAlloc, а не функции, оперирующие с кучами.
-HeapFree. Служит для освобождения блока памяти. В реализованной программе используется при удалении элем?/p>