- •7.091501 – Комп’ютерні системи та мережі
- •7.091503 – Спеціалізовані комп’ютерні системи
- •7.091501 – Комп’ютерні системи та мережі
- •7.091503 – Спеціалізовані комп’ютерні системи
- •2. Надійність і відмовостійкість
- •3. Масштабованість
- •4. Сумісність і мобільність програмного забезпечення
- •5. Класифікація комп'ютерів по галузям застосування Персональні комп'ютери та робочі станції
- •Сервери
- •Мейнфрейми
- •Кластерні архітектури
- •Контрольні запитання
- •Тести tpc
- •2. Тест tpc-a
- •3. Тест tpc-b
- •4. Тест tpc-c
- •5. Майбутні тести tpc
- •2. Архітектура системи команд. Класифікація процесорів (cisc і risc)
- •3. Методи адресації та типи даних Методи адресації
- •4. Типи команд
- •5. Команди керування потоком команд
- •6. Типи й розміри операндів
- •2. Найпростіша організація конвеєра й оцінка його продуктивності
- •3. Структурні конфлікти й способи їхньої мінімізації
- •4. Конфлікти за даними, зупинка конвеєра й реалізація механізму обходів
- •5. Класифікація конфліктів за даними
- •6. Конфлікти за даними, що призводять до призупинки конвеєра
- •7. Методика планування компілятора для усунення конфліктів за даними
- •Контрольні запитання
- •2. Зниження втрат на виконання команд умовного переходу
- •Метод вичікування
- •Метод повернення
- •Затримані переходи
- •3. Статичне прогнозування умовних переходів: використання технології компіляторів
- •2. Обробка багатотактних операцій і механізми обходів у довгих конвеєрах
- •3. Конфлікти й прискорені пересилання в довгих конвеєрах
- •4. Підтримка точних переривань
- •Контрольні запитання
- •2. Паралелізм рівня команд: залежності й конфлікти за даними
- •Залежності
- •3. Паралелізм рівня циклу: концепції та методи
- •4. Основи планування завантаження конвеєра й розгортання циклів
- •Контрольні запитання
- •2. Динамічна оптимізація із централізованою схемою виявлення конфліктів
- •2. Подальше зменшення зупинок по керуванню: буфера цільових адрес переходів
- •Контрольні запитання
- •Процесор з архітектурою 80x86 і Pentium.
- •Особливості процесорів з архітектурою spark компанії Sun Microsystems.
- •Процесори pa-risc компанії Newlett-Packard
- •2.Особливості процесорів з архітектурою sparc компанії Sun Microsystems
- •Процесори pa-risc компанії Hewlett-Packard
- •Контрольні запитання
- •Процесор mc88110 компанії Motorola.
- •Особливості архітектури mips компанії mips Technology.
- •Особливості архітектури Alpha компанії dec.
- •Особливості архітектури power компанії ibm і power pc компанії Motorola, Apple і ibm.
- •2.Особливості архітектури mips компанії mips Technology
- •3.Особливості архітектури Alpha компанії dec
- •4.Особливості архітектури power компанії ibm і PowerPc компаній Motorola, Apple і ibm
- •Архітектура power
- •Еволюція архітектури power у напрямку архітектури PowerPc
- •Процесор PowerPc 603
- •Контрольні запитання
- •Термінологія в області паралельної обробки .
- •Питання створення програмного забезпечення.
- •Ахітектура паралельної обробки.
- •2.Питання створення програмного забезпечення.
- •1) Язикові розширення.
- •2) Розширення компіляторів.
- •3) Додавання нового язикового рівня.
- •4) Нова мова.
- •3.Архітектура паралельної обробки.
- •4.Елементи теорії конкурентних процесів. Події та процеси
- •Особливості мов конкурентного програмування
- •Моделі конкурентних процесів
- •Взаємодія процесів, синхронізація й передача даних
- •2. Внутрішня архітектура трансп’ютера
- •3. Послідовна обробка
- •Регістри трансп’ютера
- •4. Інструкції
- •Безпосередні функції
- •Непрямі функції
- •Ефективність кодування
- •5. Підтримка паралелізму
- •6. Зв'язок
- •Лінії зв'язку
- •7. Таймер
- •8. Альтернативне виконання
- •9. Інструкції із плаваючою крапкою
- •Контрольні запитання
- •2. Найпростіші процеси-примітиви
- •3. Послідовні процеси-композиції
- •4. Паралельні процеси
- •5. Канали зв'язку
- •6. Конструктор альтернативного процесу
- •7. Описи
- •8. Масиви
- •9. Оголошення процесів
- •10. Цикли і масиви процесів
- •Контрольні запитання
- •2. Структури програмування
- •Прості паралельні процеси
- •Синхронізація за допомогою керуючих сигналів
- •3. Мовні засоби для програмування в реальному масштабі часу
- •4. Використання мови оккам для рішення завдань системного програмування
- •Контрольні запитання
- •Рекомендована література
2. Структури програмування
Прості послідовні процеси
Звичайно при вивченні нової мови програмування спочатку освоюється програма виводу на екран дисплея деякого повідомлення. В Оккам-оточенні екран термінала представляється спеціальним каналом виводу. Значення, які виводяться в цей канал, відображаються на екрані як символьні дані. Отже, вивід на екран повідомлення можна оформити у вигляді наступного фрагмента:
DEF prompt = TABLE [BYTE 13, 'O', 'c', 'c', 'a', 'm', '*'','s', '*s', 'r', 'a', 'z', 'o', 'r']:
SEQ i = [1 FOR prompt [BYTE 0]] screen !
string [BYTE i]
Нагадаємо, що в нульовому елементі масиву prompt [BYTE 0] зберігається число елементів масиву.
Процес виводу в канал деякого довільного рядка буває дуже корисний у роботі. Все різноманіття процесів, що виводять рядки з різними довжинами, можна представити у вигляді іменованого процесу для виводу масиву символів у деякий канал.
PRОС output.string(CHAN output, VALUE string []) =
вивід рядка в канал з ім'ям output
SEQ i = (1 FOR string [BYTE 0]]
output ! string [BYTE i]:
Записаний у цьому прикладі коментар підсумує поведінка іменованого процесу output.string.
Тепер для виводу нашого повідомлення на екран дисплея необхідно записати в програмі ім'я процесу output.string з фактичними параметрами
output.string(terminal.screen, "Occam razor")
Прості паралельні процеси
Існує найпростіша програма, корисна для практичних додатків. У цій програмі два паралельно працюючі процеси спілкуються один з одним по асинхронному каналу. Асинхронний зв'язок реалізується, звичайно, через буфер. Буфер - теж процес, він очікує певного значення із вхідного каналу, запам'ятовуючи його в локальній змінній, і наступним кроком алгоритм намагається вивести значення, що зберігається в локальній змінній, у певний канал виводу:
SEQ
buffer.in ? val
buffer.out ! val
Цей фрагмент можна узагальнити і ввести іменований процес, що буде копіювати дані з одного каналу в іншій з буферизацією одного значення:
PROC buffer (CHAN buffer.in, buffer.out) =
WHILE TRUE
VAR val:
SEQ
buffer.in ? val
buffer.out ! val:
У цьому процесі використовується конструктор WHILE, але на місці логічного виразу для з'ясування питання про наступне виконання тіла циклу існує ключове слово TRUE, що зображує в мові Оккам константу, що має значення булевої «істини». За допомогою послідовності ключових слів WHILE TRUE в Оккам-програмах записують нескінченні цикли.
За допомогою процесу buffer можна вирішити канонічну задачу паралельних обчислень - завдання асинхронного обміну даними між двома паралельними процесами: процесом-виробником і процесом- споживачем.
Розглянемо спочатку варіант нескінченно працюючого завдання (рис.1):
Рис. 1
PROC producer (CHAN output) =
CHAN keyboard AT 2:
WHILE TRUE
VAR char:
SEQ
keyboard ? char
output ! char:
PROC consumer (CHAN input) =
CHAN screen AT 1:
WHILE TRUE
VAR char:
SEQ
input ? char
screen ! char; -2:
PROC buffer (CHAN buffer.in, buffer.out) =
WHILE TRUE
VAR val:
SEQ
buffer.in ? val
buffer.out ! val:
CHAN char.from.producer, char.to.consumer:
PAR
producer (char.from.producer)
buffer (char.from.producer, char.to.consumer)
consumer (char.to.consumer)
Буферизація одного значення дозволяє процесу-виробникові працювати з випередженням процесу-споживача на одне значення (один такт), тому якщо при "миттєвій фотографії" потоку даних у цьому фрагменті процес-виробник обробляє n-те дане, то буфер буде містити (n - 1) -e дане, а процес-споживач використовує (n - 2) -е дане.
У цьому прикладі з'явилася конструкція
CHAN ім'я_каналу AT номер:
за допомогою якої в програмах оголошуються спеціальні канали для зв'язку із зовнішнім миром. Наприклад, оголошення
CHAN input AT 2:
жорстко закріплює канал з ім'ям input за клавіатурою термінала, а оголошення
CHAN output AT 1:
зв'язує канал з ім'ям output з екраном дисплею.
В іменованому процесі consumer використовується трохи незвичайний процес-примітив виводу:
screen ! char ; -2:
Помітимо, що вивід на екран дисплея сам по собі буферизується, а константа -2 змушує виводити недозаповнений буфер.
Для того щоб коректно закінчити паралельну програму, що складається з декількох паралельних процесів, необхідно по каналах, через які вони повідомляються один з одним, поширювати сигнал закінчення роботи всієї програми. Інакше, якщо просто якимось образом припинити один з паралельно працюючих і сполучених процесів, то через якийсь час цей, а потому і всі інші процеси перейдуть у стан очікування введення даних по своїх каналах. Програма не зможе далі працювати, тобто виникне дедлок.
Розглянемо модифікацію нашої програми, що коректно закінчується при наборі на клавіатурі термінала спеціального символу з кодом ASCII 13, що позначає повернення каретки. У цьому випадку програма повинна закінчитися після введення одного рядка тексту, код 13 буде служити "термінатором" для всіх паралельно працюючих процесів програми:
DEF eoln = 13:
PROC producer (CHAN output) =
VAR run:
CHAN keyboard AT 2:
SEQ
run := TRUE
WHILE run
VAR char:
SEQ
keyboard ? char
output ! char
IF
char = eoln
run := FALSE
char <> eoln
SKIP:
PROC consumer (CHAN Input) =
VAR run:
CHAN screen AT 1:
SEQ
run := TRUE
WHILE run
VAR char:
SEQ
input ? char
IF
char = eoln
run := FALSE
char <> eoln
screen ! char; -2:
PROC buffer (CHAN buffer.in, buffer.out) =
VAR run:
SEQ
run := TRUE
WHILE run
VAR val:
SEQ
buffer.in ? val
buffer.out! val
IF
val = eoln
run := FALSE
val <> eoln
SKIP:
CHAN char.from.producer, char.to.consumer:
PAR
producer (char.from.producer)
buffer(char.from.producer, char.to.consumer)
consumer (char.to.consumer)
Якщо є необхідність у буферизації більшої кількості значень, можна побудувати ланцюжок (конвеєр) буферів для одного значення, які будуть реалізовувати чергу з дисципліною FIFO:
DEF n = 100:
CHAN comms [n + 1]:
PAR
producer (comms [0])
PAR i = [0 FOR n]
buffer(comms[i], comms [i + 1])
consumer (comms[n])