|
|
  |
Размышлизма о вреде вытесняющей многозадачности., Все не так просто, как кажется. |
|
|
|
Jun 12 2008, 13:27
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 2 065
Регистрация: 11-01-05
Из: Москва
Пользователь №: 1 892

|
Есть некий типовой контроллер. 512к FLASH,32к RAM. Такое распределение памяти вызвано объективными технологическими особенностями. И, вероятно так будет долго. Скоро станет 4M FLASH и 256 К SRAM, суть не изменится.
Есть вариант unix идеологии. Когда в памяти живет куча процессов и потоков, различных дискрипторов и структур, и все это в RAM занимает просто мегабайты места. Для однокристальных систем эта идеология слабо подходит.
Пусть есть несколько потков данных. Для каждого из который выделяются некие буфера.
Пусть есть совокупность закоченных процедур, достаточно сложных. Такие процедуры принимают на вход указатель на структуру, что-то там делают (длительное время), активно юзают стек и кучу, но после завершения обработку выдают указатель на выходную структуру, стек на том же самом уровне, и кучу в том же самом состоянии, в каком они ее получили.
Если идти по пути обычных вытесняющих ОСей, и при отсутствии глабального планирования времени, в зависимости от наступления неких критических событий в буферах (близок к переполнению/опустошению) и в окружающем мире (пришло событие, и нам надо срочно его обрабатывать) мы вынуждены будем переключить задачи. Что даст нам неприятность в виде нескольких кадров под стек задач, и бардак в куче, ибо новая задача может затребовать память, ей выделят ее, потом отработает вытесненная ранее задача, она освободит память, но куча уже будет фрагментирована. Дефрагментация кучи - тоска для малоресурсных систем. Для больших, заметим, это тоже фундаментальная проблема.
Если же предположить, что есть некий планировщик, который зная внутреннюю картину системы (сколько чего в буферах, сколько событий ждет обработки), а таже при условии предсказуемости внешнего мира (пример - синхронная система связи, с выделенными кадрами), может более эффективно распределять время.
Типа выбираем блок для обработки, запускаем его с пачкой данных, все остальное копится в буферах. Блок отработал - запустили следующий.
Более того, при запуске такой своебразной задачи, ей можно выделить максимальный квант времени. Она сама смотрит, сколько у нее времени осталось, и если обработка не завершена, она ставит флаг (который ей потом сохранится, он static), чистит стек за собой, и отдает управление системе. Разумеется, алгоритм должен допускать такую возможность дробной обработки.
Также задача может заказать, через сколько ее надо вызвать.
Тогда у планировщика работы системы будет дотаточно данных, чтобы найти оптимальное распределение ресурсов.
Такой подход к работе софтины потребудет специальных тулзов для логического проектирования, ибо прописывать такое все в лоб ручками - это нереально. А вот если использовать некую систему разметки кода, о которых я тут так давно размышляю, это было бы не так уж и сложно.
Комбинация вытесняющего и невытесняющего механизмов была бы, IMHO, очень эффективной.
Вопросы:
* видел ли кто какие наработки по теме? * какие есть ОСьки, гибко использующие вытесняющий и коопреативный механизмы многозадачности? * критика и дополнение моих идей.
|
|
|
|
|
Jun 12 2008, 14:27
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551

|
Цитата(Evgeny_CD @ Jun 12 2008, 16:27)  * видел ли кто какие наработки по теме? * какие есть ОСьки, гибко использующие вытесняющий и коопреативный механизмы многозадачности? * критика и дополнение моих идей. Как по мне, большую часть ваших идей покрывает технология стейт машин. Типа рапсодии и вижуалстейта. А планировщик можно реализовать теми же средствами, по крайней мере пока весь дизайн остается синхронным. Смущает возможная узкая напраленность такого подхода. Хотя я бы с удовольствием использовал uIP или lwIP (равно как и другие сущности) в виде диаграммы состояний, включенную в мега-каркас приложения Из осей вроде OSEK и контики имеют возможность использовать смешанный механизм многозадачности.
|
|
|
|
|
Jun 12 2008, 14:54
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Evgeny_CD @ Jun 12 2008, 15:27)  * видел ли кто какие наработки по теме? * какие есть ОСьки, гибко использующие вытесняющий и коопреативный механизмы многозадачности? * критика и дополнение моих идей. - Ну у меня в принципе все "темы" где-то такие. - FreeRTOS и кооперативные задачи и задачи одного уровня приоритета. - Как уже писалось выше, многое решает просто задача с конечным автоматом.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 12 2008, 15:07
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 2 065
Регистрация: 11-01-05
Из: Москва
Пользователь №: 1 892

|
Цитата(zltigo @ Jun 12 2008, 18:54)  - Ну у меня в принципе все "темы" где-то такие. - FreeRTOS и кооперативные задачи и задачи одного уровня приоритета. - Как уже писалось выше, многое решает просто задача с конечным автоматом. Самое главное в конечных автоматах - найти способ удобной работы с большими автоматами. Пока, IMHO, стандартного общепринятого решения нет, а жаль  Цитата(ig_z @ Jun 12 2008, 18:27)  Из осей вроде OSEK и контики имеют возможность использовать смешанный механизм многозадачности. Есть такое. Contiki - это вообще очень интересная ОСька. http://www.sics.se/contiki Adam Dunkels заложил туда массу интересных идей. Есть некий парадок - вроде ОСька маленькая, но она вявляется целыми миром, который изучать можно долго. Про Contiki я помнил, про FreeRTOS тоже, просто интересно, что еще есть на тему.
|
|
|
|
|
Jun 12 2008, 17:30
|
Местный
  
Группа: Свой
Сообщений: 421
Регистрация: 25-12-04
Пользователь №: 1 675

|
Цитата(Evgeny_CD @ Jun 12 2008, 21:05)  Есть еще такая штука, как сети Петри. Более близкие к народу (к практике) - IEC61131 - язык SFC
|
|
|
|
|
Jun 13 2008, 08:19
|
Частый гость
 
Группа: Участник
Сообщений: 167
Регистрация: 15-08-07
Пользователь №: 29 803

|
А что подразумевается под вытесняющей многозадачностью? Если вытеснение одной задачи другой, - тогда понятие "приоритет" теряет смысл, ибо более приоритетная задача должна вытеснять менее приоритетную; так проще применять матаппараты, которые аналитически позволяют строить подобные системы, например, небезызвестный ЧМА (http://mike.qnx.org.ru/files/articles/rms/rms.doc). "Ресурсный" вопрос тоже должен решаться на этапе проектирования (мы же не рассматриваем высоконагруженные сервера или базы данных, верно? хотя тут просто используются другие методы). В идеале, динамической памяти вообще быть не должно, или, на худой конец, должны быть раздельные пулы для задач, причем размер пулов должен позволять обрабатывать данные при заданной их интенсивности и производительности вычислителя. В противном случае система просто захлебнется, и никакие стейт машины не спасут. Так или иначе, возлагать на ОС (планировщик) архитектурные задачи - плохая идея, имхо. Это должен делать человек, в рамках модели ОС, разумеется. Сети Петри - хорошая штука  Жаль, только, задача достижимости в общем случае нерешаема. Плюс разные эффекты, связанные с асинхронностью и недерминированностью.
|
|
|
|
|
Jun 13 2008, 08:59
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(vshemm @ Jun 13 2008, 10:19)  А что подразумевается под вытесняющей многозадачностью? Если вытеснение одной задачи другой, - тогда понятие "приоритет" теряет смысл, ибо более приоритетная задача должна вытеснять менее приоритетную А задачи одного приоритета (или разного, но имеющие на данный момент времени одинаковый приоритет) должны выполняться "параллельно". Цитата "Ресурсный" вопрос тоже должен решаться на этапе проектирования (мы же не рассматриваем высоконагруженные сервера или базы данных, верно? Не верно. Мы рассматриваем, например, банальный контроллер, который обслуживает несколько каналов связи имеющих разную и пиковую загруженность во времени и соответственно делящий какие-то (даже не свои собственные!) недостающие ресурсы. Цитата В идеале, динамической памяти вообще быть не должно.. Угу, а чего думать - берешь кувалду побольше и ставишь вместо контролера "невысоко нагруженный сервер"  ...
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 13 2008, 10:00
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Чтобы что-то облегчить, надо что-то нагрузить. ;-) Чесно не понял как вы Евгений предлагаете облегчить разработку приложения под RTOS. А вообще хотелось бы рассмотреть проблему на конкретных примерах. Действительно ли там такие проблемы с фрагментацией и ресурсами? Сети Петри не рассматриваю серьезно, так как уже давно есть Simulink, LabView , Systemview ... который "рвут" эти сети, как говориться, простым брутфорсом. Плюс в книгах по этим сетям рассматривают такие частные и примитивные приложения, что смешно. А если отключить таймер, то из вытесняющей RTOS сразу получается кооперативка. Цитата(Evgeny_CD @ Jun 12 2008, 16:57)  Есть некий типовой контроллер. 512к FLASH,32к RAM. Такое распределение памяти вызвано объективными технологическими особенностями. И, вероятно так будет долго. Скоро станет 4M FLASH и 256 К SRAM, суть не изменится.
Есть вариант unix идеологии. Когда в памяти живет куча процессов и потоков, различных дискрипторов и структур, и все это в RAM занимает просто мегабайты места. Для однокристальных систем эта идеология слабо подходит.
Пусть есть несколько потков данных. Для каждого из который выделяются некие буфера.
Пусть есть совокупность закоченных процедур, достаточно сложных. Такие процедуры принимают на вход указатель на структуру, что-то там делают (длительное время), активно юзают стек и кучу, но после завершения обработку выдают указатель на выходную структуру, стек на том же самом уровне, и кучу в том же самом состоянии, в каком они ее получили.
Если идти по пути обычных вытесняющих ОСей, и при отсутствии глабального планирования времени, в зависимости от наступления неких критических событий в буферах (близок к переполнению/опустошению) и в окружающем мире (пришло событие, и нам надо срочно его обрабатывать) мы вынуждены будем переключить задачи. Что даст нам неприятность в виде нескольких кадров под стек задач, и бардак в куче, ибо новая задача может затребовать память, ей выделят ее, потом отработает вытесненная ранее задача, она освободит память, но куча уже будет фрагментирована. Дефрагментация кучи - тоска для малоресурсных систем. Для больших, заметим, это тоже фундаментальная проблема.
Если же предположить, что есть некий планировщик, который зная внутреннюю картину системы (сколько чего в буферах, сколько событий ждет обработки), а таже при условии предсказуемости внешнего мира (пример - синхронная система связи, с выделенными кадрами), может более эффективно распределять время.
Типа выбираем блок для обработки, запускаем его с пачкой данных, все остальное копится в буферах. Блок отработал - запустили следующий.
Более того, при запуске такой своебразной задачи, ей можно выделить максимальный квант времени. Она сама смотрит, сколько у нее времени осталось, и если обработка не завершена, она ставит флаг (который ей потом сохранится, он static), чистит стек за собой, и отдает управление системе. Разумеется, алгоритм должен допускать такую возможность дробной обработки.
Также задача может заказать, через сколько ее надо вызвать.
Тогда у планировщика работы системы будет дотаточно данных, чтобы найти оптимальное распределение ресурсов.
Такой подход к работе софтины потребудет специальных тулзов для логического проектирования, ибо прописывать такое все в лоб ручками - это нереально. А вот если использовать некую систему разметки кода, о которых я тут так давно размышляю, это было бы не так уж и сложно.
Комбинация вытесняющего и невытесняющего механизмов была бы, IMHO, очень эффективной.
Вопросы:
* видел ли кто какие наработки по теме? * какие есть ОСьки, гибко использующие вытесняющий и коопреативный механизмы многозадачности? * критика и дополнение моих идей.
|
|
|
|
|
Jun 13 2008, 10:03
|
Частый гость
 
Группа: Участник
Сообщений: 167
Регистрация: 15-08-07
Пользователь №: 29 803

|
Цитата(zltigo @ Jun 13 2008, 12:59)  А задачи одного приоритета (или разного, но имеющие на данный момент времени одинаковый приоритет) должны выполняться "параллельно". Собственно, это и есть "карусель" (хоть и с квантами), которую тов. rezident отделил от "вытесняющей многозадачности". К тому же, у задач одинакового приоритета дедлайна не должно быть, иначе зачем им назначать одинаковый приоритет? Динамически менять его тоже не очень хорошая идея, а если Вы намекаете на инверсию (которой, по идее, тоже не должно быть  ), так там все кроме одной задачи заблокированы по определению. Цитата Не верно. Мы рассматриваем, например, банальный контроллер, который обслуживает несколько каналов связи имеющих разную и пиковую загруженность во времени и соответственно делящий какие-то (даже не свои собственные!) недостающие ресурсы. У каналов связи бесконечная пропускная способность, и из них непрерывно сыпятся данные, которые обязательно нужно обработать? С т.з. контроллера - возможно, но с т.з. архитектора - это не так, всегда можно найти верхнюю оценку загруженности исходя из задачи и предметной области. Грубо говоря, из серийного порта на 115200 мегабитного потока не дождешься, а, зная протоколы более высокого уровня, можно еще сильнее конкретизировать загрузку. Еще бывают рилтаймовые потоковые данные, для которых валидно последнее значение(я). И т.д и т.п... Цитата Угу, а чего думать - берешь кувалду побольше и ставишь вместо контролера "невысоко нагруженный сервер"  ... Хмм... Про серверы я специально сказал, чтобы разделить эти классы (см. "вариант unix идеологии" в первом посте). Как правило, в узкоспециализированных девайсах можно (и нужно, имхо) избавится от неконтролирумых malloc/free, особенно когда куча/память общая для задач. Только делать это должна не ОС
|
|
|
|
|
Jun 13 2008, 10:41
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(vshemm @ Jun 13 2008, 12:03)  К тому же, у задач одинакового приоритета дедлайна не должно быть, иначе зачем им назначать одинаковый приоритет? Потому, что они обслуживают вполне себе одинаковые/равноправные каналы. Цитата Динамически менять его тоже не очень хорошая идея, а... Я реалист, а не идеалист  Цитата У каналов связи бесконечная пропускная способность, и из них непрерывно сыпятся данные, которые обязательно нужно обработать? Как-раз с точностью до наоборот. Для "бесконечных" и "непрерывных" нужено взять бесконечно большие ресурсы и никаих проблем  . А вот в реальности, когда обеспечить абсолютно достаточные ресурсы за разумные деньги просто невозможно, тогда и начинается. А c чем-нибудь типа "котроллера светодиода" или на самом деле принципиально от него не отличающегося, например, "MP3 плеера" - проблем в этом смысле нет - ресурсы для них просто обязаны быть достаточными. Цитата(vshemm @ Jun 13 2008, 12:03)  Собственно, это и есть "карусель" (хоть и с квантами)... Так такую карусель с добровольным занятием не более каког-то кванта времени еще собрать надо. Причем обеспечить добровольность квантования и в случае всех нештатных ситуаций, перегрузок, выхода из строя оборудования. И еще при этом не ошибиться при обработке всей этой нештатности. Такое возможно только в каких-то достаточно вырожденных случаях.. А отстрелить задачу за которой стоит сдохшее железо? А поднять резервный канал?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 13 2008, 12:41
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 2 065
Регистрация: 11-01-05
Из: Москва
Пользователь №: 1 892

|
Цитата(AlexandrY @ Jun 13 2008, 14:00)  Чесно не понял как вы Евгений предлагаете облегчить разработку приложения под RTOS. Такой задачи не было. Была попытка понять, как максимально эффективно использовать ресурсы контроллера. Цитата(AlexandrY @ Jun 13 2008, 14:00)  Сети Петри не рассматриваю серьезно, так как уже давно есть Simulink, LabView , Systemview ... который "рвут" эти сети, как говориться, простым брутфорсом. Плюс в книгах по этим сетям рассматривают такие частные и примитивные приложения, что смешно. Не понял смысла этой фразы. Сети Петри - математический аппарат. Как его можно порвать тупым перебором - не вкурил. Цитата(AlexandrY @ Jun 13 2008, 14:00)  А если отключить таймер, то из вытесняющей RTOS сразу получается кооперативка. Только вот обычная ОСька малость в осадок выпадет, из-за того что у нее пропадет понятие времени. Цитата(vshemm @ Jun 13 2008, 14:03)  Хмм... Про серверы я специально сказал, чтобы разделить эти классы (см. "вариант unix идеологии" в первом посте). Как правило, в узкоспециализированных девайсах можно (и нужно, имхо) избавится от неконтролирумых malloc/free, особенно когда куча/память общая для задач. Только делать это должна не ОС  Разговаривал я тут по душам с разработчкиком одного телемаического сервака. Который принимает данные от 1к+ GSM девайсиков. Первое действие его сервера при запуске - отожрать у ОСи кучу памяти (задается) и запустить поток собственного менеджера памяти  Приводимые здесь примеры с сервером базы данных тоже не совсем корректны - программа, обслуживабющая эту БД одна, и ничего левого в произвольный момент времени там не стартует. Видимо, ситуация по памяти выглядит так: * при инициализации проиходит обращение к malloc * при норамальной работе задача (задачи) сами занимаются управлением собственной памятью (ОСь не обладает телепатическими способностями, чтобы понять, как и когда можно дефрагментировать память конкретного приложения) * free вызывается только при глобальном завершении процесса на Сервере или типа когда контроллер сдох  Еще есть труды Шалыто А.А., в том числе знаменитый Switch-технология. Алгоритмизация и программирование задач логического управления http://is.ifmo.ru/books/switch/2Есть алгоритм решения задачи. Он живет сам по себе. Есть способы реализации этого алгоритма: структурное, функциональное, логическое, и еще 1001 программирование. Есть железяка, которая, на самом деле, понимает только один язык - машинные коды. И вопрос только в том, как корректно преобразовать алгоритм в машинные коды, чтобы: * машинные коды гарантированно реализовывали тот же алгорим, причем такая верификация должна быть проведена аналитически, без перебора всех состояний кода программы (для сколь-нибудь сложных программ это нереально) * они должны это гарантированно делать за заданное время. Сила "обычных" языков программировнаия в том, что они неплохо ложатся на мозги программеров. Но соотнесение их с алгоритмом не так-то просто. Давайте говорить на чистоту - пока нет способов (точнее, мне они неизвестны), сормальной верификации кода на соотвествие алгоритму. Т.е. есть алгоритм, есть программа, и программе говорит - она реализует этот алгоритм. Проверяем - вроде работает. При этом никакого автоматического способа проверить, соотвествует ли программа алгоритму, нет. И никакой гарантии, что в программе предусмотрена обработка всех состояний, тоже нет. Есть паллиативы. Которые ресурсы среды исполнения разменивают на сложность программирования. Парадигма многозадачности удобная для восприятия человеком. Она позволяте разбить код на куски, и четко отследить связи между этимми кусками. Что и дают все эти потоки, сигналы, семафоры, m-box, пайпы и сокеты. Язк программирования + ОСь гарантируют в таком случае изоляцию этих кусков программ. Это возволяет осуществить декомпозицию задачи. Но плата за это - расход ресурсов среды исполнения. С другой стороны, обычный С компилятор отлажен настолько, что Вы можете иметь миллионы функций, вызывать их согласнов Вашей логики, и компилятор все это отработает корректно. Вот теперь самый главный вопрос - как всю эту систему вызова "миллиона" функций сопоставить с решаемым алгоритмом? В виде написания "линейного" текста программы точно нет. Вопрос закрыт. Только в виде некоего графического представляния составных частей, графа, который нужно корретно отобразить на код. Спопобы такого отображения и есть предмет далеко не оконченных изысканий Шалыто и многих других товарищей. Общепринятого сопосба (каким в своей области стал, например, язык С) пока нет. Хотя теоретические основы вроде как есть. Вопрос - кто какие системы работы с конечными атвоматами знает - кроме iSTATE и Rapsody?
|
|
|
|
|
Jun 13 2008, 12:58
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Я как понял эти Петри - просто способ рисовать модели стрелочками, кружочками и квадратиками. Потом изголяться и искать там какие-то закономерности. Это бред. В ваших же книжках написано, что эти сети в основном только для анализа применяются. Т.е., допустим, уже когда ось готова и хреново работает. В MATLAB SIMULINK более 1000 функциональных блоков на все случаи жизни. И c дискретным времененм, и с непрерывным, и со смешанным и без времени и вообще че хош. Вот там реально сделать модель над осью и сгенерировать исходники действительно оптимизирующие использование сервисов оси. А че мы обсуждаем? Я что-то нить потерял. Наличие каких-либо проблем никто так и не подтвердил. А про ресурсы же мы вроде договорились. Для продвинутой RTOS надо 8 Meг RAM-а и 1/4 от этого для FLASH-а. Для Линукса на порядок больше. Кто-то добрый выложил Integrity от GreenHills. Там лишний раз подтверждается оценка для RTOS. Дальнейшая оптимизация и ужимание особой экономии не принесет. Цитата(Evgeny_CD @ Jun 13 2008, 15:46)  Такой задачи не было. Была попытка понять, как максимально эффективно использовать ресурсы контроллера.Не понял смысла этой фразы. Сети Петри - математический аппарат. Как его можно порвать тупым перебором - не вкурил.Только вот обычная ОСька малость в осадок выпадет, из-за того что у нее пропадет понятие времени.Разговаривал я тут по душам с разработчкиком одного телемаического сервака. Который принимает данные от 1к+ GSM девайсиков. Первое действие его сервера при запуске - отожрать у ОСи кучу памяти (задается) и запустить поток собственного менеджера памяти  Приводимые здесь примеры с сервером базы данных тоже не совсем корректны - программа, обслуживабющая эту БД одна, и ничего левого в произвольный момент времени там не стартует. Видимо, ситуация по памяти выглядит так: * при инициализации проиходит обращение к malloc * при норамальной работе задача (задачи) сами занимаются управлением собственной памятью (ОСь не обладает телепатическими способностями, чтобы понять, как и когда можно дефрагментировать память конкретного приложения) * free вызывается только при глобальном завершении процесса на Сервере или типа когда контроллер сдох 
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|