- •Лекция 1. Операционные системы.
- •Экскурс в историю.
- •Основы архитектуры вычислительных систем.
- •Лекция 2. Системы программирования.
- •Выводы:
- •Основы компьютерной архитектуры.
- •Центральный процессор
- •Модель организации прерываний с использованием «вектора прерываний»
- •Лекция 3.Внешние запоминающие устройства.
- •Аппаратная поддержка ос и систем программирования.
- •Регистровые окна
- •Системный стек
- •Виртуальная память
- •Модельный пример организации страничной виртуальной памяти. Лекция 4.Операционная система. Общие характеристики и свойства.
- •Структура ос.
- •Процессы в ос unix.
- •1. Системный вызов fork()
- •2. Системный вызов exec()
- •Лекция 5. Взаимодействие процессов: синхронизация, тупики
- •Средства синхронизации
- •Классические задачи синхронизации процессов
- •Лекция 6 .Основы взаимодействия сети.
- •Многомашинные и многопроцессорные ассоциации.
- •Компьютерные сети
- •Лекция 7. Файловые системы
- •Практическая реализация фс.
- •Лекция 8. Ос unix. Файловая система.
- •Модель версии system V
- •Альтернатива для system V – ffs bsd.
- •Управление внешними устройствами.
- •Лекция 9. Программное управление внешними устройствами
- •Эффективность (когда есть все уровни кэш, но нет интенсивности потоков)
- •Одно из основных качеств программного решения – надежность (24 часа 7 дней в неделю)
- •Oc Unix: Работа с внешними устройствами
- •Лекция 10. Система межпроцессного взаимодействия ipc
- •«Очередь сообщений»
- •Ipc: разделяемая память.
- •1Й процесс:
- •2Й процесс:
- •Close – полная аналогия с работой с файлами, но аргумент – дескриптор сокета.
- •Лекция 11. Планирование
- •Алгоритмы, основанные на приоритетах
- •Планирование в ос unix
- •Планирование в Windows nt.
- •Планирование свопинга в ос Unix
- •Лекция 12. Управление оперативной памятью
- •1.Одиночное непрерывное распределение.
- •2.Распределение разделами.
- •3.Распределение перемещаемыми разделами.
- •4.Страничное распределение.
- •А лгоритм nru
- •Алгоритм fifo
- •Алгоритм «Часы»
- •А лгоритм lru
Процессы в ос unix.
Процесс в UNIXe имеет системно-ориентированные характеристики:
-
Объект, зарегистрированный в таблице процессов
-
Объект, порожденный системным вызовом fork().
Каждому процессу соответствует идентификатор процесса, который идентифицируется с процессом до его завершения.
Контекст процесса в UNIXе – совокупность данных, которые принадлежат адресному пространству процесса и ОС, состоит из 3х компонент:
-
пользовательская
-
аппаратная
-
системная
1)Пользовательская:
Сегмент кода
-
машинные компоненты
-
системные команды
Сегмент данных
-
статические данные
-
разделяемая память
-
стек
2) Аппаратная составляющая - все регистры и аппаратные таблицы ЦП, используемые активным или исполняемым процессом
•счетчик команд
• регистр состояния процессора
• аппарат виртуальной памяти
• регистры общего назначения
• и т. д.
3) Системная составляющая:
•приоритет процесса
•реальный и эффективный идентификаторы пользователя-владельца
•текущее состояние процесса
•реальный и эффективный идентификатор группы, к которой принадлежит владелец
•идентификатор родительского процесса
Создание нового процесса.
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
1. Системный вызов fork()
С понятием процесса в ОС UNIX связаны средства формирования процесса, суть их заключается в следующем. Ядром системы поддерживается функция fork(). При обращении к этой функции происходит дублирование процесса. Образуется процесс-двойник, который идентичен процессу-отцу (идентичен, но не совпадает с процессом-отцом!). Функция возвращает значение:
>0, это PID сыновнего процесса (мы находимся в процессе-отце)
=0 (мы находимся в процессе-сыне)
=-1 произошла ошибка - невозможно создать новый процесс, эта ошибка может возникнуть при недостатке места в таблице процессов, при нехватке места в системных областях данных и т.п.
Заметим, во-первых, что fork() - общесистемное средство порождения процессов. Система пользуется этим средством в подавляющем большинстве случаев. Во-вторых, система поддерживает родственные взаимоотношения между процессами, это означает, что существуют некоторые функции, характерные для работы с процессами, которые доступны только процессам, являющимся родственниками. Родственные связи процессов отражаются на использовании тех или иных средств UNIX. При порождении сыновнего процесса с использованием fork() порожденный процесс наследует от «отца»:
-
Окружение - при формировании процесса ему передается некоторый набор параметров-переменных, используя которые, процесс может взаимодействовать с операционным окружением (интерпретатором команд и т.д.). О переменных окружения мы поговорим на последних лекциях нашего курса;
-
Файлы, открытые в процессе-отце, за исключением тех, которым было запрещено передаваться процессам-потомкам с помощью задания специального параметра при открытии. Речь идет о том, что в системе при открытии файла с файлом ассоциируется некоторый атрибут, который определяет правила передачи этого открытого файла сыновним процессам. По умолчанию открытые в «отце» файлы можно передавать «потомкам», но можно изменить значение этого параметра и блокировать передачу открытых в процессе-отце файлов.);
-
Способы обработки сигналов;
-
Разрешение переустановки действующего идентификатора пользователя (это то, что связано с s-bit’ом);
-
В ОС имеется возможность системными вызовами осуществлять отладку (профилирование) программы, в процессе может быть указано - разрешено или нет профилирование;
-
Разделяемые ресурсы процесса-отца;
-
Текущий рабочий каталог и домашний каталоги.
Не наследуется при создании нового процесса идентификатор процесса
В качестве иллюстрации работы fork() можно привести следующую картинку:
Здесь процесс с PID=105 создается процессом с PID=101.
Также следует отметить, что если убивается процесс-отец, то новым отцом становится 1-ый процесс ОС.
Пример:
int main(int argc, char **argv)
{
printf("PID=%d; PPID=%d \n", getpid(),
getppid());
fork();
printf("PID=%d; PPID=%d \n", getpid(),
getppid());
}