Различия между версиями 1 и 2
Версия 1 от 2008-07-17 20:12:15
Размер: 11919
Редактор: eSyr
Комментарий:
Версия 2 от 2008-07-22 02:42:23
Размер: 33446
Редактор: PavelSutyrin
Комментарий: расшифровано
Удаления помечены так. Добавления помечены так.
Строка 1: Строка 1:
== Знакомство ==
Обратите внимание, что перед вами на экране какая-то штука, в которой не по-русски всё написано. Это следствие того, что на эти компьютеры установлен дистрибутив из состава ПСПО под названием Lite, главной задача которого --- экономить ресурсы компьютера везде, где это не сильно вредит функциональности. . В данном случае, та программа, которая занимается регистрацией пользователей, та самая простая, под названием xdm, которая в этом плане умеет довольно мало, ее довольно тяжело перевести на русский язык, Прежде чем будем тыкать пальцем в логин и пароль, немножко теории.

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

=== Однозадачный режим ===
Уровень нулевой, где никаких дополнительных действий относительно доступности ресурсов компьютера выполнять не надо --- когда у нас есть ровно одна программа, которая полностью распоряжается всеми ресурсами компьютера, пока не закончит свою работу. В этом случае это называется однозадачная система, и то, правильно она ими распоряжается, или неправильно -- это дело этой самой программы. Если мы ее плохо написали и она пожирает память и в конце концов перестаёт работать, потому что оперативной памяти не хватает. Если мы написали ее хорошо, она распоряжается всей оперативной памятью, всеми внешними устройствами по своему усмотрению. Вопрос такой: много ли нужно программного обеспечения, чтобы эта единственная программа нормально, удобно могла ими распоряжаться? Нужно ли создавать какое-то программное обеспечение для поддержки этого процесса? Скорее всего нет, эта программа и есть это ПО. Типичный пример -- это игровая консоль старого разлива, с картриджем. На картридже программа, она загружается и выполняется, однозадачная система.

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

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

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

Еще более очевидно возникает необходимость разделения ресурсов, когда мы имеем многозадачную систему с параллелизмом или псевдо-параллелизмом (что вообще-то одно и то же). Параллелизм -- несколько центральных процессоров, одновременно работают несколько программ, псевдо-параллелизм -- это ситуация, когда эти программы в действительности работают последовательно, но для пользователя создается впечатление, что они работают параллельно, и псевдо-параллелизм происходит так: один квант времени работает одна программа, потом она временно отставляется в сторону, квант времени поработает другая программа, и так пока вся очередь не закончится, потом снова начинает работать первая программа, и все снова. Псевдо-параллелизм чаще всего используется, это так называемая вытесняющая многозадачность. Впрочем, программа может не хотеть работать, может, она дожидается окончания операции ввода-вывода, тогда она свою очередь пропускает, потом ей вне очереди дают возможность повыполняться. Алгоритм там довольно сложный. Прошлый год прошёл под флагом революций в области планировщиков процессов в UNIX-системах, что в Linux, что в BSD, у нас был семинар этому посвящён.

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

==== Разделение центрального процессора ====
Здесь возникают другая довольно интересная задача, связанная с тем, что у нас один на всех процессор. Процессор -- это не только процессорное время, но его, процессора, разные ресурсы, связанные с хранением данных, регистры, и т.п. Небольшие объекты памяти, которые нельзя попилить на куски. Это значит, что когда мы организуем этот псевдо-параллелизм, мы должны предусмотреть не только ситуацию разбиения по времени (немножко работает одна, немножко другая задача), но и механизм сохранения тех элементов памяти, которые не дублируются, от одной программы где-то, на то время, пока работает другая программа, элементы памяти все, специфическое для работы программы, весь комплекс памяти, который программа использует для работы, достаточный для того, чтобы продолжить работу программы, называется контекст процесса. Это что значит, что в случае псевдо-параллелизм. Мы имеем один процесс, имеем набор оперативной памяти, в очереди сидят программы (программа1, программа2). С каждой ожидающей программой связан контекст процесса, сохранённый в той же ОП. Когда задача попадает на выполнения, контекст ее подгружается, программа некоторое время выполняется, контекст отгружается обратно, подгружается контекст следующей по очереди задачи, она выполняется, и так далее. Даже такая с виду простая штука, как разделение ресурсов под названием ЦП уже приводит к довольно сложным механизмам разделения доступа к этому ресурсу: квантование выполнения и сохранение контекста.

==== Разделение оперативной памяти ====
Тут ситуация чуть более простая, если в ней не разбираться, и чуть более сложная, если в ней разбираться. Никому не надо рассказывать слишком подробно, что в некоей абстрактной действительности ОП представляет собой последовательность ячеек с номерами от 0 до самого большого, сколько у нас воткнуто, столько и будет. Адреса. Системы, которые ведут свое происхождение от однозадачных систем и не обеспечивают надлежащее разделение памяти между задачами (типичная такая система -- DOS или Windows 3.11, отчасти Win95), они вкладывают: одна программа от 100 до 1000, другая от 2000 до 2020, эти программы там у себя работали, эти участки памяти выполняли роль контекста процесса, когда надо было, выполнялись команды из одного участка памяти, потом состояние сохранялось, выполнялись команды из другого участка, и т.д. Но если одной программе по причине ошибки приходило в голову исписать нулями не свою память (начав, к пример, в своей, а в результате ошибки убежав за границу), то тогда она убивала всю оперативную память, доступную ОС, и все умирало. Типичная ситуация в DOS'е: написал программу на Си с ошибкой, запустил, перегрузился. Между прочим, в младших версиях Windows то же самое. ОС, которые обеспечивают нормальное разделение памяти, пользуются аппаратным механизмом разделения, который спокон веку (лет 20 назад, а то и раньше), устроен так.

Вся оперативная память делится на страницы некоторого размера. Пусть запускаются два процесса в псевдо-параллельном режиме, никто из них не ждет обмена, а жаждет выполняться на процессоре, для каждого создается контекст, набор регистров, который нужно хранить, и все остальное, потом каждая из них запрашивает себе память, ему выделяется память. Куски памяти, запрошенные разными процессами, перемешаны произвольно. Но реальных адресов с 0 до полного объема памяти ни один процесс не наблюдает. У него происходит аппаратно поддерживаемое со стороны процессора штука: два куска памяти, принадлежащей ему, складываются в некоторую т.н. виртуальную память (допустим, 1 Мб), которую, собственно, и видит этот процесс. В таких случаях в понятие контекста процесса включается указанное преобразование. Когда процесс обращается к памяти, он видит только ту память, которую ему выдали, причем он ее видит прям подряд, от 0 и так далее. Из скольки страниц она состоит -- его не волнует. У нас всего 1 Гб памяти, процесс заказал 1 Мб, он 1Мб получил, этот 1 Мб набран из двух страниц, но процесс этого не видит, специальная аппаратная структура, входящая в понятие контекст процесса, производит такое преобразование. То же самое происходит с второй программой (три странички, одно адресное пространство, от нуля до 2 Мб). Каждый процесс видит свою память, строго от нуля, чужую память он не видит в принципе. При использовании виртуальной памяти программа не может случайно испортить чужую память. По предварительной договорённости можно обратиться в вышестоящей организации и сказать: у меня есть две программы, которые используют общий сегмент памяти, разреши им пользоваться, потому что так проще данные передавать: одна запишет, другая возьмёт. Она (ОС) скажет: ну хорошо, тогда вот вам еще один сегмент, который будет подключен в адресное пространство обоих процессов (со своими адресами). Когда один процесс в него пишет, другой процесс сразу видит изменения. Но, в отличие от ситуации, когда программа расписала нулями всю чужую память, эта ситуация -- контролируемая. Вы написал программы так, что они заказали себе один и тот же сегмент, и по Вашей воле производят там изменения.

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

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

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

Если в случае многозадачной системы все задачи была в равных правах и главной целью было обеспечить невозможность случайного доступа к чужим ресурсам, то в случае многопользовательской системы разные задачи могут иметь разные права, и основной целью будет недопущение не просто случайного, а вообще несанкционированного доступа к ресурсу. Если один пользователь не хочет, чтобы задачи другого пользователя имели доступ к ресурсам первого пользователя, то он это должен уметь запретить. Это называется ограничение доступа к ресурсам.
Строка 2: Строка 41:
Мы получаем три группы задач, которые должна решать ОС:
Строка 3: Строка 43:
Начинаем мы со знакомства.  * унификация доступа
 * разделение доступа
 * ограничение доступа
Строка 5: Строка 47:
Обратите внимание, что перед вами на экране какая-то штука, в которой не по русски всё написано. Это следствие того, чт уст. дистрибути под названием Lite, задачей котрого явл. экономить ресурсы. В частности, в кчестве desktop manager используется xdm, который трудно локализовать. прежде чем будем тыкать пальцами в логин и парль, немнго говорильни. Фактически, это определение ОС -- это комплекс ПО, которое обеспечивает указанные три вещи касательно доступа к тому аппаратному обеспечению, на котором это все запущено.
Строка 7: Строка 49:
У нс существует три уровня, на которых мы по-разному забтимся о том, как и кем исп. ресурсы компьютера. Уровень нулевой, где никких дополнительных действий отн. доступнсти компьютера вып. не надо --- когда у нс есть в каждый ммент времени ровно одна программа, кторая расп. всеми ресурсами ()однощадачная сисьема. В этом случае, правильно или неправлиьно программа расп. ресурсами компьютера --- дело программы. Впрос такой --- много ли нужно программного обеспечения, чтобы эта программа нормально, удбно могла ими распоряжаться, нужно ли создавать какое-то прогр. окружение? Очевидно нет, поск. эта программа и есть это прогр. приложение. Типичный пример --- игровая консоль старого разлива (с картриджами). Однозадачная система. На самом деле, это не совсем так, поск. мы можем захотеть как минимум унифиц. спсоб рабты с апп. обесп.. Т есть будет некая прослойка между ресурсами и сп. польз. этими ресурсами, клторая будет скрывать особенности. Т есть, мы поменяли видеокарту, поменяли прслойку, которая предст. унифиц. пртокол, и мы можем исп. ту же самую программу. Т есть даже здесь встаёт задача унификации. Она встаёт для того, чтбы прогр. обесп. не зависело от особенностей апп. облесп. Вообще говоря, нет стандартного определения ОС. Если уйти в историю, мы поймём, что пользуемся этим словом неправильно. operating system -- это не ПО, это систематическое (system) руководство по использованию (operating) компьютера, совокупность методов. Как правило, эти методы программируются и получается прграммное обеспечение, но смысл изначально был такой.
Строка 9: Строка 51:
Как только мы гворим о том, что у нас компьютер общег назначения и говорится, что им могут польз. неск программ, сразу возникает задача, кто какими ресурсами может пользоваться. Многозадачная среда. Рассм. самый простой вариант --- у нас рабтают неск. программ одна за другй. Даже в этом случае встаёт задача доступа к ресурсам, которые сущ. на протяжении всей работы программ. Например, хранилище данных. То есть оперативной памятью прогр. пользуются монопльно, а с файлами в хранилище --- свместно. Ещё более необх. разд. ресурсов возникет в системе с (псевдо)параллелизмом. Параллелизм --- когда действ. есть неск. процессров и они одн. вып. неск. прграмм. Псевдопарал --- когда происх. перек. между прграммами во время их вып. Тут встаёт вопрос о том, что все ресурсы (проц. время, память...) длжны быть разделяемыми. Например, неправильно, если дна прогр. сжрёт всё проц. время. То же самое с памятью. Разумн орг. как раздачу памяти, так и разг. доступа. Это должно быть обозначенно, и ситуции, когда одни прогр. что-то делают с чужими ресурсами, длжны быть штатными. Эт наз. разделение ресурсов. === Примеры ===
Из этого определения выкинуты подробности отдельных вариантов использования. Я бы очень хотел избежать ситуации, когда под операционной системой понимается нечто, у чего в нижнем левом углу экрана находится кнопка "Пуск", по двум причинам: никакого экрана может не быть, мы говорим о ресурсах, мало ли, может нет графических ресурсов у данной аппаратной платформы, вообще нету, о каком экране речь? Во-вторых, может быть экран есть, но нету графической кнопки для нажатия на нее мышкой, т.к. может случиться, что эта аппаратная платформа управляется без помощи графических инструментов, а исключительно подачей ей команд, а всякая графика -- прикладная, а не интерфейсная. Не надо забывать о том, что наша задача -- повысить удобство работы с компьютером. Собственно, ради чего мы все это делаем? Ради того, чтобы человек, который программирует, или запускает программы, не занимался указанными тремя задачами сам.
Строка 11: Строка 54:
На самм деле, тут возникает другая ещё инт. задача --- у нас один процессор, и тут впрос не только с проц. временем, но и его ресурсы (регистры), которые нельзя попилить на куски. И когда мы орг. псевдопаралл., мы должны преддусмтреть не тлько мех. времени, но и механизм сохранения этих ресурсов одной пргр. на время рабты других. Всё, чт связано с вып. процесса (fixme!), нащывается контекстом процесса. То есть, даже такая штука, как псевдопараллелизм, состоит из двух вещей: квантование времени и сохр. контекста. Что же касается разд. памяти, т тут ситуация проще, если в ней не разб. и сложнее, если разб. Условно говоря, память предст. собой посл. ячеек с номерами от 0 до сколько воткнуто. Системы, которые ведут присх. от однозадачных систем (DOS) не имели средств разделения памяти. То есть, есть неск. порграмм, каждая в свём месте памяти, но ничто не мешает одной программе испортить память другой. Поэтому нормальные С исп. аппаратные средства защиты памяти, стрничн-сегм. организацию. Вся память разделена на страницы, и при запрсе памяти, выдаются страницы в небх количестве, возм. не подряд. При этм процесс физ. адресов не видит, видит только виртуальные, и дресация вирт. непрерывна. При этом, что бы ни делать, то кроме своих страниц ничего не испортишь. Исключение --- использование shmem. Почему DOS -- это не ОС?.. Привожу пример DOS, вы явно с ним знакомы. DOS -- это дисковая операционная система, если кто помнит. Многозадачная, но однопользовательская. На этом уровне DOS не умеет обеспечивать защиту памяти, со стороны ОС не предоставляются возможности обеспечить даже защиту от случайного, непреднамеренного доступа. Не предоставляет нормальных способов разделения таких ресурсов как видео, аудио, ничего этого нет. Вы пишете специальную программу-драйвер, или еще хуже, вписываете в вашу программу работу непосредственно с регистрами видеокарты, после чего все начинает работать.
Строка 13: Строка 56:
При этом разделение ресурсов касается не только процессора и памяти, но и, например, звуковая карта. То же саме тн. к любму внешнему ресурсу. Единственные инструменты по унификации и разделению предоставляет DOS пользователю, это файловая система. Она в те времена вызывала очень много нареканий, т.к. в том же UNIX'е уже была вполне нормальная файловая система, а в DOS'е ее не было. Но тем не менее представление о DOS'е хорошо иллюстрирует, почему он не является ОС вообще. С точки зрения внешних ресурсов, например, графики, DOS вообще не операционная система, даже унификации никакой не предоставляет, т.е., там есть INT 13h для выдачи на экран, но это же смешно. Чтобы выискать в DOS'е следы операционной системы, его нужно изучать. Там есть INT 21h... Никаких средств обеспечения многозадачности тоже нет. Это притом, что все современные ОС, в том числе более новые версии Windows, начиная с Windows NT и далее, и, собственно и Linux, на этот вопрос отвечают полностью утвердительно по всем статьям, с некоторыми нюансами, о которых мы тоже поговорим.
Строка 15: Строка 58:
Н самом деле, есть ещё одна задача, кторой мы не вспомнили. Ещё одна задача возн., когда выясн., чт эти процессы не знют о сущ. друг друга, причём не просто не хотят, чтобы произошёл дост к ремсурсам, кторые ни хотели, но и в случае, даже если программа знает о ресурсе, он не могла им воспльзваться. Здесь мы приходим к тму, что система не просто мнгозадачная, но и задачи имеют разные права. Фктически, это означает то, что задачи делятся на группы, принад. разным плзователям. И мы переходям от системы мнгозад. к системе многозад. и многопольз. То есть, идея сост. в том, что если раньше у нас задачи были в равных правах, и главнй целью было бесп. невозм. неправильного. доступа к ресурсам, то тут задачи имеют разные права, и задача обесп. невозм. несанкц. доступа к ресурсам. Это называется ограничение ресурсов.
Строка 17: Строка 59:
Мы получаем три группы задач, кторые мы должны решать, когда работаем с ОС: унификация, разделение, ограничение. Факт., это определение ОС. ОС --- такй прогр. комплекс, кторый обеспечивает унификацию, разделение, ограничение.
Строка 19: Строка 60:
Пчему именно так? Вообще, нет правильного опред. ОС. Если мы уйдём в историю, то увидим, что термином мы исп. непрвильно, OS --- система исп. компьютера, которая конечно выливается в ПО, но всё-ткие. Это опр. лектору нравится тем, что из него выкинуты подробности тдельных вариантв исп. Лектор чень хотел бы избежать ситуации, когда под ОС имеется в виду нечто, когда в левой нижней части экрана есть кнопка пуск. Портому что экрана может не быть. Может не быть кнопки и мышки. Тем не менее, не надо забывать о том, что наша задача --- повыить удобство работать с компьютером, и сделть так, чтобы человек не знимался этими задачами сам. Почему DOS не операционная система, поск. он не обесп. защиту памяти, не предост. норм. разд. ресурсов. Единственное, каикие инстр. униф. и разд. представляет DOS --- файловая система. При этом WinNT и Linux отвечают на все эти впросы утвердительно.
## {00:45:45}
Строка 26: Строка 66:
|| Готовность (%) || Продолжительность (ак. ч.) || Подготовка (календ. ч.) || Полный текст (раб. д.) || Предварительные знания || Level || Maintainer                                       || Start date || End date ||
|| 0              || 1 || 1 || 1 || || 1 || PavelSutyrin, GeorgeTarasov, VsevolodKrishchenko ||            || ||
|| Готовность (%) || Продолжительность (ак. ч.) || Подготовка (календ. ч.) || Полный текст (раб. д.) || Предварительные знания || Level || Maintainer || Start date || End date ||
||20 || 1 || 1 || 1 || || 1 || PavelSutyrin, GeorgeTarasov, VsevolodKrishchenko || || ||

Строка 29: Строка 71:
CategoryLectures CategoryPspo CategoryMpgu CategoryUneex  . CategoryLectures CategoryPspo CategoryMpgu CategoryUneex

Знакомство

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

Управление ресурсами компьютера

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

Однозадачный режим

Уровень нулевой, где никаких дополнительных действий относительно доступности ресурсов компьютера выполнять не надо --- когда у нас есть ровно одна программа, которая полностью распоряжается всеми ресурсами компьютера, пока не закончит свою работу. В этом случае это называется однозадачная система, и то, правильно она ими распоряжается, или неправильно -- это дело этой самой программы. Если мы ее плохо написали и она пожирает память и в конце концов перестаёт работать, потому что оперативной памяти не хватает. Если мы написали ее хорошо, она распоряжается всей оперативной памятью, всеми внешними устройствами по своему усмотрению. Вопрос такой: много ли нужно программного обеспечения, чтобы эта единственная программа нормально, удобно могла ими распоряжаться? Нужно ли создавать какое-то программное обеспечение для поддержки этого процесса? Скорее всего нет, эта программа и есть это ПО. Типичный пример -- это игровая консоль старого разлива, с картриджем. На картридже программа, она загружается и выполняется, однозадачная система.

Унификация доступа

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

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

Многозадачный режим. Разделение доступа

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

Еще более очевидно возникает необходимость разделения ресурсов, когда мы имеем многозадачную систему с параллелизмом или псевдо-параллелизмом (что вообще-то одно и то же). Параллелизм -- несколько центральных процессоров, одновременно работают несколько программ, псевдо-параллелизм -- это ситуация, когда эти программы в действительности работают последовательно, но для пользователя создается впечатление, что они работают параллельно, и псевдо-параллелизм происходит так: один квант времени работает одна программа, потом она временно отставляется в сторону, квант времени поработает другая программа, и так пока вся очередь не закончится, потом снова начинает работать первая программа, и все снова. Псевдо-параллелизм чаще всего используется, это так называемая вытесняющая многозадачность. Впрочем, программа может не хотеть работать, может, она дожидается окончания операции ввода-вывода, тогда она свою очередь пропускает, потом ей вне очереди дают возможность повыполняться. Алгоритм там довольно сложный. Прошлый год прошёл под флагом революций в области планировщиков процессов в UNIX-системах, что в Linux, что в BSD, у нас был семинар этому посвящён.

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

Разделение центрального процессора

Здесь возникают другая довольно интересная задача, связанная с тем, что у нас один на всех процессор. Процессор -- это не только процессорное время, но его, процессора, разные ресурсы, связанные с хранением данных, регистры, и т.п. Небольшие объекты памяти, которые нельзя попилить на куски. Это значит, что когда мы организуем этот псевдо-параллелизм, мы должны предусмотреть не только ситуацию разбиения по времени (немножко работает одна, немножко другая задача), но и механизм сохранения тех элементов памяти, которые не дублируются, от одной программы где-то, на то время, пока работает другая программа, элементы памяти все, специфическое для работы программы, весь комплекс памяти, который программа использует для работы, достаточный для того, чтобы продолжить работу программы, называется контекст процесса. Это что значит, что в случае псевдо-параллелизм. Мы имеем один процесс, имеем набор оперативной памяти, в очереди сидят программы (программа1, программа2). С каждой ожидающей программой связан контекст процесса, сохранённый в той же ОП. Когда задача попадает на выполнения, контекст ее подгружается, программа некоторое время выполняется, контекст отгружается обратно, подгружается контекст следующей по очереди задачи, она выполняется, и так далее. Даже такая с виду простая штука, как разделение ресурсов под названием ЦП уже приводит к довольно сложным механизмам разделения доступа к этому ресурсу: квантование выполнения и сохранение контекста.

Разделение оперативной памяти

Тут ситуация чуть более простая, если в ней не разбираться, и чуть более сложная, если в ней разбираться. Никому не надо рассказывать слишком подробно, что в некоей абстрактной действительности ОП представляет собой последовательность ячеек с номерами от 0 до самого большого, сколько у нас воткнуто, столько и будет. Адреса. Системы, которые ведут свое происхождение от однозадачных систем и не обеспечивают надлежащее разделение памяти между задачами (типичная такая система -- DOS или Windows 3.11, отчасти Win95), они вкладывают: одна программа от 100 до 1000, другая от 2000 до 2020, эти программы там у себя работали, эти участки памяти выполняли роль контекста процесса, когда надо было, выполнялись команды из одного участка памяти, потом состояние сохранялось, выполнялись команды из другого участка, и т.д. Но если одной программе по причине ошибки приходило в голову исписать нулями не свою память (начав, к пример, в своей, а в результате ошибки убежав за границу), то тогда она убивала всю оперативную память, доступную ОС, и все умирало. Типичная ситуация в DOS'е: написал программу на Си с ошибкой, запустил, перегрузился. Между прочим, в младших версиях Windows то же самое. ОС, которые обеспечивают нормальное разделение памяти, пользуются аппаратным механизмом разделения, который спокон веку (лет 20 назад, а то и раньше), устроен так.

Вся оперативная память делится на страницы некоторого размера. Пусть запускаются два процесса в псевдо-параллельном режиме, никто из них не ждет обмена, а жаждет выполняться на процессоре, для каждого создается контекст, набор регистров, который нужно хранить, и все остальное, потом каждая из них запрашивает себе память, ему выделяется память. Куски памяти, запрошенные разными процессами, перемешаны произвольно. Но реальных адресов с 0 до полного объема памяти ни один процесс не наблюдает. У него происходит аппаратно поддерживаемое со стороны процессора штука: два куска памяти, принадлежащей ему, складываются в некоторую т.н. виртуальную память (допустим, 1 Мб), которую, собственно, и видит этот процесс. В таких случаях в понятие контекста процесса включается указанное преобразование. Когда процесс обращается к памяти, он видит только ту память, которую ему выдали, причем он ее видит прям подряд, от 0 и так далее. Из скольки страниц она состоит -- его не волнует. У нас всего 1 Гб памяти, процесс заказал 1 Мб, он 1Мб получил, этот 1 Мб набран из двух страниц, но процесс этого не видит, специальная аппаратная структура, входящая в понятие контекст процесса, производит такое преобразование. То же самое происходит с второй программой (три странички, одно адресное пространство, от нуля до 2 Мб). Каждый процесс видит свою память, строго от нуля, чужую память он не видит в принципе. При использовании виртуальной памяти программа не может случайно испортить чужую память. По предварительной договорённости можно обратиться в вышестоящей организации и сказать: у меня есть две программы, которые используют общий сегмент памяти, разреши им пользоваться, потому что так проще данные передавать: одна запишет, другая возьмёт. Она (ОС) скажет: ну хорошо, тогда вот вам еще один сегмент, который будет подключен в адресное пространство обоих процессов (со своими адресами). Когда один процесс в него пишет, другой процесс сразу видит изменения. Но, в отличие от ситуации, когда программа расписала нулями всю чужую память, эта ситуация -- контролируемая. Вы написал программы так, что они заказали себе один и тот же сегмент, и по Вашей воле производят там изменения.

Разделение внешних устройств

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

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

Ограничение доступа

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

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

Что такое операционная система

Мы получаем три группы задач, которые должна решать ОС:

  • унификация доступа
  • разделение доступа
  • ограничение доступа

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

Вообще говоря, нет стандартного определения ОС. Если уйти в историю, мы поймём, что пользуемся этим словом неправильно. operating system -- это не ПО, это систематическое (system) руководство по использованию (operating) компьютера, совокупность методов. Как правило, эти методы программируются и получается прграммное обеспечение, но смысл изначально был такой.

Примеры

Из этого определения выкинуты подробности отдельных вариантов использования. Я бы очень хотел избежать ситуации, когда под операционной системой понимается нечто, у чего в нижнем левом углу экрана находится кнопка "Пуск", по двум причинам: никакого экрана может не быть, мы говорим о ресурсах, мало ли, может нет графических ресурсов у данной аппаратной платформы, вообще нету, о каком экране речь? Во-вторых, может быть экран есть, но нету графической кнопки для нажатия на нее мышкой, т.к. может случиться, что эта аппаратная платформа управляется без помощи графических инструментов, а исключительно подачей ей команд, а всякая графика -- прикладная, а не интерфейсная. Не надо забывать о том, что наша задача -- повысить удобство работы с компьютером. Собственно, ради чего мы все это делаем? Ради того, чтобы человек, который программирует, или запускает программы, не занимался указанными тремя задачами сам.

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

Единственные инструменты по унификации и разделению предоставляет DOS пользователю, это файловая система. Она в те времена вызывала очень много нареканий, т.к. в том же UNIX'е уже была вполне нормальная файловая система, а в DOS'е ее не было. Но тем не менее представление о DOS'е хорошо иллюстрирует, почему он не является ОС вообще. С точки зрения внешних ресурсов, например, графики, DOS вообще не операционная система, даже унификации никакой не предоставляет, т.е., там есть INT 13h для выдачи на экран, но это же смешно. Чтобы выискать в DOS'е следы операционной системы, его нужно изучать. Там есть INT 21h... Никаких средств обеспечения многозадачности тоже нет. Это притом, что все современные ОС, в том числе более новые версии Windows, начиная с Windows NT и далее, и, собственно и Linux, на этот вопрос отвечают полностью утвердительно по всем статьям, с некоторыми нюансами, о которых мы тоже поговорим.


Сведения о ресурсах

Готовность (%)

Продолжительность (ак. ч.)

Подготовка (календ. ч.)

Полный текст (раб. д.)

Предварительные знания

Level

Maintainer

Start date

End date

20

1

1

1

1

PavelSutyrin, GeorgeTarasov, VsevolodKrishchenko


PspoClasses/080717/01OsDefinition (последним исправлял пользователь VsevolodKrishchenko 2008-10-06 08:49:13)