Все о моделировании в Компас-3D LT
   Главная Статьи Файлы Форум Ссылки Категории новостей
Июль 22 2019 02:14:59   
Навигация
Главная
Статьи
Файлы
FAQ
Форум
Ссылки
Категории новостей
Обратная связь
Фото галерея
Поиск
Разное
Карта Сайта
Популярные статьи
Что необходимо ... 65535
Учимся удалять!... 23476
4.12.1 Професси... 22306
Примеры, синони... 21235
FAST (методика ... 19172
Просмотр готовы... 18903
Декартовы коорд... 17278
Просмотр готовы... 15717
Работа с инстру... 11874
Что такое САПР 11274
Сейчас на сайте
Гостей: 1
На сайте нет зарегистрированных пользователей

Пользователей: 9,955
новичок: Logyattella
Друзья сайта
Ramblers Top100
Рейтинг@Mail.ru

Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ по Delphi
Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog
12.3.3.1 Выделение буфера
Обратимся еще раз к алгоритму getblk, рассмотренному нами в главе 3. Алгоритм работает с тремя структурами данных: заголовком буфера, хеш-очередью буферов и списком свободных буферов. Ядро связывает семафор со всеми экземплярами каждой структуры. Другими словами, если у ядра имеются в распоряжении 200 буферов, заголовок каждого из них включает в себя семафор, используемый для захвата буфера; когда процесс выполняет над семафором операцию P, другие процессы, тоже пожелавшие захватить буфер, приостанавливаются до тех пор, пока первый процесс не исполнит операцию V. У каждой хеш-очереди буферов также имеется семафор, блокирующий доступ к очереди. В однопроцессорной системе блокировка хеш-очереди не нужна, ибо процесс никогда не переходит в состояние приостанова, оставляя очередь в несогласованном (неупорядоченном) виде. В многопроцессорной системе, тем не менее, возможны ситуации, когда с одной и той же хеш-очередью работают два процесса; в каждый момент времени семафор открывает доступ к очереди только для одного процесса. По тем же причинам и список свободных буферов нуждается в семафоре для защиты содержащейся в нем информации от искажения.
алгоритм getblk /* многопроцессорная версия */
входная информация:
номер файловой системы
номер блока
выходная информация: захваченный буфер, предназначенный для обработки содержимого блока
{
do while(буфер не будет обнаружен) {
P(семафор хеш-очереди);
if (блок находится в хеш-очереди) {
if (операция CP(семафор буфера) завершается неудачно) { /* буфер занят */
V(семафор хеш-очереди);
P(семафор буфера); /* приостанов до момента освобождения */
if (операция CP(семафор хеш-очереди) завершается неудачно) {
V(семафор буфера);
continue; /* выход в цикл "выполнять" */
}
else if (номер устройства или номер блока изменились) {
V(семафор буфера);
V(семафор хеш-очереди);
}
}
do while(операция CP(семафор списка свободных буферов) не завершится успешно);
/* "кольцевой цикл" */
пометить буфер занятым;
убрать буфер из списка свободных буферов;
V(семафор списка свободных буферов);
V(семафор хеш-очереди);
return буфер;
}
else
/* буфер отсутствует в хеш-очереди здесь начинается выполнение оставшейся части алгоритма */
}
}
Рисунок 12.14. Выделение буфера с использованием семафоров
На Рисунке 12.14 показана первая часть алгоритма getblk, реализованная в многопроцессорной системе с использованием семафоров. Просматривая буферный кеш в поисках указанного блока, ядро с помощью операции P захватывает семафор, принадлежащий хеш-очереди. Если над семафором уже кем-то произведена операция данного типа, текущий процесс приостанавливается до тех пор, пока процесс, захвативший семафор, не освободит его, выполнив операцию V. Когда текущий процесс получает право исключительного контроля над хеш-очередью, он приступает к поиску подходящего буфера. Предположим, что буфер находится в хеш-очереди. Ядро (процесс A) пытается захватить буфер, но если оно использует операцию P и если буфер уже захвачен, ядру придется приостановить свою работу, оставив хеш-очередь заблокированной и не допуская таким образом обращений к ней со стороны других процессов, даже если последние ведут поиск незахваченных буферов. Пусть вместо этого процесс A захватывает буфер, используя операцию CP; если операция завершается успешно, буфер становится открытым для процесса. Процесс A захватывает семафор, принадлежащий списку свободных буферов, выполняя операцию CP, поскольку семафор захватывается на непродолжительное время и, следовательно, приостанавливать свою работу, выполняя операцию P, процесс просто не имеет возможности. Ядро убирает буфер из списка свободных буферов, снимает блокировку со списка и с хеш-очереди и возвращает захваченный буфер. Предположим, что операция CP над буфером завершилась неудачно из-за того, что семафор, принадлежащий буферу, оказался захваченным. Процесс A освобождает семафор, связанный с хеш-очередью, и приостанавливается, пытаясь выполнить операцию P над семафором буфера. Операция P над семафором будет выполняться, несмотря на то, что операция CP уже потерпела неудачу. По завершении выполнения операции процесс A получает власть над буфером. Так как в оставшейся части алгоритма предполагается, что буфер и хеш-очередь захвачены, процесс A теперь пытается захватить хеш-очередь [34] . Поскольку очередность захвата здесь (сначала семафор буфера, потом семафор очереди) обратна вышеуказанной очередности, над семафором выполняется операция CP. Если попытка захвата заканчивается неудачей, имеет место обычная обработка, требующаяся по ходу задачи. Но если захват удается, ядро не может быть уверено в том, что захвачен корректный буфер, поскольку содержимое буфера могло быть ранее изменено другим процессом, обнаружившим буфер в списке свободных буферов и захватившим на время его семафор. Процесс A, ожидая освобождения семафора, не имеет ни малейшего представления о том, является ли интересующий его буфер тем буфером, который ему нужен, и поэтому прежде всего он должен убедиться в правильности содержимого буфера; если проверка дает отрицательный результат, алгоритм запускается сначала. Если содержимое буфера корректно, процесс A завершает выполнение алгоритма.
Оставшуюся часть алгоритма можно рассмотреть в качестве упражнения.
Комментарии
Нет комментариев.
Добавить комментарий
Пожалуйста залогиньтесь для добавления комментария.
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Случайные статьи
2.4.3 Блоковые коды
Интернет-система, ...
Среда передачи данных
Глава 27. Garmin G...
10.2 ДИСКОВЫЕ ДРАЙ...
Теоретические осно...
Глава 1. Выбираем ...
12.3.3 Примеры ал...
Глава 5. Что такое...
Этапы реинжиниринг...
Глава 22. EM-401
Глава шестая
Вспомогательные:
Процессор. Память....
1.1. Зрелые и незр...
Глава 3. Как выбр...
Метод доступа в се...
3. Обзор концепции...
До 500 долларов
Строка текущего со...
7.2. Интерпретация...
Объединение приемн...
2.3.3.4 Импульсно-...
Внешний источник
5.5 УКАЗАНИЕ МЕСТА...
Коммутация каналов
Продолжение расска...
4.12.2 Системы пер...
2.2.3. Понимание у...
Мультиплексный
СИСТЕМНЫЕ ОПЕРАЦИИ...
Опции сетевой филь...
6.5.7 Отсоединение...
Учимся удалять! [К...
Анализ результатов...
Дополнительные сог...
6.2.4 Пространство...
Соединение КПК и G...
Как подключить GPS...
Совместная работа ...
Мини-чат
Вам необходимо залогиниться.

Нет присланных сообщений.
Copyright © 2009