Работы всей вычислительной системы.
С течением времени приоритет потока, относящегося к классу потоков с переменными
приоритетами, может отклоняться от базового приоритета потока,
причем эти изменения могут быть не связаны с изменениями базового приоритета
процесса. ОС может повышать приоритет потока (который в этом случае
называется динамическим) в тех случаях, когда поток не полностью использовал
отведенный ему квант, или понижать приоритет, если квант был использован
полностью. ОС наращивает приоритет дифференцировано в зависимости
от того, какого типа событие не дало потоку полностью использовать квант.
В частности, ОС повышает приоритет в большей степени потокам, которые
ожидают ввода с клавиатуры (интерактивным приложениям), и в меньшей степени
потокам, выполняющим дисковые операции.
границей является нижняя граница диапазона
приоритетов реального времени. Существует две разновидности приоритетного
планирования: обслуживание с относительными приоритетами и обслуживание
с абсолютными приоритетами.
В обоих случаях выбор потока на выполнение из очереди готовых осуществляется
одинаково: выбирается поток, имеющий наивысший приоритет. Однако
проблема определения момента смены активного потока решается по-разному.
В системах с относительными приоритетами активный поток выполняется до
тех пор, пока он сам не покинет процессор, перейдя в состояние ожидания (или
произойдет ошибка, или поток завершится).
В системах с абсолютными приоритетами время ожидания потока в очередях
может быть сведено к минимуму, если ему назначить самый высокий приоритет.
Такой поток будет вытеснять из процессора все остальные потоки (кроме
потоков, тоже имеющих наивысший приоритет). Это делает планирование
на основе абсолютных приоритетов подходящим для. систем управления объектами,
в которых важна быстрая реакция на событие.
25. Во многих операционных системах алгоритмы планирования построены с использованием
как квантования, так и приоритетов. Например, в основе планирования
лежит квантование, но величина кванта и/или порядок выбора потока
из очереди готовых определяется приоритетами потоков. Именно так реализовано
планирование в ОС семейства Windows NT, где квантование сочетается
с динамическими абсолютными приоритетами. На выполнение выбирается готовый
поток с наивысшим “приоритетов. Ему выделяется квант времени. Если
во время выполнения в очереди готовых появляется поток с бояее высоким
приоритетом, то он вытесняет выполняемый поток. Вытесненный поток возвращается
в очередь готовых, причем он становится впереди всех остальных потоков,
имеющих такой же приоритет.
Процессы реального времени также применяют стратегию фиксированных
приоритетов, но пользователь может их изменять. Так как при наличии готовых
к выполнению процессов реального времени другие процессы не рассматриваются,
то процессы реального времени надо тщательно проектировать, чтобы
они не захватывали процессор на слишком долгое время. Характеристики
планирования процессов реального времени включают две величины: уровень
глобального приоритета и квант времени. Для каждого уровня приоритета по
умолчанию имеется своя величина кванта времени. Процессу разрешается захватывать
процессор на указанный квант времени, а по его истечению планировщик
снимает процесс с выполнения
На множестве потоков определены приоритетные классы — критической (time
critical), серверный (server), стандартный (regular) и остаточный (idle), в каждом
из которых имеется 32 приоритетных уровня. Потоки критического класса
имеют наивысший приоритет. В этот класс могут быть отнесены, например,
системные потоки, выполняющие задачи управления сетью. Следующий по
приоритетности класс предназначен, как это следует из его названия, для потоков,
обслуживающих серверные приложения. К стандартному классу могут быть
отнесены потоки обычных приложений. Потоки, входящие в остаточный класс,
имеют самый низкий приоритет. К этому классу относится, например, поток, выводящий
на экран заставку, когда в системе не выполняется никакой работы.
Поток из менее приоритетного класса не может быть выбран для выполнения,
пока в очереди более приоритетного класса имеется хотя бы один поток. Внутри
каждого класса потоки выбираются также по приоритетам. Потоки, имеющие
одинаковое значение приоритета, обслуживаются в циклическом порядке.
Приоритеты могут изменяться планировщиком в следующих случаях.
■ Если поток находится в ожидании процессорного времени дольше, чем это
задано системной переменной MAXWAIT, его приоритет будет автоматически
увеличен операционной системой. При этом результирующее значение приоритета
не должно превышать нижйей границы диапазона приоритетов критического
класса.
■ Если поток ушел на выполнение операции ввода-вывода, то после ее завершения
он получит наивысший для своего йласйа приоритет.
* Приоритет потока автоматически повышается, когда он поступает на выполнение.
26.
является обеспечение временных характеристик вычислительного процесса,
планирование имеет особое значение. Любая система реальною времени должна
реагировать на сигналы управляемого объекта в течение заданных временных ограничений.
Необходимость тщательного планирования работ облегчается Тем,
что в системах реального времени весь набор выполняемых задач известен заранее.
Кроме того, часто в системе имеется информация о временах выполнения
задач, моментах активизации, предельных допустимых сроках ожидания
ответа и т. д.,Эти данные могут быть использованы планировщиком для создания
статического расписания или для построения адекватного алгоритма динамического
планирования.
При разработке алгоритмов планирования для систем реального времени
необходимо учитывать, какие последствия в этих системах возникают при несоблюдении
временных ограничений. Если эти последствия катастрофичны,
как, например, для системы управления полетами или атомной электростанцией,
то операционная система реального времени, на основе которой строится
управление объектом, называется жесткой (hard). Если же последствия нарушения
временных ограничений не столь серьезны, то есть сравнимы с той пользой,
которую приносит система управления объектом, то система является мягкой
(soft). Примером мягкой системы реального времени является система
резервирования билетов. Если из-за временных нарушений оператору не удается
зарезервировать билет, это не очень страшно — можно просто послать запрос
на резервирование заново.
В жестких системах реального времени время завершения выполнения каждой
из критических задач должно быть гарантировано для всех возможных сценариев
работы системы.
отношении.
В мягких системах реального времени предполагается, что заданные временные
ограничения могут иногда нарушаться, поэтому здесь обычно применяются
менее затратные способы планирования.
В зависимости от характера возникновения запросов на выполнение задач полезно
разделять их на два типа: периодические и спорадические. Начиная с момента
первоначального запроса, все будущие моменты запроса периодической
задачи можно определить заранее путем прибавления к моменту начального
проса величины, кратной известному периоду. Время поступления запросов на выполнение спорадических задач заранее не известно
Существуют также алгоритмы с динамическим изменением приоритетов,
которые назначаются в соответствии с такими текущими параметрами задачи,
как, например, конечный срок выполнения (deadline). При необходимости назначения
некоторой задачи на выполнение выбирается та, у которой текущее
значение разницы между конечным сроком выполнения и временем, требуемым
для ее непрерывного выполнения, является наименьшим.
27.Прерывания являются основной движущей силой любой операционной системы. Отключите систему прерываний, и «жизнь» в операционной системе немедленно остановится. Как верно было замечено: «прерывания названы так весьма удачно, поскольку они прерывают нормальную работу системы». Система прерываний переводит процессор на выполнение потока команд, отличного от того, который выполнялся до сих пор, с последующим возвратом к исходному коду.Механизм прерываний поддерживается аппаратными средствами компьютера и программными средствами операционной системы. В зависимости от источника прерывания делятся на три больших класса: ■ внешние; ■ внутренние; ■ программные.
Внешние прерывания могут возникать в результате:
■ действий пользователя или оператора за терминалом;
■ поступления сигналов от аппаратных устройств (сигналов завершения операций ввода-вывода, вырабатываемых контроллерами внешних устройств компьютера, такими как принтер или накопитель на жестких дисках);
■ поступления сигналов от датчиков управляемых компьютером технических объектов.
Внешние прерывания называют также аппаратными, отражая тот факт, что прерывание возникает вследствие подачи некоторой аппаратурой.
Внутренние прерывания, называемые также исключениями (exeption), происходят синхронно выполнению программы при появлении аварийной ситуации в ходе обработки некоторой инструкции программы. Примерами исключений являются деление на нуль, ошибки защиты памяти, обращения по несуществующему адресу.
Программные прерывания отличаются от предыдущих двух классов тем, что они по своей сути не являются «истинными» прерываниями. Программное прерывание возникает при выполнении особой команды процессора, что имитирует прерывание, то есть переход на новую последовательность инструкций.
Процедуры, вызываемые по прерываниям, обычно называют обработчиками прерываний, или процедурами обслуживания прерываний . Аппаратные прерывания обрабатываются драйверами соответствующих внешних устройств; исключения -специальными модулями ядра, программные прерывания — процедурами ОС, обслуживающими системные вызовы. Помимо этих модулей в операционной системе может находиться так называемый диспетчер прерываний, который координирует работу отдельных обработчиков прерываний.
28.Аппаратная поддержка прерываний осуществляется как на уровне процессора, так и на уровне функциональных блоков компьютера. Функциональный блок компьютера, назначением которого является поддержка прерываний, называется контроллером прерываний. Контроллер прерываний является источником сигналов прерываний по отношению к процессору и обработчиком прерываний по отношению к внешним устройствам компьютера.Существует два основных способа, с помощью которых шины выполняют прерывания: векторный и опрашиваемый. В обоих способах процессору предоставляется информация об уровне приоритета прерывания на шине подключения внешних устройств.
Устройствам, которые используют векторные прерывания, назначается вектор прерываний. Он представляет собой электрический сигнал, выставляемый на соответствующие шины процессора и несущий в себе информацию об определенном, закрепленном за данным устройством номере, который идентифицирует соответствующий обработчик прерываний. Этот вектор может быть фиксированным, конфигурируемым (например, с использованием переключателей) или программируемым. Операционная система может предусматривать процедуру регистрации вектора обработки прерываний для определенного устройства, которая связывает некоторую процедуру обслуживания прерываний с определенным вектором. При получении сигнала запроса прерывания процессор выполняет специальный цикл подтверждения прерывания, в котором устройство должно идентифицировать себя; В течение этого цикла устройство отвечает, выставляя на шину вектор прерываний. Затем процессор использует этот вектор для нахождения обработчика данного прерывания.
При использовании опрашиваемых прерываний процессор получает от запросившего прерывание устройства только информацию об уровне приоритета прерывания
Механизм прерываний чаще всего поддерживает приоритезацию и маскирование прерываний.
Приоритезация означает, что все источники прерываний делятся на классы и каждому классу назначается свой уровень приоритета запроса на прерывание. Приоритеты могут обслуживаться как относительные и абсолютные. Обслуживание запросов прерываний по схеме с относительными приоритетами заключается в том, что при одновременном поступлении запросов прерываний из разных классов выбирается запрос, имеющий высший приоритет.
Собственно говоря, в описанной схеме абсолютных приоритетов тоже выполняется маскирование — при обслуживании некоторого запроса все запросы с равным или более низким приоритетами маскируются, то есть не обслуживаются. Схема маскирования предполагает возможность временного маскирования прерываний любого класса независимо от уровня приоритета.Схема приоритета:
1. При возникновении сигнала (для аппаратных ) или условия (для внутренних) прерывания происходит первичное аппаратное распознавание типа прерывания. Если прерывания данного типа в настоящий момент запрещены, то процессор продолжает поддерживать естественный ход выполнения команд. Иначе в зависимости от поступившей в процессор информации происходит автоматический вызов процедуры обслуживания прерывания.
2. Автоматически сохраняется некоторая часть контекста прерванного потока, которая позволит ядру возобновить исполнение потока процесса после обработки прерывания. Может быть сохранен и полный контекст процесса, если ОС обрабатывает данное прерывание со сменой процесса.
3. Может включиться привилегированный режим. Прерывания практически во всех мультипрограммных ОС обрабатываются в привилегированном режиме модулями ядра, так как при этом обычно нужно выполнить ряд критических операций, от которых зависит жизнеспособность системы — управлять внешними устройствами, перепланировать потоки и т. п.
4. Временно запрещаются прерывания данного типа, чтобы не образовалась очередь вложенных друг в друга потоков одной и той же процедуры.
5. После того как прерывание обработано ядром операционной системы, прерванный контекст восстанавливается, и работа потока возобновляется с прерванного места. При возврате из прерывания блокировка повторных прерываний данного типа снимается.Программные прерывания:при выполнении команды программного прерывания процессор отрабатывает ту же последовательность действий, что и при возникновении внешнего или внутреннего прерывания, но только происходит это в предсказуемой точке программы — там, где программист поместил данную команду.
29.Для упорядочения работы обработчиков прерываний в операционных системах применяется тот же механизм, что и для упорядочения работы пользовательских процессов — механизм приоритетных очередей. Все источники прерываний обычно делятся на несколько классов, причем
каждому классу присваивается приоритет. В операционной системе выделяется программный модуль, который занимается диспетчеризацией обработчиков прерываний. Этот модуль в разных ОС называется по-разному, но для определенности будем его называть диспетчером прерываний.
При возникновении прерывания диспетчер прерываний вызывается первым. Он запрещает на небольшое время все прерывания, а затем выясняет причину прерывания. После этого диспетчер сравнивает назначенный данному источнику прерывания приоритет и сравнивает его с текущим приоритетом потока команд, выполняемого процессором. В этот момент времени процессор уже может выполнять инструкции другого обработчика прерываний, также имеющего некоторый приоритет. Если приоритет нового запроса выше текущего, то выполнение текущего обработчика приостанавливается, и он помещается в соответствующую очередь обработчиков прерываний. В противном случае в очередь помещается обработчик нового запроса.
30 !!!.Важной особенностью процедур, выполняемых по запросам прерываний, является то, что их работа чаще всего никак не связана с текущим процессом. Например, драйвер диска может получить управление после того, как контроллер диска записал в соответствующие сектора информацию, полученную от процесса А, но этот момент времени, скорее всего, не совпадет с периодом очередной итерации выполнения процесса А или его потока. В наиболее типичном случае процесс А будет находиться в состоянии ожидания завершения операции ввода-вывода.
Системный вызов позволяет приложению обратиться к операционной системе с просьбой выполнить то или иное действие, оформленное как процедура (или набор процедур) кодового сегмента ОС. Для прикладного программиста операционная система выглядит как некая библиотека, предоставляющая некоторый набор полезных функций, с помощью которых можно упростить прикладную программу или выполнить действия, запрещенные в пользовательском режиме, например обменяться данными с устройством ввода-вывода. Реализация системных вызовов должна удовлетворять следующим требованиям:
■ обеспечивать переключение в привилегированный режим;
■ обладать высокой скоростью вызова процедур ОС;
■ обеспечивать по возможности единообразное обращение к системным вызовам для всех аппаратных платформ, на которых работает ОС;
■ допускать легкое расширение набора системных вызовов;
■ обеспечивать контроль со стороны ОС за корректным использованием системных вызовов.Операционная система может выполнять системные вызовы в синхронном или асинхронном режиме.
Синхронный системный вызов означает, что процесс, сделавший такой вызов, приостанавливается (переводится планировщиком ОС в состояние ожидания) до тех пор, пока системный вызов не выполнит всю требующуюся от него работу. После этого планировщик переводит процесс в состояние готовности, и при очередном выполнении процесс гарантированно может воспользоваться результатами завершившегося к этому времени системного вызова. Синхронные вызовы называются также блокирующими, так как вызвавший системное действие процесс блокируется до его завершения.
Асинхронный системный вызов не приводит к переводу процесса в режим ожидания, после выполнения некоторых начальных системных действий, например запуска операции ввода-вывода, управление возвращается прикладному процессу.
Большинство системных вызовов в операционных системах являются синхронными, так как этот режим избавляет приложение от необходимости выяснения момента появления результата вызова.
Системные вызовы, с помощью которых приложения получают обслуживание со стороны ОС, реализуются на основе механизма программных прерываний. Системные вызовы могут выполняться синхронно, когда поток приостанавливается до завершения системного вызова, или асинхронно, когда поток продолжает работу параллельно с системной процедурой, реализующей вызов.
31.Функциями ОС по управлению памятью в мультипрограммной системе являются:
■ отслеживание свободной и занятой памяти;
■ выделение памяти процессам и освобождение памяти при завершении процессов;
■ вытеснение кодов и данных процессов из оперативной памяти на диск (полное или частичное), когда размеры основной памяти недостаточны для размещения в ней всех процессов, и возвращение их в оперативную память, когда в ней освобождается место;
■ настройка, адресов программы на конкретную область физической памяти;
■ защита памяти — запрет .выполняемому процессу записывать данные в память, назначенной другому процессу, или читать их оттуда. Эта функция, как правило, реализуется программными модулями ОС в тесном взаимодействии с аппаратными средствами.
32.
■ Символьные имена (метки) присваивает пользователь при написании программы на алгоритмическом языке или ассемблере.
■ Виртуальные, математические, или логические, адреса вырабатывает транслятор, переводящий программу на машинный язык. Поскольку во время трансляции в общем случае неизвестно, в какое место оперативной памяти будет загружена программа, то транслятор присваивает переменным и командам условные виртуальные адреса, обычно считая по умолчанию, что начальным адресом программы будет нулевой адрес.
■ Физические адреса соответствуют номерам ячеек оперативной памяти, где в действительности расположены или будут расположены переменные и команды.
Совокупность виртуальных адресов процесса называется виртуальным адресным пространством.Непрерывная последовательность виртуальных адресов называется плоской.
33.Методы распределения памяти:
без использования внешней памяти (распределение физическими разделами, распределение динамическими разделами, распределение перемещаемыми разделами).
с использованием внешней памяти(страничное распределение, сегментное распределение, сегментно-страничное).
34.
Фиксированные разделы
Простейший способ управления оперативной памятью состоит в том, что память разбивается на несколько областей фиксированной величины, называемых разделами. Такое разбиение может быть выполнено вручную оператором во время старта системы или во время ее установки. После этого границы разделов не изменяются.
Очередной новый процесс, поступивший на выполнение, помещается либо в общую очередь, либо в очередь к некоторому разделу.
При распределении памяти фиксированными разделами подсистема управления памятью решает следующие задачи.
■ Сравнивает объем памяти, требуемый для вновь поступившего процесса, с размерами свободных разделов и выбирает подходящий раздел.
■ Осуществляет загрузку программы в один из разделов и настройку адресов. Уже на этапе трансляции разработчик программы может задать раздел, в котором ее следует выполнять. Это позволяет сразу, без использования перемещающего загрузчика получить машинный код, настроенный на конкретную область памяти.
При очевидном преимуществе — простоте реализации, данный метод имеет существенный недостаток — жесткость. Так как в каждом разделе может выполняться только один процесс, то уровень мультипрограммирования заранее ограничен числом разделов. Независимо от размера программы она будет занимать весь раздел.
Динамические разделы:
Сначала вся память, отводимая для приложений, свободна. Каждому вновь поступающему на выполнение приложению на этапе создания процесса выделяется вся необходимая ему память (если достаточный объем памяти отсутствует, то приложение не принимается на выполнение и процесс для нее не создается). После завершения процесса память освобождается, и на это место может быть загружен другой процесс. Таким образом, в произвольный момент времени оперативная память представляет собой случайную последовательность занятых и свободных участков (разделов) произвольного размера.
Распределение памяти динамическими разделами сводится к выполнению операционной системой следующих функций.
■ Ведение таблиц свободных и занятых областей, в которых указываются начальные адреса и размеры участков памяти.
■ При создании нового процесса — анализ требований к памяти, просмотр таблицы свободных областей и выбор раздела, размер которого достаточен для размещения кодов и данных нового процесса.
■ Загрузка программы в выделенный ей раздел и корректировка таблиц свободных и занятых областей.
■ После завершения процесса — корректировка таблиц свободных и занятых областей.
Выбор раздела для загрузки кодов процесса при его создании может осуществляться по разным правилам, например: «первый попавшийся раздел достаточного размера», «раздел, имеющий наименьший достаточный размер» или «раздел, имеющий наибольший достаточный размер».
Поскольку данный способ предполагает, что программный код не перемещается во время выполнения, то настройка адресов может быть проведена один раз во время загрузки.
По сравнению с методом распределения памяти фиксированными разделами данный метод обладает существенно большей гибкостью, но ему присущ очень серьезный недостаток — фрагментация памяти.
Перемещаемые разделы
Одним из методов борьбы с фрагментацией является перемещение всех занятых участков в сторону старших или младших адресов, так чтобы вся свободная память образовала единую область. В дополнение к функциям, которые выполняет ОС при распределении памяти динамическими разделами, в случае перемещаемых разделов она должна еще время от времени копировать содержимое разделов из одного места памяти в другое, корректируя таблицы свободных и занятых областей. Эта процедура называется сжатием. Сжатие может выполняться либо при каждом завершении процесса, либо только тогда, когда для вновь создаваемого процесса нет свободного раздела достаточного размера. Хотя процедура сжатия и приводит к более эффективному использованию памяти, она может требовать значительного времени, что часто перевешивает преимущества данного метода.
35.При нехватке памяти в оперативной, процесс может быть перемещен на диск (это и есть виртуальная память).
Виртуализация оперативной памяти осуществляется совокупностью программных модулей ОС и аппаратных схем процессора и подразумевает решение следующих задач:
■ размещение данных в запоминающих устройствах разного типа, например часть кодов программы — в оперативной памяти, а часть — на диске;
■ выбор образов процессов или их частей для перемещения из оперативной памяти на диск и обратно;
■ перемещение по мере необходимости данных между памятью и диском;
■ преобразование виртуальных адресов в физические.
Различают два достаточно близких подхода к виртуализации памяти:
■ свопинг — образы процессов выгружаются на диск и возвращаются в оперативную память целиком (но присутствует – избыточность),
■ виртуальная память — между оперативной памятью и диском перемещаются части (сегменты, страницы и т. п.) образов процессов.
авления памятью.
Все множество реализаций виртуальной памяти может быть представлено тремя классами
■ В случае страничной виртуальной памяти перемещение данных между памятью и диском организуется страницами — частями виртуального адресного пространства фиксированного и сравнительно небольшого размера.
■ Сегментная виртуальная память предусматривает перемещение данных сегментами — частями виртуального адресного пространства произвольного размера, полученными с учетом смыслового значения данных.
■ В сегментно-страничной виртуальной памяти используется двухуровневое деление: виртуальное адресное пространство делится на сегменты, а затем сегменты делятся на страницы. Единицей перемещения данных здесь является страница. Этот способ управления памятью объединяет в себе элементы обоих предыдущих подходов.
36.При страничном распределении памяти виртуальное адресное пространство каждого процесса делится на части одинакового, фиксированного для данной системы размера, называемые виртуальными страницами.
Страничное прерывание –если понадобилась страница, которая на диске, происходит прерывание для ее поиска.
Накладные расходы системы на поддержание страничной виртуальной памяти могут быть уменьшены за счет:
■ аппаратного способа преобразования виртуального адреса в физический; (т.к. при обращении происходит преобразование виртуальных адресов в физический).
■ снижения частоты страничных прерываний путем оптимизации размера страницы, а также выбора страниц на загрузку/выгрузку. Интенсивность страничного обмена может быть также снижена в результате так называемой упреждающей загрузки, в соответствие с которой при возникновении страничного прерывания в память загружается не одна страница, содержащая адрес обращения, а сразу несколько прилегающих к ней страниц. При двухуровневом страничном распределении памяти множество виртуальных адресов процесса делится на разделы, а разделы делятся на страницы. Все страницы имеют одинаковый размер, а разделы содержат одинаковое количество страниц.
37(Механизмы).При сегментной организации памяти виртуальное адресное пространство процесса делится на части — сегменты, размер которых определяется с учетом смыслового значения содержащейся в них информации. Отдельный сегмент может представлять собой подпрограмму, массив данных и т. п. Деление виртуального адресного пространства на сегменты осуществляется компилятором на основе указаний программиста или по умолчанию, в соответствии с принятыми в системе соглашениями. (При загрузке процесса с диска, загружается его часть – сегмент, полная копия хранится на диске).
Каждая запись в таблице сегментов содержит следующие характеристики
соответствующего сегмента:
■ базовый физический адрес сегмента в оперативной памяти;
■ размер сегмента;
■ правила доступа к сегменту;
■ признаки модификации, присутствия и обращения к данному сегменту, а также некоторая другая информация.
В сегментарном распределении существует понятие разграничения доступа: один сегмент можно только читать, в другой только записывать, например
Недостатки:
1)ОС заносит в таблицы страниц не полные адреса, а номера физических страниц, которые совпадают со старшими разрядами базовых адресов. Сегмент же может в общем случае располагаться в физической памяти, начиная с любого адреса, следовательно, для определения местоположения в памяти необходимо задать его полный начальный физический адрес. Использование операции сложения вместо конкатенации замедляет процедуру преобразования виртуального адреса в физический по сравнению со страничной организацией.
2)Другим недостатком сегментного распределения является избыточность,
При сегментной организации единицей перемещения между памятью и диском
является сегмент, имеющий в общем случае объем больший, чем страница. Од
нако во многих случаях для работы программы вовсе не требуется загружать
весь сегмент целиком, достаточно было бы одной или двух страниц