Поиск

Полнотекстовый поиск:
Где искать:
везде
только в названии
только в тексте
Выводить:
описание
слова в тексте
только заголовок

Рекомендуем ознакомиться

Информатика, программирование->Лекция
Таблицю можна перейменовувати скільки завгодно разів, це ніяк не відбивається на стані зберігаються в ній даних. Зрозуміло, що в деяких ситуаціях пере...полностью>>
Информатика, программирование->Лекция
Запит являє собою команду, написану мовою SQL, яка вибирає дані з таблиць. Якщо запит виготовляється візуальним способом, то інтерпретатор складає йог...полностью>>
Информатика, программирование->Лекция
DISTINCT [ON (вираз [, ...])] – поле або вираз, значення якого повинні входити в підсумковий набір не більш одного разу. Ключове слово DISTINCT означа...полностью>>
Информатика, программирование->Лабораторная работа
Динамика погоды 1. . 001 . . 001 3. . 001 4. . 001 5. . 001 . . 001 7. . 001 8. . 001 9. . 001 10. . 001 11. . 001 1 . . 001 13. . 001 14. . 001 15. ....полностью>>

Главная > Лабораторная работа >Информатика, программирование

Сохрани ссылку в одной из сетей:

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

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

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

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

Передатчик:

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


Похожие страницы:

  1. Процессы и потоки (2)

    Реферат >> Информатика, программирование
    ... применять для синхронизации потоков только в рамках одного процесса. Но Бывают ... При освобождении семафора этот счетчик вновь увеличивается на единицу. Уведомление при помощи ... посылки сообщений Очень часто в процессе работы потокам ...
  2. Процесс в операционной системе

    Реферат >> Информатика
    ... портам TCP/UPD, семафорам. И для выполнения ... при таком подходе будет рассматривать эти процессы наравне со всеми остальными процессами и с помощью ... в таблице процессов, операционная система осуществляет планирование и синхронизацию процессов. В дескрипторе ...
  3. Многопроцессорные системы Операционные системы UNIX

    Курсовая работа >> Информатика
    ... могут повлиять на приоритет процесса при помощи изменения значения его «любезности» ... этого используются механизмы, подобные семафорам. Семафоры. Поддержка системы UNIX в ... алгоритма wait показана синхронизация выполнения процессов, схема блокирования драйверов ...
  4. Управление процессами (2)

    Лекция >> Информатика
    ... характеризующее степень привилегированности процесса при использовании ресурсов ... планирования процессов, при котором активный процесс ... семафоры и мониторы оказываются непригодными. В таких системах синхронизация может быть реализована только с помощью ...
  5. Операционные системы (8)

    Реферат >> Информатика
    ... процессов Можно доказать, что использование двоичных семафоров позволяет корректно решить любые проблемы синхронизации процессов ... уведомление об изменениях создается при помощи функции FindFirstChangeNotification. При этом указываются следующие аргументы ...

Хочу больше похожих работ...