Автор работы: Пользователь скрыл имя, 17 Января 2012 в 21:30, лабораторная работа
Реализовать последовательно-параллельный запуск нитей в операционной системе Linux (см. задание I) с использованием средств синхронизации. В графе выделяются три группы нитей. Часть нитей никак не синхронизирована. Часть синхронизирована мьютексом (захватывает мьютекс на время выполнения). Часть – семафорами (передает управление другой нити после каждой итерации).
СПб ГУАП
Отчет по лабораторной работе №2
По «Операционным
системам»
Санкт-Петербург 2012 г.
Задание
Реализовать
последовательно-параллельный запуск
нитей в операционной системе Linux (см. задание
I) с использованием средств синхронизации.
В графе выделяются три группы нитей. Часть
нитей никак не синхронизирована. Часть
синхронизирована мьютексом (захватывает
мьютекс на время выполнения). Часть –
семафорами (передает управление другой
нити после каждой итерации).
Граф
выполнения нитей.
a, f = 4; k,
n, e = 5; i = 9; b = 6; m = 10; c = 11; d = 15; g = 20
/*
II. Реализовать последовательно-параллельный запуск нитей в операционной
системе Linux (см. задание I) с использованием средств синхронизации.
В графе выделяются три группы нитей. Часть нитей никак не синхронизирована.
Часть синхронизирована мьютексом (захватывает мьютекс на время выполнения).
Часть - семафорами (передает управление другой нити после каждой итерации).
*/
#include <stddef.h>
#include <stdio.h>
#include <unistd.h>
#include "pthread.h"
#include "semaphore.h"
// ------------------------------
// Глобальные переменные
int retcode;// возвращаемое значение
sem_t sm_g, sm_b, sm_c, sm_d; // семафоры
pthread_mutex_t mt; // мьютекс
// ------------------------------
// функция, которая выполняется нитью
// не синронизированная нить
void * process1 (void * arg)
{
int i;
char bukva; // имя нити
int lifetime; // кол-во символов, выводимых на экран
bukva = *(char *)arg;
// Установить длинну нити, т.е. время выполнения нити.
// Чем больше кол-во выводимых символов, тем дольше выполняется нить.
// Кол-во итераций = длинна нити на графе * 100.
if (
(bukva == 'a')
||(bukva == 'f')
)
{
lifetime = 400; // для a, f длина = 4
}
if (
(bukva == 'k')
||(bukva == 'n')
||(bukva == 'e')
)
{
lifetime = 500; // для k, n, e длина = 5
}
if (bukva == 'i')
{
lifetime = 900; // для i длина = 9
}
if (bukva == 'b')
{
lifetime = 600; // для b длина = 6
}
if (bukva == 'm')
{
lifetime = 1000; // для m длина = 10
}
if (bukva == 'c')
{
lifetime = 1100; // для c длина = 11
}
if (bukva == 'd')
{
lifetime = 1500; // для d длина = 15
}
if (bukva == 'g')
{
lifetime = 2000; // для g длина = 20
}
// вывод на экран имени нити
printf("Starting process %s\n", (char *) arg);
// цикл от 0 до lifetime
for (i = 0; i < lifetime; i++)
{
// вывод на экран буквы
printf((char *) arg);
}
// выход из нити
return NULL;
}
// ------------------------------
// нить, синхронизированная мьютексом
void * process2 (void * arg)
{
int i;
char bukva; // имя нити
int lifetime; // кол-во символов, выводимых на экран
bukva = *(char *)arg;
// Установить длинну нити, т.е. время выполнения нити.
// Чем больше кол-во выводимых символов, тем дольше выполняется нить.
if (
(bukva == 'a')
||(bukva == 'f')
)
{
lifetime = 400; // для a, f длина = 4
}
if (
(bukva == 'k')
||(bukva == 'n')
||(bukva == 'e')
)
{
lifetime = 500; // для k, n, e длина = 5
}
if (bukva == 'i')
{
lifetime = 900; // для i длина = 9
}
if (bukva == 'b')
{
lifetime = 600; // для b длина = 6
}
if (bukva == 'm')
{
lifetime = 1000; // для m длина = 10
}
if (bukva == 'c')
{
lifetime = 1100; // для c длина = 11
}
if (bukva == 'd')
{
lifetime = 1500; // для d длина = 15
}
if (bukva == 'g')
{
lifetime = 2000; // для g длина = 20
}
printf("Starting process %s\n", (char *) arg);
// ждем освобождения мьютекса
pthread_mutex_lock (&mt);
// нить захватила мьютекс
for (i = 0; i < lifetime; i++)
{
printf((char *) arg);
}
//освободить мьютекс
pthread_mutex_unlock (&mt);
// выход из нити
return NULL;
}
// ------------------------------
// нить, синхронизированная семафором
void * process3 (void * arg)
{
int i;
char bukva; // имя нити
int lifetime1; // кол-во символов, выводимых на экран
int
lifetime2;
bukva = *(char *)arg;
// Первые 600 итераций нити синхронизуются семафорами.
lifetime1 = 600; // т.к длинна нити b = 6. Нить b самая короткая.
// Установить длинну нити, т.е. время выполнения нити.
// Чем больше кол-во выводимых символов, тем дольше выполняется нить.
if (bukva == 'g')
{
lifetime2 = 2000 - lifetime1;
}
if (bukva == 'b')
{
lifetime2 = 600 - lifetime1;
}
if (bukva == 'c')
{
lifetime2 = 1100 - lifetime1;
}
if (bukva == 'd')
{
lifetime2 = 1500 - lifetime1;
}
printf("Starting process %s\n", (char *) arg);
for (i = 0; i < lifetime1; i++)
{
if ((char *) arg == "g")
{
// для нити "g"
// ждем, пока значение счетчика семафора равно нулю
// после того, как значение стало равно 1, счетчик опять сбрасывается в ноль
retcode = sem_wait (&sm_g);
printf((char *) arg);
// увеличивает на 1 значение счетчика семафора b
retcode = sem_post(&sm_b);
}
if ((char *) arg == "b")
{
// для нити "b"
// ждем, пока значение счетчика семафора равно нулю
// после того, как значение стало равно 1, счетчик опять сбрасывается в ноль
retcode = sem_wait (&sm_b);
printf((char *) arg);
// увеличивает на 1 значение счетчика семафора c
retcode = sem_post(&sm_c);
}
if ((char *) arg == "c")
{
// ждем, пока значение счетчика семафора равно нулю
// после того, как значение стало равно 1, счетчик опять сбрасывается в ноль
retcode = sem_wait (&sm_c);
printf((char *) arg);
// увеличивает на 1 значение счетчика семафора d
retcode = sem_post(&sm_d);
}
if ((char *) arg == "d")
{
// ждем, пока значение счетчика семафора равно нулю
// после того, как значение стало равно 1, счетчик опять сбрасывается в ноль
retcode = sem_wait (&sm_d);
printf((char *) arg);
// увеличивает на 1 значение счетчика семафора g
retcode = sem_post(&sm_g);
}
}
// вывод на экран
for (i = 0; i < lifetime2; i++)
{
printf((char *) arg);
}
return NULL;
}
// ------------------------------
int main(void)
{
// запускаем нити согласно графу
// дескриптор для каждой нити
Информация о работе Последовательно-параллельный запуск нитей в операционной системе Linux