Последовательно-параллельный запуск нитей в операционной системе Linux

Автор работы: Пользователь скрыл имя, 17 Января 2012 в 21:30, лабораторная работа

Краткое описание

Реализовать последовательно-параллельный запуск нитей в операционной системе Linux (см. задание I) с использованием средств синхронизации. В графе выделяются три группы нитей. Часть нитей никак не синхронизирована. Часть синхронизирована мьютексом (захватывает мьютекс на время выполнения). Часть – семафорами (передает управление другой нити после каждой итерации).

Вложенные файлы: 1 файл

отчет_лб_2.doc

— 61.50 Кб (Скачать файл)

СПб ГУАП                                                                                          10 ф-т (заочное отделение) 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Отчет по лабораторной работе №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