Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Для каких типов операций используется объект dentry? Почему недостаточно обычных inode?



4. Как связаны описатель файла и структура файла? Как один к одному? Много к одно­му? Один ко многим?

5. Для чего используется структура f d_set?

6. Какой тип структуры данных отвечает за обеспечение максимальной скорости рабо­ты с кешем?

7. Представьте, что вам нужно написать новый драйвер файловой системы? Вы заме­няете драйвер файловой системы ext2 новым драйвером (media_f s), оптими­зированным для ввода-вывода при работе с мультимедийными файлами. Где вам нужно произвести изменения, чтобы быть уверенным, что ядро Linux будет исполь­зовать ваш драйвер вместо драйвера ext2?

Каким образом страница становится грязной? Как грязные страницы записываются на диск?


Глава



Планировщик и синхронизация ядра

В этой главе:

■ 7.1 Планировщик Linux

? 7.2 Приоритетное прерывание обслуживания

? 7.3 Циклическая блокировка и семафоры

? 7.4 Системные часы: прошедшее время и таймеры

? Резюме

? Упражнения



Глава 7 • Планировщик и синхронизация ядра


Я

дро Linux является многозадачным, что означает, что в системе может выпол­няться множество процессов таким образом, как будто выполняется только один процесс. Способ, которым операционная система выбирает, какому процессу в дан­ный момент разрешено получить доступ к системному процессору (процессорам), называется планировщиком.

Планировщик отвечает за перемену доступа к процессору между различными процессами и выбирает порядок, в котором они получают доступ к процессору. Linux, как и большинство операционных систем, включает планировщик с помощью таймера прерывания. Когда таймер заканчивается, ядру необходимо решить, пере­дать ли процессор другому процессу, и если да, то какому процессу позволить по­лучить процессор следующим. Количество времени между прерываниями таймера называется временным срезом (timeslice).

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

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

Обычно планировщики используют несколько типов очереди процессов для управления выполнением процессов в системе. В Linux эта очередь процессов назы­вается очередью выполнения. Очередь выполнения подробно описана в гл. 3, «Про­цессы: принципиальная модель выполнения»1, но давайте вспомним некоторые фун­даментальные принципы связи между планировщиком и очередью выполнения.

В Linux очередь выполнения состоит из двух массивов приоритетов:

активных: хранят процессы, еще не использовавшие свой временной срез;

истекших: хранят процессы, которые уже использовали свой временной срез.

1 Разд. 3.6 описывает очередь выполнения.


Планировщик Linux



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

Планировщик Linux

В ядре Linux 2.6 представлен полностью новый планировщик, называемый также пла­нировщиком 0(1). Это значит, что планировщик выполняет планирование выполнения задач за константное время1. Гл. 3 описывает базовые структуры планировщика, их ини­циализацию при создании процессов. Этот раздел описывает, как задачи выполняются на единственном процессоре. Мы будем упоминать о планировщике для многопроцес­сорной системы (SMP), но в общем процессы внутри всех планировщиков совпадают. Далее мы опишем, как планировщик переключает текущий выполняющийся процесс, определяя, какой контекст будет вызван следующим, и затем мы коснемся других значи­тельных изменений в ядре 2.6 - приоритетных прерываний обслуживания.

На наивысшем уровне планировщик просто группирует функции, работающие с эти­ми структурами данных. Почти весь код, связанный с планировщиком, можно найти в kernel/sched.с и include/linux/sched.h. Важно не забывать, что, как мы упоминали ранее, в коде планировщика термины задача и процесс обозначают одно и то же. Задача или процесс в планировщике представляют собой набор структур данных и по­ток управления. Код планировщика также связан с task_struct - структурой данных, используемой Linux для слежения за процессами2.

Выбор следующей задачи

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

1 0(1) в нотации большого О означает константное время. 2- В гл. 3 подробно описывается структура task_struct.



Глава 7 • Планировщик и синхронизация ядра


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

Рис. 7.1 иллюстрирует, как процессор с течением времени передается между раз­личными процессами. Мы видим, что Process А контролирует процессор и выполняется. Системный таймер scheduler_tick() завершается, получает управление процес­сором от А и помечает А как требующий перепланирования. Ядро Linux вызывает schedule (), выбирающую Process В и передающую ему управление процессором.


— Время ----------------------------------------------------- >


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-03-25; Просмотров: 788; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.012 с.)
Главная | Случайная страница | Обратная связь