- •Кафедра программного обеспечения информационных технологий
- •«Операционные системы и системное программирование»
- •40 01 01
- •Содержание
- •Введение
- •Разработка программ в ос unix
- •1.1 Отличительные черты ос unix
- •1.2 Основы архитектуры операционной системы unix
- •1.3 Ядро системы
- •1.4 Пользователи системы, атрибуты пользователя
- •1.5 Системные вызовы и функции стандартных библиотек
- •1.6 Описание программы, переменные окружения
- •1.7 Аргументы и опции программы
- •1.8 Обработка ошибок
- •2 Файлы и файловая система
- •2.1 Файлы
- •2.2 Типы файлов
- •2.2.1 Обычные файлы
- •2.2.2 Каталоги
- •2.2.3 Файлы символичной связи (ссылки)
- •2.2.4 Файлы устройства
- •2.2.5 Именованные каналы
- •2.2.6 Сокеты
- •2.3 Владельцы файлов и права доступа к файлу
- •2.4 Дополнительные атрибуты файла
- •2.5 Файловый ввод/вывод
- •Открытие файла
- •2.6 Мультиплексированный ввод/вывод
- •2.7 Векторный ввод/вывод
- •2.8 Файлы, отображающиеся в памяти
- •2.9 Каталоги, работа с каталогами
- •2.9.1 Создание каталога
- •2.9.2 Удаление каталога
- •2.9.3 Чтение информации из каталога
- •2.9.4 Закрытие каталога
- •2.10 Создание жестких ссылок
- •2.11 Символическая ссылка
- •2.12 Удаление ссылки (или имени файла)
- •2.13 Переименование файла
- •2.14 Файловая система ос unix
- •2.14.1 Организация файловой системы ext2
- •2.15 Файлы устройств
- •3 Процессы
- •3.1 Виды процессов
- •3.2 Создание процесса
- •3.3 Вызовы семейства exec
- •3.4 Функции завершения процесса
- •3.5 Ошибки
- •3.6 Копирование при записи
- •3.7 Системные вызовы ожидания завершения процесса
- •3.8 Системный вызов system
- •3.9 Основные параметры, передаваемые процессу
- •3.10 Сеансы и группы процессов
- •4 Взаимодействие процессов
- •4.1 Сигналы
- •4.1.1 Отправка (генерация) сигнала
- •4.1.2 Наборы сигналов
- •4.1.3 Блокировка сигналов
- •4.2 Неименнованные каналы (трубы)
- •4.2.1 Размер канала и взоимодействие процессов при передаче данных
- •4.3 Именнованные каналы
- •4.4 Дополнительные средства межпроцессного взоимодействия
- •4.5 Механизмы межпроцессорного взаимодействия
- •4.5.1 Очереди сообщений
- •4.5.2 Семафоры Семафоры как теоретическая конструкция
- •4.5.3 Разделяемая память
- •4.5.4 Потоки
- •Int pthread_setschedparam(pthread_t tid, int policy, const struct sched_param *param);
- •Int pthread_getschedparam(pthread_t tid, int policy, struct schedparam *param);
- •5 Операционные системы
- •5.1 Понятие операционной системы
- •5.2 Характеристики современных ос
- •5.2.1 Многопоточность
- •5.2.2 Распределенные ос
- •5.2.3 Концепция ос на основе микроядра
- •5.2.4 Функции микроядра.
- •5.3 Принципы построения ос
- •5.4 Концептуальные основы ос
- •5.4.1 Процессы
- •Модель работы процесса с двумя приостановочными состояниями
- •Варианты решения:
- •Решение задачи взаимного исключения. Алгоритм Деккера.
- •Решение задачи взаимного исключения. Алгоритм Пэтерсона..
- •Синхронизирующие примитивы (семафоры).
- •Задача “производитель-потребитель” Общие семафоры
- •Задача “производитель-потребитель”, буфер неограниченного размера(Спящий парикмахер)
- •Задача “производитель-потребитель”, буфер ограниченного размера
- •5.4.2 Распределение ресурсов. Проблема тупиков
- •Алгоритм банкира
- •Применение алгоритма банкира
- •5.4.3 Монитороподобные средства синхронизации
- •Механизм типа «критическая область»
- •5.4.4 Виртуализация
- •5.4.5 Подсистема управления памятью
- •5.4.6 Виртуальная оперативная память
- •5.5 Аппаратные особенности процессоров Intel-архитектуры, направленных на поддержку многозадачности
- •5.5.1 Сегментация памяти. Ia-32
- •5.5.2 Распределение памяти в реальном режиме
- •5.5.3 Организация защиты в процессоре
- •5.5.4 Поддержка многозадачности в процессорах архитектуры ia-32
4.3 Именнованные каналы
Применение неименованных каналов реально только для взоимодействия родственных процессов. То есть неименованный канал должен быть создан до создания процессов. И неименованные каналы закрываются при завершении процесса.
Чтобы устронить эти недостатки предлогается механизм именованных каналов (или канал FIFO). При его создании создается и его имя:
#include<sys/types.h>
#include<sys/stat.h>
int mkfifo(const char *pathname,mode_t mode);
Создается именованный канал с именем указаным в качестве первого аргумента и правами доступа, определенными вторым аргументом с учетом маски создания файла.
После того как канал создан он должен быть открыт функцией open. Если канал открыт каким-то процессом для чтения, то процесс будет заблокирован до тех пор пока другой процесс не откроет его для записи или наоборот.Можно также выполнить не блокируемый вызов для канала FIFO.
fd=open(“/tmp/fifo1”,O_WRONLY|O_NONBLOCK);
В таком случае open вернет значение -1, а в errno установится ENXIO
#include<fcntl>
#include<stdio.h>
#include<string.h>
#include<errno.h>
#define MSG_S 60
char *fifo=“F_FIFO”;
main(int argc,char **argv)
{ int fd,j,n_w;
char msgbuf[MSG_S];
if(argc<2)
exit(1);
if((fd=open(fifo,O_WRONLY|O_NONBLOCK))<0)
exit(2);
for(j=1;j<argc;j++)
{ if(strlen(argv[j])>MSG_S)
continue;
strcpy(msgbuf,argv[j]);
if((n_w=write(fd,msgbuf,MSG_S+1))==-1)
exit(3);
}
exit(0);
}
#include<fcntl>
#include<stdio.h>
#include<string.h>
#include<errno.h>
#define MSG_S 60
int main(int argc,char **argv)
{ int f1;
char msgbuf[MSG_S+1]
if(mkfifo(fifo,0666)==-1)
{ if(errno!=EEXIST)
{ printf(“Ошибка, чтения mkfifo\n”);
exit(1);
}
if((fd=open(fifo,0_RDONLY))<0)
exit(2);
for(;;)
{ if(read(fd,msgbuf,MSG_S+1)<0)
exit(3);
printf(“Получено сообщение %s\n”,msgbuf);
}
}
}
4.4 Дополнительные средства межпроцессного взоимодействия
К дополнительным средствам взоимодействия относятся: передача сообщений, семафоры и разделяемая память. Програмный интерфейс для их реализации имеет значительное подобие. Для обозначения конкретного механизма используются числа называемые ключами. По смыслу ключ напоминает имя файла. Он имеет специальный тип key_t, но сам по себе не несет смысловой информации. Ключ можно выбирать в программе произвольно. Рассмотрим возможность переносимости программы, так как в других программах можно встретить такое же обозначение ключа.
Для решения этой проблеммы существует функция, которая позволяет генерировать ключи.
#include<sys/ipc.h>
key_t ftok(const char *path, int id);
Эта функция возвращает значение ключа на основе инициализации связи с именем файла и номера версии. Если функцию удалить, а потом создать новый с таким же именем, но опирационная система будет возвращать уже другой ключ. Второе действие – создание механизма межпроцессного взоимодействия или получения доступа к межпроцессному взоимодействию. Для этого существуют функции:
msgget
semget
shmget
Результатом выполнения функции get является идентификатор (целое число). Get подобна creat или open для работы с файлами. Но get создает уникальные идентификаторы (open может для одного файла в разных процессах создать один и тот же идентификатор).
#include <sys/ipc.h>
int msgget (key_t key, int permflags);
Вторая группа функций – функции для изменения параметров межпроцессорного взаимодействия:
msgctl
semctl
shmctl
Для каждого типа межпроцессорного взаимодействия существуют функции записи, чтения, изменения состояния этих объектов. При создании объекта межпроцессорного взаимодействия создается специальная структура статуса средства взаимодействия. В ней содержится вся управляющая информация, связанная с объектом. Каждый тип межпроцессорного взаимодействия содержит свою управляющую информацию. Но для всех трех типов имеется общая информация, связанная с правами доступа:
struct ipc_perm {
uid_t cuid;// идентификатор пользователя, создавшего объект
gid_t cgid;// идентификатор группы, к которой принадл. пользователь
uid_t uid;// действительный идентификатор пользователя
gid_t gid;// действительный идентификатор группы
mode_t mode;// права доступа
}
Права доступа подобны правам доступа к файлам. Значения маски на права доступа не действуют.