66545

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

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

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

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

Русский

2014-08-22

49 KB

1 чел.

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

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

—————————

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

ОТЧЕТ

по лабораторной работе №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 обеспечивают достаточный набор механизмов, использующихся при взаимодействии потоков и процессов.

Приложение

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


 

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

28989. Способы связи ПК и соответствующие виды компьютерных сетей. Виды взаимодействия (доступа) ПК в сети 23 KB
  Виды взаимодействия доступа ПК в сети. образуются распределенные корпоративные компьютерные сети соединённые каналами связи нескольких локальных сетей доступ из вне строго регламентирован; глобальные сети общего доступа совокупность ЛВС и индивидуальных ПК; специальные сети пример: сеть банкоматов сеть кассовых аппаратов сеть телеконференций. Сетевой ресурс – ресурс одного компьютера доступный с другим ПК в сети информация программы сетевое оборудование. Сервер – ПК сети который представляющий сетевой ресурс.
28990. Локальные компьютерные сети: типы, классификации, состав 30 KB
  Для создания сети компьютеры должны быть связаны линейными связями: витая пара оптиковолоконный кабель беспроводные радиоканалы WIFI. Применяемые технические средства и топологии сети определяет скорость передачи информации в такой сети. Работу сети организует системный администратор который назначает пользователю сетевой ресурс права доступа к нему а так же имя и пароль пользователю.
28991. Звезда шина 63.5 KB
  Топология – физическое расположение компьютеров узлом коммутации и линий связи в сети а также их организационное взаимодействие. Все ПК подключены к единому узлу коммутации.
28992. Кольцо 44.5 KB
  Кольцо. ПК подключены к повторителям кот соединены шиной данных в однонаправленное кольцо. Обмен: Кольцо бывает тактированное и маркерное.
28993. Глобальная сеть Интернет 84.5 KB
  Магистральный канал – основная часть сети Интернет является совокупностью марштрутизаторов и высокоскоростных каналов связи оптоволокно или спутниковый радиоканал 2. Серверы сети узлы сети содержащие информационные ресурсы сети. программ агентов извлекающих информацию и передающих ей в сети.
28994. Адресация в сети Интернет. Протоколы сети Интернет 32.5 KB
  Протоколы сети Интернет. Основные протоколы: Сетевой протокол – соглашение о способах и методах передачи данных между компьютерами. TCP IP набор сетевых протоколов разных уровней модели сетевого взаимодействия DOD используемых в сетях. Протоколы работают друг с другом в стеке.
28995. Автоматизированное рабочее место (АРМ): понятие, требование к АРМ, классификация 27 KB
  АРМ это совокупность программнотехнических и организационнотехнических средств индивидуального и коллективного использование объединенных для выполнения определенных функций и задач работника в конкретной предметной области. Основные требования АРМ: 1. Максимальная ориентация на конечного пользователя достигаемая созданием инструментальных средств адаптации АРМ к уровню подготовки пользователя возможностей его обучения и самообучения.
28996. АРМ: назначение и виды обеспечения 26.5 KB
  АРМ это совокупность программнотехнических и организационнотехнических средств индивидуального и коллективного использование объединенных для выполнения определенных функций и задач работника в конкретной предметной области. Виды обеспечения: информационное обеспечение АРМ ориентируется на конкретную привычную для пользователя предметную область. технологическое обеспечение АРМ должно гарантировать высокую надежность технических средств организацию удобных для пользователя режимов работы способность обработать в заданное время...
28997. Типовая структура и принцип работы поисковых систем ( на примере поисковых машин Интернет) 33 KB
  Под поисковой системой обычно подразумевается сайт на котором размещен интерфейс системы. Программной частью поисковой системы является поисковая машина – это комплекс программ обеспечивающий функциональность поисковой системы и обычно это является коммерческой тайной компанииразработчика поисковой системы.