Лабораторная работа 2
.docМинистерство образование и науки РФ
Санкт-Петербургский государственный электротехнический университет
Дисциплина «Параллельное программирование»
Кафедра МОЭВМ
Лабораторная работа №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
Выводы
В ходе выполнения этой лабораторной работы был разработан синхронный механизм обмена данными между параллельными процессами на одном процессоре посредством создания виртуальных линков. Аналогичным образом можно организовать синхронный обмен данными между параллельными процессами на разных процессорах.