Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.doc
Скачиваний:
13
Добавлен:
01.05.2014
Размер:
65.02 Кб
Скачать

Министерство образование и науки РФ

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

Дисциплина «Параллельное программирование»

Кафедра МОЭВМ

Лабораторная работа №2 ”Организация вычислений на одном процессорном элементе”

Выполнил:

студент гр. 3351

Фонарева С.

Преподаватель:

Красюк В.И.


Санкт-Петербург

2008

Задание

Написать программу, устанавливающую виртуальные связи между тремя или более процессами на одном процессоре. Организовать приём и передачу данных между процессами.

Описание программы

Программа базируется на примере диалога Harry и Tony, рассмотренного на лекции.

Взаимодействие процессов осуществляется следующим образом:

Текст программы.

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<sys/root.h>

#include<sys/link.h>

#define BUFFER 4096

#define ANSW 1024

#define link_HT 1

int ID;

int Harry (void)

{

LinkCB_t *TonyLink;

char *FName = "Harry";

char answ[ANSW+1];

char *messg[] = {"Harry_MSG1", "Harry_MSG2", "Harry_MSG3", "Harry_MSG4"};

int error, i;

ID = GET_ROOT()->ProcRoot->MyProcID;

TonyLink = MakeLink(ID, link_HT, &error);

if (TonyLink==NULL) {

LogError(EC_ERROR, FName, "\make link Tony error = %d", error);

exit(1);

}

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

printf ("\nHarry->Tony :%s", messg[i]);

SendLink (TonyLink, (byte*)messg[i], strlen(messg[i])+1);

RecvLink (TonyLink, (byte*)answ, ANSW);

printf ("\nHarry<-Tony : %s",answ);

}

return 0;

}

int Tony (void)

{

LinkCB_t *HarryLink;

char *FName = "Tony";

char answ[ANSW+1];

char *messg[] = {"Tony_MSG1", "Tony_MSG2", "Tony_MSG3", "Tony_MSG4"};

int error, i;

ID = GET_ROOT()->ProcRoot->MyProcID;

HarryLink = GetLink(ID, link_HT, &error);

if (HarryLink==NULL) {

LogError(EC_ERROR, FName, "\nGet link Harry error = %d", error);

exit(1);

}

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

RecvLink (HarryLink, (byte*)answ, ANSW);

printf ("\nTony<-Harry : %s \n Tony->Harry :%s",answ, messg[i]);

SendLink (HarryLink, (byte*)messg[i], strlen(messg[i])+1);

}

return 0;

}

int main(void)

{

Thread_t *HarryThread, *TonyThread;

char *FName = "main";

int error;

int result;

HarryThread = StartThread (Harry, BUFFER, &error, 0);

if (HarryThread==NULL){

LogError (EC_ERROR, FName, "\nStarting Harry error = %d", error);

exit(1);

}

TonyThread = StartThread (Tony, BUFFER, &error, 0);

if (TonyThread==NULL){

LogError (EC_ERROR, FName, "Starting Tony error = %d", error);

exit(1);

}

WaitThread (HarryThread, &result);

WaitThread (TonyThread, &result);

exit (0);

}

В программу включен процесс– Max.

Взаимодействие процессов осуществляется следующим образом:

При отправке сообщения и при получении оно выводится на экран

Текст программы.

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<sys/root.h>

#include<sys/link.h>

#define BUFFER 4096

#define ANSW 1024

#define link_HT 1

#define link_TM 2

#define link_MH 3

int ID;

int Harry (void)

{

LinkCB_t *TonyLink,*MaxLink;

char *FName = "Harry";

char answ[ANSW+1];

char *messg[] = {"Harry_MSG1", "Harry_MSG2", "Harry_MSG3", "Harry_MSG4"};

int error, i;

ID = GET_ROOT()->ProcRoot->MyProcID;

TonyLink = MakeLink(ID, link_HT, &error);

if (TonyLink==NULL) {

LogError(EC_ERROR, FName, "\make link Tony error = %d", error);

exit(1);

}

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

printf ("\nHarry->Tony :%s", messg[i]);

SendLink (TonyLink, (byte*)messg[i], strlen(messg[i])+1);

RecvLink (TonyLink, (byte*)answ, ANSW);

printf ("\nHarry<-Tony : %s",answ);

}

MaxLink=GetLink(ID,link_MH,&error);

if(MaxLink==NULL)

{

LogError(EC_ERROR,FName,”can’t get link from Max,error=%d”,error);

exit(1);

}

for(i=2;i<4;i++)

{

RecvLink(MaxLink,answ,ANSW);

printf(“\n Harry<-Max:%s \n Harry->Max:%s”,answ,messg[i]);

SendLink(MaxLink,messg[i],strlen(messg[i])+1);

}

return 0;

}

int Tony (void)

{

LinkCB_t *HarryLink,*MaxLink;

char *FName = "Tony";

char answ[ANSW+1];

char *messg[] = {"Tony_MSG1", "Tony_MSG2", "Tony_MSG3", "Tony_MSG4"};

int error, i;

ID = GET_ROOT()->ProcRoot->MyProcID;

HarryLink = GetLink(ID, link_HT, &error);

if (HarryLink==NULL) {

LogError(EC_ERROR, FName, "\nGet link Harry error = %d", error);

exit(1);

}

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

printf("\nTony_for");

RecvLink (HarryLink, (byte*)answ, ANSW);

printf ("\nTony<-Harry : %s \n Tony->Harry :%s",answ, messg[i]);

SendLink (HarryLink, (byte*)messg[i], strlen(messg[i])+1);

}

MaxLink=MakeLink(ID,link_TM,&error);

if(MaxLink==NULL)

{LogError(EC_ERROR,FName,”can’t make linl to Max,error=%d”,error);

exit(1);

}

for(i=2;i<4;i++)

{

printf(“\nTony->Max: %s”,messg[i]);

SendLink(MaxLink,messg[i],strlen(messg[i])+1);

RecvLink(MaxLink,answ,ANSW);

printf(“\n Tony<-Max: %s”,answ);

}

return 0;

}

int Max (void)

{

LinkCB_t *HarryLink,*TonyLink;

char *FName=”Max”;

int error;

int i;

int result;

char answ[ANSW+1];

char *messg[]={"Max_MSG1", "Max_MSG2", "Max_MSG3", "Max_MSG4"};

ID=GET_ROOT()->ProcRoot->MyProcID;

TonyLink=GetLink(ID,link_TM,&error);

if(TonyLink==NULL)

{LogError(EC_ERROR,FName,”\n can’t get link to Tony, error=%d”,error);

exit(1);

}

for(i=0;i<2;i++)

{

RecvLink(TonyLink,answ,ANSW);

printf(“\n Max<-Tony : %s \n Max->Tony :%s”,answ,messg[i]);

SendLink(TonyLink,messg[i],strlen(messg[i])+1);

}

HarryLink=MakeLink(ID,link_MH,&error);

if(HarryLinl==NULL)

{LogError(EC_ERROR,FName,”\n can’t make link to Harry, error=%d”,error);

exit(1);

}

for(i=2;i<4;i++)

{

printf(“Max->Harry: %s”,messg[i]);

SendLink(HarryLink,messg[i],strlen(messg[i])+1);

RecvLink(HarryLink,answ,ANSW);

printf(“Max<-Harry: %s”,answ);

}

return 0;

}

int main(void)

{

Thread_t *HarryThread, *TonyThread, *MaxThread;

char *FName = "main";

int error;

int result;

HarryThread = StartThread (Harry, BUFFER, &error, 0);

if (HarryThread==NULL){

LogError (EC_ERROR, FName, "\nStarting Harry error = %d", error);

exit(1);

}

TonyThread = StartThread (Tony, BUFFER, &error, 0);

if (TonyThread==NULL){

LogError (EC_ERROR, FName, "Starting Tony error = %d", error);

exit(1);

}

MaxThread = StartThread (Max, BUFFER, &error, 0);

if (MaxThread==NULL){

LogError (EC_ERROR, FName, "Starting Max error = %d", error);

exit(1);

}

WaitThread (HarryThread, &result);

WaitThread (TonyThread, &result);

WaitThread(MaxThread,&result);

exit (0);

}

Результат запуска программы

Harry -> Tony : Harry_MSG1

Tony <- Harry : Harry_MSG1

Tony -> Harry : Tony_MSG1

Harry <- Tony : Tony_MSG1

Harry -> Tony : Harry_MSG2

Tony <-Harry : Harry_MSG2

Tony -> Harry : Tony_MSG2

Harry <- Tony : Tony_MSG2

Tony -> Max : Tony_MSG3

Max<- Tony : Tony_MSG3

Max -> Tony : Max_MSG1

Tony <- Max : Max_MSG1

Tony -> Max: Tony_MSG4

Max <- Tony : Tony_MSG4

Max -> Tony : Max_MSG2

Tony <- Max : Max_MSG2

Max -> Harry : Max_MSG3

Harry <- Max : Max_MSG3

Harry -> Max : Harry_MSG3

Max <- Harry : Harry_MSG3

Max -> Harry : Max_MSG4

Harry <- Max : Max_MSG4

Harry -> Max : Harry_MSG4

John <- Harry : Harry_MSG4

Выводы

В ходе выполнения этой лабораторной работы был разработан синхронный механизм обмена данными между параллельными процессами на одном процессоре посредством создания виртуальных линков. Аналогичным образом можно организовать синхронный обмен данными между параллельными процессами на разных процессорах.

7