Архитектура операционной системы

Изучение понятия архитектуры ОС - структурной организации операционной системы на основе различных программных модулей. Исследование особенностей интерфейса прикладного программирования. Рассмотрение и характеристика основных принципов построения ядра.

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 21.04.2015
Размер файла 42,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Архитектура операционной системы

1. Ядро и вспомогательные модули ОС

Под архитектурой ОС понимают структурную организацию операционной системы на основе различных программных модулей.

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

Ядро. Состав ядра можно условно разделить на два подкласса:

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

Функции поддержки приложений, создающие так называемую прикладную программную среду. Эти функции образуют интерфейс прикладного программирования - API (application programming interface). Приложения обращаются к ядру с запросами - системными вызовами - для выполнения тех или иных действий (например, для открытия и чтения файла, вывода графической информации на дисплей, получения системного времени).

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

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

Грань между пользовательскими приложениями и ОС является весьма условной. Нередко бывает, что за время существования приложения его статус меняется. Если какое-то приложение оказывается достаточно востребованным, то при очередной модификации операционной системы оно может быть включено в её состав. Например, Web-браузер компании Microsoft изначально являлся отдельным приложением, затем стал частью ОС Windows NT версии 4.0 и Windows 95/98.Вспомогательные модули ОС обычно подразделяются на следующие группы:

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

2. Системные обрабатывающие программы - редакторы, компиляторы, отладчики, компоновщики.

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

4. Библиотеки процедур различного назначения (математических функций, функций ввода/вывода).

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

2. Многослойная структура ОС

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

1 - аппаратура; 2 - ядро ОС; 3 - утилиты, обрабатывающие программы, библиотеки.

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

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

Ядро может состоять из следующих слоев:

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

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

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

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

5. Интерфейс системных вызовов - верхний слой ядра, который взаимодействует непосредственно с приложениями, образуя прикладной программный интерфейс ОС - API.

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

3. Интерфейс прикладного программирования

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

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

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

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

4. Пользовательский интерфейс

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

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

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

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

5. Принципы построения ядра

Монолитное ядро

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

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

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

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

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

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

Системный вызов реализуется посредством программного прерывания

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

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

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

6. Микроядерная архитектура

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

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

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

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

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

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

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

7. Сравнение двух архитектур: достоинства и недостатки

Каждая имеет свои достоинства и недостатки, поэтому ни одна из них не может полностью вытеснить другую. ОС с микроядерной архитектурой удовлетворяет большинству требований, предъявляемых к современной ОС, обладая переносимостью, расширяемостью, надежностью.

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

Надежность системы с микроядром повышается потому, что каждый сервер работает в своей области памяти и не может влиять не только на микроядро, но и на другие модули ОС. Уменьшение кода микроядра также уменьшает вероятность ошибок.

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

Следовательно, ОС на основе микроядра при прочих равных условиях всегда будет менее производительной, чем ОС с классической архитектурой. Этим объясняется то, что микроядерный подход не получил того распространения, которое ему предрекали.

Для повышения производительности ОС некоторые часто используемые приложения вносятся в состав микроядра. Например, в ОС Windows NT 3.1, 3.5 диспетчер окон, графическая библиотека входили в состав сервера пользовательского режима. Частое использование этих приложений снижало производительность всей системы. Поэтому при разработке очередной версии системы - Windows NT 4.0 - эти функции были внесены в микроядро, что существенно повысило эффективность работы системы.

Архитектура большинства современных ОС содержит как черты монолитного ядра, так и элементы микроядерной архитектуры. Один из подходов выбирается в роли базового, с последующими коррективами в сторону альтернативного подхода. Ранее говорилось о необходимости перекомпиляции монолитного ядра для внесения изменений - например, для изменения аппаратных драйверов. В современных UNIX-системах этот недостаток устранен за счет динамической загрузки драйверов устройств. Т.е., хотя драйверы и работают в едином адресном пространстве, они должны иметь четко специфицированный интерфейс с остальной частью ядра ОС, чтобы обеспечить их загрузку в любой момент времени. В ядреLinux разрешена динамическая загрузка любых компонент ядра - т.н. модулей. В момент загрузки модуля его код загружается в адресное пространство ядра и связывается с остальной частью ядра.

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

Операционная система Windows NT, например, хотя и cчитаеться микроядерной, но имеет также и черты классической ОС. Микроядро её слишком сложно и велико, чтобы иметь приставку "микро" (оно занимает более 1 мегабайта). Компоненты ядра взаимодействуют друг с другом путем передачи сообщений, как в микроядерной ОС. Но в то же время они работают в одном адресном пространстве и используют общие структуры данных, как ОС с монолитным ядром. Таким образом, ОС Windows NT с полным правом может называться гибридной.

Литература

1. Островский В.А. Информатика: учебн. Для вузов. М.: Высшая школа, 2000. - 511 с.

2. Фигурнов В.Э. «IBM PC для пользователя». Изд. 7 перераб. и доп. - ИНФРА-М 2000

3. Васильев Б.М. «Операционные системы»: Знание 1990

4. Леонтьев В.П. «Новейшая энциклопедия персонального компьютера». Издательство «ОЛМА-ПРЕСС», Москва, 2003

5. Таненбаум Э. «Современные операционные системы». Издательство «Питер», Санкт-Петербург, 2002г.

Размещено на Allbest.ru

...

Подобные документы

  • Структурная организация операционной системы на основе различных программных модулей. Функции, выполняемые модулями ядра. Модули операционной системы, оформленные в виде утилит. Ядро в привилегированном режиме. Многослойная структура ядра системы.

    презентация [705,2 K], добавлен 16.01.2012

  • Классификация подсистем операционной системы автономного компьютера. Характеристика особенностей аппаратных платформ. Интерфейс прикладного программирования. Архитектура операционной системы с ядром в привилегированном режиме. Основные свойства ядра.

    презентация [97,9 K], добавлен 20.12.2013

  • Изучение механизма работы программных инструментов как трудная часть отладочного процесса. Отладчики пользовательского режима, их основные типы. Автоматический запуск приложений в отладчике. Быстрые клавиши прерываний. Отладка ядра операционной системы.

    реферат [260,0 K], добавлен 25.11.2016

  • Изучение процесса создания новой версии Windows Vista. Исследование особенностей установки и интерфейса операционной системы. Характеристика требований к аппаратному обеспечению компьютера. Анализ основных средств навигации и работы в Windows Vista.

    реферат [33,6 K], добавлен 25.11.2014

  • Особенности и свойства операционной системы UNIX, ее история, файловая структура, функции и отличия от других. Архитектура ядра системы. Понятия диспетчеризации, прерываний, системного времени (таймера), кеша. Проблема построения многопроцессорных систем.

    курсовая работа [35,6 K], добавлен 10.05.2011

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

    курсовая работа [1,7 M], добавлен 12.01.2014

  • Анализ архитектуры ОС Windows 8. Сравнение с предыдущими версиями (интерфейс Modern UI, работа с учетными записями, модель безопасности, диспетчер задач, история файлов, восстановление системы, Storage Spaces). Особенности различных версий Windows 8.

    курсовая работа [289,1 K], добавлен 25.01.2016

  • Особенности архитектуры MIPS компании MIPS Technology. Иерархия памяти. Обработка команд перехода. Адресная очередь. Переименование регистров. Обоснование выбора операционной системы. Perl-эмулятор и сборка ядра. Электрическая и пожарная безопасность.

    дипломная работа [180,2 K], добавлен 06.03.2013

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

    отчет по практике [255,1 K], добавлен 20.10.2021

  • Рассмотрение различных дистрибутивов операционной системы. Изучение протоколов обмена данными и форматов физического хранения данных. Разработка дистрибутива на основе операционной системы Linux для функционирования в составе сетевого хранилища StarNAS.

    курсовая работа [1,6 M], добавлен 05.11.2015

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

    контрольная работа [2,9 M], добавлен 14.12.2009

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

    курсовая работа [1,8 M], добавлен 25.04.2016

  • Архитектура операционной системы Android, набор библиотек для обеспечения базового функционала приложений и виртуальная машина Dalvik. Объектно-ориентированный язык программирования Java как инструмент разработки мобильных приложений для ОС Android.

    дипломная работа [1,6 M], добавлен 08.07.2015

  • Классификация автомобильных мехатронных модулей по функциональному назначению. Анализ особенностей архитектуры сетевого интерфейса бортовой информационно–управляющей системы. Исследование основных топологических схем мультиплексных систем автомобиля.

    дипломная работа [1,6 M], добавлен 26.07.2017

  • История создания, архитектура операционной системы и перечень возможностей, реализуемых в Linux. Инструментальные средства и цикл разработки новой версии ядра. Жизненный цикл патча. Структура принятия решений при добавлении новых функций (патчей) в ядро.

    лекция [303,8 K], добавлен 29.07.2012

  • Анализ серверных операционных систем на базе ядра Linux. Подходы к построению маршрутизации и оценка полученных результатов. Установка операционной системы CentOS 6.6 и закономерности ее настройки. Принципы и основные этапы тестирования созданного шлюза.

    курсовая работа [2,9 M], добавлен 19.11.2015

  • Разработка системы хранения и обработки данных, интерфейса. Использование технологии Xamarin.Forms для организации заполнения путевых листов. Выбор операционной системы, языка и среды программирования. Аппаратная интеграция информационной системы.

    дипломная работа [1,7 M], добавлен 09.07.2017

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

    курсовая работа [2,7 M], добавлен 12.08.2010

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

    дипломная работа [2,6 M], добавлен 10.07.2017

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

    лабораторная работа [21,5 K], добавлен 12.05.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.