- •Раздел 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
Маска создания файла
С каждым процессом в системе связано специальное значение, называемое маской создания файлов. Эта маска используется для автомотического выключения битов прав доступа при создании файла, независимо от режима, определенного в функциях создания или открытия файла. Это полезно для защиты всех, созданных за время существования процесса файлов, т.к. предотвращает случайное включение лишних прав доступа.
filedes = open(“/tmp/f1”, O_CREAT, mode);
filedes = open(“/tmp/f1”, O_CREAT, (~mask) & mode);
т.е. идет логическое побитовое “И”.
#include<sys/types.h>
#include<sys/stat.h>
mode_t umask (mode_t newmask); //изменяет значение маски
mode_t oldu;
if ((oldu = umask(0)) = = -1)
{ printf(“Ошибка сохранения старой маски\n”);
return(-1);
}
if(filedes = open(“/tmp/f1”, O_CREAT) = = -1)
printf(“Ошибка открытия файла\n”);
if (umask(oldu) = = -1)
printf(“Ошибка восстановления маски\n”);
Следует контроллировать корректность завершения системных вызовов.
Программы Oc unix
Под программой можно понимать некоторую совокупность файлов, то ли набор исходных текстов,или это объектный файл, или выполняемый файл.
Выполнение программы начинается с создания в памяти её образа и связанных с процессом структур ядра ОС: инициализации и передачи управления инструкциям программы. Завершение программы приводит к освобождению памяти и соответствующих структур ядра. Образ программы в памяти содержит как минимум сегменты инструкций (команд) и данных, созданных компилятором, а также стек, который пользуется программой в ходе выполнения.
Заголовок программы может выглядеть или так:
main (int argc; char *argv[]; char *envp[]) //символьные переменные окружения
или так:
extern char **environ; // глобальная переменная, указывающая на строки с переменными окружения.
main (int argc; char *argv[])
Стандарт ANSI C определяет только два первых параметра, поэтому иногда можно использовать второй вариант.В этом случае внешняя глобальная переменная environ указывает на тот же символьный массив переменных окружения. Переменные окружения передаются программе, и каждая из них представляет символьную строку, которая имеет вид:
<имя перемен.>=<значение переменной>.
Значение переменной окружения можно прочитать или изменить .
#include <stddef.h>
extern chsr ** environ;
main (int argc, char* argv[])
{
int i;
for (i=0;i<8;i++)
{
if (environ[i]!=NULL)
printf(«Строка окружения [%d]: %s \n», i, environ[i]);
};
}
#include <stdlib.h>
char * getenv(const char*name); //получить значение переменной окружения
int putenv (const char*string); // занести значение в переменную окружения
#include <stdio.h>
main(int argc, char *argv[])
{
char *term;
char buf[200], var[200];
if ((term=getenv("TERM"=NULL)
{
printf("Переменная TERM не определена. Введите значение: ");
gets(buf);
sprintf(var,"TERM=%s",buf);
putenv(var);
printf(" %s \n",var);
}
else
{
printf("TERM=%s | Изменить? ",getenv(“TERM”));
gets(buf);
if (buf[0]=='Y' || buf[0]=='y')
{
printf("TERM=%s",buf);
putenv(var);
printf("Новое значение TERM=%s",var);
};
};
}
Вводимое новое значение переменной окружения будет действительно только для данного процесса и порожденных им процессов. После завершения текущего процесса измененная переменная окружения принимает текущее значение.
Переменная окружения позволяет передавать программе какую-либо информацию. Если программа интерактивная, то большую часть информации она получает от пользователя. Возникает вопрос: как программа узнает, где находится пользователь, или на каком терминале работает пользователь, запустивший программу.
При запуске программы на выполнение из командной строки shell для нее автоматически устанавливается три стандартных потока ввода-вывода:
для ввода данных(stdin)
для вывода данных(stdout)
для вывода сообщений об ошибках(stderr)
Начальную информацию о связях файловых дескрипторов этих потоков с конкретным устройством производит терминальный сервер. В большинстве случаев это процесс getty, который открывает специальный файл устройства, связанный с терминалом пользователя и получает соответствующие дескрипторы. Эти потоки наследует командный интерпретатор shell и передает их исходной программе.
По умолчанию все три потока связаны с терминалом пользователя, но также имеется возможность перенаправления. Такой подход позволяет программисту не задумываться о местоположении пользователя, и в то же время обеспечить передачу данных пользователю, запустившему программу.
При компиляции, а затем компоновке программы, редактор устанавливает точку входа в программу на специальную функцию start( ). Эта функция инициализирует процесс, создавая кадр стека, устанавливая значение переменных, и затем вызывает функцию main( ).
Существует несколько способов завершения программы. Основным является возврат из функции main( ) или вызов функции exit( ).