Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Для каких типов операций используется объект 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; Просмотров: 853; Нарушение авторского права страницы