Screenshot 2021-11-28 at 14.49.37.png

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

Мы хотим запустить написанные программы на другом компьютере, у которого своя система команд

  1. Внезапно возникает желание провести какую-то унификацию

    ⇒ возникает необходимость в абстракции доступа к устройству

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

    Но это не спасает нас от необходимости в каком-то слое абстракции, который взаимодействует с устройством

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

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

    Нарезаем время на какие-то кванты и переключаемся между разными задачами — разделение времени

    Квотирование ресурсов

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

    У одной программы своя память, у другой программы — свой участок памяти, хочется, чтобы они друг другу не мешали

    ⇒ возникает необходимость в разграничении доступа

Итог: мы пишем какой-то комплекс ПО, который будет этими вещами заниматься

Мы не хотим реализации следующего сценария: какая-то злобно/плохо написанная прикладная программа захватила все ресурсы, которые мы так тщательно квотировали и к которым мы так тщательно разграничивали доступ

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

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

⇒ мы вынуждены добавлять в систему какие-то средства принуждения (enforcement), то есть средства обеспечения разграничения доступа и квотирования, которые необходимы ОС

⇒ для этого требуется аппаратная поддержка со стороны того компьютера, на котором мы исполняемся

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

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

Традиционно, та часть ПО, которая исполняется в привилегированном режиме (режиме супервизора), называется ядром ОС

Как нам все это организовать?

Понятно, что для этого требуется поддержка со стороны процессора