Главная страница

Лекция 1 - Среда исполнения. Среда исполнения введение


Скачать 155.5 Kb.
НазваниеСреда исполнения введение
Дата24.03.2022
Размер155.5 Kb.
Формат файлаdoc
Имя файлаЛекция 1 - Среда исполнения.doc
ТипПрограмма
#412377
страница1 из 7
  1   2   3   4   5   6   7

СРЕДА ИСПОЛНЕНИЯ

Введение


В данном разделе изучается среда исполнения программ в Unix. Вы ознакомитесь с понятием процесса, основными атрибутами процесса и методами доступа к этим атрибутам.

Определение процесса


Процессом называется экземпляр исполняющейся программы вместе с данными этой программы и набором атрибутов, хранящихся в ядре операционной системы. Например, файл /bin/date - это программа. Каждый раз при запуске этой программы создаётся процесс, который выполняет считывание показаний системных часов, переводит их в читаемый человеком формат и выводит на терминал.

Каждый процесс в Unix имеет идентификатор процесса (process id, pid). Строго говоря, этот идентификатор не является уникальным: система переиспользует свободные значения идентификаторов при создании новых процессов. Однако, одновременно в системе не может быть двух процессов с одинаковыми pid.

В разные моменты времени процесс может исполнять разные программы. Переключение исполняемой программы осуществляется вызовом exec(2), который будет изучаться в разделе «Запуск процессов и исполнение программ». Поскольку при замене программы pid процесса и многие другие атрибуты не изменяются, говорят, что это тот же самый процесс, но программа в нем была заменена.

Виртуальная память


Системы семейства Unix работают на машинах с диспетчером памяти и используют виртуальную память. Диспетчер памяти — это устройство, осуществляющее трансляцию виртуальных адресов в физические. Обычно диспетчер памяти осуществляет трансляцию на основе таблиц, формируемых операционной системой. Главная функция виртуальной памяти — это защита процессов друг от друга, а ядра системы — от процессов.

Ошибки работы с памятью, например, обращения по неинициализированным указателям или выход индекса за границы массива могут приводить к повреждению кода и данных программы, что, в свою очередь, может приводить к записи повреждённых данных в файлы, то есть к потере данных. Также, злоумышленник может модифицировать код ядра или других процессов для совершения различных вредоносных действий: доступа к чужим данным, запуска саморазмножающихся программ («вирусов»), рассылки «спама» и т. д. Чтобы защититься от всего этого, ОС при помощи диспетчера памяти ограничивает диапазоны адресов, к которым может обращаться пользовательская программа, и отображает эти диапазоны адресов разных процессов на разные страницы физической памяти. Таким образом, процесс не может обратиться к памяти ядра или другого процесса.

Все процессоры с диспетчером памяти имеют хотя бы два разных режима работы с разным уровнем привилегий (у некоторых процессоров таких режимов больше). Unix использует два режима: режим с высшим уровнем привилегий, называемый системным, и режим с низшим уровнем привилегий, называемый пользовательским.

В системном режиме, код может менять настройки диспетчера памяти, осуществлять доступ к внешним устройствам, менять некоторые настройки самого процессора, а также переключать режим, то есть переходить в пользовательский режим. Внешние прерывания и аппаратные исключения, например, исключение по делению на ноль, приводят к переключению в системный режим. В пользовательском режиме все перечисленное запрещено, за исключением переключения режима.

В пользовательском режиме доступна специальная команда. У разных процессоров эта команда называется по разному, например, у PDP-11 — EMT, у Intel 80286 — вызов шлюза, у современных процессоров x86 производства Intel – SYSCALL. Эта команда переключает режим на системный и одновременно с этим передаёт управление по определённому адресу. Таким образом, гарантируется, что пользователь не может исполнить произвольный код в привилегированном режиме.

Код, исполняющийся в привилегированном режиме, называется системным, или кодом ядра. Код, исполняющийся в пользовательском режиме, называется пользовательским, даже если этот код, как стандартная библиотека языка C или стандартные утилиты, такие, как /bin/date, поставляется вместе с системой.

Точка, в которую передаёт управление команда включения системного режима, называется диспетчером системных вызовов. Пользовательский код использует вызовы этой точки для передачи ядру запросов на исполнение различных функций, которые он не может выполнять сам: запросов на ввод-вывод, на получение дополнительной памяти (это требует изменения настроек диспетчера памяти), для взаимодействия с другими процессами, для получения информации из системных структур данных и т.д.

Ядро, строго говоря, не является процессом в. Ядро не имеет идентификатора процесса и других атрибутов процесса. Во многих Unix-системах есть процессы, весь код которых исполняется в режиме ядра. Так, в Solaris существует процесс sched, имеющий pid=0. Его можно увидеть, выведя список всех процессов командой pid -aef. Эти процессы не являются самим ядром, они задействуют лишь часть кода ядра и работают лишь с частью его данных. Фактически, это нити исполнения, которые ядро создаёт для выполнения различных задач.
  1   2   3   4   5   6   7


написать администратору сайта