- •Средства разработки параллельных и распределенных
- •План
- •Литература
- •Средства разработки
- •Поддержка параллелизма в языках программирования
- •Языки без поддержки параллелизма
- •Языки с явной поддержкой параллелизма
- •Языки с неявной поддержкой параллелизма
- •Компиляторы с автораспараллеливанием
- •Языки для создания распределнных программ
- •Средства отладки
- •Средства оптимизации
- •Параллельные математические библиотеки
- •Интерфейс операционных систем
- •Работа с процессами
- •Пример fork
- •Пример fork.c
- •Пример Exec
- •Пример exec
- •Наследование открытых файлов
- •Файловые операции
- •Файловые операции
- •Переназначение файлового дескриптора
- •Пример перенаправления ввода вывода
- •Пример выполнения
- •Взаимодействие между процессами
- •Конвейеры
- •Пример
- •Пример выполнения
- •Общая память
- •Функции работы с общей памятью
- •Пример работы с общей памятью
- •Пример выполнения
- •Семафоры
- •Функции работы с семафорами
- •Операции с семафорами
- •Пример программы работы c общей памятью и семафором
- •Вопросы ?
Функции работы с общей памятью
Создать или открыть область памяти
int shm_open(const char *name, int oflag, mode_t mode);
Задать размер области (как файла)
ftruncate() или write()
Удалить область памяти
int shm_unlink(const char *name);
Закрыть область памяти
int close(int)
Отобразить на адресное пространство процесса
void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
Удалить отображение
int munmap(void *start, size_t length);
Пример работы с общей памятью
#include <fcntl.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h> int main(){
int mem_fd; char* shm;
//создаем область общей памяти
mem_fd = shm_open("/test.mem",O_RDWR|O_CREAT, S_IRWXU); shm_unlink("/test.mem");
ftruncate(mem_fd,100); //задаем размер в 100 байт
switch(fork()){
case 0: //child
//отображаем общую область пямяти в адресное пространство shm = mmap(NULL, 100, PROT_WRITE , MAP_SHARED, mem_fd, 0);
//записываем информацию в общую область памяти sprintf(shm,"MESSAGE FROM CHILD");
break;
default: //parent
sleep(1); // ждем одну секунду
//отображаем общую область пямяти в адресное пространство shm = mmap(NULL, 100, PROT_READ , MAP_SHARED, mem_fd, 0);
// читаем информацию из общей области памяти printf("Read from child=\"%s\"\n",shm); break;
}
// отсоединяем и удаляем общую область памяти close(mem_fd);
munmap(shm,100); return 0;
}
Пример выполнения
saa@cluster processes]$ gcc shm_posix.c -lrt [saa@cluster processes]$ ./a.out
Read from child="MESSAGE FROM CHILD"
Семафоры
Семафор – взаимоисключающая переменная
Есть два стандарта UNIX и POSIX
Стандарт UNIX
Семафоры создаются специальными системными вызовами
Операции
создать
down – захватить (опустить, уменьшить на 1)
up – вернуть (поднять, увеличить на 1)
удалить
Функции работы с семафорами
Создать семафор
int semget(key_t key, int nsems, int semflg);
Операции с семафорами
int semop(int semid, struct sembuf *sops, unsigned nsops);
Управление семафорами
int semctl(int semid, int semnum, int cmd, ...);
Операции с семафорами
Операция представляется в виде структуры
Struct sembuf {
unsigned short sem_num; |
/* номер семафора */ |
||
short |
sem_op; |
/* |
операция */ |
short |
sem_flg; |
/* |
флаги */ |
}
Операция
Увеличение на sem_op (sem_op > 0)
Уменьшение на sem_op (sem_op < 0)
Пример программы работы c общей памятью и семафором
#include<fcntl.h>
#include<sys/types.h>
#include<sys/mman.h>
#include<unistd.h>
#include<stdio.h>
#include<sys/stat.h>
#include<sys/ipc.h> #include <sys/sem.h> int main(){
int mem_fd; char* shm;
int sem; //дескриптор семафора
struct sembuf up = {0,1,1}; //команда поднять семафор struct sembuf down = {0,-1,1}; //команда опустить семафор mem_fd = shm_open("/test.mem",O_RDWR|O_CREAT, S_IRWXU); shm_unlink("/test.mem");
ftruncate(mem_fd,100);
shm = mmap(NULL, 100, PROT_WRITE|PROT_READ , MAP_SHARED, mem_fd, 0);
sem=semget(IPC_PRIVATE,1,S_IRUSR|S_IWUSR|IPC_CREAT); //создаем семафор semop(sem,&down,0); //опускаем семафор
switch(fork()){
case 0: //child
sprintf(shm,"MESSAGE FROM CHILD"); semop(sem,&up,1); // разрешем читать break;
default: //parent
semop(sem,&down,1); // ждем разрешения читать printf("Read from child=\"%s\"\n",shm); semctl(sem,0,IPC_RMID,0); // удаляем семафор break;
}
close(mem_fd); munmap(shm,100); // отсоединяем и удаляем общую область памяти return 0;
}