Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Следующая версия Следующая версия справа и слева | ||
ao [2016/04/15 09:10] prospero78 [B.1 Читатели и писатели] |
ao [2020/10/29 07:08] 127.0.0.1 внешнее изменение |
||
---|---|---|---|
Строка 24: | Строка 24: | ||
Множество расширений языка **Oberon** было предложено как в **ETH**, так и вне его. **Object Oberon** [19], **Oberon-2** [18], и **Froderon** [7] исследуют добавление дополнительных объектно-ориентированных свойств в язык; **Oberon-V** [9] предлагает дополнения для поддержки параллельных операций на векторных компьютерах; | Множество расширений языка **Oberon** было предложено как в **ETH**, так и вне его. **Object Oberon** [19], **Oberon-2** [18], и **Froderon** [7] исследуют добавление дополнительных объектно-ориентированных свойств в язык; **Oberon-V** [9] предлагает дополнения для поддержки параллельных операций на векторных компьютерах; | ||
- | PIC FIXME | + | {{ :: |
Рис. 1: Эволюция языков семейства Pascal | Рис. 1: Эволюция языков семейства Pascal | ||
Строка 613: | Строка 614: | ||
==== B.2 Сигналы ==== | ==== B.2 Сигналы ==== | ||
- | < | + | < |
TYPE | TYPE | ||
Signal* = OBJECT | Signal* = OBJECT | ||
Строка 643: | Строка 644: | ||
</ | </ | ||
- | Signal реализует примитивы для работы с сигналами Active Oberon подобно тому, как это сделано в Java и Modula-2. Он использует слегка измененный ticket-algorithm. Как в некоторых магазинах, | + | '' |
==== B.3 Повторно входимые блокировки ==== | ==== B.3 Повторно входимые блокировки ==== | ||
- | < | + | < |
ReentrantLock* = OBJECT | ReentrantLock* = OBJECT | ||
VAR | VAR | ||
Строка 670: | Строка 671: | ||
</ | </ | ||
- | ReentrantLock позволяет блокировать объект его хозяином более одного раза. Клиенты этого объекта должны явно использовать Lock и Unlock вместо пометки защищаемого участка оператором EXCLUSIVE. | + | '' |
==== B.4 Бинарный и общий семафоры ==== | ==== B.4 Бинарный и общий семафоры ==== | ||
- | < | + | < |
MODULE Semaphores; | MODULE Semaphores; | ||
Строка 716: | Строка 717: | ||
</ | </ | ||
- | Это хорошо известные синхронизирующие примитивы Дейкстры [5]. Заметим, | + | Это хорошо известные синхронизирующие примитивы |
==== B.5 Барьеры ==== | ==== B.5 Барьеры ==== | ||
- | < | + | < |
MODULE Barriers; | MODULE Barriers; | ||
(* | (* | ||
Строка 749: | Строка 750: | ||
P = Phase ;P hase ;...P hase i i,0 i,1 i,n | P = Phase ;P hase ;...P hase i i,0 i,1 i,n | ||
- | то барьер используется для гарантии того, что все активности выполнят Phasei,j до начала Phasei,j+1. Отдельный поток исполнения будет выглядеть подобно следующему: | + | то барьер используется для гарантии того, что все активности выполнят |
- | < | + | < |
- | FOR j := 0 TO N DO | + | FOR j := 0 TO N DO |
Phase(i, j); barrier.Enter | Phase(i, j); barrier.Enter | ||
END; | END; | ||
</ | </ | ||
- | Барьер сбрасывает счетчик in после выполнения условия чтобы избежать переполнения. Это возможно потому, | + | Барьер сбрасывает счетчик |
==== B.6 Ограниченный буфер ==== | ==== B.6 Ограниченный буфер ==== | ||
- | < | + | < |
MODULE Buffers; | MODULE Buffers; | ||
Строка 799: | Строка 800: | ||
</ | </ | ||
- | Buffer реализует ограниченный кольцевой буфер. Методы Put и Get защищены от одновременного доступа; | + | '' |
===== C Примеры активных объектов ===== | ===== C Примеры активных объектов ===== | ||
Строка 806: | Строка 807: | ||
==== C.1 Обедающие философы ==== | ==== C.1 Обедающие философы ==== | ||
- | < | + | < |
MODULE Philo; | MODULE Philo; | ||
Строка 853: | Строка 854: | ||
==== C.2 Решето Эратосфена ==== | ==== C.2 Решето Эратосфена ==== | ||
- | < | + | < |
MODULE Eratosthenes; | MODULE Eratosthenes; | ||
Строка 902: | Строка 903: | ||
END Eratosthenes.</ | END Eratosthenes.</ | ||
- | Eratosthenes использует отсеивающий алгоритм для поиска простых чисел. Каждое решето --- это активный объект, | + | '' |