Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС / Методические рекомендации по выполнению курсовой работы.doc
Скачиваний:
123
Добавлен:
11.04.2015
Размер:
228.86 Кб
Скачать

Тема 7. Разработка двух приложений, взаимодействующих между собой на основе проецируемых в память файлов.

Содержание задания.

Создайте приложения A и B (имена дайте сами), взаимодействующие между собой посредством проецируемого в память файла и посылки друг другу пользовательских сообщений. Сообщения (использовать сообщения, определенные пользователем) лишь служат для информирования приложений о подготовленности для них данных. Сами данные передаются через проецируемый в память файл. Приложение B по полученным в сообщении от приложения A первому члену b1, разности q и числу членов n рассчитывает n-й член и сумму Sn первых n членов геометрической прогрессии и отправляет результат приложению A. В окне приложения B должны отображаться полученные от приложения A параметры геометрической прогрессии b1, q и n. В окне приложения A должны отображаться принятые от приложения B результаты bn и Sn. Приложение B должно вести протокол получаемых запросов и выданных на них ответов в текстовом файле. Каждая строка файла имеет вид типа: “Первый член =1, знаменатель = 2, n = 3, последний член = 5, сумма = 9». Для операций с файлом протокола использовать функции управления файлами Win 32 API. Интерфейс приложения A должен быть построен на основе диалогового окна. Файл для ведения протокола должен задаваться в поле ввода окна приложения B. Вычисления в приложении B должны выполняться в отдельном рабочем потоке. Интерфейс приложения B построить на основе окна приложения общего вида. При запуске одного из приложений второе приложение должно запускаться автоматически, если оба файлы обоих приложений расположены в одном каталоге. При закрытии одного из приложений второе приложение должно закрываться автоматически, если оба файлы обоих приложений расположены в одном каталоге. В противном случае приложения запускаются и останавливаются порознь.

Тема 8. Разработка двух приложений, взаимодействующих между собой на основе буфера обмена.

Содержание задания.

Создайте приложения A и B (имена дайте сами), взаимодействующие между собой посредством буфера обмена и посылки друг другу пользовательских сообщений. Сообщения (использовать сообщения, определенные пользователем) лишь служат для информирования приложений о подготовленности для них данных. Сами данные передаются через буфер обмена. Приложение B по полученным в сообщении от приложения A координатам ax, ay, az вектора и координатам bx, by, bz вектора рассчитывает скалярное произведение и угол  между векторами и и отправляет результат приложению A. В окне приложения B должны отображаться полученные от приложения A координаты ax, ay, az вектора и координаты bx, by, bz вектора . В окне приложения A должны отображаться принятые от приложения B результаты и угол . Приложение B должно вести протокол получаемых запросов и выданных на них ответов в текстовом файле. Каждая строка файла имеет вид типа: “Координаты первого вектора = (1, 2, -1); координаты второго вектора = (2, 1, 4), скалярное произведение = 0, угол = 90 градусов». Для операций с файлом протокола использовать функции управления файлами Win 32 API. Интерфейс приложения A должен быть построен на основе диалогового окна. Файл для ведения протокола должен задаваться в поле ввода окна приложения B. Вычисления в приложении B должны выполняться в отдельном рабочем потоке. Интерфейс приложения B построить на основе окна приложения общего вида. При запуске одного из приложений второе приложение должно запускаться автоматически, если оба файлы обоих приложений расположены в одном каталоге. При закрытии одного из приложений второе приложение должно закрываться автоматически, если оба файлы обоих приложений расположены в одном каталоге. В противном случае приложения запускаются и останавливаются порознь.

Тема 9. Разработка многопоточного приложения, демонстрирующего распараллеливание вычислений на примере расчета произведения матриц произвольных размерностей m×n и n×k и использующего механизм управления памятью на основе виртуальной памяти.

Содержание задания.

Разработайте многопоточное приложение, выполняющее вычисление произведения матриц A (m×n) и B (n×k). Элементы cij матрицы произведения С = A×B вычисляются параллельно p однотипными потоками. Если некоторый поток уже вычисляет элемент cij матрицы C, то следующий приступающий к вычислению поток выбирает для расчета элемент cij+1, если j<k, и ci+1k, если j=k. Выполнив вычисление элемента матрицы-произведения, поток проверяет, нет ли элемента, который еще не рассчитывается. Если такой элемент есть, то приступает к его расчету. В противном случае отправляет (пользовательское) сообщение о завершении своей работы и приостанавливает своё выполнение. Главный поток, получив сообщения о завершении вычислений от всех потоков, выводит результат на экран и запускает поток, записывающий результат в конец файла-протокола. В каждом потоке должна быть задержка в выполнении вычислений (чтобы дать возможность поработать всем потокам). Синхронизацию потоков между собой организуйте через критическую секцию, мьютекс или событие с автоматическим сбросом. Для хранения перемножаемых матриц и матрицы-результата перемножения используйте функции семейства Win 32 API VitrualXXX() для управления виртуальной памятью. Разработайте необходимый пользовательский интерфейс для ввода размерностей перемножаемых матриц M, N и K, и их элементов; запуска расчета, задания количества вычисляющих потоков, вывода матрицы-произведения. Для ускорения ввода предусмотрите возможность не заполнять нулевые элементы (не заполненные элементы матриц должны сами инициализироваться нулями). Например, для ввода каждой матрицы предусмотрите три поля ввода: номер строки, номер столбца, элемент матрицы (на пересечении этой строки и этого столбца); и кнопку для команды ввода элемента в матрицу. Для вывода результата предусмотрите использование прокруток по строкам и столбцам матрицы-результата с окном вывода 10×10. Разработайте файл протокола, в который должна записываться следующая информация: размерности перемножаемых матриц, их элементы, элементы результата, а также информацию о том, каким потоком (номером) вычислен данный элемент матрицы. В пользовательском интерфейсе предусмотрите кнопку для вызова диалогового окна для выбора файла протокола.

Тема 10. Разработка многопоточного приложения, демонстрирующего распараллеливание вычислений на примере расчета произведения матриц произвольных размерностей m×n и n×k и использующего механизм управления памятью на основе проецируемого в память файла.

Содержание задания.

Разработайте многопоточное приложение, выполняющее вычисление произведения матриц A (m×n) и B (n×k). Элементы cij матрицы произведения С = A×B вычисляются параллельно p однотипными потоками. Если некоторый поток уже вычисляет элемент cij матрицы C, то следующий приступающий к вычислению поток выбирает для расчета элемент cij+1, если j<k, и ci+1k, если j=k. Выполнив вычисление элемента матрицы-произведения, поток проверяет, нет ли элемента, который еще не рассчитывается. Если такой элемент есть, то приступает к его расчету. В противном случае отправляет (пользовательское) сообщение о завершении своей работы и приостанавливает своё выполнение. Главный поток, получив сообщения о завершении вычислений от всех потоков, выводит результат на экран и запускает поток, записывающий результат в конец файла-протокола. В каждом потоке должна быть задержка в выполнении вычислений (чтобы дать возможность поработать всем потокам). Синхронизацию потоков между собой организуйте через критическую секцию или мьютекс. Для хранения перемножаемых матриц и матрицы-результата перемножения используйте функции семейства Win 32 API для управления проецируемыми в память файлами. Разработайте необходимый пользовательский интерфейс для ввода размерностей перемножаемых матриц M, N и K, и их элементов; запуска расчета, задания количества вычисляющих потоков, вывода матрицы-произведения. Для ускорения ввода предусмотрите возможность не заполнять нулевые элементы (не заполненные элементы матриц должны сами инициализироваться нулями). Например, для ввода каждой матрицы предусмотрите три поля ввода: номер строки, номер столбца, элемент матрицы (на пересечении этой строки и этого столбца); и кнопку для команды ввода элемента в матрицу. Для вывода результата предусмотрите использование прокруток по строкам и столбцам матрицы-результата с окном вывода 10×10. Разработайте файл протокола, в который должна записываться следующая информация: размерности перемножаемых матриц, их элементы, элементы результата, а также информацию о том, каким потоком (номером) вычислен данный элемент матрицы. В пользовательском интерфейсе предусмотрите кнопку для вызова диалогового окна для выбора файла протокола.

Тема 11. Разработка многопоточного приложения, демонстрирующего распараллеливание вычислений на примере расчета произведения матриц произвольных размерностей m×n и n×k и использующего механизм управления динамически распределяемой памятью.

Содержание задания.

Разработайте многопоточное приложение, выполняющее вычисление произведения матриц A (m×n) и B (n×k). Элементы cij матрицы произведения С = A×B вычисляются параллельно p однотипными потоками. Если некоторый поток уже вычисляет элемент cij матрицы C, то следующий приступающий к вычислению поток выбирает для расчета элемент cij+1, если j<k, и ci+1k, если j=k. Выполнив вычисление элемента матрицы-произведения, поток проверяет, нет ли элемента, который еще не рассчитывается. Если такой элемент есть, то приступает к его расчету. В противном случае отправляет (пользовательское) сообщение о завершении своей работы и приостанавливает своё выполнение. Главный поток, получив сообщения о завершении вычислений от всех потоков, выводит результат на экран и запускает поток, записывающий результат в конец файла-протокола. В каждом потоке должна быть задержка в выполнении вычислений (чтобы дать возможность поработать всем потокам). Синхронизацию потоков между собой организуйте через критическую секцию или мьютекс. Для хранения перемножаемых матриц и матрицы-результата перемножения используйте функции семейства Win 32 API HeapXXX() для управления динамически распределяемой памятью. Разработайте необходимый пользовательский интерфейс для ввода размерностей перемножаемых матриц M, N и K, и их элементов; запуска расчета, задания количества вычисляющих потоков, вывода матрицы-произведения. Для ускорения ввода предусмотрите возможность не заполнять нулевые элементы (не заполненные элементы матриц должны сами инициализироваться нулями). Например, для ввода каждой матрицы предусмотрите три поля ввода: номер строки, номер столбца, элемент матрицы (на пересечении этой строки и этого столбца); и кнопку для команды ввода элемента в матрицу. Для вывода результата предусмотрите использование прокруток по строкам и столбцам матрицы-результата с окном вывода 10×10. Разработайте файл протокола, в который должна записываться следующая информация: размерности перемножаемых матриц, их элементы, элементы результата, а также информацию о том, каким потоком (номером) вычислен данный элемент матрицы. В пользовательском интерфейсе предусмотрите кнопку для вызова диалогового окна для выбора файла протокола.

Тема 12. Разработка многопоточного приложения, демонстрирующего распараллеливание вычислений на примере вычисления нормы вектора в Евклидовом линейном пространстве большой размерности и использующего механизм управления памятью на основе виртуальной памяти.

Содержание задания.

Разработайте многопоточное приложение, выполняющее вычисление нормы вектора a. Каждый из p потоков вычисляет частичную сумму квадратов компонент вектора: от некоторого элемента ai до ai+k-1 (k последовательных элемента). Параметры k и p должны быть варьируемыми (предусмотреть поля ввода для них в диалоговом окне приложения). Если некоторый поток уже вычисляет сумму квадратов элементов от ai до ai+k-1, то следующий приступающий к вычислению поток выбирает для расчета последовательность элементов от ai+k до ai+2k-1. Выполнив вычисление частичной суммы квадратов компонентов вектора a, поток проверяет, нет ли последовательности элементов в количестве не более k, сумма квадратов которой еще не вычислялась. Если такая последовательность есть, то приступает к суммированию квадратов ее элементов. В противном случае приостанавливает своё выполнение. Суммирование частичных сумм выполняется путем их накопления (сложения) в глобальной переменной, первоначально инициализированной нулевым значением, самими потоками. Вычислительный поток после завершения работы отправляет (пользовательское) сообщение главному потоку. Главный поток, получив сообщения о завершении вычислений всеми потоками, извлекает квадратный корень из результата суммирования и выводит результат на экран и запускает поток, записывающий результат в конец файла-протокола. В каждом потоке должна быть задержка в выполнении вычислений (чтобы дать возможность поработать всем потокам). Синхронизацию потоков между собой для выбора суммируемой подпоследовательности компонент вектора и доступа к накапливающей сумму квадратов компонент вектора переменной организуйте через критические секции, мьютексы или события с автоматическим сбросом (в любой комбинации). Для хранения компонент вектора используйте функции семейства Win 32 API VitrualXXX() для управления виртуальной памятью. Разработайте необходимый пользовательский интерфейс для ввода размерности вектора N и значений его компонент, запуска расчета, задания количества вычисляющих частичные суммы потоков, задания количества суммируемых квадратов элементов одним потоком, вывода нормы вектора. Для ускорения ввода предусмотрите возможность не заполнять нулевые компоненты вектора (не заполненные компоненты вектора должны сами инициализироваться нулями). Например, для ввода вектора предусмотрите два поля ввода: номер компоненты, значение компоненты; и кнопку для команды задания компоненты вектора. Разработайте файл протокола, в который должна записываться следующая информация: размерность вектора, его компоненты, результат (норма), а также информацию о том, каким потоком (номером) и какая подпоследовательность элементов просуммирована (задать ее номером первого элемента). В пользовательском интерфейсе предусмотрите кнопку для вызова диалогового окна для выбора файла протокола.

Тема 13. Разработка многопоточного приложения, демонстрирующего распараллеливание вычислений на примере вычисления нормы вектора в Евклидовом линейном пространстве большой размерности и использующего механизм управления памятью на основе проецируемого в память файла.

Содержание задания.

Разработайте многопоточное приложение, выполняющее вычисление нормы вектора a. Каждый из p потоков вычисляет частичную сумму квадратов компонент вектора: от некоторого элемента ai до ai+k-1 (k последовательных элемента). Параметры k и p должны быть варьируемыми (предусмотреть поля ввода для них в диалоговом окне приложения). Если некоторый поток уже вычисляет сумму квадратов элементов от ai до ai+k-1, то следующий приступающий к вычислению поток выбирает для расчета последовательность элементов от ai+k до ai+2k-1. Выполнив вычисление частичной суммы квадратов компонентов вектора a, поток проверяет, нет ли последовательности элементов в количестве не более k, сумма квадратов которой еще не вычислялась. Если такая последовательность есть, то приступает к суммированию квадратов ее элементов. В противном случае приостанавливает своё выполнение. Суммирование частичных сумм выполняется путем их накопления (сложения) в глобальной переменной, первоначально инициализированной нулевым значением, самими потоками. Вычислительный поток после завершения работы отправляет (пользовательское) сообщение главному потоку. Главный поток, получив сообщения о завершении вычислений всеми потоками, извлекает квадратный корень из результата суммирования и выводит результат на экран и запускает поток, записывающий результат в конец файла-протокола. В каждом потоке должна быть задержка в выполнении вычислений (чтобы дать возможность поработать всем потокам). Синхронизацию потоков между собой для выбора суммируемой подпоследовательности компонент вектора и доступа к накапливающей сумму квадратов компонент вектора переменной организуйте через критические секции, мьютексы или события с автоматическим сбросом (в любой комбинации). Для хранения компонент вектора используйте функции семейства Win 32 API для управления проецируемыми в память файлами. Разработайте необходимый пользовательский интерфейс для ввода размерности вектора N и значений его компонент, запуска расчета, задания количества вычисляющих частичные суммы потоков, задания количества суммируемых квадратов элементов одним потоком, вывода нормы вектора. Для ускорения ввода предусмотрите возможность не заполнять нулевые компоненты вектора (не заполненные компоненты вектора должны сами инициализироваться нулями). Например, для ввода вектора предусмотрите два поля ввода: номер компоненты, значение компоненты; и кнопку для команды задания компоненты вектора. Разработайте файл протокола, в который должна записываться следующая информация: размерность вектора, его компоненты, результат (норма), а также информацию о том, каким потоком (номером) и какая подпоследовательность элементов просуммирована (задать ее номером первого элемента). В пользовательском интерфейсе предусмотрите кнопку для вызова диалогового окна для выбора файла протокола.

Тема 14. Разработка многопоточного приложения, демонстрирующего распараллеливание вычислений на примере вычисления нормы вектора в Евклидовом линейном пространстве большой размерности и использующего механизм управления динамически распределяемой памятью.

Содержание задания.

Разработайте многопоточное приложение, выполняющее вычисление нормы вектора a. Каждый из p потоков вычисляет частичную сумму квадратов компонент вектора: от некоторого элемента ai до ai+k-1 (k последовательных элемента). Параметры k и p должны быть варьируемыми (предусмотреть поля ввода для них в диалоговом окне приложения). Если некоторый поток уже вычисляет сумму квадратов элементов от ai до ai+k-1, то следующий приступающий к вычислению поток выбирает для расчета последовательность элементов от ai+k до ai+2k-1. Выполнив вычисление частичной суммы квадратов компонентов вектора a, поток проверяет, нет ли последовательности элементов в количестве не более k, сумма квадратов которой еще не вычислялась. Если такая последовательность есть, то приступает к суммированию квадратов ее элементов. В противном случае приостанавливает своё выполнение. Суммирование частичных сумм выполняется путем их накопления (сложения) в глобальной переменной, первоначально инициализированной нулевым значением, самими потоками. Вычислительный поток после завершения работы отправляет (пользовательское) сообщение главному потоку. Главный поток, получив сообщения о завершении вычислений всеми потоками, извлекает квадратный корень из результата суммирования и выводит результат на экран и запускает поток, записывающий результат в конец файла-протокола. В каждом потоке должна быть задержка в выполнении вычислений (чтобы дать возможность поработать всем потокам). Синхронизацию потоков между собой для выбора суммируемой подпоследовательности компонент вектора и доступа к накапливающей сумму квадратов компонент вектора переменной организуйте через критические секции, мьютексы или события с автоматическим сбросом (в любой комбинации). Для хранения компонент вектора используйте функции семейства Win 32 API HeapXXX() для управления динамически распределяемой памятью. Разработайте необходимый пользовательский интерфейс для ввода размерности вектора N и значений его компонент, запуска расчета, задания количества вычисляющих частичные суммы потоков, задания количества суммируемых квадратов элементов одним потоком, вывода нормы вектора. Для ускорения ввода предусмотрите возможность не заполнять нулевые компоненты вектора (не заполненные компоненты вектора должны сами инициализироваться нулями). Например, для ввода вектора предусмотрите два поля ввода: номер компоненты, значение компоненты; и кнопку для команды задания компоненты вектора. Разработайте файл протокола, в который должна записываться следующая информация: размерность вектора, его компоненты, результат (норма), а также информацию о том, каким потоком (номером) и какая подпоследовательность элементов просуммирована (задать ее номером первого элемента). В пользовательском интерфейсе предусмотрите кнопку для вызова диалогового окна для выбора файла протокола.