КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Распределение памяти
Ядро постоянно располагается в оперативной памяти, наряду с выполняющимся в данный момент процессом. В процессе компиляции программа-компилятор генерирует последовательность адресов, являющихся адресами переменных и информационных структур, а также адресами инструкций и функций. Компилятор генерирует адреса для виртуальной машины так, словно на физической машине не будет выполняться параллельно с транслируемой ни одна другая программа. Когда программа запускается на выполнение, ядро выделяет для нее место в оперативной памяти, при этом совпадение виртуальных адресов, сгенерированных компилятором, с физическими адресами совсем необязательно. Ядро, взаимодействуя с аппаратными средствами, транслирует виртуальные адреса в физические, т.е. отображает адреса, сгенерированные компилятором, в физические, машинные адреса. Такое отображение опирается на возможности аппаратных средств, поэтому компоненты системы UNIX, занимающиеся им, являются машинно-зависимыми. Например, отдельные вычислительные машины имеют специальное оборудование для подкачки выгруженных страниц памяти. АРХИТЕКТУРА ОПЕРАЦИОННОЙ СИСТЕМЫ UNIX. На Рис.58 представлена блок-схема ядра системы, отражающая состав модулей, из которых состоит ядро, и их взаимосвязи друг с другом. В частности, на ней слева изображена файловая подсистема, а справа подсистема управления процессами, две главные компоненты ядра. Эта схема дает логическое представление о ядре, хотя в действительности в структуре ядра имеются отклонения от модели, поскольку отдельные модули испытывают внутреннее воздействие со стороны других модулей. Схема на Рис. 58 имеет три уровня: уровень пользователя, уровень ядра и уровень аппаратуры. Обращения к операционной системе и библиотеки составляют границу между пользовательскими программами и ядром, проведенную на Рис.58. Обращения к операционной системе выглядят так же, как обычные вызовы функций в программах на языке Си, и библиотеки устанавливают соответствие между этими вызовами функций и элементарными системными операциями. При этом программы на ассемблере могут обращаться к операционной системе непосредственно, без использования библиотеки системных вызовов. Программы часто обращаются к другим библиотекам, таким как библиотека стандартных подпрограмм ввода-вывода, достигая тем самым более полного использования системных услуг. Для этого во время компиляции библиотеки связываются с программами и частично включаются в программу пользователя. Далее проиллюстрированы эти моменты на примере. На рисунке совокупность обращений к операционной системе разделена на те обращения, которые взаимодействуют с подсистемой управления файлами, и те, которые взаимодействуют с подсистемой управления процессами. Файловая подсистема управляет файлами, размещает записи файлов, управляет свободным пространством, доступом к файлам и поиском данных для пользователей. Процессы взаимодействуют с подсистемой управления файлами, используя при этом совокупность специальных обращений к операционной системе, таких как open (для того, чтобы открыть файл на чтение или запись), close, read, write, stat (запросить атрибуты файла), chown (изменить запись с информацией о владельце файла) и chmod (изменить права доступа к файлу). Подсистема управления файлами обращается к данным, которые хранятся в файле, используя буферный механизм, управляющий потоком данных между ядром и устройствами внешней памяти. Буферный механизм, взаимодействуя с драйверами устройств ввода-вывода блоками, инициирует передачу данных к ядру и обратно. Драйверы устройств являются такими модулями в составе ядра, которые управляют работой периферийных устройств. Устройства ввода-вывода блоками относятся к типу запоминающих устройств с произвольной выборкой; их драйверы построены таким образом, что все остальные компоненты системы воспринимают эти устройства как запоминающие устройства с произвольной выборкой. Например, драйвер запоминающего устройства на магнитной ленте позволяет ядру системы воспринимать это устройство как запоминающее устройство с произвольной выборкой. Подсистема управления файлами также непосредственно взаимодействует с драйверами устройств "неструктурированного" ввода-вывода, без вмешательства буферного механизма. К устройствам неструктурированного ввода-вывода, иногда именуемым устройствами посимвольного ввода-вывода (текстовыми), относятся устройства, отличные от устройств ввода-вывода блоками. Рис. 58. Блок-схема ядра операционной системы
Подсистема управления процессами отвечает за синхронизацию процессов, взаимодействие процессов, распределение памяти и планирование выполнения процессов. Подсистема управления файлами и подсистема управления процессами взаимодействуют между собой, когда файл загружается в память на выполнение: подсистема управления процессами читает в память исполняемые файлы перед тем, как их выполнить. Примерами обращений к операционной системе, используемых при управлении процессами, могут служить fork (создание нового процесса), exec (наложение образа программы на выполняемый процесс), exit (завершение выполнения процесса), wait (синхронизация продолжения выполнения основного процесса с моментом выхода из порожденного процесса), brk (управление размером памяти, выделенной процессу) и signal (управление реакцией процесса на возникновение экстраординарных событий). Модуль распределения памяти контролирует выделение памяти процессам. Если в какой-то момент система испытывает недостаток в физической памяти для запуска всех процессов, ядро пересылает процессы между основной и внешней памятью с тем, чтобы все процессы имели возможность выполняться. Есть два способа управления распределением памяти: выгрузка (подкачка) и замещение страниц. Программу подкачки иногда называют планировщиком, т.к. она "планирует" выделение памяти процессам и оказывает влияние на работу планировщика центрального процессора. Однако в дальнейшем мы будем стараться ссылаться на нее как на "программу подкачки", чтобы избежать путаницы с планировщиком центрального процессора. Модуль "планировщик" распределяет между процессами время центрального процессора. Он планирует очередность выполнения процессов до тех пор, пока они добровольно не освободят центральный процессор, дождавшись выделения какого-либо ресурса, или до тех пор, пока ядро системы не выгрузит их после того, как их время выполнения превысит заранее определенный квант времени. Планировщик выбирает на выполнение готовый к запуску процесс с наивысшим приоритетом; выполнение предыдущего процесса (приостановленного) будет продолжено тогда, когда его приоритет будет наивысшим среди приоритетов всех готовых к запуску процессов. Существует несколько форм взаимодействия процессов между собой от асинхронного обмена сигналами о событиях до синхронного обмена сообщениями. Наконец, аппаратный контроль отвечает за обработку прерываний и за связь с машиной. Такие устройства, как диски и терминалы, могут прерывать работу центрального процессора во время выполнения процесса. При этом ядро системы после обработки прерывания может возобновить выполнение прерванного процесса. Прерывания обрабатываются не самими процессами, а специальными функциями ядра системы, перечисленными в контексте выполняемого процесса. Модуль распределения памяти контролирует выделение памяти процессам. Если в какой-то момент система испытывает недостаток в физической памяти для запуска всех процессов, ядро пересылает процессы между основной и внешней памятью с тем, чтобы все процессы имели возможность выполняться. Есть два способа управления распределением памяти: выгрузка (подкачка) и замещение страниц. Программу подкачки иногда называют планировщиком, т.к. она "планирует" выделение памяти процессам и оказывает влияние на работу планировщика центрального процессора. Однако в дальнейшем мы будем стараться ссылаться на нее как на "программу подкачки", чтобы избежать путаницы с планировщиком центрального процессора. Модуль "планировщик" распределяет между процессами время центрального процессора. Он планирует очередность выполнения процессов до тех пор, пока они добровольно не освободят центральный процессор, дождавшись выделения какого-либо ресурса, или до тех пор, пока ядро системы не выгрузит их после того, как их время выполнения превысит заранее определенный квант времени. Планировщик выбирает на выполнение готовый к запуску процесс с наивысшим приоритетом; выполнение предыдущего процесса (приостановленного) будет продолжено тогда, когда его приоритет будет наивысшим среди приоритетов всех готовых к запуску процессов. Существует несколько форм взаимодействия процессов между собой от асинхронного обмена сигналами о событиях до синхронного обмена сообщениями. Наконец, аппаратный контроль отвечает за обработку прерываний и за связь с машиной. Такие устройства, как диски и терминалы, могут прерывать работу центрального процессора во время выполнения процесса. При этом ядро системы после обработки прерывания может возобновить выполнение прерванного процесса. Прерывания обрабатываются не самими процессами, а специальными функциями ядра системы, перечисленными в контексте выполняемого процесса.
ПРОЦЕССЫ
UNIX является и многопользовательской, и многозадачной системой. Достаточно мощный ЦП может выделить квант времени одной программе, затем переключиться на обслуживание другой, и так далее, что создает иллюзию одновременного выполнения ("квантование времени"). В каждый конкретный момент времени ОЗУ содержит не только объектный код активной программы, но и объектный код определенного числа приостановленных программ, а также различные области данных, содержащие промежуточные результаты этих программ. Большая часть ядра ОС (а иногда и все ядро) также должна быть резидентной в ОЗУ. Более современный термин "многозадачность" включает в себя понятие мультипрограммирования, но расширяет эту концепцию и предполагает возможность одновременного выполнения отдельных частей одной и той же программы (которые называются нитями или потоками). Большинство программ можно интерпретировать как последовательность более мелких элементов, которые называются задачами. Иногда такие задачи должны выполняться синхронно, то есть выполняться и завершаться поочередно и по одной, так, например, для выполнения задачи 2 могут потребоваться результаты задачи 1. В других случаях некоторые или все задачи в программе могут выполняться независимо (или асинхронно). Есть, конечно, и смешанные ситуации. Термины "программа" и "задача" довольно туманны: программный код теоретически и практически можно разбить на фрагменты по-разному. Программист может сформировать программу путем компиляции и компоновки множества мелких программ или модулей. При выполнении такие программы могут вызывать другие программы и подпрограммы, часть из которых могут представлять собой системные вызовы - предусмотренные в ОС базовые обслуживающие программы. Поэтому с одной стороны программа - это подготавливаемый программистом исходный код, с другой - скомпилированный двоичный файл на диске, а с третьей - двоичный код, находящийся в ОЗУ и ожидающий планирования. Процесс и программа не идентичные понятия. Во-первых, существуют процессы, которым не соответствует никакой программы (т. е. исполняемого файла). Во-вторых, программа в ходе своего выполнения может породить более одного процесса. А в-третьих, при запуске программы порождение нового процесса (системный вызов fork) предшествует собственно запуску программы (системный вызов exec). С технической точки зрения, образ программы представляет собой выполняемую программу в двоичном виде (которую не совсем верно называют сегментом текста), а также различные структуры данных, содержащие контекст программы, и две ее рабочих области - сегмент данных и стек. Упрощенная версия образа программы UNIX показана на рис.59.
Рис. 59. Схема образа программы
Когда вызывается какая-либо команда, командный процессор загружает образ программы (через вызов ядра) и начинает новый процесс с уникальным числовым идентификатором процесса (PID). Все последующие ссылки на этот процесс (как пользователей, так и других процессов) осуществляется через идентификатор процесса, а не имя исходной команды. Идентификаторы процессов 0 и 1 резервируются для специальных процессов, создаваемых при загрузке. Если выполняемую команду вызывает другой пользователь, то создается новый процесс с другим идентификатором. Однако для нового процесса не всегда нужен новый образ программы, так как при выполнении одной и той же программы процессы могут совместно использовать сегмент текста ее образа. Существуют, с одной стороны, процессы системные и прикладные, с другой — интерактивные и неинтерактивные. Первые порождаются ядром и не имеют соответствующих им программ (исполнимых файлов). Функция их, в первую очередь — управление виртуальной памятью, свопингом и т. д. К системным относят и процесс init. Это вызвано тем, что, хотя он и не является частью ядра, запускаясь из исполняемого файла, он является прародителем всех остальных процессов. Все прочие протекающие в системе процессы относят, как правило, к категории прикладных. Они разделяются на процессы интерактивные или неинтерактивные (все системные процессы - неинтерактивны). Первые обычно порождаются в рамках пользовательского сеанса работы, привязаны к определенному терминалу (реальному или виртуальному - тому, с которого они стартовали) и имеют своего хозяина, т. е. запустившего процесс пользователя. Неинтерактивные процессы именуются обычно демонами (daemon - Disk And Execution MONitor). Они инициируются самой системой при ее загрузке обычным образом (запуском соответствующих программ) и функционируют в фоновом режиме, активизируясь при требовании соответствующей функции (печати, доставки почты и т. д.). Не будучи при этом привязанными к какому-либо терминалу, реальному или виртуальному. Каждый выполняемый процесс будет выбираться для выполнения согласно своему приоритету, который может устанавливаться и изменяться. Обычно процесс выполняется до завершения, а затем прекращает свое существование. Процесс может также завершиться в результате возникновения какой-то ошибки или сигнала (такого как kill) от пользователя или другого процесса. При завершении процесса он удаляется из таблицы процессов, а занятая им ОП освобождается для новых процессов. Когда работает процесс А, он может порождать другой процесс, процесс В. Говорят, что процесс В является дочерним процессом процесса А, а процесс А называется родительским процессом. Помимо собственного идентификатора, каждый процесс имеет атрибут PPID, то есть идентификатор родительского процесса. Атрибутами процесса являются: - идентификатор процесса и его родителя; - его приоритет; - реальный и эффективный идентификаторы пользователя; - реальный и эффективный идентификаторы группы пользователей. Для получения информации о протекающих в системе процессах и их атрибутах служит команда ps.
Дата добавления: 2014-01-06; Просмотров: 360; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |