Механизмы синхронизации. Семафороподобные средства 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Механизмы синхронизации. Семафороподобные средства



В качестве примеров реализации семафорных механизмов рассмотрим специализированные команды на примере архитектуры Windows.

Семафор в данном случае ячейка памяти, обозначенная специальным тегом.

Закрыть — выполняется традиционно

открыть — реализует 2 варианта решения задачи реактивации (освобождаются все процессы и они обратно должны выполниться)

пропустить — работает аналогично операции открыть, но семафор не открывается.

Жужжать — процесс реализует активное ожидание для указанного семафора.

Отксем — открытие семафора без обработки очереди.

 

Организация и управление подпроцесами в Java

Программный поток предоставляет некоторую задачу или операцию, поэтому необходимы средства для её выполнения. В языке java существует интерфейс Runnable, содержащий метод run в котором и выполняются все действия. Обычно он содержит некоторый цикл, выполняющийся до выполнения какого-то условия. При реализации данного интерфейса поток, после окончания действий не может вернуть какое-либо значение. Если необходимо, что бы поток возвращал значение — нужно реализовать интерфейс Callable, который вместо метода run содержит метод call. Данный интерфейс параметризирован и после выполнения вернет значения указанного типа. Однако просто реализовав интерфейс выполнения потока не добьешься, поэтому традиционным способом преобразования интерфейса в задачу заключается в передаче его конструктору класса Thread и вызов метода start для потока. Так же можно упомянуть о том, что метод main() выполняется в отдельном потоке. Если создаваемый поток не должен выполнять каких-либо слажных операций — можно просто наследовать от класса Thread. Java так же предоставляет возможность создания потоков-демонов. Демоном называется поток, предоставляющий некоторый сервис, работая в фоновом режиме во время выполнения программы, но при этом не является её неотъемлемой частью. Таким образом при завершении всех основных потоков выполнение программы завершается независимо от тог, завершил ли демон свою работу. Все потоки, порождаемые потоками-демонами так же будут демонами.

Java предоставляет некоторые методы, управляющие выполнением потоков, например метод yield — явное освобождение процессора потоком, для передачи управления другому потоку, однако нет никакой гарантии, что другой поток будет выполняться в это время. Фактически вызов данного метода означает лишь, что очередная важная часть цикла была выполнена и теперь можно на время переключиться на другую задачу.

Другим способом управления вашими потоками является вызов метода sleep(), который переводит поток в состояние ожидания на заданное количество времени. (благодаря включению этого метода в класс TimeUnit его использование стало более удобно, так как можно указывать время не только в милисекундах). Данный метод может выбрасывать исключение InterruptedException.

Потокам можно назначить приоритет. Приоритет передает планировщику информацию об относительной важности потока. Хотя порядок обращения процессора к существующему набору потоков не детерминирован, если существует несколько приостановленных потоков, одновременно ожидающих запуска, планировщик сначала запустит поток с большим приоритетом. Использование приоритетов не означает, что поток с младшим приоритетом не будет выполняться вовсе, он лишь будет выполняться чуть реже. Использование приоритетов не слишком хорошо согласуется с большинством ОС, тк пакет JDK имеет 10 уровней приоритетов, в то время как планировщик Windows имеет 7, поэтому во время использования нестандартных приоритетов лучше использовать только универсальные константы класса Thread.

 

Решение задачи взаимного исключения в Java

В языке предоставлены некоторые вещи для решения задачи взаимного исключения: любой объект, метод или участок кода может быть объявлен со спецификатором synchronized. Участок кода, выделенный таким образом всегда выполняется, по отношению к другим потокам, в режиме взаимного исключения, т. е. Если этот участок вызван потом из потока ни в одном другом потоке этот участок выполняться не будет до момента выхода из него первого потока. Для синхронизации потоков так же можно использовать синхронизирующие операторы, например для метода или объекта можно использовать методы wait() и notify(). Так же могут использоваться семафоры.

Событийные переменные в java.

 

Семафоры в java.

Семафор со счетчиком позволяет n задачам одновременно обращаться к ресурсу. Можно считать, что семафор «выдает разрешение» на использование ресурса, хотя никаких реальных объектов в этой схеме нет. Класс Semaphore содержится в библиотеке java.concurrent. Объект класса Semaphore в java имеет метод acquire() для закрытия и release() для открытия. При создании объекта семафора конструктору класса передается целое значение — начальное состояние семафора и логическое значение, определяющее будут ли потоки выполняться в порядке очереди, или в произвольном порядке.

Организация подзадач в Win

Win 32: Create Thread

Delphi/C Builder function: Begin Thread

Deplhi/C Builder Class: Tthread

Организация подзадач в ОС Windows возможна на 3 уровнях:

1) Базовый — непосредственное использование средств ОС

2) Подразумевает использование низкоуровневых средств, встроенных в системы программирования

3) Использование специализированных классов

Рассмотрим организацию подзадач осуществляется вызовом функции Begin Thread.

Sa — указатель на запись, описывающий права доступа, имеет смысл знач. NiL

stacksize размер стека, выделяемой подзад. (0 по умолчанию)

Thread Function — указатель на функцию потока содерж. Ссылку на функцию, кот. Выполн-ся в рамках подзадачи

р — указатель на область памяти, содержащий параметры функции потока

creationFlag1 — режим созд. Подзадач.

1) Создание и запуск

2) Созд. Приост. Передач. Которое нужно старт.

Function Begin Thread(

sa: Pointer;

stacksize: Integer;

ThreadFunction: TthreadFunc;

p: pointer;

creationflag1: Integer;

var Threadld: Integer

): Thadle;

var Threadld: Integer — индикатор создания подзад.

): Функция возвращает дескриптор, созданный подзадачей т. е. Это указатель на ячейку кот. Содержит

Создание подзад. Доступна через дескриптор.

Функция подзадачи:

ThreadFunction: TthreadFunc;

type TthreadFunc = function(parameter: pointer):Integer; // возвращаем результат

Указатель на параметр(параметры)

p: pointer; p-> array(record)

Подзад. Работает до тех пор пока выполняется функция подзадачи

Операции для подзадачи:

function SuspendThread(threadHandle: TthreadID): Dword //приостанавливает

function ResumeThread(threadHandle: TthreadID): Dword //запустить

результат — код ошибки

 

Приоритеты подзадачей Чтобы получить значение текущего приоритета используют функцию get, а что бы установить приоритет — set.

Приоритеты для подзадач являются относительные (± относительно приоритета основной задачи)

Подзадачи завершаются, когда добавляется функция потока.

Стандартный способ завершения если заранее неизвестно кол-во итераций, используется специальный флаг.

Чтобы безопасно остановить подзадачу необходимо переодически проверять состояние флагов.

Окончательное удаление подзадачи из системы осуществляется вызовом фкнции CloseHandle(Handle)

В ОС Windows большинство системных объектов сообщают о своем состоянии с помощью сигналов. Другими словами объект может находится в сигнализирующем или несигнализирующем состоянии.

Подзадача переходит в сигнализирующее состояние в момент завершения.

Function WaitForSingleObject(

1 параметр — дескриптор

2 параметр: timeout — время в течении которого ожидается сигнал

Handle:Thandle;

dw Milliseconds:LongInt): DWORD;

function WaitForMultipleObject(n

IpHandle: pWOHhandleArray;

dWaitAll: BOOL;

dwMilliseconds: LongInt): DWORD

параметр: 1) ссылка для дескриптора

2)

3) режим ожидания dWaitAll



Поделиться:


Последнее изменение этой страницы: 2016-04-19; просмотров: 491; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.22.248.208 (0.012 с.)