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;
}


 

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

75784. Решение многокритериальных задач. Формирование плана продаж различных видов товаров 2.53 MB
  В курсовой работе нам необходимо рассмотреть задачу о планах продаж компьютеров как на внешнем так и на внутреннем рынке. Для этого нам надо построить ЭММ многокритериальной задачи и решить все задачи всеми методами проходимыми на практике по ММЭ, учитывая различные условия...
75787. Синтез цифрового устройства управления (ЦУУ) в базисах мультиплексоров, логических элементов Шеффера и Пирса 2.33 MB
  Преобразование минимальной ДНФ для реализации в базисе элементов Шеффера с двумя и тремя входами9 Синтез ЦУУ для логической функции 5 переменных на основе мультиплексоров с 4мя информационными входами на первом уровне мультиплексирования и 2мя информационными входами...
75788. Уроки английского языка 3.83 MB
  I was brought up in a small town in the countryside. Growing up in the countryside offered lots of advantages for young people. The only problem was that we often got into trouble as we made up stories that we acted out around town. I can remember one adventure in particular...
75789. Роль ВТО в развитии мировой торговли 364 KB
  Цель работы – рассмотреть отношения ВТО в развитии мировой торговли. Объектом исследования курсовой работы является организация ВТО. Основной задачей курсовой работы является определить важность организации ВТО в развитии мировой торговли.
75790. Органы местного самоуправления в Российской Федерации: основные проблемы законодательного регулирования 56.55 KB
  Целью написания данной курсовой работы является исследование проблем и перспектив развития российского законодательства в области местного самоуправления, а также формулировка предложений по совершенствованию данного направления законодательства.
75791. Расчет электрической части силовых трансформаторов 379.5 KB
  Силовыми трансформаторами называют трансформаторы, служащие для преобразования электрической энергии в сетях энергосистем и электропотребителей. Данные трансформаторы являются определяющими трансформаторами рассматриваемыми для данной специальности, то есть основными...
75792. Электроснабжение механического завода местной промышленности 121.06 KB
  В данном курсовом проекте рассмотрены вопросы электроснабжения механического завода местной промышленности, касающиеся определения расчетных нагрузок цехов завода с учетом их внутреннего освещения и наружного освещения территории комбината, построения картограммы нагрузок...