ЛЕКЦИЯ 22.12.12
Параллельное программирование подразделяется:
Ø Уровень машинных команд (обеспечивается только архитектурой процессора)
Ø Уровень оператора выполнения одной или нескольких команд (когда некоторые операторы должны выполняться одновременно, это имеет отношение к ЯП)
Ø Уровень модулей (модули могут выполняться одновременно, даже в одной и той же программе).
В старых windows этого не было, а сейчас есть фоновый режим.
А в IBM360 было полностью реализовано параллельное выполнение программ.
Параллельное выполнение модулей может осуществляться:
- на физическом уровне
-на логическом уровне (логическая параллельность)- с помощью разделения времени процессором
ПАРАЛЛЕЛЬНОСТЬ НА УРОВНЕ ОПЕРАТОРА отличается от параллельности на уровне модулей. Она в основном сводится к определению того, как следует разделять данные между выполняемыми устройствами.
Многопроцессорная архитектура. Первые компьютеры с несколькими процессорами имели 1 процессор общего назначения и один или несколько для выполнения ввода-вывода. В начале 60-х годов имелись несколько вспомогательных процессоров (сейчас их называют контроллеры - функциональные устройства ввода-вывода)
Планировщик заданий(scheduler)
Многопроцессорные компьютеры разделяются:
1)SIMD (имеют несколько процессоров, которые выполняют одну и ту же команду, но каждая команда выполняется со своим набором данных. Компьютер с одним потоком команд, но с разными потоками данных. Из многих процессоров выделяется главный, он координирует работу остальных. Это векторные процессоры, служат для научных вычислений.
2)MIMD (много команд и много потоков данных, процессоры независимы, контроллера нет, но операции можно синхронизировать)
Нас будет интерес параллельность на уровне модулей (подпрограмм). В Java тоже есть много - поточность (модуль main).
Задача реализации любого ЯП является отображение логической параллельности с соответствующим программным обеспечением
Поток управления(thread of control) - последовательность точек, которые достигаются при выполнении программы. Программы на уровне физической параллельности могут иметь несколько потоков управления, причем каждый выполняется отдельным процессором.
Когда многопоточная программа выполняется на одном процессоре, то ее потоки отображаются на один поток.
Много - поточность на уровне операторов проще.
Зачем нужна параллельность?
1.В настоящее время широко используются многопроцессорные компьютеры, поэтому мы должны знать о параллельности.
2. Чтобы наши программы работали эффективно (быстро, оптимально использовали ресурсы).
3. Параллельность обеспечивает более глубокое понимание решения поставленных задач (например, моделирование полета самолета).
4. некоторые программные продукты устанавливаются на нескольких компьютерах и работа между ними синхронизируется(в играх, например, клиент-сервер, программы для сети)
ПАРАЛЛЕЛЬНОСТЬ НА УРОВНЕ ПОДПРОГРАММ (модулей, например, в Java это threads). Основное понятие - task( задачи) - это модуль программы, который выполняется параллельно. Каждая задача имеет 1 поток thread of control.
1) программа может вызываться неявно, явно.
2) когда программный модуль вызывает задачу, то он не обязан ждать завершения задачи.
3)управление может возвратиться в модуль или не возвратиться(а в подпрограммах возврат всегда)
Может поддерживать связь с другими задачами через совместное использование нелокальной переменной, передачу сообщений.
Задачи DisJoin (выполняющиеся отдельно).
Синхронизация - это механизм, управляющий порядком выполнения задач при совместном использовании данных, а также, когда задачи взаимодействуют друг с другом или конкурируют между собой.
2 вида синхронизации (синхронизация взаимодействия и синхронизация конкуренции).
Синхронизация взаимодействия должна отслеживать выполнение различных потоков(например, несколько потоков ждут и их работа зависит от выполнения и получения данных одного какого-то потока)
Синхронизация конкуренции, когда одни и те же потоки должны обрабатывать одни и те же данные, при некорректном использовании параллельности, синхронизации данные могут быть разрушены (разрушение базы данных),потоки а и б хотят обращаться к одним и тем же данным.
первый ЯП решающий этот вопрос – это PL/1, потом ADA.
3 способа синхронизации:
1)семафоры - 1965 год предложил Дейкстра, еще он книжку про это написал.
Семафор - это структура данных для синхронизации конкуренции с помощью взаимно-исключающего доступа к взаимному использованию структуры данных, семафоры можно использовать и для синхронизации взаимодействия.
Семафоры - это структура данных из целого числа и очереди, хранящие дескрипторы задач(это структуры данных, в которых хранятся все данные о состоянии задач и ее выполнении).
Семафор расставляет свои коды вокруг кода программ.
Есть понятие didlock(смертельное объятие, это ошибка, когда задачи ждут одновременно данные друг от друга)
2)монитор (многовходовый модуль M, в котором много процедур P1,P2,…PN)
В любой момент времени только один параллельный процесс (task) может вызвать процедуру M.P. Другой блокируется и ждет завершение задачи(взаимодействие и конкуренция)
3) синхронизация сообщений (механизм рандеву в ада95, это на лингвистическом уровне) как начальник, если пришло сообщение, может не ответить.
Потоки ЯП JAVA: параллельные модули(в java- это объекты, содержащие метод RUN, код которого выполняется параллельно с другими методами и с методом main.
Есть 2 способа определить класс, объекты которого, могут иметь параллельные методы:
1способ - определить подкласс, встроенного класс Thread, который обеспечивает поддержку метода RUN.
2способ - класс может быть производным от любого другого класса, но в этом случае он должен поддерживать интерфейс RUNNABLE(частично поддерживает параллельность),
который является разновидностью абстрактного класса.
Класс THREAD, в нем много методов, но нам важны 2 существенных метода:
1)метод run- всегда переопределяется в подклассах класса Thread.В теле этого метода записывается код того, что должен сделать поток.
2)метод start-запускает объекты на параллельное выполнение.