Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Основные направления борьбы с тупиками



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

Основные направления борьбы с тупиками:

  1. Игнорировать данную проблему
  2. Обнаружение тупиков
  3. Восстановление после тупиков
  4. Предотвращение тупиков за счет тщательного выделения ресурсов или нарушения одного из условий возникновения тупиков.

Вопрос 14: Критерии планирования процессов

Критерии планирования и требования к алгоритмам

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

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

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


Вопрос 15: Общая модель файловой системы

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

В широком смысле понятие "файловая система" включает:

· совокупность всех файлов на диске,

· наборы структур данных, используемых для управления файлами, такие, например, как каталоги файлов, дескрипторы фай­лов, таблицы распределения свободного и занятого пространства на диске,

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

Имена файлов

Файлы идентифицируются именами. Пользователи дают файлам символьные имена, при этом учитываются ограничения ОС как на используемые символы, так и на длину имени. До недавнего времени эти границы были весьма узкими. Так в популярной фай­ловой системе FAT длина имен ограничивается известной схемой 8.3 (8 символов - собственно имя, 3 символа - расширение имени), а в ОС UNIX System V имя не может содержать более 14 символов. Однако пользователю гораздо удобнее работать с длинными именами, поскольку они позволяют дать файлу действительно мнемоническое название, по которому даже через достаточно большой промежу­ток времени можно будет вспомнить, что содержит этот файл. Поэтому современные файловые системы, как правило, поддерживают длинные символьные имена файлов. Например, Windows NT в своей новой файловой системе NTFS устанавливает, что имя файла может содержать до 255 символов, не считая завершающего нулевого символа. При переходе к длинным именам возникает проблема совместимости с ранее созданными приложениями, использующими короткие имена. Чтобы приложения могли обращаться к файлам в соответствии с принятыми ранее соглашениями, файловая система должна уметь предоставлять эквивалентные короткие имена (псев­донимы) файлам, имеющим длинные имена. Таким образом, одной из важных задач становится проблема генерации соответствующих коротких имен.

Длинные имена поддерживаются не только новыми файловыми системами, но и новыми версиями хорошо известных файло­вых систем. Например, в ОС Windows 95 используется файловая система VFAT, представляющая собой существенно измененный ва­риант FAT. Среди многих других усовершенствований одним из главных достоинств VFAT является поддержка длинных имен. Кроме проблемы генерации эквивалентных коротких имен, при реализации нового варианта FAT важной задачей была задача хранения длин­ных имен при условии, что принципиально метод хранения и структура данных на диске не должны были измениться. Обычно разные файлы могут иметь одинаковые символьные имена. В этом случае файл однозначно идентифицируется так называемым составным именем, представляющем собой последовательность символьных имен каталогов. В некоторых системах одному и тому же файлу не может быть дано несколько разных имен, а в других такое ограничение отсутствует. В последнем случае операционная система при­сваивает файлу дополнительно уникальное имя, так, чтобы можно было установить взаимно-однозначное соответствие между файлом и его уникальным именем. Уникальное имя представляет собой числовой идентификатор и используется программами операционной системы. Примером такого уникального имени файла является номер индексного дескриптора в системе UNIX.

Типы файлов

Файлы бывают разных типов: обычные файлы, специальные файлы, файлы-каталоги.

Обычные файлы в свою очередь подразделяются на текстовые и двоичные. Текстовые файлы состоят из строк символов, представленных в ASCII-коде. Это могут быть документы, исходные тексты программ и т.п. Текстовые файлы можно прочитать на экране и распечатать на принтере. Двоичные файлы не используют ASCII-коды, они часто имеют сложную внутреннюю структуру, например, объектный код программы или архивный файл. Все операционные системы должны уметь распознавать хотя бы один тип файлов - их собственные исполняемые файлы.

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

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

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

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

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

Логическая организация файла

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

Физическая организация и адрес файла

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

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

Популярным способом, используемым, например, в файловой системе FAT операционной системы MS-DOS, является ис­пользование связанного списка индексов. С каждым блоком связывается некоторый элемент - индекс. Индексы располагаются в от­дельной области диска (в MS-DOS это таблица FAT). Если некоторый блок распределен некоторому файлу, то индекс этого блока со­держит номер следующего блока данного файла. При такой физической организации сохраняются все достоинства предыдущего спо­соба, но снимаются оба отмеченных недостатка: во-первых, для доступа к произвольному месту файла достаточно прочитать только блок индексов, отсчитать нужное количество блоков файла по цепочке и определить номер нужного блока, и, во-вторых, данные файла занимают блок целиком, а значит имеют объем, равный степени двойки.

В заключение рассмотрим задание физического расположения файла путем простого перечисления номеров блоков, зани­маемых этим файлом. ОС UNIX использует вариант данного способа, позволяющий обеспечить фиксированную длину адреса, незави­симо от размера файла. Для хранения адреса файла выделено 13 полей. Если размер файла меньше или равен 10 блокам, то номера этих блоков непосредственно перечислены в первых десяти полях адреса. Если размер файла больше 10 блоков, то следующее 11-е поле содержит адрес блока, в котором могут быть расположены еще 128 номеров следующих блоков файла. Если файл больше, чем 10+128 блоков, то используется 12-е поле, в котором находится номер блока, содержащего 128 номеров блоков, которые содержат по 128 но­меров блоков данного файла. И, наконец, если файл больше 10+128+128(128, то используется последнее 13-е поле для тройной косвен­ной адресации, что позволяет задать адрес файла, имеющего размер максимум 10+ 128 + 128(128 + 128(128(128.

Права доступа к файлу

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

В самом общем случае права доступа могут быть описаны матрицей прав доступа, в которой столбцы соответствуют всем файлам системы, строки - всем пользователям, а на пересечении строк и столбцов указываются разрешенные операции (рисунок 2.35). В некоторых системах пользователи могут быть разделены на отдельные категории. Для всех пользователей одной категории опреде­ляются единые права доступа. Например, в системе UNIX все пользователи подразделяются на три категории: владельца файла, членов его группы и всех остальных.

Различают два основных подхода к определению прав доступа:

- избирательный доступ, когда для каждого файла и каждого пользователя сам владелец может определить допустимые опе­рации;

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

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

Самый нижний уровень – физический. Далее логический, ещё выше уровень проверки прав доступа, затем базовый. Самый высокий уровень – символьный.

Задачей символьного уровня является определение по символьному имени файла его уникального имени. В файловых систе­мах, в которых каждый файл может иметь только одно символьное имя (например, MS-DOS), этот уровень отсутствует, так как сим­вольное имя, присвоенное файлу пользователем, является одновременно уникальным и может быть использовано операционной систе­мой. В других файловых системах, в которых один и тот же файл может иметь несколько символьных имен, на данном уровне про­сматривается цепочка каталогов для определения уникального имени файла. В файловой системе UNIX, например, уникальным именем является номер индексного дескриптора файла (i-node).

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

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

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

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

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

Вопрос 16: Файловая система FAT. Структура диска. Файлы. Размещение файлов. Формат входа каталога.

Файловая система FAT (таблица распределения файлов)

Организация диска:

загрузочный сектор

2 копии таблицы размещения файлов

корневой каталог

сектора данных

В FAT ровно столько записей, сколько кластеров на диске. Размер кластера – 16 бит. Если в FAT записан 0, то соответствующий кластер пуст. Любое другое значение FAT соответствует номеру следующего кластера FAT, за ис­ключением FFF8, FFFF, которые определяют последний кластер в файле. FFF7 означает сбойный кластер. В секторах, отведенных под ……………., хранится информация об именах файлов, размерах, датах создания, модификация, ссылка на FAT для первого кластера. Номер начального кластера записи каталога является отправной точкой для отслеживания данных файлов…………………..

Длина записи файла – 16 бит. Если всего 500 кластеров, то размер FAT 516 бит. Пусть длина файла 100 бит. Если меньше 512 бит, то значение FFFF.

16 битами можно закодировать 65535 блоков, но не больше. Т.о., диск 32 Мбт.

Структура диска

1 физический сектор содержит:

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

Таблица описания разделов содержит 4 элемента, каждый равен 16 байтам.

Разделы расположены в обратном порядке со следующим смещением:

1ВЕ

1СЕ

1DЕ

1ЕЕ

Со смещения 1FF расположен код АА55, который является подписью таблицы разделов.

Каждый 16-байтовый код содержит следующую информацию:

Смещение 01 бт – индикатор начальной загрузки

Смещение 1 бт – признак …….

Смещение 21 бт – начальный сектор

Смещение 31 бт – начальный цилиндр

Смещение 41 бт – системный индикатор

Смещение 51 бт – признак конца

Смещение 61 бт – конечный сектор

Смещение 71 бт – конечный цилиндр

Смещение 84 бт – начальный сектор …..

Смещение 04С бт –количество секторов на диске

Т.о. можно разбить на логические диски.

Индикатор начальной загрузки равен 0 для незагрузочного раздела и ……. – для активного раздела

Системный индикатор:

0 – не определено

1 – 12 бит MS-DOS

2 –

3 –

Сектор начальной загрузки:

идентификатор разработчика

программа-загрузчик

блок параметров……….

Смещение …………………………

Смещение 3 8 байт – имя и версия системы

Смещение 0В 2 байта – число байт (512) в секторе

Смещение 0D 1 байт – число секторов на устройстве

Смещение 0Е 2 байта – число резервных секторов

Смещение ……………. FAT 1 байт – …………………………………………………………..

Смещение 13 2 байта – общее число секторов на логическом томе

Смещение 15 1 байт – дескриптор носителя данных

Смещение 16 2 байта – число секторов FAT

Смещение 17 – число секторов до…………

Смещение 1А 2 байта – число головок

Смещение 1С 2 байта – число невидимых секторов

Смещение 1Е ….байт – программа загрузчика

Формат входа каталога

Структура:

- имя (с 0 до 0В)

- атрибуты (0В-0С)

- резерв (0С-16)

- время (16-18)

- дата (18-1А)

- начальный кластер (1А-1С)

- размер файла (1С-1F)

Поле атрибутов (1 байт):

- 0 бит – постоянный файл

- 1 бит – скрытный

- 2 бит – системный

- 3 бит – метка тома

- 4 бит – подкаталог

- 5 бит – архивный

- 6 и 7 бит – резерв

Формат поля времени (2 байта):

- 0-4 бит – 2-хсекундное превращение значения от 0 до 29

- 4-10 бит – минуты от 0 до 59

- 10-15 бит – часы от 0 до 23

Формат поля даты (2 байта):

- 0-4 бит – день от 0 до 31

- 4-10 бит – месяц с 1 по 12

- 10-15 бит – год относительно 1980


Вопрос 17: Файловые системы NTFS и HPFS. Структура диска. Файлы. Размещение файлов.

Файловая система HPFS

Данная система должна была снять ограничения:

1. на ……….

2. на ………..

3. на 0

4. на фрагментацию файлов

5. на потери внешней памяти

6. на подверженность внешним сбоям

Первые 16 секторов HPFS составляют загрузочный блок. Он содержит метку диска и начало…………

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

Сектор 17 – «запасной блок».

Содержит:

- Указатель на список секторов, которые можно использовать для горячего исправления ошибок.

- Счетчик доступных секторов для горячего исправления

- Указатель на резерв свободных блоков, которые применяются для управления деревьев

- Информация ……………

- «грязный флаг» – сообщение, было ли завершение предыдущего сеанса нормальным, либо по каким-либо причинам файлы не были закрыты. Если этот флаг обнаружен, запуск восстановления.

Во время форматирования раздела HPFS делит его на полосы по 8 Мбайт. Каждая полоса имеет таблицу объе­мом 2 кбайта, которая показывает, какие сектора заняты, а какие свободны.

Чтобы увеличить ……………

………………..данные таблицы располагаются переменно то вначале, то в конце. Т.о. максимальный размер файла составляет 16 Мбайт-4Кбайта.

Файловая система NTFS

Размер файловой системы не ограничен. Если при установке NT указать раздел «NTFS», NT предложит 4 Гб, т.к. не знает, оставим ли мы предыдущую файловую сис­тему, либо эту. Потом при необходимости преобразовывает.

Все полезное место на диске делится на кластеры от 512 б до 64 кб. Стандарт – 4 кб. При установке либо сразу диск NTFS, либо потом преобразуем, либо изменяем раз­делы. Диск NTFS условно делится на:

первые 12 % диска отводится по MFT зону (главная файловая таблица)

остальное место под файлы

MFT зона всегда содержит пустой…………… для того, чтобы сам глобальный файл MFT не фрагментировался. В логической середине диска хранится зеркальная копия MFT. Каждый элемент системы, в том числе и MFT, является файлом. MFT – файл представляет собой центральный каталог всех остальных файлов диска и самого себя. MFT делится на записи фиксированного раздела 1 кб, каждая запись соответствует какому-либо файлу. Первые 16 файлов носят слу­жебный характер и не доступны системе. Они называются мета – файлы, причем самый первый MFT. Первые 16 эле­ментов имеют на диске фикси­рованное значение. Копии первых трех файлов (MFT) находятся в логической середине диска, остальные – где угодно в пределах MFT – зоны. Их местоположение определяют с первого файла. Первые 16 файлов носят служебный характер, их название начинается с «$», стандартными средствами получить информацию о них нельзя, «$» не видно.

Файлы:

$ MFT – сам MFT

$ MFT mirr – копии в середине логического диска

$ Log File – журнал поддержки журналирования

$ VO 1 VME – служебная информация, метка тома, версия файловой системы

$ Attr Del – список стандартных атрибутов файлов на диске

$ – корневой каталог

$ Bit map – карта свободного места (всего тома)

$ BOOT – загрузочный сектор

$ QVOTA – файл, в котором записаны права пользователя на использование диско­вого пространства (в NT это не действует, только в XP)

$ Up case – файловые таблицы соответствия с заглавных и прописных букв в име­нах файла на томе.

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

Если одной записи (1 кб) мало, в MFT для файла, то могут использоваться не­сколько записей, причем они рас­полагаются необязательно смежно. Файлы небольшого размера могут храниться непосредственно в MFT – файле.

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

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

NTFS поддерживает сжатые файлы. Сжатие осуществляется блоками по 16 класте­ров. Если есть NTFS, выби­раем целый диск и каталог и ставим «сжатие». Все последую­щие записи файла будут сжатыми.

Безопасность:

Различные ограничения прав доступа к объектам; есть понятие «символическая ссылка» (к каталогу присваива­ется короткое имя и осуществляется переход к каталогу по короткому имени); с NT 5.0 шифрование файлов, алгоритм не очень хороший.

Фрагментация:

Алгоритм MFT – зоны (12 %). Если есть 1 файл, занимающий остальные 88 %, то в MFT – зону писать данные не можем. MFT сжимается в 2 раза. Если и этого мало, то опять сжимается в 2 раза и т.д. Фрагментация присутствует всегда.

В NT есть стандартные функции API для дефрагментации. Данные функции имеют ограничения – за один раз перемещают не менее 16 кластеров, они начинаются с позиции, кратной 16. В свободное место, меньшее 16 кластеров, ничего записать нельзя, используя дефрагментацию. При перемещении фрагментация, если не может, будет оставаться вре­менно не занятое место (от 1 до 16 кластеров). При ошибке поведение системы не пред­сказуемо. При заполнении диска более, чем на 80 %, фрагментация возрастает по геомет­рической прогрессии.

Алгоритм свободного времени:

При выполнении любой записи NT берет размер, заполняет до упора – сначала за­писываются большие, затем малые фрагменты. Фрагментация всегда появляется.

Сравнение FAT, FAT 32, NTFS

FAT 16 FAT 32 NTFS
максимальный размер тома
2 Гб неограниченно
максимальное количество файлов
< 65 535 неограниченно
имя файла
с поддержкой длинных имен до 255 символов из систем­ного набора символов 250 символов из любых символов любого алфавита
атрибуты
базовый набор любые
устойчивость к сбоям
средняя плохая автоматическое восстанов­ление
экономичность
высокая для малого числа файлов, уменьшается при увеличении файлов в ката­логе; плохое использование дискового пространства при больших размерах файла улучшено за счет уменьше­ния разме­ров кластера, бы­стродействие умень­шается при увеличении количества файлов экономичность эффективна при достаточном размере оперативной памяти

Вопрос 18: Операционная система MS-DOS. Порядок загрузки.

Процесс загрузки операционной системы MS-DOS

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

Загрузка начинается с того, что BIOS делает попытку прочитать самый первый сектор дискеты, вставленной в дисковод А: (на загрузочной дискете этот сектор содержит загрузчик операционной системы). Если в дисковод вставлена системная дискета, с нее считывается загрузчик и ему передается управление.

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

Если же дискеты в дисководе А: вообще нет, то BIOS читает основную загрузочную запись диска С: (Master Boot Record). Обычно это самый первый сектор на диске. Управление передается загрузчику, кото­рый находится в этом секторе. Загрузчик анализирует содержимое таблицы разделов (она также находится в этом секторе), выбирает активный раздел и читает загрузочную запись этого раздела. Загрузочная запись активного раздела (Boot Record) аналогична загрузочной записи, находящейся в первом секторе системной дискеты.

Загрузочная запись активного раздела считывает с диска файлы IO.SYS и MSDOS.SYS (именно в этом порядке). Затем считываются и загружаются резидентные драйверы. Начинается формирование свя­занного списка драйверов устройств. Анализируется содержимое файла CONFIG.SYS, загружаются описан­ные в этом файле драйверы. Сначала загружаются драйверы, описанные параметром DEVICE, затем (только в MS-DOS версии 4.х и 5.0) резидентные программы, указанные операторами INSTALL. После этого считы­вается командный процессор и ему передается управление.

Командный процессор состоит из трех частей - резидентной, инициализирующей и транзитной. Первой загружается резидентная часть. Она обрабатывает прерывания INT 22H, INT 23H, INT 24H, управ­ляет загрузкой транзитной части. Эта часть командного процессора обрабатывает ошибки MS-DOS и выдает запрос пользователю о действиях при обнаружении ошибок.

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

Транзитная часть командного процессора располагается в старших адресах памяти. В этой части на­ходятся обработчики внутренних команд MS-DOS и интерпретатор командных файлов с расширением имени.BAT. Транзитная часть выдает системное приглашение (например, А:\>), ожидает ввода команды оператора с клавиатуры или из пакетного файла и организует их выполнение.

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


Вопрос 19: Операционная система MS-DOS. Загрузочный сектор жесткого диска. Структура элементов раздела в таблице разделов диска.

1 физический сектор содержит:

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

Таблица описания разделов содержит 4 элемента, каждый равен 16 байтам.

Разделы расположены в обратном порядке со следующим смещением:

1ВЕ

1СЕ

1DЕ

1ЕЕ

Со смещения 1FF расположен код АА55, который является подписью таблицы разделов.

Каждый 16-байтовый код содержит следующую информацию:

Смещение 01 бт – индикатор начальной загрузки

Смещение 1 бт – признак …….

Смещение 21 бт – начальный сектор

Смещение 31 бт – начальный цилиндр

Смещение 41 бт – системный индикатор

Смещение 51 бт – признак конца

Смещение 61 бт – конечный сектор

Смещение 71 бт – конечный цилиндр

Смещение 84 бт – начальный сектор …..

Смещение 04С бт –количество секторов на диске

Т.о. можно разбить на логические диски.

Индикатор начальной загрузки равен 0 для незагрузочного раздела и ……. – для активного раздела

Системный индикатор:

0 – не определено

1 – 12 бит MS-DOS

2 –

3 –

Сектор начальной загрузки:

идентификатор разработчика

программа-загрузчик

блок параметров……….

Смещение …………………………

Смещение 3 8 байт – имя и версия системы

Смещение 0В 2 байта – число байт (512) в секторе

Смещение 0D 1 байт – число секторов на устройстве

Смещение 0Е 2 байта – число резервных секторов

Смещение ……………. FAT 1 байт – …………………………………………………………..

Смещение 13 2 байта – общее число секторов на логическом томе

Смещение 15 1 байт – дескриптор носителя данных

Смещение 16 2 байта – число секторов FAT

Смещение 17 – число секторов до…………

Смещение 1А 2 байта – число головок

Смещение 1С 2 байта – число невидимых секторов

Смещение 1Е ….байт – программа загрузчика


Вопрос 20: Операционная система MS-DOS. Структура загрузочного сектора диска.

Сектор начальной загрузки:

- идентификатор разработчика

- программа-загрузчик

- блок параметров……….

Смещение …………………………

Смещение 3 8 байт – имя и версия системы

Смещение 0В 2 байта – число байт (512) в секторе

Смещение 0D 1 байт – число секторов на устройстве

Смещение 0Е 2 байта – число резервных секторов

Смещение ……………. FAT 1 байт – …………………………………………………………..

Смещение 13 2 байта – общее число секторов на логическом томе

Смещение 15 1 байт – дескриптор носителя данных

Смещение 16 2 байта – число секторов FAT

Смещение 17 – число секторов до…………

Смещение 1А 2 байта – число головок

Смещение 1С 2 байта – число невидимых секторов

Смещение 1Е ….байт – программа загрузчика


Вопрос 21: Операционная система MS-DOS. Форматы исполняемых файлов

DOS поддерживает 2 типа исполняемых файлов:.com и.exe. Файлы типа.com – самые простые, они являются всего лишь двоичным образом задачи. При запуске такого файла DOS просто считывает его в па­мять по смещению 100h и передает управление на его первый байт. В том же сегменте, по смещению 0, за­писывает PSP – структура данных, необходимая программе для получения доступа к элементам командной строки и др. ). В.com ds, cs, ss указывают на один сегмент.

Файла типа.exe более сложны по своей структуре. Эти файлы предназначены для создания про­грамм, код или данных которых превышают по размеру 64 Кбайта (максимальный размер.com файла). Так как максимальный размер сегмента в процессоре 8086 также равен 64 Кбайтам (что является ограничением на длину.com), то DOS записывает коды и данные из.exe файла в несколько сегментов, используя инфор­мацию из структуры, находящейся в начале файла (из заголовка.exe файла).

Файл.exe состоит из двух частей:

- управляющая информация для загрузчика

- собственно загрузочный модуль

Информация для загрузчика расположена в начале файла и образует заголовок. Сразу за ним сле­дует тело загрузочного модуля. Тело загрузочного модуля начинается на границе блока и представляет со­бой копию образа памяти задачи, которую построил компоновщик (таблица 1).

Стандартная часть заголовка

Смещение Содержимое
00 – 01 4D5A «MZ» – подпись компоновщика, указываю­щая, что файл является.exe
02 – 03 Длина образа задачи по модулю 512 (число байт в последнем блоке)
04 – 05 Длина файла в блоках
06 – 07 Число элементов таблицы настройки адресов
08 – 09 Длина заголовка в 16-байтовых параграфах. Используется для определения начала тела загрузочного модуля
0A – 0B Минимальный объем памяти, которую нужно выделить после конца задачи (в 16-байтовых параграфах)
0C – 0D Максимальный объем памяти, которую нужно выделить после конца задачи (в 16-байтовых параграфах)
0E – 0F Сегментный адрес начала стекового сегмента относительно начала образа задачи
10 – 11 Значение SP при входе в задачу
12 – 13 Контрольная сумма – ноль минус результат сложения без переноса всех слов файла
14 – 15 Значение IP (счетчика команд) при входе в задачу
16 – 17 Сегментный адрес начала кодового сегмента относительно начала образа задачи
18 – 19 Адрес первого элемента таблицы настройки адресов относительно начала файла
1A – 1B Номер оверлея (0 для главного модуля)

Далее следует таблица настройки адресов. Таблица состоит из элементов, число которых записано в байтах 06 – 07. Элемент таблицы настройки состоит из двух полей: 2-байтового смещения и 2-байтового сегмента, и указывает слово в загрузочном модуле, содержащие адрес, который должен быть настроен на место в памяти, куда загружается задача. Благодаря этой настройке программа при своей работе использует правильные сегментные адреса.


Вопрос 22: Операционная система MS-DOS. Структура PSP.

В области памяти после резидентной части, выполняющей загрузку программ, строится префикс Программного Сегмента (см. таблицу ниже). PSP представляет собой 100h – байтовую область памяти, вслед за которой загружается программа. В эту область заносятся системные данные, которые бывает полезно считывать; в частности, по адресу 80h в PSP заносится командная строка, сопутствующая программе.

Структура PSP

Смещение - Размер Содержимое
0 – 2 Команда завершения int 20h
2 – 2 Номер последнего доступного блока в памяти (номер параграфа)
4 – 1 Зарезервировано
5 – 5 Команда вызова диспетчера функций DOS
0А – 4 Адрес завершения программы
0Е – 4 Адрес обработчика критических ошибок
16 – 16 Зарезервировано для использования DOS
2С – 2 Адрес сегмента окружения DOS
2Е – 2Е Зарезервировано для использования DOS
5С – 10 Используется для обработки первого параметра командной строки с помощью FCB (file control block) (блок управления файлом)
6С – 14 Используется для обработки второго параметра командной строки с помощью FCB (file control block) (блок управления файлом)
80 – 1 Длина строки параметров (используется так же, как смещение начала области обмена данных с диском (DTA – disk transfer area) по умолчанию)
81 – 7F Содержимое командной строки
  Начинается размещение программы

Работа отладчика:

Norma db db ‘Hello’, 0Ah, 0Dh, ‘$’

db ‘DEBUG’, 0Ah, 0Dh, ‘$’

CODE:

Start:

mov ax, @DATA

mov DS,AX

mov DS, offset norma

mov ah,0

int 21h

mov ax,ss

cmp ax,es [30h]

je exit

mov ah,9

mov dx, offset trase

int 21h

exit:

mov ax,4c00h

int 21h

end start

В PSP программа со смещением 2F находится 4-байтовая область, в которую DOS помещает указатель стека при обращении к системным функциям, так как при выполнении ряда системных выховов используется внутренний стек DOS.

При пошаговом выполнении обработку int 21h первым выполняет отладчик, чей указатель будет сохранен в активном PSP.

Вопрос 23: Понятие прерывания. Аппаратные и программные прерывания. Обра­ботка прерываний.

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

3 этапа:

Приостановление выполнения основного процесса

Обработка прерывания

Возврат управления основному процессу

2 вида прерываний: аппаратное и программное (функцию пишем сами, поддерживает система).

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

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

Программы могут сами вызывать прерывания с заданным номером. Для этого они используют команду INT. Это так назы­ваемые программные прерывания. Программные прерывания не являются асинхронными, так как вызываются из программы (а она-то знает, когда она вызывает прерывание!).

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

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

Использование прерываний при работе с медленными внешними устройствами позволяют совместить ввод/вывод с обработкой данных в центральном процессоре и в результате повышает общую производительность системы.

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

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

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

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

Обработка прерывания может происходить в соответствии с тремя основными схемами.

1. Сначала вызывается системный обработчик, затем добавленный. Данный способ используется для дополнения систем­ной обработкой какой- либо функции.

Последовательность:

Pushf – в стек заносим флаги

Call SYS – системная обработка

USER – переход в нашу программу

Iret – завершение (возврат из прерывания)

Сначала выполняется пользовательская обработка, затем системная.

2. USER – пользовательская обработка, сохранение SP и CS.

JMP SYS

3. MSER

mov ah, 20h

out 20h, al

iret

 
 
 
Программа
 
 
 

Любая программа, использующая 21h, может и изменять вектор, указывающий на какую- то область памяти, на адрес производной функции. Программа, которая ограничивает доступ, перехватывает 2 вида прерывания 13h и 21h (прямое чтение записи секторов диска). Анализирует права, либо запре­щает, либо разрешает доступ. Чтобы обойти: любая программа защиты – нужно каким-либо образом обойти защиту, определить истинный адрес данного вектора.

1 способ:

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


 
AF2534B8
 

21h имеет адрес AF2534B8


 
 
 
AD34:F328

Система защиты установила в качестве обработчика прерывание 21h. Будет вызываться сначала функция по адресу.

ПЗ

Int 21h

AD34:F328

Jmp

AF25:34B8

Old int 21h

Когда вместо …………………………………… приложение вызывает int 21h, т.е. будет вызываться функция в теле команды. Функция либо передает управление старшему адресу, либо нет. Злоумышленник должен при вызове int 21h должен попасть сразу на AF2534B8.

Списать программу

Int 1
 
Int 21


Перехватив int1, выполняющее пошаговую работу, управление передано приложению. Надо пройти все команды. Управление сначала попадет в int 21. Команды попадают в приложение. Вызывается безопасная функция, выдача символов на экран (пример того, что выдает приложение). Доходим до перехода на адрес ……………………………………………………………………………………………………..

Все стандартные обработчики имеет вход. Любое приложение может просканировать последователь­ность команд. Вместо вызова int 13h и int 21h можно делать переход на любой адрес.

Для DOS:

1. Для нахождения для нахождения адреса сегмента DOS нужно использовать недокументирован­ную 34h и прерывание 21h, которое будет возвращать в регистрах ES и BX адрес так называемого флага активности DOS, расположенного в сегменте. Остается проска­нировать 64 КБ. Будет возвращать флаг активности.

2. Можно вызвать недокументированную функцию 3, 12 и прерывание 2F, которое вернет в реги­стре DS адрес сегмента DOS.

Косвенный вызов DOS: для её использования нужно поместить в регистр DS и DX указатель на мас­сив системный регистров. В AX занести значение 5D00 и вызвать int 21h. При выполнении данной функции DOS заполнит регистры процессора значениями из массива и выполнит указанную в AX функцию.

Еще одно замечание, касающееся обработки аппаратных прерываний. Если вы полностью заменяете стандартный обработчик аппаратного прерывания, не забудьте в конце программы выдать байт 20h в порт с ад­ресом 20h (A0h для второго контроллера 8259). Эти действия необходимы для очистки регистра обслуживания прерывания ISR. При этом разрешается обработка прерываний с более низким приоритетом чем то, которое только что обрабатывалось.

Вопрос 24: Структура таблицы векторов прерывания.

Таблица векторов прерываний

Адрес подпрограммы обработчика прерываний называется вектором. Длина 4 байта. В первом слове вектора хранится со­держимое IP, во втором CS. Младшие 1024 байта памяти содержат таблицу, названную таблицей векторов прерывания. Младший байт слова всегда в памяти располагается первым.

Соответственно, если какой-то вектор

CS IP

AF20: 3P8A

то в памяти он 8A3P20AF.

retn, rets, IRET

Для контроллера тоже должен быть сигнал окончания прерывания:

mov al, 20h

out 20h, al

В соответствии с описанием процессора некоторые вектора выполняют специфические действия, некоторые свободные.

Для того чтобы связать адрес обработчика прерывания с номером прерывания, используется таблица векторов прерываний, занимающая первый килобайт оперативной памяти - адреса от 0000:0000 до 0000:03FF. Таблица состоит из 256 элементов - FAR-адре­сов обработчиков прерываний. Эти элементы называются векторами прерываний. В первом слове элемента таблицы записано смеще­ние, а во втором - адрес сегмента обработчика прерывани я.

Прерыванию с номером 0 соответствует адрес 0000:0000, прерыванию с номером 1 - 0000:0004 и т.д. Для программиста, ис­пользующего язык Си, таблицу можно описать следующим образом:

void (* interrupt_table[256])();

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

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

Номер Описание
  Ошибка деления. Вызывается автоматически после выполнения команд DIV или IDIV, если в результате деления происходит переполнение (например, при делении на 0). DOS обычно при обработке этого прерывания выводит сообщение об ошибке и останавливает выполнение про­граммы. Для процессора 8086 при этом адрес возврата указывает на следующую после команды деления команду, а в процессоре 80286 - на первый байт команды, вызвавшей прерывание.
  Прерывание пошагового режима. Вырабатывается после выполнения каждой машинной ко­манды, если в слове флагов установлен бит пошаговой трассировки TF. Используется для от­ладки программ. Это прерывание не вырабатывается после выполнения команды MOV в сег­ментные регистры или после загрузки сегментных регистров командой POP.
  Аппаратное немаскируемое прерывание. Это прерывание может использоваться по-разному в разных машинах. Обычно вырабатывается при ошибке четности в оперативной памяти и при запросе прерывания от сопроцессора.
  Прерывание для трассировки. Это прерывание генерируется при выполнении однобайтовой машинной команды с кодом CCh и обычно используется отладчиками для установки точки прерывания.
  Переполнение. Генерируется машинной командой INTO, если установлен флаг OF. Если флаг не установлен, то команда INTO выполняется как NOP. Это прерывание используется для обра­ботки ошибок при выполнении арифметических операций.
  Печать копии экрана. Генерируется при нажатии на клавиатуре клавиши PrtScr. Обычно ис­пользуется для печати образа экрана. Для процессора 80286 генерируется при выполнении машинной команды BOUND, если проверяемое значение вышло за пределы заданного диапа­зона.
  Неопределенный код операции или длина команды больше 10 байт (для процессора 80286).
  Особый случай отсутствия математического сопроцессора (процессор 80286).
  IRQ0 - прерывание интервального таймера, возникает 18,2 раза в секунду.
  IRQ1 - прерывание от клавиатуры. Генерируется при нажатии и при отжатии клавиши. Исполь­зуется для чтения данных от клавиатуры.
A IRQ2 - используется для каскадирования аппаратных прерываний в машинах класса AT.
B IRQ3 - прерывание асинхронного порта COM2.
C IRQ4 - прерывание асинхронного порта COM1.
D IRQ5 - прерывание от контроллера жесткого диска для XT.
E IRQ6 - прерывание генерируется контроллером флоппи-диска после завершения операции.
F IRQ7 - прерывание принтера. Генерируется принтером, когда он готов к выполнению очеред­ной операции. Многие адаптеры принтера не используют это прерывание.
  Обслуживание видеоадаптера.
  Определение конфигурации устройств в системе.
  Определение размера оперативной памяти в системе.
  Обслуживание дисковой системы.
  Последовательный ввод/вывод.
  Расширенный сервис для AT-компьютеров.
  Обслуживание клавиатуры.
  Обслуживание принтера.
  Запуск BASIC в ПЗУ, если он есть.
  Загрузка операционной системы.
1A Обслуживание часов.
1B Обработчик прерывания Ctrl-Break.
1C Прерывание возникает 18.2 раза в секунду, вызывается программно обработчиком прерывания таймера.
1D Адрес видеотаблицы для контроллера видеоадаптера 6845.
1E Указатель на таблицу параметров дискеты.
1F Указатель на графическую таблицу для символов с кодами ASCII 128-255.
20-5F Используется DOS или зарезервировано для DOS.
60-67 Прерывания, зарезервированные для пользователя.
68-6F Не используются.
  IRQ8 - прерывание от часов реального времени.
  IRQ9 - прерывание от контроллера EGA.
  IRQ10 - зарезервировано.
  IRQ11 - зарезервировано.
  IRQ12 - зарезервировано.
  IRQ13 - прерывание от математического сопроцессора.
  IRQ14 - прерывание от контроллера жесткого диска.
  IRQ15 - зарезервировано.
78 - 7F Не используются.
80-85 Зарезервированы для BASIC.
86-F0 Используются интерпретатором BASIC.
F1-FF Не используются.

IRQ0 - IRQ15 - это аппаратные прерывания.

Приведем таблицу аппаратных прерываний, расположенных в порядке приоритета:





Дата публикования: 2015-02-03; Прочитано: 259 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.083 с)...