Для начала можно определить объект как некую совокупность данных и способов работы с ними. Данные можно рассматривать как поля записи. Это характеристики объекта. Пользователь и объекты программы должны, конечно, иметь возможность читать эти данные объекта, как-то их обрабатывать и записывать в объект новые значения.
Здесь важнейшее значение имеют принципы инкапсуляции и скрытия данных.
Инкапсуляция – это процесс отделения друг от друга отдельных элементов объекта, определяющих его устройство и поведение. Инкапсуляция служит для того, чтобы изолировать часть объекта, отражающую его внешнее поведение, от внутренней реализации объекта.
Принцип скрытия данных заключается в том, что внешним объектам и пользователю прямой доступ к данным, как правило, запрещен. Делается это из двух соображений.
Во-первых, для надежного функционирования объекта надо поддерживать целостность и непротиворечивость его данных. Если не позаботиться об этом, то внешний объект или пользователь могут занести в объект такие неверные данные, что он начнет функционировать с ошибками.
Во-вторых, необходимо изолировать внешние объекты от особенностей внутренней реализации данных. Для внешних потребителей данных должен быть доступен только пользовательский интерфейс – описание того, какие имеются данные и функции и как их использовать. А внутренняя реализация – это дело разработчика объекта. При таком подходе разработчик может в любой момент модернизировать объект, изменить структуру хранения и форму представления данных, но, если при этом не затронут интерфейс, внешний потребитель этого даже не заметит. Следовательно, во внешней программе и в поведении пользователя ничего не придется менять.
Чтобы выдержать принцип скрытия данных, в объекте обычно определяются процедуры и функции, обеспечивающие все необходимые операции с данными: их чтение, преобразование, запись. Эти функции и процедуры называются методами и через них происходит общение с данными объекта (рис. 3.2).
1. Управление задачами и памятью
в операционных системах
Основные понятия
Системное программное обеспечение – программы и комплексы программ, являющиеся общими для всех, кто совместно использует технические средства компьютера, и применяемые как для создания новых программ, так и для организации выполнения программ существующих.
Программное обеспечение (ПО) – совокупность входящих в состав вычислительной системы программных средств, т.е. программ, данных и документов к ним.
Вычислительная система – совокупность аппаратных и программных средств ЭВМ, взаимодействующих для решения задач обработки информации.
Системное программное обеспечение может быть разделено на следующие пять групп:
1. Операционные системы.
2. Системы управления файлами.
3. Интерфейсные оболочки для взаимодействия пользователя с ОС и программные среды.
4. Системы программирования.
5. Утилиты.
Рассмотрим вкратце эти группы системных программ.
Операционная система (ОС) – комплекс программ, организующих вычислительный процесс в вычислительной системе. Операционная система, с одной стороны, выступает как интерфейс между аппаратурой компьютера и пользователем с его задачами, а с другой – предназначена для наиболее эффективного использования ресурсов вычислительной системы и организации надежных вычислений. Любой из компонентов прикладного программного обеспечения обязательно работает под управлением ОС.
В данном учебном курсе нас прежде всего будут интересовать многозадачные ОС.
Многозадачная ОС – операционная система, способная одновременно поддерживать выполнение на компьютере нескольких задач.
Назначение системы управления файлами – организация более удобного доступа к данным, организованным как файлы. Именно благодаря системе управления файлами вместо низкоуровневого доступа к данным с указанием конкретных физических адресов нужной нам записи используется логический доступ с указанием имени файла и записи в нем. Как правило, все современные ОС имеют соответствующие системы управления файлами. Однако выделение этого вида системного программного обеспечения в отдельную категорию представляется целесообразным, поскольку ряд ОС позволяет работать с несколькими файловыми системами (либо с одной из нескольких, либо сразу с несколькими одновременно).
Для удобства взаимодействия с ОС могут использоваться дополнительные интерфейсные оболочки. Их основное назначение – либо расширить возможности по управлению ОС, либо изменить встроенные в систему возможности.
Система программирования представлена прежде всего такими компонентами, как транслятор с соответствующего языка, библиотеки подпрограмм, редакторы, компоновщики и отладчики. Не бывает самостоятельных (оторванных от ОС) систем программирования. Любая система программирования может работать только в соответствующей ОС, под которую она и создана, однако при этом она может позволять разрабатывать программное обеспечение и под другие ОС.
Под утилитами понимают специальные системные программы, с помощью которых можно как обслуживать саму операционную систему, так и подготавливать для работы носители данных, выполнять перекодирование данных, осуществлять оптимизацию размещения данных на носителе и производить некоторые другие работы, связанные с обслуживанием вычислительной системы. К утилитам следует отнести и программу разбиения накопителя на магнитных дисках на разделы, и программу форматирования, и программу переноса основных системных файлов самой ОС.
Понятие «вычислительный процесс» (или просто – «процесс») является одним из основных при рассмотрении операционных систем.
Процесс – последовательность операций при выполнении программы или ее части вместе с используемыми данными.
Последовательный вычислительный процесс – это выполнение отдельной программы с ее данными и на последовательном процессоре. Последовательный процессор – процессор, обеспечивающий последовательную обработку данных.
В качестве примеров можно назвать следующие процессы (задачи): прикладные программы пользователей, утилиты и другие системные обрабатывающие программы. Процессами могут быть редактирование какого-либо текста, трансляция исходной программы, ее компоновка, исполнение.
Задачей называют задание вычислительной системе, представленное в виде программы или части программы и данных, которое операционная система рассматривает как единое целое при распределении ресурсов.
Вычислительный процесс может включать в себя несколько задач. Термин «задача» в некоторых операционных системах совпадает с понятием «процесс».
Процессорное время и оперативная память являются основными ресурсами в случае реализации мультипрограммных вычислений.
Мультипрограммирование – режим или метод организации работы вычислительной системы, при котором одновременно выполняется несколько программ, попеременно использующих одни и те же ее ресурсы.
Ресурс – время, аппаратные, программные и другие средства, которые могут быть предоставлены вычислительной системой либо ее отдельными компонентами вычислительному процессу или пользователю.
Концептуально процессор рассматривается в двух аспектах: во-первых, он является носителем данных и, во-вторых, он выполняет операции, связанные с их обработкой.
Оперативная память – память, непосредственно связанная с центральным процессором вычислительной системы.
Оперативная память – это важнейший ресурс любой вычислительной системы, поскольку без нее (как, впрочем, и без центрального процессора) невозможно выполнение ни одной программы. Память является разделяемым ресурсом. От выбранных механизмов распределения памяти между выполняющимися процессами очень сильно зависит и эффективность использования ресурсов системы, и ее производительность, и возможности, которыми могут пользоваться программисты при создании своих программ. Способы распределения времени центрального процессора тоже сильно влияют и на скорость выполнения отдельных вычислений, и на общую эффективность вычислительной системы.
Операционная система выполняет следующие основные функции, связанные с управлением задачами:
• создание и удаление задач;
• планирование процессов и диспетчеризация задач;
• синхронизация задач, обеспечение их средствами коммуникации.
Система управления задачами обеспечивает прохождение их через компьютер. В зависимости от состояния процесса ему должен быть предоставлен тот или иной ресурс. Например, новый процесс необходимо разместить в основной памяти – следовательно, ему необходимо выделить часть адресного пространства. Новый порожденный поток текущего процесса необходимо включить в общий список задач, конкурирующих между собой за ресурсы центрального процессора.
Создание и удаление задач осуществляется по соответствующим запросам от пользователей или от самих задач. Задача может породить новую задачу. При этом между процессами появляются «родственные» отношения. Порождающая задача называется «предком», «родителем», а порожденная – «потомком», «сыном» или «дочерней задачей». «Предок» может приостановить или удалить свою дочернюю задачу, тогда как «потомок» не может управлять «предком».
Если мы возьмем набор таких процессов, которые не будут конкурировать между собой за неразделяемые ресурсы при параллельном выполнении, то, скорее всего, процессы смогут выполниться быстрее (из-за отсутствия дополнительных ожиданий), да и имеющиеся в системе ресурсы будут использоваться более эффективно. Итак, возникает задача подбора такого множества процессов, что при выполнении они будут как можно реже конфликтовать из-за имеющихся в системе ресурсов. Такая задача называется планированием вычислительных процессов.
Основным подходом к организации того или иного метода управления процессами, обеспечивающего эффективную загрузку ресурсов или выполнение каких-либо иных целей, является организация очередей процессов и ресурсов. На первый план вышли задачи динамического (или краткосрочного) планирования, то есть текущего наиболее эффективного распределения ресурсов, возникающего практически при каждом событии. Задачи динамического планирования стали называть диспетчеризацией. Программа, управляющая распределением ресурсов, называется диспетчером.
Долгосрочное планирование осуществляется гораздо реже, чем задача текущего распределения ресурсов между уже выполняющимися процессами и потоками. Основное отличие между долгосрочным и краткосрочным планировщиками заключается в частоте запуска: краткосрочный планировщик, например, может запускаться каждые 30 или 100 мс, долгосрочный – один раз за несколько минут (или чаще; тут многое зависит от общей длительности решения заданий пользователей).
Долгосрочный планировщик решает, какой из процессов, находящихся во входной очереди, должен быть переведен в очередь готовых процессов в случае освобождения ресурсов памяти. Он выбирает процессы из входной очереди с целью создания неоднородной мультипрограммной смеси.
Краткосрочный планировщик решает, какая из задач, находящихся в очереди готовых к выполнению, должна быть передана на исполнение. В большинстве современных операционных систем, с которыми мы сталкиваемся, долгосрочный планировщик отсутствует.
Планирование и диспетчеризация процессов и задач
Стратегии планирования
При рассмотрении стратегий планирования, как правило, идет речь о краткосрочном планировании, то есть о диспетчеризации. Стратегия планирования определяет, какие процессы мы планируем на выполнение для того, чтобы достичь поставленной цели. Известно большое количество различных стратегий выбора процесса, которому необходимо предоставить процессор. Среди них, прежде всего, можно назвать следующие стратегии:
• по возможности заканчивать вычисления (вычислительные процессы) в том же самом порядке, в котором они были начаты;
• отдавать предпочтение более коротким процессам;
• предоставлять всем пользователям (процессам пользователей) одинаковые услуги, в том числе и одинаковое время ожидания.
Когда говорят о стратегии обслуживания, всегда имеют в виду понятие процесса, а не понятие задачи, поскольку процесс может состоять из нескольких потоков (задач).
Поток – последовательность выполнения операторов в программе.