Различия между версиями 1 и 14 (по 13 версиям)
Версия 1 от 2008-07-17 20:12:15
Размер: 11919
Редактор: eSyr
Комментарий:
Версия 14 от 2008-10-06 02:08:54
Размер: 42671
Редактор: VsevolodKrishchenko
Комментарий: Еще разок прочитать осталось.
Удаления помечены так. Добавления помечены так.
Строка 3: Строка 3:
Начинаем мы со знакомства. ## ==== Знакомство ====
Строка 5: Строка 5:
Обратите внимание, что перед вами на экране какая-то штука, в которой не по русски всё написано. Это следствие того, чт уст. дистрибути под названием Lite, задачей котрого явл. экономить ресурсы. В частности, в кчестве desktop manager используется xdm, который трудно локализовать. прежде чем будем тыкать пальцами в логин и парль, немнго говорильни. ##Обратите внимание, что приглашение ко входу в систему не на русском языке. Это следствие того, что на компьютере установлен дистрибутив из состава ПСПО под названием Lite, главная задача которого --- использовать ресурсы машины настолько экономно, насколько это не вредит функциональности системы. В данном случае, программа, которая занимается регистрацией пользователей --- xdm --- не отличается богатой функциональностью, и перевод ее на русский не столь актуален. Перед тем, как осуществить вход, обратимся к теории.
Строка 7: Строка 7:
У нс существует три уровня, на которых мы по-разному забтимся о том, как и кем исп. ресурсы компьютера. Уровень нулевой, где никких дополнительных действий отн. доступнсти компьютера вып. не надо --- когда у нс есть в каждый ммент времени ровно одна программа, кторая расп. всеми ресурсами ()однощадачная сисьема. В этом случае, правильно или неправлиьно программа расп. ресурсами компьютера --- дело программы. Впрос такой --- много ли нужно программного обеспечения, чтобы эта программа нормально, удбно могла ими распоряжаться, нужно ли создавать какое-то прогр. окружение? Очевидно нет, поск. эта программа и есть это прогр. приложение. Типичный пример --- игровая консоль старого разлива (с картриджами). Однозадачная система. На самом деле, это не совсем так, поск. мы можем захотеть как минимум унифиц. спсоб рабты с апп. обесп.. Т есть будет некая прослойка между ресурсами и сп. польз. этими ресурсами, клторая будет скрывать особенности. Т есть, мы поменяли видеокарту, поменяли прслойку, которая предст. унифиц. пртокол, и мы можем исп. ту же самую программу. Т есть даже здесь встаёт задача унификации. Она встаёт для того, чтбы прогр. обесп. не зависело от особенностей апп. облесп. === Управление ресурсами компьютера ===
Строка 9: Строка 9:
Как только мы гворим о том, что у нас компьютер общег назначения и говорится, что им могут польз. неск программ, сразу возникает задача, кто какими ресурсами может пользоваться. Многозадачная среда. Рассм. самый простой вариант --- у нас рабтают неск. программ одна за другй. Даже в этом случае встаёт задача доступа к ресурсам, которые сущ. на протяжении всей работы программ. Например, хранилище данных. То есть оперативной памятью прогр. пользуются монопльно, а с файлами в хранилище --- свместно. Ещё более необх. разд. ресурсов возникет в системе с (псевдо)параллелизмом. Параллелизм --- когда действ. есть неск. процессров и они одн. вып. неск. прграмм. Псевдопарал --- когда происх. перек. между прграммами во время их вып. Тут встаёт вопрос о том, что все ресурсы (проц. время, память...) длжны быть разделяемыми. Например, неправильно, если дна прогр. сжрёт всё проц. время. То же самое с памятью. Разумн орг. как раздачу памяти, так и разг. доступа. Это должно быть обозначенно, и ситуции, когда одни прогр. что-то делают с чужими ресурсами, длжны быть штатными. Эт наз. разделение ресурсов. Одно из определений операционной системы (ОС) гласит: операционная система --- это средство управления ресурсами компьютера. Можно выделить три уровня разделения ресурсов, на каждом из которых распределение и использование ресурсов компьютера происходит по-своему.
Строка 11: Строка 11:
На самм деле, тут возникает другая ещё инт. задача --- у нас один процессор, и тут впрос не только с проц. временем, но и его ресурсы (регистры), которые нельзя попилить на куски. И когда мы орг. псевдопаралл., мы должны преддусмтреть не тлько мех. времени, но и механизм сохранения этих ресурсов одной пргр. на время рабты других. Всё, чт связано с вып. процесса (fixme!), нащывается контекстом процесса. То есть, даже такая штука, как псевдопараллелизм, состоит из двух вещей: квантование времени и сохр. контекста. Что же касается разд. памяти, т тут ситуация проще, если в ней не разб. и сложнее, если разб. Условно говоря, память предст. собой посл. ячеек с номерами от 0 до сколько воткнуто. Системы, которые ведут присх. от однозадачных систем (DOS) не имели средств разделения памяти. То есть, есть неск. порграмм, каждая в свём месте памяти, но ничто не мешает одной программе испортить память другой. Поэтому нормальные С исп. аппаратные средства защиты памяти, стрничн-сегм. организацию. Вся память разделена на страницы, и при запрсе памяти, выдаются страницы в небх количестве, возм. не подряд. При этм процесс физ. адресов не видит, видит только виртуальные, и дресация вирт. непрерывна. При этом, что бы ни делать, то кроме своих страниц ничего не испортишь. Исключение --- использование shmem. ==== Однозадачный режим ====
Строка 13: Строка 13:
При этом разделение ресурсов касается не только процессора и памяти, но и, например, звуковая карта. То же саме тн. к любму внешнему ресурсу. Начальный уровень, на котором не нужны никакие дополнительные действия для обеспечения доступности ресурсов компьютера --- когда у нас есть ровно одна программа, которая полностью распоряжается всеми ресурсами компьютера, пока она не закончит свою работу. Такая система называется однозадачной, и то, насколько разумно она распоряжается этими ресурсами, может повлиять только на работу самой этой программы. Если программа написана плохо и пожирает память, то в конце концов она просто перестаёт работать, потому что оперативной памяти ей не хватит. Если хорошо, она распоряжается процессором, всей оперативной памятью и всеми внешними (по отношению к процессору) устройствами по своему усмотрению.
Строка 15: Строка 15:
Н самом деле, есть ещё одна задача, кторой мы не вспомнили. Ещё одна задача возн., когда выясн., чт эти процессы не знют о сущ. друг друга, причём не просто не хотят, чтобы произошёл дост к ремсурсам, кторые ни хотели, но и в случае, даже если программа знает о ресурсе, он не могла им воспльзваться. Здесь мы приходим к тму, что система не просто мнгозадачная, но и задачи имеют разные права. Фктически, это означает то, что задачи делятся на группы, принад. разным плзователям. И мы переходям от системы мнгозад. к системе многозад. и многопольз. То есть, идея сост. в том, что если раньше у нас задачи были в равных правах, и главнй целью было бесп. невозм. неправильного. доступа к ресурсам, то тут задачи имеют разные права, и задача обесп. невозм. несанкц. доступа к ресурсам. Это называется ограничение ресурсов. Много ли нужно программного обеспечения, чтобы позволить этой задаче эффективно использовать память и устройства и нужно ли создавать какое-то отдельное программное обеспечение для поддержки этого процесса? Возможный ответ --- "нет", так как эта программа, как правило, содержит в себе все необходимое ПО. Типичный пример -- это старинная игровая консоль (SEGA, SNES), использующая картриджи. Каждый картридж --- отдельная программа, загружающаяся и работающая по принципу однозадачной системы.
Строка 17: Строка 17:
Мы получаем три группы задач, кторые мы должны решать, когда работаем с ОС: унификация, разделение, ограничение. Факт., это определение ОС. ОС --- такй прогр. комплекс, кторый обеспечивает унификацию, разделение, ограничение. ==== Унификация доступа ====
Строка 19: Строка 19:
Пчему именно так? Вообще, нет правильного опред. ОС. Если мы уйдём в историю, то увидим, что термином мы исп. непрвильно, OS --- система исп. компьютера, которая конечно выливается в ПО, но всё-ткие. Это опр. лектору нравится тем, что из него выкинуты подробности тдельных вариантв исп. Лектор чень хотел бы избежать ситуации, когда под ОС имеется в виду нечто, когда в левой нижней части экрана есть кнопка пуск. Портому что экрана может не быть. Может не быть кнопки и мышки. Тем не менее, не надо забывать о том, что наша задача --- повыить удобство работать с компьютером, и сделть так, чтобы человек не знимался этими задачами сам. Почему DOS не операционная система, поск. он не обесп. защиту памяти, не предост. норм. разд. ресурсов. Единственное, каикие инстр. униф. и разд. представляет DOS --- файловая система. При этом WinNT и Linux отвечают на все эти впросы утвердительно. Однако даже при однозадачной системе обычно неразумно всю задачу организации доступа к ресурсам возлагать на прикладную программу, поскольку это сильно затрудняет их разработку.

Как минимум, хотелось бы унифицировать способ использования различных аппаратных ресурсов, например внешних устройств. Для решения этой задачи необходима некая прослойка между программой, которая пользуется ресурсами компьютера, и самими ресурсами. Эта прослойка будет скрывать от программы подробности того, как именно этими ресурсами воспользоваться. Рассмотрим это на примере графической платы: мы поменяли видеокарту, вместе с ней поменяли прослойку, которая обеспечивает доступ по стандартному (и не зависящему от конкретной карты) протоколу к ресурсам этой видеокарты, и прикладные программы не "заметили" изменений, хотя в действительности по шине PCI передаются уже принципиально другие данные.

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

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


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

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

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

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

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

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

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


=== Разделение доступа к ресурсам ===

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

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

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

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

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

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

Тут ситуация чуть более простая, если в ней не разбираться, и чуть более сложная, если в ней разбираться досконально. #Никому не надо рассказывать слишком подробно, что
На некотором уровне абстракции оперативная память представляет собой последовательность ячеек с номерами от 0 до самого большого значения, и сколько у нас воткнуто в плату памяти, столько и будет. Однако, в действительности всё значительно сложнее.

Существует несколько видов адресов памяти.
В системах, которые ведут свое происхождение от однозадачных систем и не обеспечивают надлежащее разделение памяти между задачами (типичная такая система -- DOS, а также, с оговорками, Windows 3.*), основной являются физические адреса памяти --- одна программа занимает адреса от 1000 до 100000, другая от 120000 до 202000 байт, и так далее.
##, эти программы там у себя работали, эти участки памяти выполняли роль контекста процесса, когда надо было, выполнялись команды из одного участка памяти, потом состояние сохранялось, выполнялись команды из другого участка, и т.д. Но

Если при этом одной программе по причине ошибки приходило в голову исписать нулями не свою, а "чужую" память (начав, к пример, в своей, а в результате ошибки убежав за границу), то тогда она убивала всю оперативную память, доступную операционной системе, и компьютер "зависал". Типичная ситуация в DOS: написал программу на языке Си с ошибкой, запустил, в итоге перегрузил компьютер. В младших версиях Windows наблюдалось то же самое, причём отдельные рецидивы были вплоть до Windows 98 (но не в линейке полноценных ОС Windows NT).

Операционные системы, которые обеспечивают нормальное разделение памяти, пользуются аппаратным страничным механизмом разделения памяти, котому уже около 30-ти лет, а в недорогих компьютерах он появился вместе с процессором Intel i386 почти четверть века назад. Устроен этот механизм следующим образом. Вся оперативная память делится на страницы некоторого фиксированного размера (обычно по 4096 байт). Пусть запускаются два процесса в псевдо-параллельном режиме, причём никто из них не ведёт обмен с внешними устройствами, а жаждет лишь выполняться на процессоре. Для каждого создается контекст процесса, набор регистров, который нужно хранить, и все остальное, потом каждый из них запрашивает себе память, которая ему выделяется. Куски памяти, запрошенные разными процессами, с физической точки зрения перемешаны совершенно произвольно. Но реальных адресов с 0 до полного объема памяти ни один процесс не наблюдает. У него происходит аппаратно поддерживаемое со стороны процессора преобразования виртуального адреса, с которым они работают, в адрес физический.

При этом все страницы памяти, принадлежащие процессу, складываются в некоторую т.н. виртуальную память с непрерывной адресацией (допустим, объёмом 100 Mb), которую, собственно, и "видит" этот процесс. В таких случаях в понятие контекста процесса включается указанное преобразование, поскольку для каждого процесса оно своё. Когда процесс обращается к памяти, он видит только ту память, которую ему выдали, от нулевого адреса и до конца запрошенной памяти (видит он даже до физически максимального адреса). Доступ же в память напрямую, по произвольному физическому адресу, процессу запрещён.

Из скольких страниц состоит выделенная процессу память и какие у них физические адреса --- процессор не волнует, это проблема операционной системы. Пусть у нас всего 1 Гб памяти, процесс заказал 100 Мб, он 100 Мб получил, а эти 100 Мб собраны из 25600-ти страниц памяти по 4 Кб каждая.
##набраны из двух страниц, но процесс этого не видит, специальная аппаратная структура, входящая в понятие контекст процесса, производит такое преобразование.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

=== Примеры ===

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

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

Единственные инструменты по унификации и разделению ресурсов, которые предоставляет DOS пользователю, это файловая система, но она и в те времена вызывала уже много нареканий. Таким образом, DOS содержит только зачатки функций операционной системы. В настоящее время существуют специализированные операционные системы, которые, несмотря на своё название, не выполняют всех поставленных нами задач, поскольку являются компромиссным вариантом и пытаются достигнуть, например, наименьшего времени отклика системы. Все современные ОС общего назначения, в том числе линейка Windows NT, GNU/Linux и BSD-системы вместе с Mac OS X на все поставленные здесь вопросы отвечают полностью утвердительно.

## по всем статьям., с некоторыми нюансами, о которых мы тоже поговорим.

##, т.к. в том же UNIX уже была вполне нормальная файловая система, а в DOS ее не было. Но тем не менее представление о DOS хорошо иллюстрирует, почему он не является ОС вообще. С точки зрения внешних ресурсов, например, графики, DOS вообще не операционная система, даже унификации никакой не предоставляет, т.е., там есть INT 13h для выдачи на экран, но это же смешно. Чтобы выискать в DOS'е следы операционной системы, его нужно изучать. Там есть INT 21h... Никаких средств обеспечения многозадачности тоже нет. Это притом, что все современные ОС, в том числе более новые версии Windows, начиная с Windows NT и далее, и, собственно и Linux, на этот вопрос отвечают полностью утвердительно по всем статьям, с некоторыми нюансами, о которых мы тоже поговорим.
Строка 26: Строка 127:
|| Готовность (%) || Продолжительность (ак. ч.) || Подготовка (календ. ч.) || Полный текст (раб. д.) || Предварительные знания || Level || Maintainer                                       || Start date || End date ||
|| 0              || 1 || 1 || 1 || || 1 || PavelSutyrin, GeorgeTarasov, VsevolodKrishchenko ||            || ||
|| Готовность (%) || Продолжительность (ак. ч.) || Подготовка (календ. ч.) || Полный текст (раб. д.) || Предварительные знания || Level || Maintainer || Start date || End date ||
|| 80 || 1 || 1 || 1 || || 1 || PavelSutyrin, GeorgeTarasov + VsevolodKrishchenko, VsevolodKrishchenko || || ||
Строка 29: Строка 131:
CategoryLectures CategoryPspo CategoryMpgu CategoryUneex  . CategoryLectures CategoryPspo CategoryMpgu CategoryUneex

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

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

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

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

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

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

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

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

Как минимум, хотелось бы унифицировать способ использования различных аппаратных ресурсов, например внешних устройств. Для решения этой задачи необходима некая прослойка между программой, которая пользуется ресурсами компьютера, и самими ресурсами. Эта прослойка будет скрывать от программы подробности того, как именно этими ресурсами воспользоваться. Рассмотрим это на примере графической платы: мы поменяли видеокарту, вместе с ней поменяли прослойку, которая обеспечивает доступ по стандартному (и не зависящему от конкретной карты) протоколу к ресурсам этой видеокарты, и прикладные программы не "заметили" изменений, хотя в действительности по шине PCI передаются уже принципиально другие данные.

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

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

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

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

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

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

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

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

Разделение доступа к ресурсам

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

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

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

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

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

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

Тут ситуация чуть более простая, если в ней не разбираться, и чуть более сложная, если в ней разбираться досконально. #Никому не надо рассказывать слишком подробно, что На некотором уровне абстракции оперативная память представляет собой последовательность ячеек с номерами от 0 до самого большого значения, и сколько у нас воткнуто в плату памяти, столько и будет. Однако, в действительности всё значительно сложнее.

Существует несколько видов адресов памяти. В системах, которые ведут свое происхождение от однозадачных систем и не обеспечивают надлежащее разделение памяти между задачами (типичная такая система -- DOS, а также, с оговорками, Windows 3.*), основной являются физические адреса памяти --- одна программа занимает адреса от 1000 до 100000, другая от 120000 до 202000 байт, и так далее.

Если при этом одной программе по причине ошибки приходило в голову исписать нулями не свою, а "чужую" память (начав, к пример, в своей, а в результате ошибки убежав за границу), то тогда она убивала всю оперативную память, доступную операционной системе, и компьютер "зависал". Типичная ситуация в DOS: написал программу на языке Си с ошибкой, запустил, в итоге перегрузил компьютер. В младших версиях Windows наблюдалось то же самое, причём отдельные рецидивы были вплоть до Windows 98 (но не в линейке полноценных ОС Windows NT).

Операционные системы, которые обеспечивают нормальное разделение памяти, пользуются аппаратным страничным механизмом разделения памяти, котому уже около 30-ти лет, а в недорогих компьютерах он появился вместе с процессором Intel i386 почти четверть века назад. Устроен этот механизм следующим образом. Вся оперативная память делится на страницы некоторого фиксированного размера (обычно по 4096 байт). Пусть запускаются два процесса в псевдо-параллельном режиме, причём никто из них не ведёт обмен с внешними устройствами, а жаждет лишь выполняться на процессоре. Для каждого создается контекст процесса, набор регистров, который нужно хранить, и все остальное, потом каждый из них запрашивает себе память, которая ему выделяется. Куски памяти, запрошенные разными процессами, с физической точки зрения перемешаны совершенно произвольно. Но реальных адресов с 0 до полного объема памяти ни один процесс не наблюдает. У него происходит аппаратно поддерживаемое со стороны процессора преобразования виртуального адреса, с которым они работают, в адрес физический.

При этом все страницы памяти, принадлежащие процессу, складываются в некоторую т.н. виртуальную память с непрерывной адресацией (допустим, объёмом 100 Mb), которую, собственно, и "видит" этот процесс. В таких случаях в понятие контекста процесса включается указанное преобразование, поскольку для каждого процесса оно своё. Когда процесс обращается к памяти, он видит только ту память, которую ему выдали, от нулевого адреса и до конца запрошенной памяти (видит он даже до физически максимального адреса). Доступ же в память напрямую, по произвольному физическому адресу, процессу запрещён.

Из скольких страниц состоит выделенная процессу память и какие у них физические адреса --- процессор не волнует, это проблема операционной системы. Пусть у нас всего 1 Гб памяти, процесс заказал 100 Мб, он 100 Мб получил, а эти 100 Мб собраны из 25600-ти страниц памяти по 4 Кб каждая.

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

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

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

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

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

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

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

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

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

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

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

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

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

Примеры

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

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

Единственные инструменты по унификации и разделению ресурсов, которые предоставляет DOS пользователю, это файловая система, но она и в те времена вызывала уже много нареканий. Таким образом, DOS содержит только зачатки функций операционной системы. В настоящее время существуют специализированные операционные системы, которые, несмотря на своё название, не выполняют всех поставленных нами задач, поскольку являются компромиссным вариантом и пытаются достигнуть, например, наименьшего времени отклика системы. Все современные ОС общего назначения, в том числе линейка Windows NT, GNU/Linux и BSD-системы вместе с Mac OS X на все поставленные здесь вопросы отвечают полностью утвердительно.


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

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

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

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

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

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

Level

Maintainer

Start date

End date

80

1

1

1

1

PavelSutyrin, GeorgeTarasov + VsevolodKrishchenko, VsevolodKrishchenko


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