66545

Многопоточность. Межпроцессорные взаимодействия

Лабораторная работа

Информатика, кибернетика и программирование

Два дочерних процесса выполняют некоторые циклы работ, передавая после окончания очередного цикла через очереди сообщений родительскому процессу очередные четыре строки некоторого стихотворения, при этом первый процесс передает нечетные четверостишья, второй - четные.

Русский

2014-08-22

49 KB

5 чел.

Санкт-Петербургский государственный политехнический университет

Факультет технической кибернетики

—————————

Кафедра информационной безопасности компьютерных систем

ОТЧЕТ

по лабораторной работе №7

«Многопоточность. Межпроцессорные взаимодействия»

по курсу «Операционные системы»

Студент:

Никитин А. С.

гр. 2088/1

Преподаватель:

Степанова Т. В.

Санкт-Петербург — 2011

1. Формулировка задания

Цель работы — изучение процессов разработки многопоточных приложений для семейств ОС UNIX и Windows, стандартных механизмов взаимодействия процессов.

2. Использованные теоретические сведения

3. Результаты работы

3.1. Выполнение примеров

3.2. Выполнение индивидуального задания

  1.  UNIX.  Два дочерних процесса выполняют некоторые циклы работ, передавая после окончания очередного цикла через очереди сообщений родительскому процессу очередные четыре строки некоторого стихотворения, при этом первый процесс передает нечетные четверостишья, второй - четные. Родительский процесс компонует из передаваемых фрагментов законченное стихотворение и выводит его по завершении работы обоих процессов. Решить задачу с использованием механизмов синхронизации,  чтобы стихотворение получилось корректным.
    #include <unistd.h>
    #
    include <stdio.h>
    #
    include <sys/types.h>
    #
    include <sys/ipc.h>
    #
    include <sys/msg.h>

    typedef struct mesgbuf {
       
    long mtype;
       
    char buff[1024];
    }
    mesg;

    char *data[] = {
    "Гой ты, Русь, моя родная,\
    n\
    Хаты - в ризах образа...\n\
    Не видать конца и края -\n\
    Только синь сосет глаза.\n\n",

    "Как захожий богомолец,\n\
    Я смотрю твои поля.\n\
    А у низеньких околиц\n\
    Звонно чахнут тополя.\n\n",

    "Пахнет яблоком и медом\n\
    По церквам твой кроткий Спас.\n\
    И гудит за корогодом\n\
    На лугах веселый пляс.\n\n",

    "Побегу по мятой стежке\n\
    На приволь зеленых лех,\n\
    Мне навстречу, как сережки,\n\
    Прозвенит девичий смех.\n\n",

    "Если крикнет рать святая:\n\
    \"Кинь ты Русь, живи в раю!\"\
    n\
    Я скажу: \"Не надо рая,\
    n\
    Дайте родину мою\".\
    n"
    };

    void parent_proc(void) { //Функция родительского процесса
       
    mesg message;
       
    key_t key;
       
    int msgid, len;
       
    int done = 0; //Показатель окончания передачи данных процессом
       
    key = ftok("data", 'A'); //Получение ключа
       
    msgid = msgget(key, 0666 | IPC_CREAT); //Создание очереди сообщений
       
    message.mtype = 3L; //Тип сообщения 3 необходим для инициализации
       
    message.buff[0] = 0; //дочерних процессов. Отправляются два таких
       
    msgsnd(msgid, &message, 1, 0);  //сообщения со значениями первого
       
    message.buff[0] = 1;                                //байта 0 и 1
       
    msgsnd(msgid, &message, 1, 0);
       
    for (;;) {
           
    if ((done & 0x1) == 0) { //Если первый процесс ещё передаёт
                                       //данные, то получаем сообщение
               
    len = msgrcv(msgid, &message, sizeof(message), 1L, 0);
               
    if (message.buff[0] == 0) done |= 0x1; //Если это пустая
                    //строка, то устанавливаем флаг завершения передачи
               
    else write(1, message.buff, len); //иначе выводим строку
           }
           
    if ((done & 0x2) == 0) { //Аналогично для второго процесса
               
    len = msgrcv(msgid, &message, sizeof(message), 2L, 0);
               
    if (message.buff[0] == 0) done |= 0x2;
               
    else write(1, message.buff, len);
           }
           
    if (done == 0x3) { //Если оба процесса завершили передачу, то
               
    msgctl(msgid, IPC_RMID, 0);            //завершаем работу
               
    return;
           }
       }
    }

    void child_proc(void) {
       
    mesg message;
       
    key_t key;
       
    int msgid, whoami, str, len;
       
    key = ftok("data", 'A'); //Получение ключа
       
    msgid = msgget(key, 0); //Открытие очереди сообщений
       
    msgrcv(msgid, &message, sizeof(message), 3L, 0); //Получение
                                          //сообщения инициализации
       
    whoami = (int) message.buff[0]; //Номер процесса определяется
                                             //содержанием сообщения
       
    message.mtype = whoami + 1; //Тип сообщений, отправляемых данным
                                                            //процессом
       
    for (str = 0; str < 5; str++) { //Цикл по четверостишиям
           
    if (str % 2 == whoami) { //В зависимости от номера, процесс
                  //будет передавать чётные или нечётные четверостишия
               
    len = sprintf(message.buff, (const char *) data[str]);
               
    msgsnd(msgid, &message, len, 0); //Отправление сообщения
           }
       }
       
    message.buff[0] = 0;
       
    msgsnd(msgid, &message, 1, 0); //Отправление сообщения о завершении
       
    return;
    }

    int main() {
       
    if (!fork()) {
           
    child_proc();
           
    return 0;
       }
       
    if (!fork()) {
           
    child_proc();
           
    return 0;
       }
       
    parent_proc();
       
    return 0;
    }

3.3. Ответы на контрольные вопросы

  1.  Опишите основные операции над нитями в UNIX.
    Создание нити, уничтожение текущей нити, уничтожение произвольной нити, ожидание завершения нити.
  2.  Как организовать критическую секцию программы при помощи функций работы с семафорами потоков в UNIX?
    Перед входом в критическую секцию необходимо осуществить вызов
    sem_wait(), с целью захвата ресурса – оповещения других потоков о входе в критическую секцию. После выходя необходимо освободить ресурс, осуществив вызов sem_post().
  3.  Как организовать критическую секцию в Windows?
    Способ аналогичен приведённому выше, но следует использовать вызовы
    EnterCriticalSection() и LeaveCriticalSection()

4. Выводы

Операционные системы Windows и UNIX обеспечивают достаточный набор механизмов, использующихся при взаимодействии потоков и процессов.

Приложение

Исходные тексты программ


 

А также другие работы, которые могут Вас заинтересовать

25449. Психолого-ориентированные модели 18.08 KB
  Получили распространение в связи с тем что ее современная стратегия ориентирует соц.работников на то чтобы помочь клиентам оптимизировать собственные усилия по изменению ситуации возникшей на личностном и соц. Основные понятия психодинамической модели опирающиеся на психоанализ вошли в ранг категорий соц. Выполняет функцию универсальной технологии применяемой ко всем сферам соц.
25450. Надзор и контроль за соблюдением законодательства об охране труда 148.5 KB
  Контроль за состоянием охраны труда и его виды. Органы государственного надзора за охраной труда. Компетенция Госгорпромнадзора в сфере надзора и контроля за соблюдением законодательства об охране труда. Права и ответственность должностных лиц специально уполномоченного центрального органа исполнительной власти по надзору за охраной труда.
25451. Социальные перспективы и вариативность моделей социальной работы 19.29 KB
  Социальные перспективы и вариативность моделей социальной работы Основные модели теоретического обоснования практики соц.работы отражают не только результаты научных поисков ученых разных поколений но и ее эволюцию изменения в самом содержании и формах соц. Каждая модель содержит некоторые теоретические положения связь со смежными науками о человеке и обществе естественными социокультурными основами жизни а так же предполагает вполне определенное содержание соц. соц.
25452. ОРГАНИЗАЦИЯ ОХРАНЫ ТРУДА НА ПРЕДПРИЯТИИ 134 KB
  Обязанности работника и работодателя по охране труда. Финансирование охраны труда. Организация проведения медицинских осмотров. Служба охраны труда: основные задачи, компетенция. Комиссия по вопросам охраны труда предприятия: порядок создания, обязанности и права комиссии.
25453. Комплексно-ориентированные модели 18.17 KB
   Ролевая теория основа психологическое знание компоненты социологического знания. Соц.роль это поведение которое от человека ожидают люди при выполнении им соц. Ролевую игру соц.
25454. Применение теории систем в практике социальной работы 11.83 KB
  применение теории систем в практике социальной работы Теория систем и системные идеи в социальной работе восходят к общей теории социальных систем Р. В первоначальном своем варианте эта теория как известно была разработана на биологическом материале и доказывала что все организмы являются системами составленными из подсистем а сами они в свою очередь есть часть сверхсистем. В соответствии с основными положениями теории систем социальная система представляет собой не нечто целое а определенный набор абстракций из конкретных форм...
25455. Государственное управление охраной труда 104.5 KB
  Система управления охраной труда. Функции, задачи управления охраной труда. Основные принципы государственной политики в области охраны труда. Система органов государственного управления охраной труда. Полномочия КМУ в области охраны труда.
25457. Теория социальной работы как наука. Механизмы взаимодействия теории и практики социальной работы 15.18 KB
  Теория социальной работы как наука. Механизмы взаимодействия теории и практики социальной работы Теоретическое обоснование соц. Вопервых определяется место соц.работы как науки среди таких дисциплин как соц.