Pull to refresh

Многозадачность ОС в разрезе системы массового обслуживания

Reading time 4 min
Views 2.8K
Мне бы хотелось рассказать немного о многозадачности операционной системы. О концепте управления процессами и потоками с точки зрения ОС (и процессора/процессоров) как системы массового обслуживания. О том, «как это происходит».

Процессов ведь много, а ресурсы ограничены. На всех сразу не хватает. Что же делать? И вот тут возникает аналогия с системой массового обслуживания. Можно представить пул процессов как очередь в кассу. Ой, простите, в процессор. И архаичных вариантов обработки такой очереди [мне известно] три.


Предислование

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

Для начала: общие сведения.

image
Картинка процессора

Что же такое «процесс» и в чем его отличие от «потока»? Процесс — это (грубо говоря) — заявка на реализацию чего-либо. Точнее, на потребление системных ресурсов. ОС генерирует системную информацию, в которой говорит, какие необходимы это процессу ресурсы. А так же о тех ресурсах, которые ему фактически были выделены. И это — для каждого вновь создаваемого процесса отдельно. О том, сколько ему необходимо памяти, сколько процессорного времени, и т.д.

Так о чем же я? Ах, да.

О способах обработки очереди процессов

Архаичных способов обработки очереди, как я говорила, мне известно три.

Первый: квантование.

image

Т.е., каждому процессу выделяется определенный квант времени, после которого процессор радостно рапортует: «Свободная касса!», и получает на обслуживание следующий процесс. Текущий процесс же идет в конец очереди. Ибо «все равны». Недостатки: (грубый пример) у Вас идет видеоконференция. Очень важная. Прямо на самом интересном месте: бабах! И начинает печатается «важный» документ. Он же письмо с просьбой перенести время доставки ежедневного обеда с 13:00 на 14:00. А Ваша видеоконференция «неизвестно когда» будет возобновлена. Конечно, на практике так не бывает, потому что принтер работает по прерыванию, и там вообще все иначе. Но аналогия, мне кажется, в целом ясна.

Второй: приоритеты.

image

Это когда «не все равны». Процессу назначается приоритет, и пока процесс с более высоким приоритетом не будет обслужен (ой, простите, обработан), другие к кассе (ой, простите, к процессору) подойти не смогут. Недостатки: могут быть процессы, которые из-за низкого приоритета не обработаются вообще никогда. Т.е., письмо Вы так никогда и не распечатаете.

На практике же зачастую используется подход «все равны, но некоторые ровнее». Т.е., «смешанный». Когда процессу выделяется квант времени и приоритет одновременно. Тогда процесс уходит не в конец очереди, а куда-то в «свою» середину. И там ждет.

Схема ясна, но как же обрабатываются процессы? В какой очередности? Тут все та же система массового обслуживания. Есть несколько подходов к обработке процессов в случае квантования и «смешанного» типа:
— FIFO. Первый пришел, первый вышел. (First-In-First-Out)
— LIFO. Последний пришел, первый вышел. (ИМХО, не очень честно… ) (Last-In-First-Out)
— SIRO. Ну, тут полный рандом. Service-In-Random-Out.
В случае «чистых» приоритетов таких вопросов не возникает, ясное дело.

А что же там с многопроцессорными системами?

Ведь я обещала поделиться своими мыслями на этот счет. Ну, давайте представим, что касс (процессоров) несколько. И тут те же принципы, только либо несколько очередей, и процессы попадают в рандомном или не очень порядке в очередь (что мне кажется не очень логичным, ну, например, хотя бы потому, что на новых процессорах по прежнему работают «однопроцессорные» системы). Либо так же очередь (пул, из которого берутся процессы) — одна, а обрабатывают их несколько касс. Но это исключительно мысли автора, не более того.

Может возникнуть вполне резонный вопрос.

А в чем же все-таки отличие процесса от потока?

А все просто. В начале статьи вскользь упоминалось, что программе для выполнения необходимы ресурсы и процессорное время. Так вот, система «воспринимает» процесс как заявку на любые виды ресурсов, кроме процессорного времени. Заявка на процессорное время — это поток. Именно процессорное время распределяется между потоками. Таким образом, процесс состоит из нескольких потоков. Раньше, конечно, это все было единое целое. И процесс, и поток, и все в одном, и вообще, «зачем платить больше?». Как оказалось, в данном случае мы, скорее, «платим меньше». Когда потоков несколько.

Для того, чтобы процессы не могли вмешиваться в распределение ресурсов, система их «изолирует». Предоставляет каждому из них своё виртуальное адресное пространство. Так что ни один процесс не может получить прямого доступа к командам и данным другого процесса.

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

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

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

Очевидные выводы

Процесс — это заявка на потребление всех ресурсов, кроме процессорного времени. Процессы изолированы друг от друга, и включает в себя потоки. Собственно, потоки — это заявки на потребление этого самого процессорного времени.

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

Ко всему прочему, был продемонстрировано на примере непосредственно концепт работы системы [массового обслуживания] как таковой.

И P.S.

image

Я немного «смахлевала» в начале и в середине статье, рассказывая по поводу процессорного времени для «процесса» как такового. Но не сильно, и, я надеюсь, Вы меня простите за эту вынужденную неточность.
Tags:
Hubs:
+6
Comments 7
Comments Comments 7

Articles