- •Раздел 1. Операционная система unix. Введение в операционную систему unix
- •Отличительные черты ос unix
- •Основы архитектуры операционной системы unix Модель системы unix.
- •Структура ядра ос unix.
- •Основы файловой системы ос unix
- •Типы файлов
- •Структура файловой системы unix
- •Владельцы файлов
- •Права доступа к файлу
- •Дополнительные атрибуты файлов
- •Устройства
- •Маска создания файла
- •Программы Oc unix
- •Процессы ос unix
- •Типы процессов
- •Атрибуты процесса
- •Процесс создания и запуска программ
- •Системный вызов завершения процесса exit
- •Системные функции типа exec
- •Обработка ошибок
- •Ограничения для процессов
- •Пользователи системы, Атрибуты пользователя
- •Средства ВзаимодействиЯ между процессАми
- •Сигналы
- •Посылка сигналов.
- •Int raise (int sig); // посылает сигнал вызывающему процессу (т.Е. Самому себе).
- •Обработка сигналов.
- •Набор сигналов.
- •Файловая подсистема ос unix
- •Индексный дескриптор
- •Блоки хранения данных
- •Недостатки и ограничения файловой системы s5fs
- •Файловая система ffs (Fast File System)
- •Основные отличия ffs от s5fs
- •Ограничения ffs
- •Каталоги ffs
- •Раздел 2. Взаимодействие процессов. Процесс, Понятие и классификация
- •Ресурсы, Понятие и классификация
- •Взаимодействие процессов Задача взаимного исключения
- •Integer очередь;
- •ОБобщенная задача взаимного исключения
- •Integer очередь;
- •Синхронизирующие примитивы (семафоры)
- •Процесс 1 :
- •Процесс 2 :
- •V(свободно);
- •Задача “производитель-потребитель” применение ОбщиХ семафорОв
- •Задача “производитель-потребитель” (буфер ограниченНый)
- •Взаимодействие через переменные состояния
- •Integer array желание[1:n], сп[1:n];
- •Integer чпб, бб, рб, чсеб, I;
- •Integer разм_п, n, max, nmax;
- •Проблема тупиков
- •Алгоритм банкира
- •Integer Св_Деньги; boolean Безопасно;
- •If ((Завершение_под_сомнением [I]) and
- •Применение алгоритма банкира
- •V(Взаимн_искл);
- •V(Возвращенные_Талеры[Номер_Клиента[m]]);
- •If (Попытка_выдать_талер_клиенту(h))
- •Монитороподобные средства синхронизации
- •Механизм типа «критическая область»
- •Механизм типа «условная критическая область»
- •Var s : semaphore; считывание : boolean; m : t;
- •Раздел 3. Вычислительные структуры. Машины, управляемые контроллерами (устройствами управления)
- •Усовершенствованная структура вычислительной машины, управляемой контроллерОм
- •Системы с операционным конвейером
- •Мультипроцессорные системы
- •Транспьютеры
- •Распределение памяти в транспьютерах
- •Диспетчеризация процессов
- •Организация ВводА / выводА в транспьютере.
- •Гарвардская архитектура на примере процессоров семейства adsp
Обработка ошибок
Обработке ошибок в ОС UNIX уделяется достаточно серьёзное внимание, т. к. написание надёжных и устойчивых программ, особенно для многопользовательских многозадачных систем, является важной задачей.
Обычно в случае возникновения ошибки системы вызовы возвращают -1 и устанавливают значение внешней переменной errno, по которому можно определить причину возникновения ошибки.
Есть внешний массив sys_errlist, который представляет собой таблицу сообщений об ошибках и имеется внешняя переменная sys_nerr , которая задаёт текущий размер этого массива.
Имеется несколько библиотечных функций, которые позволяют осуществлять процедуры анализа ошибочных ситуаций.
#include <string.h>
char * strerror (int errnum);
#include <errno.h>
#include <stdio.h>
void perror (const char *s);
Функция strerror() в качестве аргумента принимает номер ошибки и возвращает указатель на строку, содержащую сообщение о причине ошибочной ситуации.
Функция perror() выводит в стандартный поток сообщений об ошибках info об ошибочных ситуациях, основываясь на значении переменной errno. Строка, передаваемая функции в качестве аргумента, предваряет это сообщение об ошибке и может использоваться в качестве дополнительной информации.
#include <string.h>
#include <errno.h>
#include <stdio.h>
main (int argc, char *argv [ ] )
{
fprintf (stderr, “enomem: %s \n”, strerror (ENOMEM));
errno = ENOEXEC;
perror (argv [0] );
}
$prog.out
ENOMEM: Not enough space
Prog.out: Exec format error
Ошибки имеют мнемоническое значение, т. Е. За именем каждой ошибки стоит определённый индекс массива sys_errlist.
Наиболее часто встречающиеся ошибки:
E2BIG – слишком длинный список аргументов в системном вызове exec ();
EACCES – нет доступа из–за отсутствия прав доступа;
EAGAIN – ресурс временно недоступен, обычно обозначает переполнение некоторой системной таблицы;
EBADF – недопустимый дескриптор файла (используется неоткрытый дескриптор файла);
EBUSY – занято устройство или ресурс (попытка удалить файл, используемый другим приложением);
ECHILD – нет дочерних процессов для системных вызовов wait() и waitpid();
EEXIST – файл уже существует;
EINVAL – недопустимый аргумент, системному вызову передан неверный параметр или список параметров;
EIO – ошибка ввода/вывода;
EMFILE – слишком много открытых процессом файлов;
ENODEV – устройство не существует;
ENOMEM – нет места в памяти;
EPIPE – разрыв связи в канале.
Ограничения для процессов
Так как ОС UNIX является многозадачной системой, то в ходе работы несколько процессов могут конкурировать между собой за доступ к различным ресурсам. Для упрощения распределения ресурсов памяти или дискового пространства каждому из процессов устанавливается набор ограничений. Эти ограничения не носят общесистемного характера, как, к примеру, максимальное число процессов, а устанавливается для каждого процесса отдельно.
Для получения информации о текущих ограничениях и для их изменения используются системные вызовы:
#include <sys/time.h>
#include <sys/resource.h>
int getrlimit (int resource, struct rlimit *rlp);
int setrlimit (int resource, struct rlimit *rlp);
struct rlimit
{
rlim_t rlim_cur;
rlim_t rlim_max;
}
Параметр resource определяет вид ресурса. Параметр rlim_cur определяет изменяемое ограничение, т.е. текущее ограничение процесса на данный ресурс. Параметр rlim_max определяет жесткое ограничение, т.е. максимально возможный значение для данного ресурса.
Любой процесс может изменить текущее значение ограничения ресурса до максимально возможного предела. Жесткое ограничение может быть изменено в сторону увеличения только процессами с привилегиями супер-пользователя. Обычные процессы могут только уменьшать значение жёсткого ограничения. Ограничения устанавливаются при инициализации системы и затем наследуются аппаратурными процессами. Для жёсткого ограничения может быть установлено значение, определяемое как RLIM_INFINITY. В этом случае физические ограничения системы будут определять реальный предел использования того или иного ресурса (например: размер памяти или дискового пространства).
Имеются следующие мнемонические ограничения:
RLIMIT_CORE это максимальный размер создаваемого файла core. Если предел 0, то файл создаваться не будет.
RLIMIT_CPU максимальное время использования процессора в секунду. При превышении предела процессу посылается сигнал SIGXCPU.
RLIMIT_DATA максимальный размер сегмента данных в байтах. При достижении этого предела последующие вызовы функций распределения памяти возвращаются с ошибкой ENOMEM.
RLIMIT_FSIZE максимальный размер файла, который может создать процесс. При достижении предела процессу отправляется сигнал SIGXFSZ. Если этот сигнал игнорируется, то последующие попытки увеличить размер файла заканчиваются ошибкой E2BIG
RLIMIT_NOFILE максимальное количество назначенных файловых дескрипторов процесса. Когда это значение достигнуто, системные вызовы возвращают ошибку EMFILE.
RLIMIT_STACK максимальный размер стека процесса. При достижении предела процессу отправляется сигнал SIGSEGV.
RLIMIT_NPROC максимальное число процессов с одним реальным пользовательским идентификатором. При достижении этого значения, возвращается ошибка системного вызова fork() EAGAIN.
RLIMIT_MEMLOCK максимальный размер физической памяти, который процесс может заблокировать с помощью системного вызова mlock(). При превышении предела возвращается ошибка EAGAIN.