- •Ос в общей структуре компьютера.
- •История операционных систем.
- •Классификация современных ос. Задачи современных ос.
- •6. Понятие процесса – ключевое понятие ос.
- •8. Трансляторы: компиляторы и интерпретаторы.
- •9. Иерархия зу (запоминающих устройств).
- •10. Управление оперативной памятью (оп). Менеджер памяти; swapping; виртуальная память.
- •11. Модели организации виртуальной памяти.
- •12. История ос unix.
- •13. Общая архитектура unix. Основные подсистемы ядра.
- •14. Пользовательская среда unix.
- •Командный интерпретатор shell.
- •16. Система каталогов в oс unix. Управление с помощью команд языка Bourn shell.
- •17. Управление файлами с помощью команд языка Bourn shell. Перенаправление ввода/вывода.
- •19. Обработка аргументов командной строки. Переменные окружения.
- •20. Пользователь и группа. Права доступа к файлу.
- •21. Системные вызовы и функции стандартных библиотек. Обработка ошибок.
- •22.Структура программы на языке с. Параметры главной функции (пример).
- •23. Файловая система ос unix: монтирование, индексные дескрипторы, жесткие и символические ссылки, файлы устройств.
- •24.Системные вызовы для работы с файлами
- •25. Понятие «процесс» в ос unix. Контекст процесса; свойства процесса; состояние процесса.
- •26.Создание процессов и упр-е ими.
- •27. Запуск внешней программы
- •29.Общая классификация средств взаимодействия процессов в ос unix.
- •30.Иерархия процессов в ос unix. Понятие сеанса. Фоновые процессы.
- •31.Каналы – средства взаимодействия процессов. Неименованные каналы. Организация конвейера (пример программы).
- •33.Сигналы как средство взаимодействия процессов в ос unix. Диспозиция сигналов.
- •34.Ограничения для процесса в ос unix (по ресурсам). Связь со свойствами процесса.
- •36.Отображение файлов в виртуальное адресное пространство. Разделяемая память.
- •37. Взаимодействие процессов через псевдотерминал.
- •38. Недостатки потокового взаимодействия процессов. Средства System vipc. Пространство имен. Общие принципы работы со средствами System vipc.
- •39. Организация очереди сообщений в ос unix. Структура сообщения. Отправка и принятие сообщений.
- •40.Семафоры, как средство взаимодействия процессов System vipc. Понятие атомарной операции. Массив семафоров.
- •41.Разделяемая память, как средство взаимодействия процессов System vipc.
- •42.Взаимодействие по сети. Понятие протокола. Семейства адресации и типы взаимодействия. Создание сокета в ос unix.
- •45. Потоковые сокеты. Клиент – серверная модель.
- •46. Проблема очередности действий и ее решение.
- •47. Процессы-демоны. Система журнализации.
- •48. Загрузка и жизненный цикл в ос unix.
- •49. Взаимоисключения. Понятие критической секции. Устаревшие подходы к организации взаимного исключения.
- •50.Поддержка взаимоисключения на уровне ос. Мьютексы и семафоры (Дейкстры). Команда ассемблера tsl.
- •51.Проблема тупиков. Граф ожидания
- •52. Нити исполнения (pthreads) в ос unix. Мьютексы pthreads.
- •53.Графический интерфейс в ос unix. Базовые принципы построения x_window.
- •54.Файловая подсистема. Общая структура. Методы выделения дискового пространства. Управление дисковым пространством.
- •55.Файловая подсистема. Структура файловой системы на диске. Реализация директорий. Поиск в директории (хеширование).
- •56.Подсистема ввода/вывода. Схема взаимодействия подсистем ос. Понятие драйвера. Типы драйверов.
27. Запуск внешней программы
Запуск новой программы осуществляется с помощью системного вызова ехес(). При этом новый процесс не порождается, а исполняемый код процесса полностью замещается кодом запускаемой программы. В UNIX запуск на выполнение новой программы часто связан с порождением нового процесса, таким образом сначала процесс выполняет вызов fork, порождая дочерний процесс, который затем выполняет ехес() полностью замещаясь новой программой. После возврата из вызова ехес(2) процесс продолжает выполнение кода новой программы.
#include <unistd.h>
Int execve(const char**path, const char**argv, const char**envir)
Процесс тот же но с другой программой.
Пар-р path – задает исполн файл программы, кот нужно запустить вместо текущей. Пар-ры argv и envir – создают команд строку и окружение для запускаемой программы. Если запуск успешный, то ничего не вернет, т.к. уходим в другую программу, если ошибка то вернет -1.
Модификации системного вызовова ехес():
Int execv(const char**path, const char**argv[]) здесь окружение для запуска программы наслед из текущей
Int execvp(const char**path, const char**argv[]) – отличие в том что имя зад-ся в пар-ре path м.б именем программ-мы, исполн файл которой наход в одной из директорий опред-ных в переменной окружения.
Пример:
Int execl(const char**path, const char**argv[])
>ls –l
Execl(“bin/ls”,”ls”,”-l”,NULL)
Int execlp (const char**path, const char**argv[0], const char**argv[1]….,NULL)
Все ф-и заменяют в памяти процесса выполн-щуюся программу на другую, указа-ю в пар-рах вызова. Открытые файл дискрипторы при выполнении Exe остаются открытами, что позволяет осущ-ть манипуляцию дескрипторами. Суффиксы l, v, p и e:
p - определяет, что функция будет искать дочернюю" программу в директориях, определяемых переменной среды DOS PATH. Без суффикса p поиск будет производиться только в рабочем каталоге. Если параметр path не содержит маршрута, то поиск производится в текущей директории.
l - показывает, что адресные указатели (arg0, arg1,..., argn) передаются, как отдельные аргументы. Обычно суффикс l употребляется, когда число передаваемых аргументов заранее известно.
v - показывает, что адресные указатели (arg[0],arg[1],
...arg[n]) передаются, как массив указателей. Обычно, суффикс v используется, когда передается переменное число аргументов.
e - показывает, что "дочернему" процессу может быть передан аргумент envp, который позволяет выбирать среду "дочернего" процесса. Без суффикса e "дочерний" процесс
унаследует среду "родительского" процесса.
Пример: Смоделировать команду ls –l –a
Main()
{int pid; pid=fork();
If (pid==-1) {perror(“osibka fork”);exit(1);}
If (pid==0) {execlp(“ls”,”ls”,”-l”,”-a”,NULL);//дочерний проц perror(“error ls”); exit(2);}
Wait(NULL); - дождется окончание дочернего процесса и уничтожит зомби
Return 0;}
28. Системный вызов Wait. Процессы зомби.
Операционная система предоставляет процессу ряд функций, позволяющих ему контролировать выполнение потомков. Это функции Wait:
#include <sys/types.h>
#include <sys/wait.h>
Pid_t wait(int*stat_loc)
Pid_t waitpid(pid_t, int*stat_loc, int options);
Системный вызов Wait позволяет заблокировать выполнение процесса, пока кто-либо из его непосредственных потомков не прекратит существование. Вызов wait немедленно возвратит идентификатор уже завершившегося дочернего процесса в переменной stat_loc, если процесс в состоянии зомби – то он завершится к моменту wait. Значение stat_loc может быть проанализировано с помощью следующих макроопределений:
WERMSIGNALED(status)- сох-ет номер сигнала заверш процесс.
Процесс становится «зомби» если он завершился но информация о нем не затребована родительским процессом – поэтому он висит в системе, занимает место в таблице процесса, не имея ни кода, ни данных. Wait затребует инф-цию о зомби и тем самым позволит убрать зомби из системы.
Если родит процесс не имеет порожденных процессов, завершение которых он ожидает или был прерван сигналом при выполнении Wait фун-я возвращает значение -1. Фун-я waitpid явл более универсальный по сравнению с Wait. Фун-я waitpid сообщает код завершения и идентификатор дочернего процесса по его завершению. Однако в случае waitpid в вызывающ процессе можно указать завершения какого из поражденных процессов следует ожидать.
Пар-р pid<0 указывает кого ждать. Если pid>0 то ждать люб. дочерний.
int wait4(int pid, int *status, int options,
struct rusage *rusage);
Функция wait4 приостанавливает исполнение текущего процесса до того, как свою работу завершит дочерний процесс с номером pid, или этот процесс не получит сигнал, прекращающий его работу.
Параметр options состоит из комбинации следующих флагов:
WNOHANG- немедленно вернуть управление вызывающему процессу, если нет дочерних процессов, попадающих под действие функции.
WUNTRACED- вернуться, если существуют остановленные дочерние процессы, а их статус еще не получен. Если options=0, то обычный wait. Если status не равен NULL, то wait4 сохранят в памяти информацию о процессе в виде структуры status. Wait(NULL) – снимает зомби.