Скачиваний:
17
Добавлен:
01.04.2014
Размер:
120.32 Кб
Скачать

Белорусский государственный университет

информатики и радиоэлектроники

Факультет заочного, вечернего и дистанционного обучения

Специальность “Программное обеспечение информационных технологий”

Контрольная работа №1

по дисциплине «Теория вычислительных процессов и структур»

Бондаренко Александра Леонидовича

Группа 701021с

Зачетная книжка 701021с-06

Электронный адрес AlexBond2@tut.by

Минск – 2009

Задание.

Создать дерево процессов/потоков по индивидуальному заданию. Каждый процесс/поток постоянно, через время t, выводит на экран следующую информацию:

номер процесса/потока pid текущее время (мсек).

Время t =((номер процесса/потока по дереву)*200 (мсек).

Порядок создания процессов(потоков) определяется их номером по дереву. На экран вывести pid ppid тек. время в мсек. и номер процесса(потока) по дереву.

- процесс - поток

Решение.

Описание алгоритма: По заданному дереву создаем процессы, каждый из которых меняет значение Id. После чего для заданных процессов устанавливаем значения Id2 которое будет свидетельствовать о создании потоков. Далее каждый процесс вызовет функцию prtmess(), которая в цикле выводит сообщения на экран в зависимости от переданного номера. Созданные потоки так же вызывают функцию prtmess(). После выполнения функции, процесс ожидает пока выполниться его дочерние процессы. Так как родительский процесс создает три дочерних процесса, то для ожидания их выполнения, три раза прописана функцию wait().

Функция prtmess() запускает цикл с ожиданием t и выводит сообщения с номерами процесса/потока, id процесса, id родителя процесса и время в миллисекундах. Количество итераций цикла определяется параметром MAXI, в данном случае он равен 5.

Листинг программы

#include <unistd.h>

#include <stdio.h>

#include <sys/types.h>

#include <pthread.h>

#define MAXI 5

void * prtmess(void *id);

int main(){

pthread_t thread_id;

int id,id2;

pid_t pid;

id = 1;

if (0 == fork ())

{

id = 2;

if (0 == fork ())

{

id = 3;

}

}

if (id == 1)

if (0 == fork ())

{

id = 4;

if (0 == fork ())

{

id = 5;

if (0 == fork ())

{

id = 6;

}

}

}

if (id == 1)

if (0 == fork ())

{

id = 7;

}

id2 = 0;

switch (id) {

case 6: id2 = 8;break;

case 3: id2 = 9;break;

case 7: id2 = 10;

}

if (id2!=0){

if (pthread_create(&thread_id,NULL,&prtmess,&id2))

perror("pthread_create");

}

prtmess(&id);

wait(0);

wait(0);

wait(0);

return 0;

}

void * prtmess(void *id){

struct timeval c_time;

int i;

int id2 = *(int *)id;

for (i = 0; i<MAXI;i++){

gettimeofday(&c_time,NULL);

printf("%2d pid:%5d ppid:%5d :%6d\n",

id2,getpid(),getppid(),c_time.tv_usec);

usleep(200*1000*id2);

}

}

Скриншот работы программы