
- •1. Операционные системы
- •2. Функциональные компоненты локальной ос
- •3. Назначение и функции сетевой ос
- •4. Функциональные компоненты сетевой ос
- •5. Коммуникационные средства
- •6. Классификация ос
- •8. Архитектура ос
- •9. Монолитные и многоярусные ядра
- •10. Функциональные компоненты Linux
- •11. Структура ядра
- •12. Функции слоёв ядра
- •13. Вспомогательные модули
- •14. Микроядерные системы
- •15. Объектная модель функционирования
- •16. Состав исполнительной системы WinNt
- •17. Совместимость
- •18. Множественные прикладные среды. Способы реализации
- •19. Интерфейсы ос
- •20. Файловая система
- •21. Логическая организация файла
- •22. Физическая организация файла
- •23. Общая модель фс
- •Непрерывное
- •2) Цепочечная
- •3) Фиксированный
- •Битовые карты (таблицы) – каждому блоку ставится в соответствие свой бит (1 – занят, 0 – свободен)
- •Цепочки сводных свободных порций
- •Список свободных блоков
- •Индексированный
- •24. Функции фс
- •25. Фс unix-подобных ос
- •26. Структура фс
- •27. Структура фс базовых unix-подобных ос
- •28. Архитектура виртуальной фс
- •29. Последовательность действий при монтировании
- •30. Файловые дескрипторы и трансляция имён
- •31. Физическая организация fat
- •32. Физическая организация ntfs
- •33. Управление процессами
- •34. Контекст и дескриптор
- •35. Структура контекста процесса
- •36. Планирование и диспетчеризация
- •37. Алгоритмы планирования
- •38. Планирование и диспетчеризация в unix системах
- •39. Управление процессами в unix-подобных системах
- •40. Атрибуты, инфраструктура процесса
- •41. Создание процессов
- •42. Этап exec()
- •43. Межпроцессные взаимодействия (ipc)
- •44. Каналы (pipe)
- •45. Fifo
- •46. Пространство имен
- •47. Сообщения
- •48. Семафоры
- •49. Разделяемая память
- •50. Сигналы
- •51. Последовательность событий
- •52. Функции управления процессами
- •53. Сообщения в микроядерных ос.
- •54. Процессы и потоки в WinNt
- •55. Базовая структура процесса, создание процесса в WinNt
- •56. Основные различия управления процессами в различных средах
- •57. Состав потока в WinNt и контекст потока
- •58. Передача сообщений с помощью lpc (локальный вызов процедур)
- •59. Распределенные системы. Удаленный вызов процедур. Rpc (Remote Procedure Call)
- •60. Система ввода-вывода в Win nt
- •61. Реализация свв в Windows nt
- •62. Унифицированная модель драйвера
- •63. Формат пакета irp
- •64. Структура драйвера
- •65. Редиректор и сервер. Встроенные сетевые компоненты
41. Создание процессов
Cоздание процесса в 2 этапа:
1. Порождение нового процесса - соответствующему системному вызову fork()
2. Системный вызов exec() - загрузка на выполнение, загрузка исполняемого кода данных в АП и запуск кода.
pid_f fork(void) - выполняет родительский процесс и создает точную копию самого себя.
Наследование:
идентификатор пользователя, группы
переменные окружения
диспозиция сигналов и их обработки
ограничения накладываются на текущий корневой каталог
маска создания файлов
все файловые дескрипторы , включая файловые указатели
управляющий терминал
После возврата из вызова fork() в родительском и в потомке выполняется одна и та же инструкция.
Различия между потомками и родителями :
- дочернему присваивается свой PID, PPID у них различные
- дочерний процесс свободен от сигналов ожидающих доставки
- значение, возвращенное вызовом fork() в родителе и потомке различны. В потомке - 0 , а родителю возвращается PID потомка
- дочерний процесс получает свою копию u-area
- временная статистика выполнения в режиме ядра/задачи у каждого своя
Наследуются блокировки памяти и записей.
Действия, которые выполняются при сист. вызове fork():
1. Резервируется место под swap для сегмента кода и данных из стека процесса
2. Размещается новая запись в /proc в таблицу процессов и присваивается новый PID - идентификатор процесса
3. Инициализируется структура proc
4. Размещение необходимых карт отображения для трансляции адреса.
5. Размещение структуры u-area для нового процесса и копирование информации родительского.
6. Создание соответствующей области процесса, часть из которой соответствует родительскому процессу, сообразно таблице наследования.
7. Инициализация аппаратного контекста процесса, пока как копия родительского.
8. Установка в "0" значения возвращаемое fork() процессу - потомку (и равное PID потомка для процесса - родителя)
9. Пометка как готового и установка в очередь готовых процессов.
В зависимости от версии UNIX по-разному осуществляется перенос в АП полезного кода
Организация параллельной работы нескольких потомков вместе с родителем
main ()
{
int pid;
pid = fork();
if (pid == -1)
{
perror (“fork”);
exit();
}
if (pid == 0)
{
// код, выполняемый потомком. Если хотим ещё параллельно потомков, то ещё вызов fork()
}
else
{
// код, выполняемый родителем.
}
printf (“something\n”); // выведется дважды, и потомком, и родителем
return 0;
}
Жизненный цикл процесса
Kill Sig-number Pid прерывание процессов (Sig-number номер сигнала т. к. они все пронумерованы)
Kill$! – отсылка сигнала процессу, с которым последний раз работали.
Proc& - запуск процесса в фоновом режиме.
42. Этап exec()
Выполняет 2 функции:
1. Заполняет АП из исполняемого файла
2. Запуск на исполнение
#
include
<unistd.h>
С точки зрения полноты параметров наиболее близка функция execve().
Наследуются: PID, PPID родителя идентификатор пользователя и группы, эффективный идентификатор пользователя и группы (EUID, EGID) без флага SUID , ограничения на процесс, текущий и корневой каталог, маска создаваемых файлов, управляющий терминал, файловый дескриптор.
Системный вызов обычно содержит следующие аргументы exec():
1.Имя исполняемого файла (программы) (file)
2.Набор аргументов (args)
3.Список переменных окружения (envp)
В большинстве случаев не создаётся АП, а происходит замена АП как есть после вызова fork().(зависит от версии UNIX).
Все возвращаемые значения типа int
В большинстве обрабатываемых системных вызовах, если возвращается -1 то это ошибка.
Функции завершения
wait(&status) – блокировка выполнения процесса до смерти какого-либо из непосредственных потомков
waitid(id_type, id) – определяет потомка и все его изменения
waitpid(id_group или process_all) – позволяет контролировать определённое множество потомков. Контроль группы потомков – создаётся ID этой группы. Состояние всех потомков – process_all.
Возврат состояния – переменная stat_log. Её можно анализировать с помощью специальной макрокоманды.
Алгоритм выполнения системного вызова exec():