Поиск

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

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

Информатика, программирование
Для создания реалистичной модели объекта используются геометрические примитивы (куб, шар, конус и пр.) и гладкие, так называемые сплайновые поверхност...полностью>>
Информатика, программирование
Алгоритм вывода прямой линии. Алгоритм вывода окружности. Алгоритм вывода эллипса. Алгоритмы вывода фигур. Алгоритмы закрашивания (простейший алгоритм...полностью>>
Информатика, программирование
У вікні цієї команди в полі “Заменить” треба ввести слово, в якому часто зустрічається помилка, або словосполучення, яке буде скороченням. У полі “На”...полностью>>
Информатика, программирование
У теорії інформаційних систем обробки даних (ІСОД) інфор­мація ототожнюється з будь-якими відомостями (даними), тобто тлу­мачиться як сукупність відом...полностью>>

Главная

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

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

Цель работы: получить представление о синхронизации процессов в ОС 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. При этом указываются следующие аргументы ...

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