- •Средства разработки параллельных и распределенных
- •План
- •Литература
- •Средства разработки
- •Поддержка параллелизма в языках программирования
- •Языки без поддержки параллелизма
- •Языки с явной поддержкой параллелизма
- •Языки с неявной поддержкой параллелизма
- •Компиляторы с автораспараллеливанием
- •Языки для создания распределнных программ
- •Средства отладки
- •Средства оптимизации
- •Параллельные математические библиотеки
- •Интерфейс операционных систем
- •Работа с процессами
- •Пример fork
- •Пример fork.c
- •Пример Exec
- •Пример exec
- •Наследование открытых файлов
- •Файловые операции
- •Файловые операции
- •Переназначение файлового дескриптора
- •Пример перенаправления ввода вывода
- •Пример выполнения
- •Взаимодействие между процессами
- •Конвейеры
- •Пример
- •Пример выполнения
- •Общая память
- •Функции работы с общей памятью
- •Пример работы с общей памятью
- •Пример выполнения
- •Семафоры
- •Функции работы с семафорами
- •Операции с семафорами
- •Пример программы работы c общей памятью и семафором
- •Вопросы ?
Файловые операции
Стандарт POSIX – дескриптор файла – целочисленный номер
int open(const char *pathname, int flags);
int close(int fd);
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
Стандарт ANSI C – дескриптор файла – указатель на структуру
FILE *fopen(const char *path, const char *mode);
int fclose(FILE *stream);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
Файловые операции
Файловые операции возможны с любыми файловыми объектами
Дисковый файл
Файл устройства
Конвейер (fifo)
Сокет
Каждая программа обычно имеет в начале 3 дескриптора
Стандартный ввод дескриптор номер 0 - входной
Стандартный вывод дескриптор номер 1 - выходной
Стандартный поток ошибок дескриптор номер 2 -выходной
Переназначение файлового дескриптора
Файловый дескриптор соответствует открытому файлу
Можно менять номера дескрипторов файлов, чтобы связывать нужный файл с нужным дескриптором
Функции
int dup(int oldfd); - создать новый дескриптор – копию старого
int dup2(int oldfd, int newfd); - сделать так, чтобы newfd стал тоже связан с файлом, с которым связан oldfd
Пример перенаправления ввода вывода
//io.c
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main() {
int out_fd;
//открываем новый файл
out_fd = open("./new_file",O_WRONLY|O_CREAT);
//делаем это файл новым стандартным вводом dup2(out_fd,1);
//выполненная команда выдаст результат в новый файл //учитывая наследование дескрипторов открытых файлов execlp("ps","ps",NULL);
}
Пример выполнения
[saa@cluster processes]$ gcc io.c [saa@cluster processes]$ ./a.out [saa@cluster processes]$ cat new_file
PID TTY |
TIME CMD |
26544 pts/1 |
00:00:00 bash |
27315 pts/1 |
00:00:00 ps |
[saa@cluster processes]$
Взаимодействие между процессами
Конвейеры
Общая память
Семафоры
Конвейеры
int pipe(int filedes[2]);
Создает массив из двух связанных дескрипторов
Все, что записывается в одни дескриптор, можно читать из другого
Используется для перенаправление ввода- вывода между родительским и порожденным процессами
Пример
#include <unistd.h>
#include <stdio.h>
int main() {
int channel[2];
pipe(channel);
char buf[10]; switch ( fork() ){
case 0: //порожденный процесс попадает сюда //мы только пишем close(channel[0]);
// пишем родителю write(channel[1],"MESSAGE",8); break;
default: //родительскийпроцесс попадает сюда
//мы только ситаем close(channel[1]);
//читаем информацию от порожденного read(channel[0],buf,8);
printf("GOT FROM CHILD \"%s\"\n", buf); break;
}
return 0;
}
Пример выполнения
[saa@cluster processes]$ gcc ./pipe.c [saa@cluster processes]$ ./a.out GOT FROM CHILD "MESSAGE"
Общая память
Есть два стандарта UNIX и POSIX
Стандарт POSIX
Общая память – файловый объект
Операции
Создать
Открыть
Задать размер
Уничтожить
Отобразить на память процесса
Удалить отображение на адресное пространство