Ядро операционной системы
Программа связана с некоторыми ресурсами:
Память
Время
УВВ
Файлы
Безопасность
Часть их относится к ядерным, часть - к пользовательским. В Unix графика в пользовательской системе, в Windows наоборот.
Программы, процессы и потоки
Программа и процесс – это не одно и то же. Программа – это то, что хранится в дисковом файле, процесс – это то, что создается, когда мы запускаем программу.
Первый шаг при создании процесса – выделение памяти под процесс. Каждый процесс имеет свое адресное пространство.
Процесс – это просто адресное пространство, в котором работает программа.
Поток – thread (нить).
После выделения процесса запускается главный поток – исполняющая часть программы. Поток существует во времени, а не в пространстве.
В Windows есть два типа потоков:
UI-threads – пользовательский интерфейс
Working threads – рабочие потоки
Новый процесс всегда создается другим процессом. Первый процесс всегда запускается вместе с ОС. В UNIX порождающая функция fork – порождает копию родительского процесса, в котором потом меняются код и данные. В Windows – CreateProcess, создается сразу нужный процесс. fork позволяет иметь общую часть кода у экземпляров одной программы. В Windows если запустить 100 раз word, то будет 100 его копий в памяти. В Windows нет иерархии процессов, все процессы самостоятельные. В UNIX есть чёткая иерархия процессов.
Права процесса = права порожд. процесса пересечь с правами текущего пользователя.
Ни в UNIX, ни в Windows завершение процесса не приводит к завершению дочерних процессов, но завершение процесса приводит к уничтожению всех его потоков. Демоны и сервисы – потоки, которые выполняются и без родительского процесса.
Завершение процесса – это завершение всех его потоков.
Нормальное завершение потока – все сделал
Нормальное завершение по ошибке (из-за невозможности дальше выполняться)
Фатальная ошибка, не предусмотренная программистом
Насильное завершение потока ОС
Процесс параллельного выполнения
Работает система разделения времени. Нужно хранить состояние каждого потока, чтобы не потерять информацию при переключении.
С каждым потоком связана структура в памяти – TCB (Thread Control Block).
Е
сть
также PCB (Process
Control Block),
там есть список всех работающих потоков.
Состояния потока:
Поток работает (Running)
Поток готов, но ему не дают работать (Ready)
Поток не готов (блокирован), например, ждем ввода-вывода или его насильно остановили (Blocked)
Выбор приоритета: кто работает дольше, тому приоритет меньше. Должна быть корректировка. Иногда процессам с маленьким приоритетом резко повышают приоритет.
Пусть есть потоки с разными приоритетами. Выбирают очередной поток из тех, которые давно не работали, но с учетом приоритета.
В UNIX есть один диспетчер процессов (он же супервизор, он же менеджер процессов).
В Windows есть менеджер процессов и менеджер потоков.
Загрузчик процессов.
Загрузчик (loader).
Исполняемые файлы
Абсолютно загружаемые
Относительно загружаемые
Com-файлы – абсолютно загружаемые, всегда загружаются в память в одну и ту же область.
Com – 100h. Проблемы: нельзя реализовать много задач в рамках одного сегмента, трудно работать с функциями API. Сейчас такой подход уже почти не используется.
Обычно файлы перемещаемые – куда конкретно загрузить, решает загрузчик.
В UNIX – это elf. В Windows – exe (PE – portable executable).
Mov eax, [10000h]
Сначала мы загружаем программу в адрес 1000h, затем в 2000h. Все абсолютные должны измениться.
Linker создает в перемещаемых файлах таблицу настроек адресов – список адресов программы относительно её начала. Эта таблица изменяется при загрузке.
Как добраться до API? В UNIX API – это набор библиотечных функций С.
FILE *fp=open(“…”);
open – и есть функция API.
Библиотека функций API в памяти постоянна.
E
LF:
open адрес в памяти
функции open.
Связывание
В Windows все системные функции лежат в исполняемых файлах .dll типа PE
Формат .exe и .dll одинаковый. Dll – это набор функций, которые вызываются из exe.
Kernel32.dll, user32.dll, gdi32.dll – базовый набор функций API Windows.
Kernel32 – работа с файлами, gdi32 – базовая графика, user32 – интерфейс пользователя.
Аналог open – CreateFile из kernel32.dll. Вместо функций С вызывается соответствующая функция из Dll-файлов, при этом файлы подгружаются в память. Kernel32.dll висит в памяти все время.
Виды многозадачности:
1)Вытесняющая – ОС делит время между задачами, гарантируя, что достанется каждой.
2) Кооперативная – сама программа решает, когда дать другим поработать (реализована в Win3.x).
