Понятие процесса и ядра. Сегментация виртуального адресного пространства процесса

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

Вычислительный процесс или процесс (называемый иногда «задача») – выполнение отдельной программы с ее данными на последовательном процессоре. Определение концепции «процесса» помогает осуществить механизмы управления и распределения ресурсов вычислительной системы. Понятие процесса было введено для реализации идей мультипрограммирования, а понятие треда, было введено для реализации принципов распараллеливания работы внутри пространства ресурсов используемых процессом. Отличие потоков, тредов или нитей от процессов заключается в следующем:

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

предоставить соответствующему потоку доступ к ресурсу процессорного времени.

Ресурсом – принято называть повторно используемые, относительно стабильные и часто недостающие объекты, которые запрашиваются, используются и освобождаются процессами в период активности.

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

Схема классификации ресурсов приведена на рис.2.

Рис.2 Классификация ресурсов вычислительной системы

 

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

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

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

В состав ядра входят функции, решающие внутрисистемные задачи организации вычислительного процесса, такие как переключение контекстов, загрузка/выгрузка станиц, обработка прерываний. Эти функции недоступны для приложений. Другой класс функций ядра служит для поддержки приложений, создавая для них так называемую прикладную программную среду. Приложения могут обращаться к ядру с запросами — системными вызовами — для выполнения тех или иных действий, например для открытия и чтения файла, вывода графической информации на дисплей, получения системного времени и т. д. Функции ядра, которые могут вызываться приложениями, образуют интерфейс прикладного программирования — API.

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

Физическая память представляет собой упорядоченное множество ячеек, и все они пронумерованы, то есть к каждой из них можно обратиться, указав ее порядковый номер (адрес). Количество ячеек физической памяти ограничено и фиксировано.

Системное программное обеспечение должно связать каждое указанное пользователем имя с физической ячейкой памяти, то есть осуществить отображение пространства имен па физическую память компьютера. В общем случае это отображение осуществляется в два этапа (рис. 2,5): сначала системой программирования, а затем операционной системой (с помощью специальных программных модулей управления памятью и использования соответствующих аппаратных средств вычислительной системы). Между этими этапами обращения к памяти имеют форму виртуального или логического адреса. При этом можно сказать, что множество всех допустимых значений виртуального адреса для некоторой программы определяет ее виртуальное адресное пространство или виртуальную память. Виртуальное адресное пространство программы прежде всего зависит от архитектуры процессора и от системы программирования и практически не зависит от объема реальной физической памяти, установленной в компьютер. Можно еще сказать, что адреса команд и переменных в готовой машинной программе, подготовленной к выполнению системой программирования, как раз и являются виртуальными адресами.

Рис. 2.5. Память и отображения

 

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

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

- область, занимаемая операционной системой;

- область, в которой размещается исполняемая задача;

- незанятая ничем (свободная) область памяти.

При необходимость создать программу, логическое (и виртуальное) адресное пространство, которой должно быть больше, чем свободная область памяти, или даже больше, чем весь возможный объем оперативной памяти, используется распределение с перекрытом. Этот метод распределения предполагает, что вся программа может быть разбита на части — сегменты. Каждая оверлейная программа имеет одну главную часть (main) и несколько сегментов (segment), причем в памяти машины одновременно могут находиться только ее главная часть и одни или несколько не перекрывающихся сегментов.

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

Разбиение памяти на несколько непрерывных разделов может быть произведено либо фиксированным (статическим), либо динамическим (то есть процесс выделения новою раздела памяти происходит непосредственно при появлении новой задачи) способом.

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

- первый подходящий участок;

- самый подходящий участок;

- самый неподходящий участок.