| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Параллельные процессы |
| Автор: Guia 9.7.2006, 12:26 |
| Привет всем! Открываю эту тему для всех, кому она не "параллельна" Поддержите своими знаниями? Итак... Мотивация Изучение параллельных процессов, знакомство с основными концептами синхронизации. Для начала несколько определений: Параллельные процессы – это логически не взаимосвязанные действия системы, происходящие одновременно. Программу можно представить себе, как инструкцию по сборке компьютерного стола. Если её не прочитать, никогда не узнаешь, почему шурупов всегда меньше чем предназначенных для них дыр. Инструкция не действует если её не исполнить. В нашем случае эта инструкция находятся в .java файле. Она переводится в в байт - код, и размещается в файле .сlass. Исполняется программа с помощью Java Virtual Machine. Процесс -это компьютерный зал, а Thread - это один или несколько программистов в зале. Они собирают компьютерный стол. Причём собирать можно либо по общей, либо по своей собственной инструкции. Программисты делят между собой отвёртки, дрель, пилу и другие обьекты в компьютерном зале. Возникает необходимость регулировать доступ к общим обьектам, и разрешения основной проблемы программирования с Threads - разумного ограничения параллельности. Псевдопараллельность. В системах с одним CPU физически возможны только квази – или псевдопараллельные процессы, которые реализуются путём быстрого переключения с одного процесса на другой. Реально - параллельные процессы имеют место в системах с несколькими CPU. Продолжение следует... |
| Автор: powerOn 9.7.2006, 16:54 |
| Причем тут Java? |
| Автор: Guia 9.7.2006, 18:45 |
Неожиданный вопрос. Программирование при помощи параллельных процессов - Тредов имеет прямое отношение к языку Java. К тому же по моему мнению проблематика обьясняется лучше всего Java кодом. Все примеры которые я приведу будут иметь либо производную от класса Thread, либо имплементировать интерфейс Runnable. |
| Автор: Sardar 9.7.2006, 20:07 | ||||
| Ладно, пофлужу из опыта В Java мониторы кривые. По определению (как Hoar'а так и Lampson'а и Redell'a) монитор имеет общий эксклюзивный вход и некоторое количество условных переменных (очередей ожидания). Удобно, можно реализовать практически любой синхронизационный механизм (ожидание по условию). Напомню что ожидая условной перменной тред сбрасывает блокировку с входа, так что другой тред может войти и уведомить спящий тред. В Java же монитор не может иметь более одной синхронизационной переменной, т.к. только до неё и получаем эксклюзивный доступ:
Допустим имеем некий обьект, имеющий два условных состояния (из реала очередь обьектов, условные переменные: пришёл обьект и кончились все обьекты). Для вычисления обеих состояний требуються некие общие переменные (из примера очередь), следовательно нужен эксклюзивный доступ для каждого треда обращающегося к монитору (собстно как и должно по теории). Возникает проблема:
И тут узнаём что по wait освободиться только a_condition_variable, блок на shared_variables снят не будет. Естественно тот кто должен уведомить a_condition_variable не сможет войти, т.к. ему потребуються общие переменные, которые уже навечно закрыты. Класический deadlock, который два месяца назад ввёл меня в ступор. Даже предположить такого не мог, думал по wait все блокировки отпускаються. Потерял 6 часов рабочего времени В итоге: мониторы в Java есть урезанный, не очень удобный механизм синхорнизации, близко не стоящий с "реальными" мониторами. P.S. конечно с примитивами синхорнизации можно не заморачиваться, пользуясь java.util.concurrent, но иногда требуеться. В итоге приходиться сильно извращаться, требуя гораздо больше блокоровок и перетасовок состояниями чем это нужно. |
| Автор: Sardar 9.7.2006, 22:17 | ||
Я имел в виду другое, монитор существует для обьекта в целом, т.к. условные переменные (в Java это обычные обьекты, т.к. все обьекты имеют wait) пользуються общей инфой, что бы вычислить своё состояние и соответствено ждать/уведомлять. Следовательно нужен эксклюзивный доступ, что бы левый тред инфу не убил (например при переборе списка кто то удалил обьект под "курсором"). Но! что бы получить доступ до условной переменной тоже потребуеться эксклюзивный доступ, просто потому что таков дизайн Java. При вызове wait блок с условной переменной снимаеться, а эксклюзивный блок вообще с обьекта (логический обьект, а не буквально обьект Java |
| Автор: Guia 13.7.2006, 17:48 |
| Перечитал несколько раз Потом спросил преподавателя. Его мнение - концепт сановцев монитору не противоречит, поскольку монитор (нельзя/ненужно?) закладывать внутрь монитора. Пойду еще почитаю для общего развития... |
| Автор: Sardar 13.7.2006, 18:20 |
А его и не нужно закладывать друг в друга, это не будет иметь смысла т.к. все треды встанув в очередь на входе самого внешнего монитора (эксклюзивный доступ). Короче тебе нужно просто написать прогу которая как я говорил выше будет иметь монитор с двумя условными переменными:
Попытался обьяснить как мог, если не понятно, то только одно - пиши софт, когда упрёшся в проблему, поймёшь |