Список использованной литературы
А. Робачевский. Операционная система UNIX®. – СПб.: БВХ-Петербург, 2002. – 528c.
Марк Митчелл, Джеффри Оудем, Алекс Самьюал. Программирование для Linux. Профессиональный подход. – М.: Издательский дом «Вильямс», 2003 – 288с.
Романчева Н.И.Системное программное обеспечение. Пособие к выполнению курсовых работ – М.: МГТУГА, 2005. - 40c.
У. Ричард Стивенс, Стивен А. Раго. Unix. Профессиональное программирование, 2-е издание. – СПб.: Символ-Плюс, 2007 – 1040с.
ПРИЛОЖЕНИЕ А
Спецификация
Обозначение |
Наименование |
Примечание |
|
Документация |
|
КР 061021 12 |
Разработка программы |
|
|
создания параллельно |
|
|
взаимодействующих |
|
|
вычислительных |
|
|
Процессов. |
|
|
Текст. |
|
|
программы. |
|
|
|
|
КР 061021 34 |
Разработка программы |
|
|
создания параллельно |
|
|
взаимодействующих |
|
|
вычислительных |
|
|
Процессов. |
|
|
Руководство |
|
|
Оператора. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ПРИЛОЖЕНИЕ Б
УТВЕРЖДЕН
КР061021-12
Программа создания параллельно
взаимодействующих вычислительных процессов
Текст программы
КР061021-34
Листов 3
2008
#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
2008
Аннотация
Данное руководство оператора содержит сведения, необходимые для правильной работы программы, а также сведения о возможных ошибках и возможные способы их устранения.
Руководство оператора содержит сведения о назначении программы, условиях выполнения программы, выполнении программы и сообщения оператору.
СОДЕРЖАНИЕ
1. Назначение программы
2. Условия выполнения программы
3. Выполнение программы
4. Сообщения оператору
1 Назначение программы
Данное приложение демонстрирует принципы взаимодействия и механизмы синхронизации процессов в операционной системе UNIX.
2 Условия выполнения программы
Для выполнения программы необходимы:
1) Наличие на компьютере операционной среды Unix (Linux).
2) Наличие компилятора, который позволит откомпилировать программу, написанную на языке С.
3 Выполнение программы
Для выполнения рассматриваемой программы в операционной среде UNIXнеобходимо:
1) Загрузить операционную систему UNIX.
2) Набрать исходный текст программы, приведённый выше в текстовом редакторе, либо переписать файл kursovik.cс текстом программы с информационного носителя. На старых версияхLinuxдля этого потребуется предварительно смонтировать нужный привод.
3) После этого необходимо скомпилировать на компьютере исходный текст программы. Поученный исполняемый файл запустить на выполнение.