Ядро UNIX является реентерабельным. Это означает, что в одно и тоже время в ядре системы могут работать сразу несколько процессов, иногда выполняя при этом одинаковые задачи. На однопроцессорных системах в один момент времени может выполняться только один процесс.
Также может иметь смысл заглянуть на сайт velvetdekor.ru, ведь именно там можно узнать много нового на тему http://velvetdekor.ru/. Тема шторы на заказ в Москве может показаться на первый взгляд незначительной и даже не тематичной. Но стоит посетить сайт velvetdekor.ru, и тема шторы на заказ в Москве начинает проявлять себя с неожиданной стороны и вызывает всё больший интерес. Дело в том, что тема шторы на заказ в Москве очень подробно представлена на сайте velvetdekor.ru. Трудно найти более детальное освещение темы шторы на заказ в Москве чем это сделано на сайте velvetdekor.ru. Спасибо сайту velvetdekor.ru за такое доскональное преподнесение темы шторы на заказ в Москве.
Система постоянно переключается от выполнения одного процесса к другому, создавая иллюзию параллельного функционирования. Такая возможность получила название многозадачной работы. Так как все процессы используют единое ядро, ему необходимо как-то синхронизировать доступ к своим структурам данных для предупреждения возможности их повреждения. В разделе 2.5 подробно рассказывалось о технологиях синхронизации, применяемых в традиционных системах UNIX. В этой главе мы подведем краткие итоги.
Первым защитным механизмом традиционного ядра UNIX является его невытесняемость.
Любая нить будет продолжать работу в режиме ядра до тех пор, пока сама не будет готова освободить его либо приостановить выполнение в ожидании ресурса, даже в том случае, если эта нить исчерпала выделенный ей квант времени. Такой подход дает возможность кодам ядра управлять различными структурами данных без обеспечения какой-либо защиты содержащейся в них информации, поскольку заранее известно, что никакая другая нить не сможет получить доступ к ним до тех пор, пока текущая нить не закончит манипуляции данными и не переведет ядро в
Ограничения традиционного ядра UNIX
Традиционная модель синхронизации корректно работает на однопроцессорных машинах, но она, к сожалению, не избавлена от проблем, связанных с производительностью системы. В многопроцессорных системах использование традиционной модели невозможно, что и будет более подробно показано в разделе 7.4.
Блокировка ресурсов и очереди приостановленных нитей
В некоторых ситуациях организация очередей приостановленных нитей может являться причиной заметного ухудшения производительности системы. В системах UNIX нить блокируется при ожидании освобождения ресурса или возникновении определенного события. Каждый ресурс или событие ассоциированы с каналом ожидания, представляющим собой 32-разрядную переменную, обычно указывающую на адрес ресурса. Система поддерживает набор очередей ожидания, соединение канала с одной из очередей реализовано при помощи хэширования
Нить приостанавливает работу, помещая себя в одну из очередей ожидания, при этом ссылка на соответствующий канал ожидания сохраняется в структуре ргос.
Применение такой методики блокировки приводит к двум последствиям. Во-первых, на каждый канал может ссылаться более чем одно событие. Например, одна из нитей может заблокировать буфер, инициализировать проведение над ним определенных действий и приостановить работу до тех пор, пока эти действия не будут закончены. Если другая нить попытается получить доступ к тому же буферу, то обнаружит его заблокированным. Следовательно, ей придется приостановить выполнение в ожидании освобождения ресурса. Оба события ссылаются на один и тот же канал, указывающий на необходимый обеим нитям буфер. После завершения процедур ввода-вывода обработчик прерываний разбудит обе нити, несмотря на то, что последняя из них ожидает еще не произошедшее событие.
Во-вторых, количество структур хэширования обычно меньше, чем различных каналов ожидания (то есть ресурсов и событий), следовательно, несколько каналов могут ссылаться на одно и то же место. Таким образом, оказаться хэшированными могут нити, ожидающие несколько различных каналов. Процедуре wakeup() необходимо проверять каждый из них и делать работоспособными только те нити, которые ожидают определенный ресурс. Общее время работы wakeupQ зависит не от количества процессов, находящихся в режиме ожидания данного канала, а от общего количества хэшированных процессов. Это приводит к непредусмотренным задержкам, появление которых нежелательно для систем, поддерживающих приложения реального времени, требующих соблюдения определенных верхних границ задержек планировщика (см. раздел 5.5.4).
Опубликовал katy
July 06 2015 16:13:34 ·
0 Комментариев ·
2727 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.