Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_ОПЕРАЦИОННЫЕ СИСТЕМЫ.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
642.56 Кб
Скачать

3. Загрузка программ

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

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

Для того чтобы не путаться, давайте будем называть программой ту часть за­грузочного модуля, которая содержит исполняемый код. Результат загрузки программы в память будем называть процессом или, если нам надо отличать загруженную программу от процесса ее исполнения, образом процесса. К образу процесса иногда причисляют не только код и данные процесса подвергнутые преобразованию как в процессе загрузки, так и в процессе боты программы), но и системные структуры данных, связанные с этим процессом. В старой литературе процесс часто называют задачей.

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

В рамках одного процесса может исполняться один или несколько потоков или нитей управления. Это понятие будет подробнее разбираться в главе 8.

Некоторые системы предоставляют и более крупные структурные единицы, чем процесс. Например, в системах семейства Unix существуют группы процессов, которые используются для реализации логического объединения процессов в задания (job). Ряд систем имеют также понятие сессии — сово­купности всех заданий, которые пользователь запустил в рамках одного сеанса работы. Впрочем, соответствующие концепции часто плохо определены, а их смысл сильно меняется от одной ОС к другой, поэтому мы практически не будем обсуждать эти понятия.

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

Однако в наиболее распространенных ныне ОС семейств Unix и Win32 принято задачу называть процессом, а процесс — нитью (tread). Этой терминологии мы и будем придерживаться, кроме тех случаев, когда будем обсуждать примеры из жизни ОС, в которой принята иная термино­логия.

Создание процессов в Unix

В системах семейства Unix новые процессы создаются системным вызовом fork. Этот вызов создает два процесса, образы которых в первый момент пол­ностью идентичны, у них различается только значение, возвращенное вызовом fork. Типичная программа, использующая этот вызов, выглядит так, как пред­ставлено в примере 3.1.

При этом каждый из процессов имеет свою копию всех локальных и статиче­ских переменных. На процессорах со страничным диспетчером памяти физиче­ского копирования не происходит. Изначально оба процесса используют одни и те же страницы памяти, а дублируются только те из них, которые были измене­ны. На системах, не имеющих страничного или сегментного диспетчера памяти, fork требует копирования адресных пространств, что приводит к большим на­кладным расходам, да и просто не всегда возможно.

Если мы хотим запустить другую программу, то мы должны исполнить систем­ный вызов из семейства exec. Вызовы этого семейства различаются только способом передачи параметров. Все они прекращают исполнение текущего об­раза процесса и создают новый процесс с новым виртуальным адресным про­странством, но с тем же идентификатором процесса. При этом у нового про­цесса будет тот же приоритет, будут открыты те же файлы (это часто используется), и он унаследует ряд других важных характеристик.

Несколько неожиданное, но тем не менее верное описание действия exec — это замена образа процесса в рамках того же самого процесса.

Запуск другой программы в UNIX выглядит примерно так, как представлено в примере 3.2.

Программа в примере 3.2 запускает командный интерпретатор /bin/sh, извест­ный как Bourne shell, приказывает ему исполнить команду is -1 и перенаправ­ляет стандартный вывод этой команды в файл ls.log.

Техника программирования, основанная на fork/exec, несколько отличается от принятой во многих других современных системах, в том числе Win32, так при создании нового процесса мы сразу же указываем программу, которую она будет исполнять.

Но вернемся к способам загрузки программ.