Фэндом

Smalltalk по-русски

Смолток. Язык и его реализация/Вторая часть/15. Многочисленные независимые процессы

< Смолток. Язык и его реализация | Вторая часть

239статей на
этой вики
Добавить новую страницу
Обсуждение0 Поделиться
15.0.jpg

Многочисленные независимые процессыПравить

15.1.jpg

Система Смолток предоставляет поддержку многочисленных независимых процессов при помощи трёх классов: Процесса, Планировщика исполнителя и Семафора. Процесс представляет последовательность действий которые могут быть выполнены независимо от действий представляемых другими Процессами. Планировщика исполнителя планирует использование виртуальной машины Смолтока которая выполняет действия представляемые в системе Процессом. Может существовать много Процессов чьи действия выполняются и Планировщик исполнителя определят какая из этих виртуальных машин будет выполняться в данный момент. Семафор позволяет различным независимым процессам синхронизировать между собой их действия. Семафоры предоставляют простую форму синхронного средств связи которая может быть использована для создания более сложных синхронных взаимодействий. Также Семафоры предоставляют синхронное средство связи с асинхронными устройствами такими как устройства ввода пользователя и часы реального времени.

Семафоры часто являются не самым удобным механизмом синхронизации. Экземпляры Разделяемой очереди и Задержки, удовлетворяющие две наиболее частые потребности синхронизации, используют Семафоры. Разделяемая очередь предоставляет безопасный способ передачи объектов между независимыми процессами, а Задержка позволяет процессам синхронизироваться с часами реального времени.

ПроцессыПравить

Процесс это последовательность действий описываемая предложениями и выполняемая виртуальной машиной Смолтока. Несколько процессов системы следят за асинхронными устройствами. Например, существует процесс следящий за клавиатурой, за указывающим устройством и за часами реального времени. Также существует процесс следящий за доступной памятью системы. Наиболее важным для пользователя процессом является тот процесс который выполняет действия заданные пользователем, например, редактирование текста, графики или определение класса. Эти процессы интерфейса с пользователем должны поддерживать связь с процессами следящими за клавиатурой и указывающим устройством чтобы определять что делает пользователь. Processes might be added that update a clock or a view of a user-defined object.

Новый процесс можно создать послав унарное сообщение разветвить блоку. Например, следующее предложение создаёт новый процесс который показывает на мониторе три времени называемых Восточное время, Горное время и Тихоокеанское время.

   [
      Восточное время показать.
      Горное время показать.
      Тихоокеанское время показать. ]
         разветвить.

Действия производимые новым процессом описываются предложениями блока. Сообщение разветвить имеет тот же эффект что и сообщение значение, но оно отличается тем как возвращается результат. Когда блок получает сообщение значение, он ждёт пока выполнятся все предложения. Например, следующие предложение не вернёт значения до тех пор пока все три времени не покажутся на мониторе.

   [
      Восточное время показать.
      Горное время показать.
      Тихоокеанское время показать. ]
         значение.

Значение возвращаемое из блока при посылке ему сообщения значение это значение последнего предложения блока. Когда блоку принимает сообщение разветвить, управление возвращается сразу, обычно до того как будут выполнены предложения. Это позволяет выполнится предложениям следующим за сообщением разветвить независимо от предложений блока. Например, результатом следующих предложений будет сортировка содержимого набора список имён независимо от показа трёх времён.

   [
      Восточное время показать.
      Горное время показать.
      Тихоокеанское время показать. ]
         разветвить.
   алфавитный списоксписок имён сортированный.

Набор может быть отсортирован до того как будут показаны любые из часов либо все часы могут быть показаны до завершения сортировки набора. Может произойти одно из вышеуказанных двух предельных событий или промежуточное событие при котором сортировка и показ часов перемешаны что зависит от способа которым написаны сортировка и показ часов. Два процесса, один из которых посылает сообщения разветвить и сортированный и тот который посылает сообщения показать, выполняются независимо. Т.к. предложения блока могут ещё выполняться при возвращении из метода разветвить, то значение возвращаемое этим методом должно быть независимо от значений предложений блока. Блок возвращает себя в качестве значения сообщения разветвить.

Каждый процесс системы представляется экземпляром класса Процесс. В ответ на сообщение разветвить блок создаёт новый экземпляр Процесса и планирует выполнение своих предложением исполнителем. Блоки также отвечают на сообщение новый процесс созданием и возвращением нового экземпляра Процесса, но не планируется выполнение его предложений виртуальной машиной. Это сообщение полезно т.к., в отличии от разветвить, оно возвращает ссылку на Процесс. Процесс созданный сообщением новый процесс называется приостановленным т.к. его предложения не выполняются. Например, следующие предложения создают два новых Процесса но в результате не будет показано часов и не будет происходить сортировка.

   процесс показа часов[
      Восточное время показать.
      Горное время показать.
      Тихоокеанское время показать. ]
         новый процесс.
   процесс сортировки[ алфавитный списоксписок имён сортированный. ] новый процесс.

Действия представляемые одним из этих приостановленных Процессов могут быть выполнены при помощи посылки Процессу сообщения возобновить. Результатом следующих двух предложений должна стать посылка сообщения показать Восточному времени и сообщения сортированный списку имён.

   процесс показа часов возобновить.
   процесс сортировки возобновить.

Т.к. сообщения показать и сортиротированный будут посылаться из разных Процессов, то их выполнение может быть перемешано. Другим примером использования сообщения возобновить является реализация сообщения разветвить Блока замыкания.

разветвить
   сам новый процесс возобновить.

Дополняющее сообщение, приостановить, возвращает Процесс в состоянии приостановки в котором исполнитель не выполняет его предложения. Сообщение завершить не допускает дальнейшее выполнение Процесса, не смотря на то приостановлен он или нет.

Протокол экземпляров Процесса
изменение состояния процесса
возобновить Позволяет продвижение выполнения получателя.
приостановить Останавливает продвижение выполнения получателя таким образом что выполнение можно позднее возобновить (послав сообщение возобновить).
завершить Навсегда останавливает продвижение выполнения получателя.

Блоки также понимают сообщение с селектором новый процесс с: которое создаёт и возвращает новый Процесс передавая значения аргументов блока. Аргумент сообщения новый процесс с: это Ряд чьи элементы используются как значения аргументов блока. Размер Ряда должен быть равен количеству аргументов блока. Например,

процесс показа часов[ :часы | часы показать. ] новый процесс с: (Ряд с: Горное время).

Ниже приведён протокол Контекста блока который позволяет создавать новые Процессы.

Протокол экземпляров Контекста блока
планирование
разветвить Создаёт новый Процесс и планирует выполнение предложений получателя.
новый процесс Возвращает приостановленный Процесс выполнения предложений получателя. Новый Процесс не планируется.
новый процесс с: аргумент ряд Возвращает новый приостановенный Процесс выполнения предложений получателя со значениями аргументов блока из аргумента ряда.

ПланированиеПравить

Виртуальная машина Смолтока имеет только один исполнитель способный выполнять одну последовательность действия представляемых Процессом. Поэтому когда Процесс получает сообщение возобновить, то его действия могут не начать выполняться немедленно. Процесс чьи действия в текущий момент выполняются называется активным. При получении активным Процессом сообщения приостановить или завершить, выбирается новый активный Процесс из тех которые получили сообщение возобновить. Единственный экземпляр класса Планировщик исполнителя содержит все Процессы которые получили сообщение возобновить. Этот экземпляр Планировщика исполнителя именуется глобально Исполнитель. Активный Процесс можно получить послав Исполнителю сообщение активный процесс. Например, активный Процесс можно завершить при помощи выражения

Исполнитель активный процесс завершить.

Это будет последним предложением выполненным данным Процессом. Любое предложение следующее в методе никогда не будет выполнено. Также Исполнитель может завершить активный Процесс в ответ на сообщение завершить активный.

Исполнитель завершить активный.

ПриоритетыПравить

Обычно, планирование использования Процессом исполнителя происходит на основе простого правила: первым пришёл первым обслужен. При получении активным Процессом сообщения приостановить или завершить, активным становится Процесс который ждал наибольшее время. Чтобы предоставить больший контроль над тем какой Процесс запустить, Исполнитель использует очень простой механизм приоритетов. Существует фиксированное количество уровней приоритета пронумерованных возрастающими целыми значениями. Процесс с более высоким приоритетом получает исполнителя до Процесса с более низким приоритетом, не зависимо от порядка в котором он был запрошен. При создании Процесса (при помощи сообщения разветвить или новый процесс), он получает тот же приоритет что и создавший его Процесс. Приоритет процесса может быть изменён посылкой сообщения приоритет: с приоритетом в качестве аргумента. Либо приоритет Процесса может быть задан когда он разветвляется при помощи сообщения разветвить от: с приоритетом в качестве аргумента. Например, рассмотрим следующие предложения выполняемые Процессом с приоритетом 4.

   процесс слова[
      [ 'now' показать в: 50 @ 100. ] разветвить от: 6.
      [ 'is' показать в: 100 @ 100. ] разветвить от: 5.
      'the' показать в: 150 @ 100. ]
         новый процесс.
   процесс слова приоритет: 7.
   'time' показать в: 200 @ 100.
   процесс слова возобновить.
   'for' показать в: 250 @ 100.

Последовательность вывода на экран слов будет следующей.

              time
         the  time
now      the  time
now  is  the  time
now  is  the  time  for

Приоритеты задаются при помощи сообщений Процессам и Контекстам блоков.

Протокол экземпляров Процесса
доступ
приоритет: целое Присваивает приоритету получателя целое.


Протокол экземпляров Контекста блока
планирование
разветвить от: приоритет Создаёт новый процесс выполнения предложений содержащихся в получателе. Планируется выполнение нового процесса с уровнем приоритета приоритет.

В действительности методы системы Смолток не задают приоритеты с помощью литералов целых. Подходящий приоритет всегда получается при помощи посылки сообщения Исполнителю. Сообщения используемые для получения приоритетов показаны в протоколе класса Планировщик исполнителя.

Другое сообщение Исполнителя позволяет получить доступ к исполнителю другим Процессам, с тем же приоритетом что и у активного Процесса. Планировщик исполнителя отвечает на сообщение уступить приостановкой активного Процесса и помещением его в конец ожидающих Процессов с его приоритетом. Затем первый Процесс списка становится активным Процессом. Если нету других Процессов с тем же приоритетом, то сообщение уступить ничего не делает.

Протокол экземпляров Планировщика исполнителя
доступ
активный приоритет Возвращает приоритет текущего выполняющегося процесса.
активный процесс Возвращает текущий выполняющийся процесс.
изменение состояния процесса
завершить активный Завершает текущий выполняющийся процесс.
уступить Даёт возможность выполниться другому процессу, с тем же приоритетом что и у текущего выполняющегося процесса.
имена приоритетов
высокий приоритет ВВ Возвращает приоритет с которым должны выполняться наиболее критичные ко времени процессы ввода/вывода.
низкий приоритет ВВ Возвращает приоритет с которым должны выполняться большинство процессов ввода/вывода.
приоритет фона системы Возвращает приоритет с которым должны выполняться фоновые процессы системы.
приоритет синхронных процессов Возвращает приоритет с которым должны выполняться процессы отслеживающие реальное время.
приоритет фона пользователя Возвращает приоритет с которым должны выполняться фоновые процессы созданные пользователем.
приоритет прерываний пользователя Возвращает приоритет с которым должны выполняться процессы созданные пользователем которые требуют немедленного обслуживания.
приоритет интерфейса с пользователем Возвращает приоритет с которым должны выполняться процессы интерфейса с пользователем.

Сообщения запрашивающие приоритеты у Планировщика исполнителя были перечислены выше в алфавитном порядке т.к. это стандартный способ представления описания протокола. Теже сообщения перечислены ниже начиная с высшего приоритета к низшему вместе с некоторыми примерами Процессов которые могут иметь этот приоритет.

приоритет синхронных процессов Процесс следящий за часами реального времени (смотри описание класса Wakeup ниже в этой главе).
высокий приоритет ВВ Процесс следящий за устройством ввода/вывода локальной сети.
низкий приоритет ВВ Процесс следящий за устройствами ввода пользователя и Процесс распределяющий пакеты из локальной сети.
приоритет прерываний пользователя Любой Процесс разветвлённый интерфейсом с пользователем который должен быть запущен немедленно.
приоритет интерфейса с пользователем Процесс выполняющий действия заданные через интерфейс с пользователем (редактирование, просмотр, программирование и отладка).
приоритет фона пользователя Любой Процесс разветвлённый интерфейсом с иользователем который должен быть выполнен только тогда когда ничего другого не происходит.
приоритет фона системы Процессы системы которые должны выполняться когда не происходит ничего другого.

СемафорыПравить

Последовательность действий представляемая Процессом выполняется асинхронно с действиями представленными другими Процессами. Работа одного Процесса независима от работу другого Процесса. Это справедливо для Процессов которые никогда не взаимодействуют. Например, два Процесса приведённых ниже которые показывают часы и сортируют набор, наверно, совсем не нуждаются во взаимодействии между собой.

   [
      Восточное время показать.
      Горное время показать.
      Тихоокеанское время показать. ]
         разветвить.
   алфавитный списоксписок имён сортированный.

Однако некоторые, в значительной степени независимые, Процессы иногда должны взаимодействовать. Действия таких не жёстко связанных Процессов должны быть синхронизованы при взаимодействии. Экземпляры Семафора предоставляют простую форму обеспечения синхронных взаимодействий между Процессами независимыми в остальное время. Семафор предоставляет простое синхронное сообщение (~1 бита информации) от одного процесса другому. Семафор предоставляет возможность выполнить пассивное ожидание Процессу который старается получить сигнал который ещё не был послан. Семафоры это единственный безопасный механизм предоставляемый для взаимодействий между Процессами. Любые другие механизмы взаимодействия должны пользоваться Семафорами для обеспечения синхронизации.

Взаимодействие через Семафор начинается одним Процессом с посылке ему сообщения сигнал. На другом взаимодействующем конце, другой Процесс ждёт получения связи при помощи посылки сообщения ждать тому же Семафору. Не имеет значения в каком порядке посланы эти два сообщения, выполнение Процесса ждущего получения сигнала не будет продолжено до его посылки. Управление из сообщения ждать возвратится Семафором столько раз сколько раз он получил сообщение сигнал. Если семафору послано одно сообщение сигнал и два сообщения ждать, то он не вернёт управление из одного сообщения ждать. При получении Семафором сообщения ждать для которого не было послано соответствующего сигнала, он приостанавливает процесс из которого было послано сообщение ждать.

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

Процессы которые были приостановлены будут возобновлены в том же порядке в котором они были приостановлены. Приоритет Процесса рассматривается Планировщиком исполнителя только при планировании использования им исполнителя. Каждый Процесс ждёт пока Семафор возобновит его на основе порядка первым пришёл - первым обслужен, не зависимо от приоритета. Семафор позволяет Процессу ждать ещё не посланного сигнала без использования времени исполнителя. Семафор не возвращает управление из сообщения ждать до тех пор пока не будет послан сигнал. Одно из главных преимуществ создания независимых процессов для выполнения действия заключается в том что если процессу нужно что-то не доступное в данный момент, то другой процесс может продолжать выполняться в то время как первый процесс ждёт появления ресурса. Примерами того в чём процесс может нуждаться и что может быть недоступно являются: устройства, события от пользователя (нажатие кнопки или движение указывающего устройства) и разделяемые структуры данных. Определённое время дня также может быть тем в чём нуждается процесс для продолжения выполнения.

Взаимное исключениеПравить

Семафоры могут использоваться для обеспечения взаимного исключения использования некоторого ресурса различными Процессами. Например, Семафор можно использовать для создания структуры данных безопасной для доступа различным Процессами. Следующее определение простой структуры данных типа первым пришёл первым ушёл не обеспечивает взаимное исключение обращений к ней.

имя класса Простая очередь
суперкласс Объект
имена переменных экземпляра ряд содержимое пположение чтения пположение записи
методы класса
создание экземпляра
новый
   сам новый: 10.

новый: размер
   супер новый ини: размер.

методы экземпляра
доступ
следующий
   | значение |
   положение чтения = положение записи
      истина: [ сам ошибка: 'empty queue'. ]
      ложь: [
         значениеряд содержимое от: положение чтения.
         ряд содержимое от: положение чтения пом: пусто.
         положение чтенияположение чтения + 1.
         значение. ].

пом следующим: значение
   положение записи > ряд содержимое размер
      истина: [ сам создать пространство для записи. ].
   ряд содержимое от: положение записи пом: значение.
   положение записиположение записи + 1.
   значение.


размер
   положение записи - положение чтения.

проверки
пустой
   положение записи = положение чтения.
собственные
ини: размер
   ряд содержимоеРяд новый: размер.
   положение чтения1.
   положение записи1.

создать пространство для записи
   | размер содержимого |
   положение чтения = 1
      истина: [ ряд содержимое расти. ]
      ложь: [
         размер содержимогоположение записи - положение чтения.
         1
            до: размер содержимого
            делать: [
               :номер |
               ряд содержимое
                  от: номер
                  пом: (ряд содержимое от: номер + положение чтения - 1). ].
         положение чтения1.
         положение записиразмер содержимого + 1. ].

Простая очередь запоминает своё содержимое в Ряде с именем ряд содержимое и содержит два номера с именами положение чтения и положение записи. Новое содержимое добавляется в положение записи и удаляется из положения чтения. Собственное сообщение создать пространство для записи посылается когда не остаётся места в конце ряда содержимого для запоминания нового объекта. Если ряд содержимое полностью заполнен, то его размер увеличивается. Иначе, содержимое перемещается в начало ряда содержимого.

Проблема с посылкой сообщений Простой очереди из различных Процессов заключается в том что больше одного Процесса одновременно могут выполнять метод следующий или пом следующим:. Допустим Простой очереди было послано сообщение следующий из одного Процесса, и в данный момент выполняется предложение:

значениеряд содержимое от: положение чтения.

В это время просыпается Процесс с более высоким приоритетом и посылает другое сообщение следующий той же самой Простой очереди. Т.к. положение чтения не было увеличено, то второе выполнение вышеприведённого предложения присвоит тот же объект значению. Процесс с более высоким приоритетом удалит ссылку на объект из ряда содержимого, увеличит положение чтения и возвратит удалённый объект. Когда Процесс с более низким приоритетом получит управление, положение чтения будет увеличено поэтому он удалить ссылку на следующий объект из ряда содержимого. Этот объект должен был быть значением сообщения следующий, но был отброшен и оба сообщения следующий вернули один и тот же объект.

Чтобы гарантировать взаимное исключение каждый Процесс должен ждать один и тот же Семафор перед использованием ресурса и затем сигналить Семафором после его использования. Следующий подкласс Простой очереди предоставляет взаимное исключение поэтому его экземпляры могут быть использованы различными Процессами.

имя класса Простая разделяемая очередь
суперкласс Простая очередь
имена переменных экземпляра защита доступа
методы экземпляра
доступ
следующий
   | значение |
   защита доступа ждать.
   значениесупер следующий.
   защита доступа сигнал.
   значение.

пом следующим: значение
   защита доступа ждать.
   супер пом следующим: значение.
   защита доступа сигнал.
   значение.

собственные
ини: размер
   супер ини: размер.
   защита доступаСемафор новый.
   защита доступа сигнал.

Т.к. взаимное исключение это обычное использование Семафоров, то он содержит сообщение для этого. Селектор этого сообщения критический:. Ниже приведена реализация этого метода.

критический: блок взаимного исключения
   | значение блока |
   сам ждать.
   [ значение блокаблок взаимного исключения значение. ]
      гарантировать: [ сам сигнал. ].
   значение блока.

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

Протокол экземпляров Семафора
взаимное исключение
критический: блок Выполняет блок когда не выполняется другого критического блока.


Протокол класса Семафор
создание экземпляра
для взаимного исключения Возвращает новый Семафор с одним излишним сигналом.

Реализация Простой разделяемой очереди должна быть изменена так:

имя класса Простая разделяемая очередь
суперкласс Простая очередь
имена переменных экземпляра защита доступа
методы экземпляра
доступ
следующий
   | значение |
   защита доступа критический: [ значениесупер следующий. ].
   значение.

пом следующим: значение
   защита доступа критический: [ супер пом следующим: значение. ].
   значение.

собственные
ини: размер
   супер ини: размер.
   защита доступаСемафор для взаимного исключения.

Разделяемые ресурсыПравить

Чтобы разделять ресурс между двумя Процессами не достаточно только обеспечить взаимно исключающий доступ к нему. Процессы должны иметь возможность узнавать о доступности ресурса. Простая разделяемая очередь нормально работает с множественным доступом к ней, но если будет произведена попытка удалить объект из пустой Простой разделяемой очереди, то возникнет ошибка. В среде с асинхронными Процессами, трудно гарантировать что попытки удаления объектов (при помощи сообщения следующий) будут производиться только после того как они были добавлены (при помощи сообщения пом следующим:). Однако, Семафоры также используются чтобы сигнализировать доступность разделяемых ресурсов. Семафор представляющий ресурс сигналит после того как становится доступным каждая единица ресурса и ждёт перед потреблением каждой единицы. Поэтому, если производится попытка получить ресурс до того как он был произведён, потребитель просто ждёт.

Класс Безопасная разделяемая очередь это пример использования Семафоров в качестве средства сообщения о доступности ресурса. 'Безопасная разделяемая очередь подобна Простой разделяемой очереди, но она использует для представления доступности содержимого очереди ещё один Семафор с именем значение доступно. Безопасная разделяемая очередь не является частью системы Смолток, она здесь описана только как пример. Разделяемая очередь это класс который в действительности используется для связи между процессами системы. Разделяемая очередь предоставляет функциональность подобную предоставляемой Безопасной разделяемой очередью. Протокол Разделяемой очереди будет дан ниже в этой главе.

имя класса Безопасная разделяемая очередь
суперкласс Простая очередь
имена переменных экземпляра значение доступно защита доступа
методы экземпляра
доступ
следующий
   | значение |
   значение доступно ждать.
   защита доступа критический: [ значениесупер следующий. ].
   значение.

пом следующим: значение
   защита доступа критический: [ супер пом следующим: значение. ].
   значение доступно сигнал.
   значение.

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

Прерывания аппаратурыПравить

Также экземпляры Семафора используются для связи между аппаратурой и Процессами. При этом использовании, семафор замещает прерывание в значении информирования об изменении состояния оборудования. Виртуальная машина Смолтока задаёт три условия при которых семафором посылаются сигналы.

  • событие от пользователя: была нажата кнопка на клавиатуре, на указывающем устройстве или указывающее устройство перемещено.
  • таймаут: было достигнуто определённое значение миллисекундными часами.
  • мало места: доступная память объектов стала меньше определённого предела.

Эти три Семафора соответствуют трём процессам следящим за событиями от пользователя, миллисекундными часами и использованием памяти. Каждый следящий Процесс посылает сообщение ждать соответствующему Семафору что приостанавливает его до тех пор пока не произойдёт что то интересное. Когда Семофор просигналит, то Процесс будет возобновлён. Виртуальная машина уведомляется об ожидании этих трёх типов событий при помощи примитивных методов.

Класс Пробуждение это пример использования Семафора который сигналит об одном из таких событий. Пробуждение предоставляет сервис будильника для Процесса при помощи слежения за часами. Класс Пробуждение не является частью система Смолток; он описан здесь только в качестве примера. В системе Смолток слежением за миллисекундными часами занимается класс Задержка. Этот класс предоставляет функциональность подобную функциональности Пробуждения. Описание протокола Задержки будет дано ниже в этой главе. Пробуждение предоставляет сообщение которое приостанавливает пославший его Процесс на заданное количество миллисекунд. Следующее предложение приостанавливает Процесс на три четверти секунды.

Пробуждение спустя: 750.

Когда Пробуждение получает сообщение спустя: оно создаёт новый экземпляр который запоминает значение часов при котором должно произойти пробуждение. Новый экземпляр содержит Семафор на котором активный Процесс должен ждать до достижения времени пробуждения. Пробуждение хранит все свои экземпляры в списке отсортированном по времени пробуждения. Процесс следит за миллисекундными часами виртуальной машины по наиболее раннему из времён пробуждения и позволяет соответствующему приостановленному Процессу продолжиться. Этот Процесс создаётся методом класса инициализировать процесс синхронизации. На Семафор используемый для слежения за часами ссылается переменная класса Семафор синхронизации. Виртуальная машина уведомляется что что нужно следить за часами при помощи следующего предложения находящегося в методе экземпляра следующее пробуждение.

   Задержка
      прим сигнал: Семафор синхронизации
      при миллисекундах: время пробуждения.

На список экземпляров ждущих продолжения ссылается переменная класса Ожидающие пробуждения. Есть ещё один Семафор с именем Защита доступа который предоставляет взаимное исключение доступа к Ожидающим пробуждениям.

имя класса Пробуждение
суперкласс Объект
имена переменных экземпляра время будильника симафор будильник
имена переменных класса Ожидающие пробуждения Защита доступа Семафор синхронизации
методы класса
сервис будильника
спустя: количество миллисекунд
   (сам новый продолжительность сна: количество миллисекунд) ждать пробуждения.
инициализация класса
инициализировать
   Семафор синхронизацииСемафор новый.
   Защита доступаСемафор для взаимного исключения.
   Ожидающие пробужденияСортированный набор новый.
   сам инициализировать синхронный процесс.

инициализировать синхронный процесс
   [
      [ истина. ]
         пока истина: [
            Семафор синхронизации ждать.
            Защита доступа ждать.
            Ожидающие пробуждения удалить первый проснуться.
            Ожидающие пробуждения пустой
               ложь: [ Ожидающие пробуждения первый следующее пробуждение. ].
            Защита доступа сигнал. ]. ]
         разветвить от: Исполнитель приоритет синхронных процессов.

методы экземпляра
задержка процесса
ждать пробуждения
   Защита доступа ждать.
   Ожидающие пробуждения добавить: сам.
   Ожидающие пробуждения первый == сам истина: [ сам следующее пробуждение. ].
   Защита доступа сигнал.
   семафор будильник ждать.
сравнение
< другое пробуждение
   время будильника < другое пробуждение время пробуждения.
доступ
время пробуждения
   время будильника.
собственные
следующее пробуждение
   Задержка
      прим сигнал: Семафор синхронизации
      при миллисекундах: время будильника.

продолжительность сна: количество миллисекунд
   время будильникаВремя значение часов в миллисекундах + количество миллисекунд.
   семафор будильникСемафор новый.


проснуться
   семафор будильник сигнал.

Класс Разделяемая очередьПравить

Класс Разделяемая очередь это класс системы чьи экземпляры являются безопасным средством сообщения между Процессами. Его протокол и реализация похожи на протокол примера Безопасная разделяемая очередь который был приведён раньше в этой главе.

Протокол экземпляров Разделяемой очереди
доступ
следующий Возвращает первый объект который был добавлен к получателю и ещё не был удалён. Если получатель пуст, то текущий Процесс приостанавливается до тех пор пока в получателя не будет добавлен объект.
пом следующим: значение Добавляет значение к содержимому получателя. Если Процесс был приостановлен для ожидания объекта, то ему позволяется возобновиться.

Класс ЗадержкаПравить

Задержка позволяет Процессу приостановиться на заданное время. Задержка создаётся заданием продолжительности в течении которой активный Процесс будет приостановлен.

   полуминутная задержкаЗадержка на секунды: 30.
   короткая задержкаЗадержка на миллисекунды: 50.

Простое создание Задержки не имеет эффекта на активный Процесс. Задержка приостанавливает активный Процесс в ответ на сообщение ждать. Каждое из следующих предложений приостановит выполнение активного Процесса на 30 секунд.

   полуминутная задержка ждать.
   (Задержка на секунды: 30) ждать.


Протокол класса Задержка
создание экземпляра
на миллисекунды: количество миллисекунд Возвращает новый экземпляр который будет приостанавливать активный Процесс на количество миллисекунд когда ему будет посылаться сообщение ждать.
на секунды: количество секунд Возвращает новый экземпляр который будет приостанавливать активный Процесс на количество секунд когда ему будет посылаться сообщение ждать.


Протокол экземпляров Задержки
доступ
время возобновления Возвращает значение миллисекундных часов при котором приостановленный Процесс будет возобновлён.
задержка процесса
ждать Приостанавливает выполнение активного Процесса до тех пока миллисекундные часы не не достигнут подходящего значения.

При помощи следующего предложения могут быть созданы виртуальные часы.

   [
      [ истина. ]
         пока истина: [
            Время текущее цепь для печати показать в: 100 @ 100.
            (Задержка на секунды: 1) ждать. ]. ]
         разветвить.

На мониторе будет показываться текущее время каждую секунду.

Обнаружено использование расширения AdBlock.


Викия — это свободный ресурс, который существует и развивается за счёт рекламы. Для блокирующих рекламу пользователей мы предоставляем модифицированную версию сайта.

Викия не будет доступна для последующих модификаций. Если вы желаете продолжать работать со страницей, то, пожалуйста, отключите расширение для блокировки рекламы.

Также на Фэндоме

Случайная вики