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

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

    Вся функциональность операционной системы в конечном счете определяется выполнением тех или иных процессов, как и уровни выполнения системы (run levels) представляют собой ни что иное, как удобную форму определения группы выполняющихся процессов. Возможность терминального или сетевого доступа к системе, различные сервисы, традиционные для UNIX, — система печати, удаленные архивы FTP, электронная почта и система телеконференций (news) — все это результат выполнения определенных процессов. Процессы в UNIX неотъемлемо связаны с двумя важнейшими ресурсами системы процессором и оперативной памятью. Как правило, этих ресурсов никогда не бывает "много", и в операционной системе происходит активная конкурентная борьба за право обладания процессором и памятью. И по скольку UNIX является многозадачной системой общего назначения, задача справедливого распределения этого ресурса между задачами различного класса и с различными требованиями является нетривиальной.

    По скольку запущенная на выполнение программа порождает в системе один или болеепроцессов (или задач). Подсистема управления процессами контролирует:

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

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

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

Основы управления процессом

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

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

    Новорожденная операционная система UNIX обеспечивала выполнение всего двух процессов, по одному на каждый подключенный к PDP-7 терминал. Спустя год, на той же PDP-7 число процессов заметно увеличилось, появился системный вызов fork. В Первой редакции UNIX появился вызов ехес,  но операционная система по прежнему позволяла размещать в памяти только один процесс в каждый момент времени. После реализации аппаратной подсистемы управления памятью на PDP-11 операционная система была модифицирована, что позволило загружать в память сразу несколько процессов, уменьшая тем самым время на сохранение образа процесса во вторичной памяти (на диске) и считывание его, когда процесс продолжал выполнение. Однако до 1972 года UNIX нельзя было назвать действительно многозадачной системой, т. к. операции ввода/вывода оставались синхронными, и другие процессы не могли выполняться, пока их "коллега" не завершал операцию ввода/вывода. Истинная многозадачность появилась только после того, как код UNIX был переписан на языке С в 1973 году. С тех пор основы управления процессами практически не изменились.

 Выполнение процесса может происходить в двух режимах — в режиме ядра (kernel mode) или в режиме задачи (user mode). В режиме задачи процесс выполняет инструкции прикладной программы, допустимые на непривилегированном уровне защиты процессора. При этом процессу недоступны системные структуры данных. Когда процессу требуется получение каких либо услуг ядра, он делает системный вызов, который выполняет инструкции ядра, находящиеся на привилегированном уровне. 

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

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

Структуры данных процесса

    Каждый процесс представлен в системе двумя основными структурами данных proc и user, описанными, соответственно, в файлах sys/proc.h и sys/user.h. Содержимое и формат этих структур различны для разных версий UNIX. 

https://ru.wikipedia.org/wiki/Procfs

https://www.opennet.ru/docs/RUS/lkmpg/node16.html

https://www.opennet.ru/docs/RUS/kernel2prog/linux_khg_03.html

http://linux.yaroslavl.ru/docs/setup/mandrake/cl/proc-fs.html

http://www.ibm.com/developerworks/ru/library/l-proc/   <--------

https://m.habr.com/ru/company/*nix   <----------

   В любой момент времени данные структур proc для всех процессов должны присутствовать в памяти, хотя остальные структуры данных, включая образ процесса, могут быть перемещены во вторичную память, область свопинга. Это позволяет ядру иметь под рукой минимальную информацию, необходимую для определения местонахождения остальных данных, относящихся к процессу, даже если они отсутствуют в памяти. Структура proc является записью системной таблицы процессов, которая, как мы только что заметили, всегда находится в оперативной памяти. Запись этой таблицы для выполняющегося в настоящий момент процесса адресуется системной переменной curproc. Каждый раз при переключении контекста, когда ресурсы процессора передаются другому

процессу, соответственно изменяется значение переменной curproc, которая теперь указывает на структуру proc активного процесса. Вторая упомянутая структура user, также называемая u-area или u-block, содержит дополнительные данные о процессе, которые требуются ядру только во время выполнения процесса (т. е. когда процессор выполняет инструкции процесса в режиме ядра или задачи). В отличие от структуры proc, адресованной указателем curproc, данные user размещаются

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

В u-area хранятся данные, которые используются многими подсистемами ядра и не только для управления процессом. В частности, там содержится информация об открытых файловых дескрипторах, диспозиция сигналов, статистика выполнения процесса, а также сохраненные значения регистров, когда выполнение процесса приостановлено. Очевидно, что процесс не должен иметь возможности модифицировать эти данные произвольным образом, поэтому u-area защищена от доступа в режиме задачи. Как видно из рис., u-area также содержит стек фиксированного размера, системный стек или стек ядра (kernel stack). При выполнении процесса в режиме ядра операционная система использует этот стек, а не обычный стек процесса.

Состояния процесса

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

    Необходимо отметить, что не все процессы проходят через все множество состояний, приведенных выше.Процесс начинает свой жизненный путь с состояния 6, когда родительский процесс выполняет системный вызов fork(). После того как создание процесса полностью завершено, процесс завершает "дочернюю часть" вызова и переходит в состояние 3 готовности к запуску, ожидая своей очереди на выполнение. Когда планировщик выбирает процесс для выполнения, он переходит в состояние 1 и выполняется в режиме задачи. Выполнение в режиме задачи завершается в результате системного вызова или прерывания, и процесс переходит режим ядра, в котором выполняется код системного вызова или прерывания. После этого процесс опять может вернуться в режим задачи. Однако во время выполнения системного вызова в режиме ядра процессу может понадобиться недоступный в данный момент ресурс. Для ожидания доступа к такому ресурсу, процесс вызывает функцию ядра sleep() и переходит в состояние сна 4. При этом процесс добровольно освобождает вычислительные ресурсы, которые предоставляются следующему наиболее приоритетному процессу. Когда ресурс становится доступным, ядро "пробуждает процесс", используя функцию wakeup() помещает его в очередь на выполнение, и процесс переходит в состояние "готов к запуску" 3.

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

    Таким образом, после того как планировщик выбрал процесс на запуск, последний начинает свое выполнение в режиме ядра, где завершает переключение контекста. Дальнейшее состояние процесса зависит от его предыстории: если процесс был только что создан или был прерван, возвращаясь в режим задачи, он немедленно переходит в этот режим. Если процесс начинает выполнение после состояния сна, он продолжает выполняться в режиме ядра, завершая системный вызов. Заметим, что такой процесс может быть прерван после завершения системного вызова в момент перехода из режима ядра в режим задачи, если в очереди существует более высокоприоритетный процесс. В UNIX 4xBSD определены дополнительные состояния процесса, в первую очередь связанные с системой управления заданиями и взаимодействием процесса с терминалом. Процесс может быть переведен в состояние "остановлен" с помощью сигналов останова SIGSTOP, SIGTTIN или SIGTTOU. В отличие от других сигналов, которые обрабатываются только для выполняющегося процесса, отправление этих сигналов приводит к немедленному изменению состояния В этом случае, если процесс выполняется или находится в очереди  на запуск, его состояние изменяется на "остановлен". Если же процесс находился в состоянии сна, его состояние изменится на "остановлен в состоянии сна". Выход из этих состояний осуществляется сигналом  продолжения SIGCONT, при этом из состояния "остановлен" процесс переходит в состояние "готов к запуску", а для процесса, остановленного в состоянии сна, следующим пунктом назначения является продолжение "сна". 

Описанные возможности полностью реализованы и в SVR4.

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

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

Принципы управления памятью

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

по некоторой системе признаков и разделяются на: внешняя и внутренняя память, первичная и вторичная, оперативная память, буферная память, регистровая память.

Иерархия организации:

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


Байт 8 бит, это элементарная единица пересылки информации(команд и данных) все остальные единицы кратны байту, то есть 16,32,64 бита, слово, двойное слово и тд., байт единица адресуемой памяти. Булева переменная (любая 0 или 1) равна одному байту. Причина в скорости передачи информации.

Итого: Бит наименьшая единица предоставления информации, Байт наименьшая единица обработки и передачи информации.

 Маршал Кирк МакКузик FreeBSD - Архитектура и реализация <<-----------PDF ст.166

 Ю.Вахалия UNIX изнутри                                                             <<---------- PDF ст.578

 Организация памяти - Олов, Цилкер                                          <<-----------PDF ст.230

Управление памятью часть-1    http://cs.mipt.ru/wp

12:51 - Разрешение адресов  34:21 - Оверлейная,динамическая структуры  

59:26 - Линейное непрерывное отображение - Кусочно линейное (ст.25)

Управление памятью часть-2  



........что было в начале? ООП или виртуальная память.  https://www.youtube.com/playlist

51:44--> "Виртуальная память";  <-(стр. 18)->  56:03-->  "Сегменты";  01:17:00 (ст.23)-->  TLB    Таненбаум <--- Управление памятью г.4  ст.217   01:36--> associative memory

          

Простейшие способы выделения памяти на примере DOS  https://www.youtube.com


MCB

Буфер ассоциативной трансляции, Translation lookaside buffer (TLB) — это специализированный кэш центрального процессора, используемый для ускорения трансляции адреса виртуальной памяти в адрес физической памяти.

https://ru.wikipedia.org

https://www.ibm.com/support/knowledgecenter/.performance/cache_tlbs.htm

Shared memory (разделяемая память) - осуществление обмена информацией через общий для процессов сегмент памяти без использования системных вызовов ядра.

Ю.Вахалия UNIX изнутри        ст.254

http://heap.altlinux.org/tmp/unix_base/ch01s03.html

АП 

Ассоциативная память, 

Память адресуемая по содержанию,

Контентно адресуемая память, 

Ассоциативнвный массив

Ассоциативное запоминающее устройство АЗУ 


ОЗУ

Оперативная память

Оперативно запоминающее устройство

Память с произвольным доступом Random Access Memory, RAM

First-Come, First-Served (FCFS)

Простейшим алгоритмом планирования – первым пришел, первым обслужен.

FIFO - first in, first out — «первым пришёл — первым ушёл — способ организации и манипулирования данными относительно времени и приоритетов. Это выражение описывает принцип технической обработки очереди или обслуживания конфликтных требований путём упорядочения процесса по принципу: «первым пришёл — первым обслужен» (ПППО)

LIFO - last in, first out, «последним пришёл — первым ушёл — способ организации и манипулирования данными относительно времени и приоритетов. В структурированном линейном списке, организованном по принципу LIFO, элементы могут добавляться и выбираться только с одного конца, называемого «вершиной списка».

Стек (stack — стопка) — абстрактный тип данных, представляющий собой список элементов, организованных по принципу LIFO. Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю. В цифровом вычислительном комплексе стек называется магазином — по аналогии с магазином в огнестрельном оружии (стрельба начнётся с патрона, заряженного последним). В 1946 Алан Тьюринг ввёл понятие стека. А в 1957 году немцы Клаус Самельсон и Фридрих Л. Бауэр запатентовали идею Тьюринга.


Лекция 9 Способы представления информации в ЭВМ и методы адресации.mp4

15:26 погрешность представления двоичных чисел

34:19 сегментная адресация

    Одной из основных функций операционной системы является эффективное управление памятью.

Оперативная память, или основная память, или память с произвольным доступом (Random Access Memory, RAM). Время доступа к оперативной памяти составляет всего несколько циклов процессора, поэтому работа с данными, находящимся в памяти, обеспечивает максимальную производительность. Данный ресурс, как правило, ограничен. В большей степени это справедливо для многозадачной операционной системы общего назначения, каковой является UNIX. Поэтому данные, которые не могут быть размещены в оперативной памяти, располагаются на вторичных устройствах  хранения, или во вторичной памяти, роль которой обычно выполняют дисковые накопители. Время доступа ко вторичной памяти на несколько порядков превышает время доступа к оперативной памяти и требует активного содействия операционной системы.

    Подсистема управления памятью UNIX отвечает за справедливое и эффективное распределение разделяемого ресурса оперативной памяти между процессами и за обмен данными между оперативной и вторичной памятью. Часть операций производится аппаратно, устройством управления памятью (Memory Management Unit, MMU) процессора под управлением операционной системы, чем достигается требуемое быстродействие.

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

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

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

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

PS: LINUX

И того: процесс работает с виртуальными адресами, а не с физическими.  Преобразование происходит посредством вычислений, используя таблицы дескрипторов, и каталоги таблиц, в общем и целом "ТАБЛИЦЫ" как и во всей вычислительной технике, структуры сопоставления, сравнения чего то с чем то. (Н.Вирт "Алгоритмы и структуры данных"   PDF)

Linux поддерживает 3 уровня таблиц: 

Реально конкретным процессором могут поддерживаться не все уровни, но запас позволяет поддерживать больше возможных архитектур (Intel имеет 2 уровня таблиц, а Alpha - целых 3). Преобразование виртуального адреса в физический происходит соответственно в 3 этапа. Берется указатель PGD, имеющийся в структуре описывающий каждый процесс, преобразуется в указатель записи PMD, а последний преобразуется в указатель в таблице дескрипторов PTE. И, наконец, к реальному адресу, указывающему на начало страницы прибавляют смещение от ее начала. Хороший пример подобной процедуры можно посмотреть в функции ядра <partial_clear>.

http://citforum.ru/operating_systems/articles/linuxmem.shtml

Виртуальная и физическая память

    Оперативная память является, одним из важных компонентов компьютерной системы.  Ранние системы UNIX имели в своем распоряжении 64 Кбайт оперативной памяти, и это количество было явно недостаточным, современные компьютеры обладают гигабайтами оперативной памяти, и это все равно мало.

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

Все перечисленные проблемы преодолимы с помощью виртуальной памяти.

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

    Виртуальное адресное пространство —  рай для процесса.

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


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

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

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

Механизм отображения виртуальных адресов в физические (трансляция адреса) существенным образом зависит от конкретной аппаратной реализации. В этом разделе рассмотривается механизм отображения виртуальных адресов в физические в операционной системе SCO UNIX на примере семейства процессоров Intel. Однако, как и для остальных подсистем UNIX, основные принципы отличаются мало, и данное изложение поможет представить механизмы управления памятью и разобраться, при необходимости, в конкретной реализации.

Двухмерное адресное пространство. Сегменты

http://cs.mipt.ru

Семейство процессоров Intel позволяет разделить память на несколько логических частей, называемых сегментами. При этом адресное пространство процесса может быть представлено в виде нескольких логических сегментов, каждый из которых состоит из непрерывной последовательности адресов,  лежащих в заданном диапазоне. Трансляция адресов, основанная на сегментации, предусматривает однозначное отображение адресов сегмента в непрерывную последовательность физических адресов. Виртуальный адрес при этом состоит из двух частей: селектора сегмента и смещения относительно начала сегмента. Селектор (точнее, поле селектора INDEX) указывает на так называемый дескриптор сегмента, содержащий такие параметры, как его расположение в памяти, размер и права доступа. Процессор поддерживает косвенную адресацию сегментов через дескрипторы сегментов, которые располагаются в специальных таблицах — областях памяти, на которые указывают предназначенные для этого регистры процессора. Ядро операционной системы отвечает за заполнение этих таблиц и установку значений регистров. Другими словами, ядро задает отображение, а процессор выполняет отображение на аппаратном уровне. Благодаря такой косвенной адресации логические сегменты защищены друг от друга, что обеспечивает целостность адресного пространства процесса и ядра.

Дескрипторы сегментов расположены в двух системных таблицах — локальной таблице дескрипторов (Local Descriptor Table — LDT) и глобальной таблице дескрипторов (Global Descriptor Table — GDT). Как следует из названия, LDT обеспечивает трансляцию виртуальных адресов сегментов процесса, в то время как GDT обслуживает адресное пространство ядра (например, при обработке системного вызова или прерывания).Для каждого процесса создается собственная LDT, в то время как GDT разделяется всеми процессами. Информация о таблице, на которую указывает селектор, находится в самом селекторе.

Селектор сегмента

INDEX     TI     RPL


Каждая запись LDT или GDT является дескриптором сегмента. Определено несколько типов дескрипторов, используемых для сегментов кода, данных и стека, а также ряд дескрипторов,

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

Дескрипторы, используемые в последнем случае, называются шлюзами.

Дескрипторы сегментов (кода, данных, стека) имеют несколько полей:

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

Если страничный механизм не используется, полученный линейный адрес является физическим, используемым для непосредственного доступа к оперативной памяти. Однако реализация виртуальной памяти, основанная только на сегментах, не обладает достаточной гибкостью и не используется в современных версиях. Управление памятью в большинстве систем основано на страничном механизме. Сегменты используются ядром для размещения кода, данных и стека процесса, причем каждый из них имеет нулевой базовый адрес и предел — 3 Гбайт, т. е. всю адресуемую виртуальную память за вычетом 1 Гбайт, занимаемых ядром системы. Распределение виртуального адресного пространства между ядром и процессами рассмотрено в "Адресное пространство процесса".

Страничный механизм

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

Страничный механизм обеспечивает гораздо большую гибкость. В этом случае все виртуальное адресное пространство (4 Гбайт для процессоров Intel) разделено на блоки одинакового размера, называемые страницами. Большинство процессоров Intel работает со страницами размером 4 Кбайт. Так же как и в случае сегментации, страница может либо присутствовать в оперативной памяти, либо находиться в области свопинга или исполняемом файле процесса. Основное преимущество такой схемы заключается в том, что система управления памятью оперирует областями достаточно малого размера для обеспечения эффективного распределения ресурсов памяти между процессами.

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

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

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

Наконец, смещение на странице определяется третьим полем, занимающим младшие 12 бит линейного адреса. Таким образом, с помощью одного каталога таблиц процесс может адресовать  

1024 x 1024 x 4096 = 4 Гбайт физической памяти.

На рис. показано, как блок страничной адресации процессора транслирует линейный адрес в физический. Процессор использует поле PDE адреса (старшие 10 бит) в качестве индекса в каталоге таблиц. Найденный элемент содержит адрес таблицы страниц.  Второе поле линейного адреса РТЕ, позволяет процессору выбрать нужный элемент таблицы, адресующий физическую страницу. Складывая адрес начала страницы со смещением,  хранящимся в третьем поле, процессор получает 32-битный физический адрес.

Большинство современных и, в частности, процессоры семейства Intel, помещают данные о нескольких последних использовавшихся ими страницах в сверхоперативный кэш. Только когда процессор не находит требуемой страницы в этом кэше, он обращается к каталогу и таблицам страниц. Как правило 99-98% адресных ссылок попадают в кэш, не требуя для трансляции адреса обращения к оперативной памяти,  где расположены каталог и таблицы.

 

 

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

P Признак присутствия в оперативной памяти. Доступ к странице, отсутствующей в памяти (Р=0) вызывает страничную ошибку, особую ситуацию,о чем процессор информирует ядро, которое обрабатывает ее соответствующим образом.

R/W Права только на чтение страницы (R/W=0)или на чтение и запись (R/W=1)

U/S Привилегии доступа. Если U/S=0, только привилегированные задачи (ядро) имеют доступ к адресам страницы. В противном случае, доступ к странице имеют все задачи.

Адрес Физический адрес начала страницы (адрес базы)