8105

Синхронизация процессов при помощи семафоров

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

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

Синхронизация процессов при помощи семафоров Цель работы: получить представление о синхронизации процессов в ОС UNIX при помощи флагов в разделяемой памяти и процессных семафоров. Иcпользуемые средства: ОС Linux, графическая оболочка KDE, среда разр...

Русский

2013-02-03

48 KB

5 чел.

Синхронизация процессов при помощи семафоров

Цель работы: получить представление о синхронизации процессов в ОС UNIX при помощи флагов в разделяемой памяти и процессных семафоров.

Иcпользуемые средства: ОС Linux, графическая оболочка KDE, среда разработки Anjuta, терминал.

1. Создать два процесса: приемник и передатчик. Передатчик увеличивает на единицу переменную целого типа в разделяемой памяти, а приемник выводит ее значение на экран. Для синхронизации использовать переменные в разделяемой памяти. Задать 100 повторений цикла обмена.

Передатчик:

#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
#define mem 0xABCD

int* c;
int dmem;
char* pmem;
int* f_t;
int* f_r;
int* end;
int main()
{
 dmem=shmget(mem,getpagesize(),IPC_CREAT|S_IRUSR|S_IWUSR);
 pmem=(
char*)shmat(dmem,0,0);
    c=(
int*)pmem;
  f_t=(
int*)(pmem+sizeof(int));
  f_r=(
int*)(pmem+sizeof(int)+sizeof(int));
  end=(
int*)(pmem+sizeof(int)+sizeof(int)+sizeof(int));
 printf(
"Go-o-o-o !!!\n\t");

 
while(!*end){
   *f_t=
1;               
   
while(!*f_r);         
   (*c)++;               
   printf(
"%d\n\t",*c);  
   *f_t=
0;               
   
while(*f_r);          
 }
 
if(!shmdt(pmem)) printf("MEMORY CLOSE ALL RIGHT\n");
   
else printf("MEMORY ERROR!!!\n");
 
return 0;
}

Приемник:

#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
#define mem 0xABCD

int* c;
int dmem;
char* pmem;
int* f_t;
int* f_r;
int* end;
int main()
{
 dmem=shmget(mem,getpagesize(),IPC_CREAT|S_IRUSR|S_IWUSR);
 pmem=(
char*)shmat(dmem,0,0);
    c=(
int*)pmem;
  f_t=(
int*)(pmem+sizeof(int));
  f_r=(
int*)(pmem+sizeof(int)+sizeof(int));
  end=(
int*)(pmem+sizeof(int)+sizeof(int)+sizeof(int));
 *c=
0;*f_t=0;*f_r=0;*end=0;
 printf(
"Priemnic on start\n\t");
 
while(*c<20)
   {
   
while(!*f_t);             
   *f_r=
1;                       
   
while(*f_t);                  
   printf(
"%d\n\t",*c);          
   *f_r=
0;                       
   }
 *end=
1;
 
return 0;
}

2. Выполнить обмен данными между процессами как в пункте 1, но для синхронизации использовать процессный семафор.

Передатчик:

#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sem.h>
#define mem 0xABCD
#define sem 0x1234

int* c;
int dmem;
char* pmem;
int* end;
int idsem;
union semun {
 
int val;
 
struct semid_ds *buf;
 
unsigned short *array;
 
struct seminfo *__buf;
} semini;
struct sembuf smb;
int main()
{
 idsem=semget(sem,
1,IPC_CREAT|S_IRUSR|S_IWUSR);
 semini.val=
0;
 smb.sem_num=
0;
 semctl(idsem,
0,SETVAL,semini);
 dmem=shmget(mem,getpagesize(),IPC_CREAT|S_IRUSR|S_IWUSR);
 pmem=(
char*)shmat(dmem,0,0);
    c=(
int*)pmem;
  end=(
int*)(pmem+sizeof(int));
 printf(
"Go-o-o-o !!!\n");
 
while(!*end){
   smb.sem_op=
1;
   semop(idsem,&smb,
1);
   smb.sem_op=
0;
   semop(idsem,&smb,
1);
   (*c)++; printf(
"%d\n",*c);
   smb.sem_op=
1;
   semop(idsem,&smb,
1);
   smb.sem_op=
0;
   semop(idsem,&smb,
1);
 }
 
if(!shmdt(pmem)) printf("MEMORY CLOSE ALL RIGHT\n");
   
else printf("MEMORY ERROR!!!\n");
 semctl(idsem,
0,IPC_RMID,semini);
 
return 0;
}

Приемник:

#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sem.h>
#define mem 0xABCD
#define sem 0x1234

int* c;
int dmem;
char* pmem;
int* end;
int idsem;
union semun {
 
int val;
 
struct semid_ds *buf;
 
unsigned short *array;
 
struct seminfo *__buf;
} semini;
struct sembuf smb;

int main()
{
 
idsem=semget(sem,1,IPC_CREAT|S_IRUSR|S_IWUSR);
 
semini.val=0;
 
smb.sem_num=0;
 
semctl(idsem,0,SETVAL,semini);
 
dmem=shmget(mem,getpagesize(),IPC_CREAT|S_IRUSR|S_IWUSR);
 
pmem=(char*)shmat(dmem,0,0);
    
c=(int*)pmem;
  
end=(int*)(pmem+sizeof(int));
 *
c=0;*end=0;
 
printf("Priemnic on start\n\t");
 
while(*c<1000)
   {
     
smb.sem_op=-1;
     
semop(idsem,&smb,1);
     
smb.sem_op=-1;
     
semop(idsem,&smb,1);
     
printf("%d\n",*c);
   }
 *
end=1;
 
return 0;
}

3. Создать 3 процесса: диспетчер, регулятор и модель и обеспечить их синхронизацию при помощи процессных семафоров таким образом, чтобы на каждые 5 шагов модели приходился один шаг регулятора. Модель на каждом шаге увеличивает на единицу переменную целого типа в разделяемой памяти, а регулятор выводит значение этой переменной на экран.

 

Диспетчер:

#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sem.h>
#define mem 0xAAAA
#define sem 0x4567

int* c;
int* ch;
int dmem;
char* pmem;
int* end;
int idsem;
union semun {
 
int val;
 
struct semid_ds *buf;
 
unsigned short *array;
 
struct seminfo *__buf;
} semini;
struct sembuf smb;

int main()
{
 idsem=semget(sem,
3,IPC_CREAT|S_IRUSR|S_IWUSR);
 semini.val=
0;
 smb.sem_num=
0;
 semctl(idsem,
0,SETVAL,semini);
 smb.sem_num=
1;
 semctl(idsem,
1,SETVAL,semini);
 smb.sem_num=
2;
 semctl(idsem,
2,SETVAL,semini);

 dmem=shmget(mem,getpagesize(),IPC_CREAT|S_IRUSR|S_IWUSR);
 pmem=(
char*)shmat(dmem,0,0);
    c=(
int*)pmem;
  end=(
int*)(pmem+sizeof(int));
   ch=(
int*)(pmem+sizeof(int)+sizeof(int));

 printf(
"Dispetcher on start\n\n");

 smb.sem_num=
0;
 smb.sem_op=
2;
 semop(idsem,&smb,
1);

 
while(*c<500)
   {
   smb.sem_num=
1;
   smb.sem_op=
5;
   semop(idsem,&smb,
1);
   smb.sem_op=
0;
   semop(idsem,&smb,
1);


   smb.sem_num=
2;
   smb.sem_op=
1;
   semop(idsem,&smb,
1);
   smb.sem_op=
0;
   semop(idsem,&smb,
1);

   fprintf(stderr,
"\t| %d\t| %d\t|\n",*c,*ch);
   }
 *end=
1;
 printf(
"\t|_______|_______|\n\n");

 
if(!shmdt(pmem)) printf("MEMORY CLOSE ALL RIGHT\n");
   
else printf("MEMORY ERROR!!!\n");
 
if(!semctl(idsem,0,IPC_RMID,semini)) printf("SEMAFORS CLOSE ALL RIGHT\n");
   
else printf("SEMAFORS ERROR!!!\n");
 
return 0;
}

Передатчик:

#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sem.h>
#define mem 0xAAAA
#define sem 0x4567

int* c;
int* ch;
int dmem;
char* pmem;
int* end;
int idsem;
union semun {
 
int val;
 
struct semid_ds *buf;
 
unsigned short *array;
 
struct seminfo *__buf;
} semini;
struct sembuf smb;

int main()
{
 idsem=semget(sem,
3,IPC_CREAT|S_IRUSR|S_IWUSR);
 semini.val=
0;
 smb.sem_num=
1;
 semctl(idsem,
1,SETVAL,semini);

 dmem=shmget(mem,getpagesize(),IPC_CREAT|S_IRUSR|S_IWUSR);
 pmem=(
char*)shmat(dmem,0,0);
    c=(
int*)pmem;
  end=(
int*)(pmem+sizeof(int));
   ch=(
int*)(pmem+sizeof(int)+sizeof(int));

 printf(
"Peredatchic on start\n\n");

 smb.sem_num=
0;
 smb.sem_op=-
1;
 semop(idsem,&smb,
1);


 
while(!*end)
   {
   smb.sem_num=
1;
   smb.sem_op=-
1;
   semop(idsem,&smb,
1);
   (*c)++;
   printf(
"\t| %d\t|\n",*c);
   }
 
return 0;
}

Приемник:

#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sem.h>
#define mem 0xAAAA
#define sem 0x4567

int* c;
int* ch;
int dmem;
char* pmem;
int* end;
int idsem;
union semun {
 
int val;
 
struct semid_ds *buf;
 
unsigned short *array;
 
struct seminfo *__buf;
} semini;
struct sembuf smb;
int main()
{
 idsem=semget(sem,
3,IPC_CREAT|S_IRUSR|S_IWUSR);
 semini.val=
0;
 smb.sem_num=
2;
 semctl(idsem,
2,SETVAL,semini);

 dmem=shmget(mem,getpagesize(),IPC_CREAT|S_IRUSR|S_IWUSR);
 pmem=(
char*)shmat(dmem,0,0);
    c=(
int*)pmem;
  end=(
int*)(pmem+sizeof(int));
   ch=(
int*)(pmem+sizeof(int)+sizeof(int));
 *c=
0;*end=0;*ch=0;

 printf(
"Priemnic on start\n\n");
 smb.sem_num=
0;
 smb.sem_op=-
1;
 semop(idsem,&smb,
1);

 
while(!*end){
   smb.sem_num=
2;
   smb.sem_op=-
1;
   semop(idsem,&smb,
1);
   (*ch)++;
   fprintf(stderr,
"\t| %d\t|\n",*ch);
 }
 *end=
1;
 
return 0;
}


 

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

60230. Поспішайте робити добро! 47.5 KB
  Мета: формувати уявлення дітей про моральні якості людини – доброту, доброзичливість; проектувати стратегії своєї поведінки з урахуванням інтересів та потреб інших; удосконалювати уміння аналізувати власні вчинки...
60231. Милосердя і доброта - людства два крила 517.5 KB
  Навчальна:дати визначення поняттю «добро». На основі християнської та загальнолюдської моралі формувати в учнів риси людяності допомогти тим, хто в біді; наголосити на важливості гармонії виховання у сімї та школі.
60233. Інтелектуальний турнір «Ігри ерудитів» 175 KB
  МЕТА: розвивати логічне мислення, кмітливість вміння та навички розмірковувати, робити висновки; розвивати інтерес до математики, фізики та інформатики через гру; виховувати свідоме відношення до набування знань, які допомагають перемагати, бути першим.
60234. Харчова промисловість України. Шоколад. Ліки чи задоволення? 140 KB
  Щорічне споживання шоколаду в різних країнах світу Додаток №8 Гра Найбільші виробники шоколаду Вступ Урок в сучасних умовах повинен носити творчий характер. Ліки чи задоволення...
60235. Хлеб – всему голова! 769.5 KB
  Цель: расширить знания детей о выращивании и изготовлении хлеба; развивать наблюдательность и познавательный интерес; воспитывать уважение к труду хлеборобов и бережное отношение к хлебу.
60236. Виховний проект «Як баба Катря хліб пече» 99.5 KB
  У чому полягає задум Для чого це потрібно Дізнатися якомога більше про дбайливе ставлення українців до хліба Щоб учні знали скільки праці покладено щоб кожного дня був на столі окраєць хліба.
60237. Будуйте храм в своїй душі 100.5 KB
  Мета: продовжувати знайомити із людськими чеснотами; довести до свідомості дітей що добро й милосердя чиняться безкорисливо; розвивати почуття доброти чуйності милосердя; викликати бажання творити добро бути милосердними й уникати злих вчинків...
60238. Перші кроки до світу інформатики 463.5 KB
  Компютерна підтримка навчальних предметів; подальший розвиток інтересу до курсу формування мовленевої інформаційної соціальної компететностей розвиток логічного мислення уваги памяті фантазії кмітливості та творчих здібностей виховання...