Программа создания параллельно взаимодействующих вычислительных процессов
Разработка программы создания параллельно взаимодействующих процессов на языке С. Анализ метода создания многопоточного приложения. Программная реализация алгоритма. Вывод на экран результатов операций. Листинг программы, руководство пользователя.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 07.08.2013 |
Размер файла | 220,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ВОЗДУШНОГО ТРАНСПОРТА
Федеральное государственное образовательное учреждение
Высшего профессионального образования
МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ
Кафедра "вычислительные машины, комплексы, системы и сети"
КУРСОВАЯ РАБОТА
По дисциплине "Системное программное обеспечение"
Тема: Программа создания параллельно взаимодействующих вычислительных процессов
МОСКВА-2008
Содержание
- Аннотация
- Введение
- 1. Техническое задание
- 1.1 Назначение разработки
- 1.2 Описание разработки
- 1.3 Исходный данные
- 1.4 Технические требования
- 1.5 Специальные технические требования
- 2. Разработка структуры программы
- 3. Разработка Алгоритмов основных функций
- 3.1 Главная функция (main)
- 3.2 Функция thread_func_A
- 3.3 Функция thread_func_В
- 3.4 Функция thread_func_C
- 3.5 Функция thread_func_D
- 3.6 Функция thread_func_E
- 4. Разработка программы
- Заключение
- Список использованной литературы
- Приложения
Аннотация
Работа посвящена разработке программы создания параллельно взаимодействующих процессов на языке С.
В работе рассмотрен метод создания многопоточного приложения на языке С. Разработан алгоритм и его программная реализация на языке С.
Введение
Современные операционные системы (OC) нацелены на наиболее эффективное использование ресурсов компьютера. По большей части эффективность достигается за счет разделения ресурсов компьютера между несколькими процессами (многозадачность). Многопоточность является естественным продолжением многозадачности, точно также как виртуальные машины, позволяющие запускать несколько ОС на одном компьютере, представляют собой логическое развитие концепции разделения ресурсов. В многопоточном приложении одновременно работает несколько потоков. Иногда вместо термина "поток" используется термин "нить". Потоки - это независимые друг от друга задачи, выполняемые в контексте процесса. Поток использует код и данные родительского процесса, но имеет свой собственный уникальный стек и состояние процессора, включающее указатель команд.
Потоки часто становятся источниками программных ошибок особого рода. Эти ошибки возникают при использовании потоками разделяемых ресурсов системы (например, общего адресного пространства) и являются частным случаем более широкого класса ошибок - ошибок синхронизации. Если задача разделена между независимыми процессами, то доступом к их общим ресурсам управляет операционная система и вероятность ошибок из-за конфликтов доступа снижается. Важнейшее преимущество потоков перед самостоятельными процессами заключается в том, что накладные расходы на создание нового потока в многопоточном приложении оказываются ниже, чем накладные расходы на создание нового самостоятельного процесса. Уровень контроля над потоками в многопоточном приложении выше, чем уровень контроля приложения над дочерними процессами. Кроме того, многопоточные программы не склонны оставлять за собой вереницы зомби или "осиротевших" независимых процессов. Для порождения дочернего процесса, находясь в родительской программе, поток получает копии виртуальной памяти дескрипторов файлов и пр. Модификации содержимого памяти, закрытие файлов и другие подобные действия в дочернем процесса не влияют на работу родительского процесса и наоборот. С другой стороны, когда программа создает поток, ничего не копируется. Оба потока - старый и новый - имеют доступ к общему виртуальному пространству, общим дескрипторам файлов и другим системным ресурсам. Если, к примеру, один поток меняет значение переменной, это изменение отражается на другом потоке. Точно так же, когда один поток закрывает файл, второй поток теряет возможность работать с этим файлом. В связи с тем что процесс и все его потоки могут выполнять лишь одну программу одновременно, как только один из потоков вызывает функцию семейства exec (), он сразу же завершается.
Первая подсистема потоков в Linux появилась в 1996 году и называлась - LinuxThreads. Рудимент этой подсистемы, который есть в любой современной системе Linux, - файл /usr/include/pthread. h, указывает год релиза - 1996 и имя разработчика - Ксавье Лерой (Xavier Leroy). Библиотека LinuxThreads была попыткой организовать поддержку потоков в Linux в то время, когда ядро системы еще не предоставляло никаких специальных механизмов для работы с потоками. Позднее разработку потоков для Linux вели сразу две конкурирующие группы - NGPT и NPTL. В 2002 году группа NGPT фактически присоединилась к NPTL и теперь реализация потоков NPTL является стандартом Linux. Подсистема потоков Linux стремится соответствовать требованиям стандартов POSIX, что позволяет новым многопоточным приложениям Linux без проблем компилироваться в POSIX-совместимых системах.
В курсовой работе разработана программа, реализованная на языке С. Программа позволяет выводить на экран результаты операций факториал, суммы бесконечно убывающей геометрической прогрессии, суммы числового ряда.
1. Техническое задание
1.1 Назначение разработки
Данное приложение демонстрирует принципы взаимодействия и механизмы синхронизации процессов в операционной системе UNIX.
1.2 Описание разработки
В данной курсовой работе приведена программа на языке С. При помощи этого языка написана программа, управляющая взаимодействием параллельных вычислительных задач, а также сами задачи.
1.3 Исходный данные
OS GNU/Linux; Компилятор С (gcc)
1.4 Технические требования
Для работы приложения необходимо следующее:
64 МВ ОП
Наличие ОС Unix (Linux)
Процессор класса Pentium с частотой не менее 200 МГц
1.5 Специальные технические требования
Компьютер с установленной на нем ОС Unix (Linux) - для отладки программы, написанной на языке С.
Компилятор С - для компиляции программы на языке С (gcc,gc).
2. Разработка структуры программы
В соответствии с техническим заданием программа должна реализовывать следующие функции:
· Расчет факториала
· Расчет бесконечно убывающей геометрической прогрессии
· Расчет суммы числового ряда
На рисунке 1 представлена структура разрабатываемой программы, включающая в себя функцию main главного процесса, порождающую другие процессы.
Рисунок 1. Структурная схема программы
язык алгоритм листинг программа
3. Разработка Алгоритмов основных функций
3.1 Главная функция (main)
Главная функция (main) - функция, с которой начинается выполнение программы.
Эта функция осуществляет создание потоков A, B и Е, производит проверку завершения каждого из созданных потоков. Производит корректное удаление семафоров. Алгоритм главной функции представлен на рисунке 2.
Рисунок 2. Алгоритм главной функции
3.2 Функция thread_func_A
Функция thread_func_A предназначена для выполнения подсчета функции факториала числа 32 и вывода полученного значения на экран. Также этой функцией производится запуск потока С.
Алгоритм функции представлен на рисунке 3.
Рисунок 3. Алгоритм функции thread_func_A
3.3 Функция thread_func_В
Функция thread_func_В выполняет подсчет числового ряда типа - 1, +2, - 3, +4… и вывода полученного значения на экран. Также этой функцией производится запуск потока D. Алгоритм функции представлен на рисунке 4.
Рисунок 4. Алгоритм функции thread_func_В
3.4 Функция thread_func_C
Функция thread_func_C выполняет подсчет первых 30 членов геометрической прогрессии 1, Ѕ, ј…. Алгоритм функции представлен на рисунке 5.
Рисунок 5. Алгоритм функции thread_func_C
3.5 Функция thread_func_D
Функция thread_func_D выполняет подсчет первых 1.000.000 членов прогрессии 1, Ѕ, 1/3, ј … Алгоритм функции представлен на рисунке 6.
Рисунок 6. Алгоритм функции thread_func_D
3.6 Функция thread_func_E
Функция thread_func_D выполняет подсчет первых 1.000.000 членов прогрессии Ѕ, 1/6, 1/8, 1/10 … Алгоритм функции представлен на рисунке 7.
Рисунок 7. Алгоритм функции thread_func_E
4. Разработка программы
Разработанные алгоритмы функций были реализованы на языке С.
При разработке данной программы были использованы стандартные функции:
pthread_create - функция создание потока
pthread_join - функция проверки завершения потока
printf - функция вывода сообщения на экран
perror - функция вывода сообщения в стандартный поток ошибок
sem_init - функция инициализации семафора
sem_post - функция увеличивает значение семафора на 1
sem_wait - функция останавливает вызвавший ее поток, до тех пор, пока значение семафора не станет больше нуля
sem_destroy - функция для удаления семафора
При разработке программы были использованы переменные, приведенные в таблице 1
Таблица 1 - Переменные, использованные в программе
Имя |
Тип |
Назначение |
|
sem,sem_B, sem_C,sem_C2 |
sem_t |
Переменные-семафоры, служащие для синхронизации потоков |
|
result |
int |
Переменная для проверки создания потока |
|
thread_A, |
pthread_t |
Переменная-идентификатор потока А |
|
thread_B, |
pthread_t |
Переменная-идентификатор потока B |
|
thread_C, |
pthread_t |
Переменная-идентификатор потока C |
|
thread_D, |
pthread_t |
Переменная-идентификатор потока D |
|
thread_E; |
pthread_t |
Переменная-идентификатор потока E |
|
sum |
float |
Переменная для подсчета суммы в функциях |
|
i |
float |
Переменная для подсчета итераций цикла |
Заключение
В курсовой работе были изучены методы создания многопоточных приложений с использованием языка C для OS GNU/Linux.
Построены алгоритмы и структура программы многопоточного приложения. Полученная программа синхронизирует выполнение вычислительных процессов. Данная программа реализована на языке С, исполняемый файл занимает 13849 байт, в приложении приведена разработанная документация (спецификация, руководство оператора и текст программы)
Список использованной литературы
1. А. Робачевский. Операционная система UNIX®. - СПб.: БВХ-Петербург, 2002. - 528c.
2. Марк Митчелл, Джеффри Оудем, Алекс Самьюал. Программирование для Linux. Профессиональный подход. - М.: Издательский дом "Вильямс", 2003 - 288с.
3. Романчева Н.И. Системное программное обеспечение. Пособие к выполнению курсовых работ - М.: МГТУГА, 2005. - 40c.
4. У. Ричард Стивенс, Стивен А. Раго. Unix. Профессиональное программирование, 2-е издание. - СПб.: Символ-Плюс, 2007 - 1040с.
Приложения
Приложение А
Спецификация
Обозначение |
Наименование |
Примечание |
|
Документация |
|||
КР 061021 12 |
Разработка программы |
||
создания параллельно |
|||
взаимодействующих |
|||
вычислительных |
|||
Процессов. |
|||
Текст. |
|||
программы. |
|||
КР 061021 34 |
Разработка программы |
||
создания параллельно |
|||
взаимодействующих |
|||
вычислительных |
|||
Процессов. |
|||
Руководство |
|||
Оператора. |
Приложение Б
УТВЕРЖДЕН
КР061021-12
Программа создания параллельно взаимодействующих вычислительных процессов
Текст программы
КР061021-34
Листов 3
#include <stdlib. h>
#include <stdio. h>
#include <errno. h>
#include <pthread. h>
#include <semaphore. h>
sem_t sem, sem_B, sem_C, sem_C2;
int result;
pthread_t thread_A, thread_B, thread_C, thread_D, thread_E;
void * thread_func_C (void *arg)
{
float sum, i;
sem_post (&sem_C);
printf ("Поток C начат\n");
for (i=1; i<1000000000; i*=2)
sum+=1/i;
printf ("Рассчет потоком C завершен = %.3f \n",sum);
sem_wait (&sem_C2);
printf ("Поток C завершен\n");
}
void * thread_func_D (void *arg)
{
printf ("Поток D начат\n");
float sum=0, i;
for (i=1; i<1000000; i++)
sum+=1/i;
printf ("Рассчет потоком D завершен = %.3f \n",sum);
sem_wait (&sem);
printf ("Поток D завершен\n");
}
void * thread_func_E (void *arg)
{
printf ("Поток E начат\n");
float sum=0, i;
for (i=1; i<1000000; i++)
sum+=1/ (i*2);
printf ("Рассчет потоком E завершен = %.3f \n",sum);
printf ("Поток E завершен\n");
sem_post (&sem);
}
void * thread_func_A (void *arg)
{ float sum=1, i;
printf ("Поток А начат\n");
sem_wait (&sem_B);
for (i=1; i<33; i++)
{
sum*=i;
if (i==5) {
result = pthread_create (&thread_C, NULL, thread_func_C, NULL);
if (result! = 0) {
perror ("Ошибка в создании потока C");
return EXIT_FAILURE;
}
}
}
printf ("Поток А рассчитал 32! = %.0f\n",sum);
printf ("Поток A завершен\n");
}
void * thread_func_B (void *arg)
{
float sum=1, i;
printf ("Поток B начат\n");
sem_post (&sem_B);
sem_wait (&sem_C);
for (i=1; i<5000000; i++)
{
if (i==1000000) {
result = pthread_create (&thread_D, NULL, thread_func_D, NULL);
if (result! = 0) {
perror ("Ошибка в создании потока D");
return EXIT_FAILURE;
}
}
if (sum>0||sum==0) {sum-=i; continue; }
if (sum<0) {sum+=i; continue; }
}
printf ("Рассчет потоком B завершен = %.0f \n",sum);
printf ("Поток B завершен\n");
sem_post (&sem_C2);
}
int main (int argc, char * argv [])
{
printf ("\033 [0d\033 [2J");
sem_init (&sem, 0, 0);
sem_init (&sem_B,0,0);
sem_init (&sem_C,0,0);
sem_init (&sem_C2,0,0);
result = pthread_create (&thread_A, NULL, thread_func_A,NULL);
if (result! = 0) {
perror ("Ошибка в создании потока А");
return EXIT_FAILURE;
}
result = pthread_create (&thread_B, NULL, thread_func_B, NULL);
if (result! = 0) {
perror ("CОшибка в создании потока В");
return EXIT_FAILURE;
}
result = pthread_join (thread_A, NULL);
if (result! = 0) {
perror ("Невозможно проверить поток А");
return EXIT_FAILURE;
}
result = pthread_join (thread_B, NULL);
if (result! = 0) {
perror ("Невозможно проверить поток В");
return EXIT_FAILURE;
}
pthread_create (&thread_E, NULL, thread_func_E, NULL);
pthread_join (thread_D, NULL);
result = pthread_join (thread_E, NULL);
if (result! = 0) {
perror ("Невозможно проверить поток Е");
return EXIT_FAILURE;
}
sem_destroy (&sem);
sem_destroy (&sem_B);
sem_destroy (&sem_C);
sem_destroy (&sem_C2);
printf ("Готово\n");
return EXIT_SUCCESS;
}
Приложение В
УТВЕРЖДЕН
КР061021-34
Программа создания параллельно взаимодействующих вычислительных процессов
Руководство пользователя
КР061021-34
Листов 2
Аннотация
Данное руководство оператора содержит сведения, необходимые для правильной работы программы, а также сведения о возможных ошибках и возможные способы их устранения.
Руководство оператора содержит сведения о назначении программы, условиях выполнения программы, выполнении программы и сообщения оператору.
Содержание
1. Назначение программы
2. Условия выполнения программы
3. Выполнение программы
4. Сообщения оператору
1. Назначение программы
Данное приложение демонстрирует принципы взаимодействия и механизмы синхронизации процессов в операционной системе UNIX.
2. Условия выполнения программы
Для выполнения программы необходимы:
1) Наличие на компьютере операционной среды Unix (Linux).
2) Наличие компилятора, который позволит откомпилировать программу, написанную на языке С.
3. Выполнение программы
Для выполнения рассматриваемой программы в операционной среде UNIX необходимо:
1) Загрузить операционную систему UNIX.
2) Набрать исходный текст программы, приведённый выше в текстовом редакторе, либо переписать файл kursovik. c с текстом программы с информационного носителя. На старых версиях Linux для этого потребуется предварительно смонтировать нужный привод.
3) После этого необходимо скомпилировать на компьютере исходный текст программы. Поученный исполняемый файл запустить на выполнение.
4. Сообщения оператору
После запуска программы на дисплее появится информация о ходе выполнения всех процессов.
Размещено на Allbest.ru
...Подобные документы
Реализация анкеты "Литературные предпочтения" средствами разработки PHP, MYSQL. Структура баз данных и приложения. Программная реализация анкеты на языке программирования php, руководство пользователя. Разработка PHP скриптов. Листинг программы.
курсовая работа [351,1 K], добавлен 02.12.2010Описание алгоритма создания программы для решения алгебраических или трансцендентных уравнений с помощью численного метода Бернулли. Нахождение значений корней алгебраического уравнения с заданными параметрами точности. Листинг программы на языке java.
контрольная работа [206,0 K], добавлен 19.06.2015Разработка программы на языке Pascal. Описание переменных. Действия, которые должна выполнить программа согласно выбранного алгоритма. Детализация графической части программы. Листинг и тестирование программы. Вывод массива данных на экран монитора.
контрольная работа [360,4 K], добавлен 13.06.2012Использование класса статических массивов структур и базы данных "ODER" при создании программы на языке С++. Основные формы выдачи результатов. Технические и программные средства. Тесты для проверки работоспособности алгоритма создания программы.
курсовая работа [1,1 M], добавлен 17.03.2015Анализ задания и разработка алгоритма. Основные принципы создания программы. Схема взаимодействия процессов Process 1 и Process 4, в режиме задачи и в режиме ядра. Листинг программы и ее тестирование. Результат работы и выполнения программы в консоли.
контрольная работа [395,9 K], добавлен 18.09.2010Приемы программирования в Delphi. Алгоритм поиска альфа-бета отсечения, преимущества. Описание программного средства. Разработка программы, реализующая алгоритм игры "реверси". Руководство пользователя. Листинг программы. Навыки реализации алгоритмов.
курсовая работа [357,1 K], добавлен 28.02.2011Создание транслятора, обрабатывающего код программы на языке Паскаль и за счет эквивалентных операторов генерирующего программу на Си. Особенности внешней спецификации и работы лексического анализатора. Структура программы, вывод результатов на экран.
курсовая работа [254,0 K], добавлен 02.07.2011Описание авторской идеи анимации, использования базовых команд и конструкций. Процесса проектирования программы. Описание алгоритма разработанной программы. Последовательность создания анимации. Листинг программы и скриншот рисунка по программе.
курсовая работа [911,5 K], добавлен 20.05.2013Оценка погрешности и точности в математике. Составление программы и алгоритма для численного дифференцирования с заданной допустимой погрешностью на алгоритмическом языке Turbo Pascal 7.0. Составление алгоритма и программы аппроксимации функции.
курсовая работа [810,6 K], добавлен 24.03.2012Составление схемы алгоритма и программы для построения графика временной функции, работающей как в машинном, так и в реальном времени. Пример вычисления степенного ряда с помощью схемы Горнера. Описание переменных программы, листинг, процедуры и функции.
курсовая работа [67,6 K], добавлен 20.11.2012Программа на языке VBA, которая выводит исходные данные на экран и выполняет расчеты и предназначена для учета на складе мастерской индивидуального пошива. Описание переменных и алгоритма программы. Листинг программы, примеры произведенных расчетов.
реферат [25,4 K], добавлен 10.12.2010Изучение языка низкого уровня ассемблер для написания примера программы для 16 битного приложения. Разработка и реализация алгоритма поднесения чисел к степени чисел над полем за основанием 2 (mod 2). Иллюстрация техники создания DOS приложения.
курсовая работа [33,3 K], добавлен 08.11.2011Создание приложения, исполняющего трансляцию программы из языка Паскаль в язык Си: разработка алгоритма реализации задачи, описание необходимых констант, переменных, функций и операторов, представление листинга программы и распечатка результатов.
курсовая работа [305,9 K], добавлен 03.07.2011Структурная схема получения гороскопа по дате рождения. Листинг исходных кодов программы и руководство пользователя. Ввод данных с помощью объекта класса QDateEdit. Разработка пользовательского интерфейса. Выбор стратегии тестирования и отладка программы.
курсовая работа [1,0 M], добавлен 31.05.2015Разработка программы, позволяющей приобрести навыки быстрой печати на клавиатуре. Обзор существующих аналогов. Обоснование технических приемов программирования. Тестирование, анализ полученных результатов. Руководство пользователя, листинг программы.
курсовая работа [1,3 M], добавлен 03.04.2015Разработка программы на языке VBA, которая вводит исходные данные, выполняет расчеты и выводит на экран заданную информацию. Типы блок-схем и их использование при написании программы. Описание входных данных и результат вычислений, листинг программы.
курсовая работа [680,3 K], добавлен 03.08.2009Алгоритмизация вычислительных процессов. Разработка интерфейса пользователя программы. Создание программного кода, анимации, справочной системы. Разработка программы для вычисления коэффициента мощности выпрямителя. Вывод графического изображения.
курсовая работа [1,9 M], добавлен 28.04.2014Описание математической модели. Обоснование метода реализации. Вид алгоритма и программы. Руководство системного программиста, оператора. Комбинирование метод хорд и касательных. Интерпретация и анализ результатов. Листинг программы, контрольный пример.
курсовая работа [3,3 M], добавлен 12.01.2014Написание программы вычисления сопротивления электрической цепи, состоящей из двух параллельно и двух последовательно соединенных сопротивлений. Схема машинного алгоритма по условию задачи. Применение операций при написании программ на языке C/C++.
контрольная работа [17,3 K], добавлен 09.11.2010Описание алгоритма решения задачи графическим способом. Вывод элементов массива. Описание блоков укрупненной схемы алгоритма на языке Pascal. Листинг программы, а также ее тестирование. Результат выполнения c помощью ввода различных входных данных.
контрольная работа [150,4 K], добавлен 03.05.2014