66545

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

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

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

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

Русский

2014-08-22

49 KB

2 чел.

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

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

—————————

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

ОТЧЕТ

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

Приложение

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


 

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

14926. Қазақ гуманитаристикасы және ұлт тарихын зерттеу 76 KB
  Отан тарихы Қазақ гуманитаристикасы және ұлт тарихын зерттеу Г.Жугенбаева Тәуелсіз Қазақстанның тарих ғылымы ұлт тарихын терең жанжақты зерттеп жаңаша пайымдаулар жасауға батыл кірісуде1. Бұл әрекеттердің отандық тарих ғылымының осы уақытқа дейінгі жеті...
14927. Қазақстан - Өзбекстан мәдени байланыстары жөнінде 65.5 KB
  ТЕРЕҢ ТАМЫРЛАР Өзбекстан. Бұл ел күн қызуы мен шуақты жазық алқаптары мен құнарлы шұраттары көп диқаншылық һәм бағбандық кәсіппен айналысатын саудасаттық өріс алған байтақ өлке жасыл мекен. Ұлттық бағыттары мен құрамы да айқын. Қышлақтары тығыз орналасқан. Адамдар...
14928. Қазақстан Қарулы Күштері 372.5 KB
  Қазақстан Қарулы Күштері Кіріспе Қазақстан Қарулы Күштерінің қатарында әскери қызмет атқару әрбір қазақ азаматының аса маңызды әрі құрметті міндетінің бірі болып табылады. Қарулы Күштер қатарында қызмет ету Отанымызды қорғаудағы қасиетті борышыңды өтеу дег
14929. Қазақстан Республикасы, спорт және дене тәрбиесі 44 KB
  Қазақстан Республикасы спорт және дене тәрбиесі Спорт және дене тәрбиесi. Қазақ халқының дене тәрбиесiне оны шынықтыруға ептiлiкке денсаулықты көңiлкүйдi көтеруге арналған осы кездегi дене тәрбиесi мен спорт нышаны ерте замандаақ халық кәдесiне жарағандығын кейбiр
14930. Қазақстан Республикасының халқы 45.5 KB
  Қазақстан Республикасының халқы Қазақстан Республикасында 1989 жылғы халық санағында 161992 мың адам тiркелдi. 1999 жылғы санаққа дейiнгi аралықта Қазақстан халқы 12461 мың адамға кемiген. Мұның басты себебi бұрын қуғынсүргiнге ұшырап Қазақстан жерiне көшiрiлiп қоныстандырылғ
14931. Қазақстанның ғылымы және ғылыми мекемелері 79.5 KB
  Қазақстанның ғылымы және ғылыми мекемелері Ғылым және ғылыми мекемелерi. Қазақстанда ғылыми ойпiкiрдiң тууы ежелгi замандардан бастау алады. Археол. зерттеулер мен жазба деректер бiзге Жетiсуда Орт. және Шығ. Қазақстанда 6 8 9 11 ғлардаақ болған ежелгi қалалар ме
14932. Қазақстанның оқу-ағарту және денсаулық сақтау жүйесі 67.5 KB
  Қазақстанның оқуағарту жүйесі Оқуағарту жүйесi. Қазақстан жерiнде әсiресе оның отырықшы аудандарында орта ғлардың ерте кезеңiндеақ 7 8 ғ. көптеген мектептер мұсылманша бастауыш оқу орны мен медреселер дiни бiлiм беретiн ортадан жоғары оқу орындары жұмыс iсте
14933. Қазақстанның тәуелсіздігі Түркияның қоғамдық пікірінде 77.5 KB
  Қазақстанның тәуелсіздігі Түркияның қоғамдық пікірінде Абдуллах Гүндоғду Жафер Гүлер Кеңес Одағының ыдырау үрдісінің бастамасы деп саналатын Қазақстандағы 1986 жылғы желтоқсан оқиғаларының орын алуы Түркиядағы толқыныстардың тууына негіз болған еді. Түркия үшін ...
14934. Қырғызстандағы Қазақтар 56.5 KB
  Серікқұл Қосақов Баласағұн атындағы Қырғыз ұлттық университетінің конституциялық құқық кафедрасының меңгерушісі профессор Қырғыз Республикасы Конституциясын жазған авторлардың бірі ҚЫРҒЫЗСТАНДАҒЫ ҚАЗАҚТАР Қазақтар әлемнің қайсы бөлігінде өмір с...