66545

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

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

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

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

Русский

2014-08-22

49 KB

4 чел.

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

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

—————————

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

ОТЧЕТ

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

Приложение

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


 

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

45327. Гражданство РФ - принципы, основания его приобретения и прекращения 22.21 KB
  Основы конституционного строя детальная же регламентация этого конституционно-правового института закреплена в Федеральном законе О гражданстве Российской Федерации. Конституция РФ и Закон о гражданстве закрепляют следующие принципы гражданства Российской Федерации: Единство гражданства. В соответствии с этим принципом республики субъекты РФ не могут устанавливать собственное гражданство предусматривающее изъятия из общего единого статуса гражданина Российской Федерации; гражданин республики одновременно является...
45328. Референдум – понятие, виды правовое регулирование 25.75 KB
  Форма прямого волеизъявления граждан РФ по наиболее важным вопросам государственного и местного значения в целях принятия решений осуществляемого посредством голосования граждан РФ обладающих правом на участие в референдуме. Виды референдума в зависимости от территории: 1 всероссийский референдум он проводится по вопросам общефедерального значения на основании решения Президента РФ; 2 референдум субъекта РФ он проводится по вопросам ведения соответствующего субъекта РФ или совместного ведения РФ и субъектов РФ если указанные вопросы не...
45329. Функции Президента Российской Федерации 21 KB
  Назначение с согласия Государственной Думы Председателя Правительства РФ других членов Правительства РФ направление его политики и принятие решения об отставке Правительства РФ; 2 представление Государственной Думе кандидатуры на должность Председателя Центрального банка РФ постановление перед ней вопроса об освобождении от должности Председателя Центрального банка РФ; 3 представление Совету Федерации кандидатур для назначения на должности судей Конституционного Суда РФ...
45330. Порядок избрания и освобождения от должности Президента Российской Федерации 23.1 KB
  Порядок избрания и освобождения от должности Президента Российской Федерации. Президент Российской Федерации избирается сроком на шесть лет гражданами Российской Федерации на основе всеобщего равного и прямого избирательного права при тайном голосовании. Президентом Российской Федерации может быть избран гражданин Российской Федерации не моложе 35 лет постоянно проживающий в Российской Федерации не менее 10 лет Одно и то же лицо не может занимать должность Президента Российской Федерации более двух сроков подряд. Порядок выборов Президента...
45331. ИНСТИТУТ УПОЛНОМОЧЕННОГО ПО ПРАВАМ ЧЕЛОВЕКА В РФ 22.83 KB
  ИНСТИТУТ УПОЛНОМОЧЕННОГО ПО ПРАВАМ ЧЕЛОВЕКА В РФ В РФ защитой прав и свобод граждан их соблюдения государственными органами власти органами местного самоуправления и должностными лицами занимается Уполномоченный по правам человека в РФ. В пределах своей компетенции Уполномоченный по правам человека в РФ: 1 рассматривает жалобы граждан РФ и находящихся на территории РФ иностранных граждан и лиц без гражданства; 2 рассматривает жалобы на решения или действия государственных органов органов местного самоуправления должностных лиц...
45332. Государственная Дума Российской Федерации - палата Федерального Собрания Российской Федерации 26.28 KB
  Полномочия местного самоуправления это закрепленные федеральным законодательством а также нормативными правовыми актами субъектов Российской Федерации и правовыми актами органов местного самоуправления за населением соответствующих территорий выборными и иными органами местного самоуправления права и обязанности связанные с реализацией задач и функций местного самоуправления на соответствующей территории. Полномочия местного самоуправления реализуются как непосредственно населением городских и сельских поселений других территорий путем...
45333. Конституционно-правовой статус члена Совета Федерации и депутата Государственной Думы 25.69 KB
  Конституционно-правовой статус члена Совета Федерации и депутата Государственной Думы Конституционно-правовой статус члена Совета Федерации и депутата Государственной Думы определяется Конституцией РФ ст. О статусе члена Совета Федерации и депутата Государственной Думы Федерального Собрания Российской Федерации. Депутатом Государственной Думы является избранный представитель народа уполномоченный осуществлять в Государственной Думе законодательные и иные полномочия предусмотренные Конституцией РФ и федеральным законом. Срок полномочий...
45334. Система законодательных (представительных) и исполнительных органов государственной власти субъектов Российской Федерации 20.8 KB
  Система законодательных представительных и исполнительных органов государственной власти субъектов Российской Федерации устанавливается ими самостоятельно в соответствии с основами конституционного строя Российской Федерации и ФЗ от 06. Об общих принципах организации законодательных представительных и исполнительных органов государственной власти субъектов Российской Федерации.Образование формирование деятельность законодательных представительных и исполнительных органов государственной власти субъектов Российской Федерации их...
45335. Законодательный процесс в РФ 25.93 KB
  В составе городского поселения также могут находиться сельские населенные пункты не имеющие статуса сельских поселений в которых местное самоуправление осуществляется населением непосредственно и или через выборные и иные органы местного самоуправления. Городской округ городское поселение которое не входит в состав муниципального района и органы местного самоуправления которого осуществляют полномочия по решению установленных законом вопросов местного значения поселения и вопросов местного значения муниципального района а также могут...