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

Приложение

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


 

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

18286. ДОДАВАННЯ І ВІДНІМАННЯ ЦІЛИХ НЕВІД’ЄМНИХ ЧИСЕЛ 74 KB
  Лекція 13 ДОДАВАННЯ І ВІДНІМАННЯ ЦІЛИХ НЕВІД’ЄМНИХ ЧИСЕЛ Означення суми цілих невід’ємних чисел через об’єднання множин. Існування і єдність суми. Операція додавання цілих невід’ємних чисел та їх властивості. Формування понять суми і додавання в початкові...
18287. МНОЖЕННЯ І ДІЛЕННЯ ЦІЛИХ НЕВІД’ЄМНИХ ЧИСЕЛ 85 KB
  Лекція 14 МНОЖЕННЯ І ДІЛЕННЯ ЦІЛИХ НЕВІД’ЄМНИХ ЧИСЕЛ Означення добутку цілих невід’ємних чисел через декартів добуток множин. Існування і єдність добутку. Означення добутку цілих невід’ємних чисел через суму. Операція множення цілих невід’ємних чисел та...
18288. АКСІОМИ ПЕАНО 93 KB
  Лекція 15 АКСІОМИ ПЕАНО Поняття про аксіоматичний метод побудови теорії. Аксіоматична побудова множини цілих невід’ємних чисел; неозначувані поняття аксіоми Пеано та деякі наслідки з них. Аксіоматичне означення операції додавання цілих невід’ємних чисел...
18289. ВЛАСТИВОСТІ МНОЖИНИ ЦІЛИХ НЕВІД’ЄМНИХ ЧИСЕЛ 124 KB
  Лекція 16 ВЛАСТИВОСТІ МНОЖИНИ ЦІЛИХ НЕВІД’ЄМНИХ ЧИСЕЛ Ділення з остачею. Теорема про ділення з остачею. Операції ділення з остачею. Формування поняття ділення з остачею в початковій школі. Принцип і метод математичної індукції. б Натуральне число як р...
18290. НАТУРАЛЬНЕ ЧИСЛО ЯК МІРА ВІДРІЗКА 87 KB
  Лекція 17 НАТУРАЛЬНЕ ЧИСЛО ЯК МІРА ВІДРІЗКА Поняття про величини та їх вимірювання. Поняття про відрізок. Відношення дорівнює€ менше€ більше€ на множині відрізків та їх властивості. Поняття про додавання і віднімання над відрізками та їх властивос...
18291. ДЕСЯТКОВА СИСТЕМА ЧИСЛЕННЯ 148 KB
  Лекція 18 ДЕСЯТКОВА СИСТЕМА ЧИСЛЕННЯ Поняття про систему числення. Число і цифра. Непозиційні і позиційні системи числення. Десяткова система числення запис читання і порівняння цілих невід’ємних чисел в ній. Алгоритм додавання чисел в десятковій системі ...
18292. НЕДЕСЯТКОВІ ПОЗИЦІЙНІ СИСТЕМИ ЧИСЛЕННЯ 158 KB
  Лекція 19 НЕДЕСЯТКОВІ ПОЗИЦІЙНІ СИСТЕМИ ЧИСЛЕННЯ Недесяткові позиційні системи числення: запис читання і порівняння чисел в них. Алгоритми додавання і віднімання чисел в недесяткових позиційних системах числення. Таблиці додавання. Алгоритми множення і д...
18293. ВІДНОШЕННЯ ПОДІЛЬНОСТІ 73 KB
  Лекція 20 ВІДНОШЕННЯ ПОДІЛЬНОСТІ Відношення подільності на множині цілих невід’ємних чисел та його властивості. Подільність суми різниці і добутку. Поняття про ознаку подільності. Ознака подільності Паскаля. Ознаки подільності на 2 3 4 5 9 11 25 в десятко...
18294. СПІЛЬНІ КРАТНІ І ДІЛЬНИКИ 101 KB
  Лекція 21 СПІЛЬНІ КРАТНІ І ДІЛЬНИКИ Спільні кратні та найменше спільне кратне кількох натуральних чисел і його властивості. Спільні дільники та найбільший спільний дільник кількох натуральних чисел і його властивості. Взаємно прості та попарно взаємнопрості...