close

Вход

Забыли?

вход по аккаунту

?

ПП. ЛР 1

код для вставкиСкачать
1. Формулировка задачи об обедающих мудрецах
Обедающие философы: на круглом столе находятся k тарелок с едой, между которыми лежит столько же вилок, k=4,...,7. В комнате имеется k философов, чередующих философские размышления с принятием пищи. За каждым философом закреплена своя тарелка; для еды философу нужны две вилки, причем он может использовать только вилки, примыкающие к его тарелке. Требуется так синхронизировать философов, чтобы каждый из них мог получить за ограниченное время доступ к своей тарелке. Предполагается, что длительности еды и размышлений философа конечны, но заранее недетерминированы (могут быть выбраны случайным образом из некоторого диапазона).
2. Особенности решения задачи с использованием аппаратного прерывания от таймера
Использование аппаратного прерывания от таймера позволяет реализовать механизмы вытесняющей многозадачности и квазипараллельного исполнения подпрограмм-философов. Подпрограмма-обработчик прерывания в данном случае выступает в роли диспетчера задач, который вызывается ~18 раз в секунду (именно столько раз происходит прерывание таймера). Каждый вызов обработчика заканчивается переключением с текущего процесса-философа на следующий. Причем для текущего процесса необходимо сохранение в служебной структуре, называемой блоком управления процессом, его персональной информации - контекста (например, это может быть состояние регистров процессора) и адреса команды в его теле, на которой произошло прерывание. Для следующего процесса наоборот происходит восстановление его состояния и передача управления на ту команду, на которой он был прерван ранее. Таким образом, процессы-философы даже не подозревают, что их несколько и развиваются так, как будто каждый из них является единственным.
При старте программы необходимо соответствующим образом заполнить начальную информацию в блоках управления процессами (контексты каждого процесса и т.п.), а затем, установив обработчик прерывания, запустить работу диспетчера задач.
3. Краткая информация по обработке прерываний на процессора x86
Прерывания - это сигналы, приходящие от внешних устройств в непредсказуемые моменты времени, т.е. они могут быть сгенерированы в любой момент времени, и компьютерная система должна отреагировать на них адекватно. Эти сигналы приходят на специальные входы процессора. Они могут поступать от множества устройств различных типа и каждое из них может требовать специфичной обработки. Поэтому, каждый сигнал прерывания приходит вместе с его номером, определяющим тип устройства, вызвавшего данный сигнал.
Например, сигнал от таймера обладает номером 0х08. В процессорах Intel может быть до 256 различных типов прерываний (номеров прерываний) в интервале от 0 до 255. Каждый тип сигнала прерывания при его возникновении должен быть обработан соответствующей процедурой. Так, для каждого из 256 прерываний может быть вызвана специфичная программа и эти программы могут быть написаны не только разработчиками ОС, но и другими пользователями. Данные коды могут быть расположены в любом месте памяти. Поэтому адреса обработчиков прерываний должны находится в предопределенной области памяти, в так называемой таблице прерываний, занимающей 1Кб с 0-го байта. Данная таблица содержит вектора прерываний, которые являются адресами процедур обработки прерываний. Каждый вектор занимает 4 байта, 2 младших байта - смещение адреса процедуры обработки и 2 старших байта - сегментная часть адреса. Таким образом, чтобы дать возможность процессору реагировать на определенный сигнал оборудования достаточно записать 4-хбайтовый адрес процедуры обработки прерывания в ячейку памяти с адресом 4*N, где N - номер вектора прерывания. Обычно так не поступают, т.к. обработчик прерывания, использовавшийся ранее, который может делать полезную для системы работу, будет переопределен, что может повредить системе. Поэтому обычно старый вектор прерывания сохраняется. Также, после завершения программы, работающей с прерыванием, необходимо восстановить старое значение вектора прерывания. Как правило, старый вектор сохраняется в некоторой локальной области памяти программы, затем записывается новый вектор прерывания, указывающий на новый обработчик, а первой операцией обработчика, как правило, ставят вызов старой подпрограммы обработки прерывания, чтобы она могла выполнить возложенную на нее задачу. После возвращения из старого обработчика, новый обработчик выполняет свою работу. Следует отметить, что когда приходит сигнал прерывания, после нахождения адреса обработчика прерывания и до передачи управления ему, процессор помещает в стек 3 слова: регистр флагов (слово статуса процессора - ССП или PSW, для Intel - AF) и регистры CS, IP. Это необходимо для обеспечения возможности возвращения к прерванной программе (CS:IP ссылается на следующую ее инструкцию). Регистр флагов используется для анализа условий и необходим для организации ветвлений программ. Так, обычно, когда обработчик прерывания получает управление, он сохраняет в своей внутренней памяти (обычно, в стеке) все регистры или, по крайней мере, регистры, используемые им, выполняет необходимую работу, восстанавливает все сохраненные ранее регистры и передает управление на следующую команду прерванного приложения с помощью команды iret (interruption return), которая извлекает из стека IP, CS, PSW и загружает эти значения в соответствующие регистры. После загрузки предыдущих значений в регистры, прерванное приложение продолжает свое исполнение, как будто оно никогда не прерывалось. Имеет смысл обратить внимание, что обработка прерываний выполняет только после полной остановки исполнения инструкции, которая выполнялась в момент прихода сигнала. Когда мы вызываем старый вектор прерывания из нового и если это выполняется стандартной командой call, это ведет к сохранению в стеке только пары CS:IP без PSW. Но возврат из старого вектора выполняется с помощью iret, что ведет к считыванию из стека 3 слов, вместо положенных 2, что может привести к порче стека и неверной работе системы. Чтобы избежать такой ситуации перед вызовом старого вектора прерывания, PSW должен быть сохранен в стеке.
Мы обсудили аппаратные прерывания, но аналогичные обработчики прерываний могут быть запущены специальной процессорной инструкцией int, что активно используется в программировании. Например, в среде MS-DOS существует ряд прерываний, позволяющих выполнять дисковые операции, выводить информацию на экран и т.п.
Следует отметить, что при обработке программных прерываний происходит запрет программных прерываний, а при обработке аппаратных прерываний идет запрет как программных, так и аппаратных прерываний. Поэтому в процедуре обработки прерываний следует позаботиться о разрешении прерываний соответствующей командой процессора (sti). В случае использования высокоуровневой среды разработки (например, Borland Pascal или C++) обработка прерываний может быть произведена расширенными средствами соответствующего языка программирования. И в Си++, и в Паскале имеются специальные подпрограммы, описанные соответствующим образом и предназначенные специально для обработки прерываний. Такие подпрограммы содержат в заголовке ключевое слово interrupt и дополнительно производят сохранение в стеке ряда регистров процессора. Какие именно регистры и в каком порядке сохраняются можно выяснить в справочных системах соответствующих средств разработки.
Также не следует забывать, что высокоуровневые языки хранят локальные переменные подпрограмм в стеке, создавая их каждый раз при вызове соответствующей подпрограммы. Поэтому необходимо позаботиться не только о сохранении контекста процессора (его регистров), но и состояния переменных подпрограмм, реализующих процессы-философы.
4. Особенности работы и требования к отчету
Особенностью данной лабораторной работы является отсутствие необходимости в синхронизации процессов-философов при доступе к разделяемым данным (массиву вилок), что может привести к неоднозначным ситуациях, когда количество вилок начнет увеличиваться, хотя по условию задачи это невозможно. Также допускается использование механизма активного ожидания, когда некоторый процесс крутится в цикле до тех пор, пока ему не будут предоставлены необходимые ему ресурсы.
Отчет о работе должен содержать:
* постановку задачи;
* листинг программы;
* результаты работы в виде протокола выполнения программы, который должен выводиться ей в файл; протокол работы содержит информацию о текущем состоянии массива вилок и философов на некоторый момент времени
* выводы по работе
Документ
Категория
Рефераты
Просмотров
33
Размер файла
38 Кб
Теги
1/--страниц
Пожаловаться на содержимое документа