Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: VxWorks
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
beer_warrior
Доброго времени суток господа!
Вот уже неделю, как изучаю сабжевую систему, а к пониманию не приблизился.
Нет, конечно прикладной софт на нее я уже писать смогу, но без понимания философии системы это дурное дело.
Вот приблизительный список нескладух:
1.Переключение задач или вытесняющее или раунд-робин. Если есть вытеснение, зачем карусель?
2.Отсутсвует защита памяти, но зато есть управление виртуальной.
3.Изумительные вызовы типа taskLock() и taskSafe(), чтобы если уже залочить задачу навеки, чтобы никто ее не снял и не вытеснил. Это особо интересно в контексте использования этой оси в критических приложениях.
4.Собственные вызовы типа taskSpawn() перемежаются со стандартными POSIX, тоже самое с объектами синхронизации.

Вобщем выглядит это похоже на ранние поделки Мелкософт. Но ведь система сертифицирована как супер-пупер надежная и устойчивая.
Кто-то может объяснить в чем тут дело?
Andrew2000
Цитата(beer_warrior @ Jan 23 2008, 15:54) *
1.Переключение задач или вытесняющее или раунд-робин. Если есть вытеснение, зачем карусель?
2.Отсутсвует защита памяти, но зато есть управление виртуальной.

1. А возможно такое - вытеснение по приоритетам, а если задачи на одном приоритете, то между ними карусель?
2. А не наоборот? Т.е. единое адресное пространство, но с возможностью защиты задач друг от друга.
(просто интересно)
beer_warrior
Цитата
1. А возможно такое - вытеснение по приоритетам, а если задачи на одном приоритете, то между ними карусель?

Возможно и так, но тогда зачем эту карусель включать-выключать?
Цитата
2. А не наоборот? Т.е. единое адресное пространство, но с возможностью защиты задач друг от друга.
(просто интересно)

In VxWorks, one important resource that is not part of a task's context is memory address space: all code executes in a single common address space. Giving each task its own memory space requires virtual-to-physical memory mapping, which is available only with the optional product VxVMI;

А как еще защитить, если не на уровне MMU? Софтварные защиты весьма условны.
Andrew2000
Цитата(beer_warrior @ Jan 23 2008, 18:31) *
Возможно и так, но тогда зачем эту карусель включать-выключать?

Выключать, чтоб задачи сами контролировали когда отдавать управление, или через Time Slicing (если такое есть).

Цитата
In VxWorks, ..., which is available only with the optional product VxVMI;
А как еще защитить, если не на уровне MMU? Софтварные защиты весьма условны.

Ясно, ключевое слово "optional product VxVMI" - не знал про такой.
А некоторые микроконтроллеры не имеют аппаратных блоков MMU, зато имеют что-то типа memory overlay control (как например в моем "любимом" Tricore).

А такая просьба - скинте куда-нить доки на VxWorks (это вроде не секрет) - давно хотел посмотреть - что это за система.
beer_warrior
Цитата
Выключать, чтоб задачи сами контролировали когда отдавать управление, или через Time Slicing (если такое есть).

Есть-есть. Только чем Time Slicing лучше чем преэптивность?.
Цитата
зато имеют что-то типа memory overlay control (как например в моем "любимом" Tricore).

А с этого места подробней плз.

З.Ы.
доки здесь:
http://www.slac.stanford.edu/exp/glast/fli.../vxworks/guide/
grau
Цитата(beer_warrior @ Jan 23 2008, 15:54) *
Вобщем выглядит это похоже на ранние поделки Мелкософт. Но ведь система сертифицирована как супер-пупер надежная и устойчивая.
Кто-то может объяснить в чем тут дело?


Насколько понимаю, следует разделять ранние версии, до 6, и поздние. Первые действиетельно вызывали очень много нареканий. Последнии стали, вроде как, надежнее, но за такие деньги экспериментируют только если очень надо.
Andrew2000
Цитата(beer_warrior @ Jan 23 2008, 19:15) *
Есть-есть. Только чем Time Slicing лучше чем преэптивность?

Preemption - вытеснение низкоприоритетной задачи когда появляется высокоприоритетная.
Round-robin - между задачами _одного_ приоритета.
Time Slicing - также между задачами _одного_ приоритета (альтернатива Round-robin) - максимальное кол-во тиков, пока может выполнятся задача, перед тем как задача с _таким же_ приоритетом получит управление (для каждой задачи задается отдельно).
(это я написал вспоминая Nuсlеus, но, похоже, с Vx они близнецы-братья)

Цитата
А с этого места подробней плз.

А какие тут подробности? Нет MMU, есть просто регистры в которых можно прописать границы, за которые программа не имет права вылезать при обращении к памяти, а границы эти менять в ядре при переключении задач.
"The TC1775 memory protection system specifies the addressable range and read/write
permissions of memory segments available to the currently executing task. The memory
protection system controls the position and range of addressable segments in memory.
It also controls the kinds of read and write operations allowed within addressable
memory segments. Any illegal memory access is detected by the memory protection
hardware, which then invokes the appropriate Trap Service Routine (TSR) to handle the
error."
(в прошлый раз чуть промахнулся - не "memory overlay", а "memory protection". memory overlay там немного для других целей)
beer_warrior
Цитата
Preemption - вытеснение низкоприоритетной задачи когда появляется высокоприоритетная.
Round-robin - между задачами _одного_ приоритета.

Это я понимаю.
Но Р-Р, является включаемой опцией. Причем как я понял программной. Т.е. предполагается, что м.б. ситуация, когда задачи одного приоритета разруливаются, только по доброй воле программиста. Т.е. пока явно не сделан exit()/sleep()/suspend().В сочетаниии с taskLock() складываеться интересная ситуация - управление переключением отдано на откуп именно прикладному программисту. Мне всегда казалось, что одно из ключевых преимуществ ОС - автоматизация переключения задач, и обеспечение общей устойчивости системы при сбое одной из задач.
yuri_t
Round-robin - вещь, в общем-то, ненужная. А почему сделана? Потому что - у всех есть,
а у нас в системе нет??? Конкуренты будут заявлять: "А у них нет Round-robin !!!" Вот и сделали...
tag
Цитата(beer_warrior @ Jan 24 2008, 15:32) *
Это я понимаю.
Но Р-Р, является включаемой опцией. Причем как я понял программной. Т.е. предполагается, что м.б. ситуация, когда задачи одного приоритета разруливаются, только по доброй воле программиста. Т.е. пока явно не сделан exit()/sleep()/suspend().


...это нормальная ситуация для любой ОС. Time slicing поэтому и придумали.

Цитата(beer_warrior @ Jan 24 2008, 15:32) *
В сочетаниии с taskLock() складываеться интересная ситуация - управление переключением отдано на откуп именно прикладному программисту. Мне всегда казалось, что одно из ключевых преимуществ ОС - автоматизация переключения задач, и обеспечение общей устойчивости системы при сбое одной из задач.


...taskLock() отнюдь не способ управления переключением с целью переключения, а способ сохранения целостности данных
AlexandrY
Round-robin - вещь необходимейшая.
Приоритетной схемой можно обойтись только при малом количестве задач и несложном их администрировании.
Где есть WEB сервер, множественный доступ, многоканальное обслуживание и т.д. без Round-Robin, а вернее схемы равноприоритетного обслуживания задач выкрутится нельзя.


Цитата(yuri_t @ Jan 30 2008, 22:37) *
Round-robin - вещь, в общем-то, ненужная. А почему сделана? Потому что - у всех есть,
а у нас в системе нет??? Конкуренты будут заявлять: "А у них нет Round-robin !!!" Вот и сделали...
yuri_t
Давайте определимся с терминологией.

Round-robin - это когда задачи преключаются по таймеру, т.е работала себе задача и вдруг - сработал некий глобальный системный таймер и задача снята с исполнения - не потому, что ждет семафор или появления нового элемента в очереди и т.п. и не потому, что после прерывания задача с более высоким приоритетом стала активной, а просто потому, что истекло время, отведенное данной задаче на работу.

Так вот, такой механизм в real-time системах не нужен и, более того - вреден.

Если же нужно множество задач с одинаковым приоритетом - то нужно просто создать множество threads(tasks) c одинаковым приоритетом (но это не Round-robin !!!)
Andrew2000
Цитата(yuri_t @ Feb 2 2008, 21:10) *
Если же нужно множество задач с одинаковым приоритетом - то нужно просто создать множество threads(tasks) c одинаковым приоритетом (но это не Round-robin !!!)

??? ничего не понял, поясните плиз, и как их переключать?
Alex B._
Цитата(Andrew2000 @ Feb 3 2008, 00:04) *
??? ничего не понял, поясните плиз, и как их переключать?

А чего непонятного? задача конечно может работать сама по себе, но обычно она чего-то получает снаружи и чего-то наружу отдает. А это вызов сервисов с ожиданием.
vshemm
Преемптивность - это, как сказали, вытеснение текущей задачи как только появится высокоприоритетная задача. Маст хэв при нескольких приоритетах.

RR - это когда задачи одного приоритета по очереди поступают на выполнение, т.е. если порядок определен как 1-2-3, то после первой задачи всегда будет запускаться №2.

Переключение задач в RR может осуществляться как явно программистом (засыпание, ожидание, явный перешедулинг), так и самой системой с помощью TimeSlicing, когда задачам выдается квант времени, по истечении которого она вытеснится независимо от программиста.
TimeSlicing появился во времена, когда пользователи с помощью терминалов подключались к мейнфрейму и запускали свои расчеты. Т.о., каждому пользователю казалось, что он один работает с мейнфреймом (хотя и более медленным чем на самом деле).
Однако, если задача не вычислительная, а событийная (т.е. ждет событие - реагирует на него - опять впадает в ожидание), TimeSlicing усложняет жизнь, ага smile.gif

Цитата(beer_warrior @ Jan 23 2008, 15:54) *
...
3.Изумительные вызовы типа taskLock() и taskSafe(), чтобы если уже залочить задачу навеки, чтобы никто ее не снял и не вытеснил. Это особо интересно в контексте использования этой оси в критических приложениях.
4.Собственные вызовы типа taskSpawn() перемежаются со стандартными POSIX, тоже самое с объектами синхронизации.

Вобщем выглядит это похоже на ранние поделки Мелкософт. Но ведь система сертифицирована как супер-пупер надежная и устойчивая.
Кто-то может объяснить в чем тут дело?

3. Эти вызовы требуются, например, когда нужно жестко уложиться во временные рамки (т.е. сформировать временную диаграмму для работы с железом), т.к. иногда нет возможности сделать такую задачу высокоприоритетной. В основном, это следствие "кривого" железа smile.gif
Другой пример - синхронизация с более высокоприоритетной задачей, т.к. мьютекс потяжеловесней и может привести к лишним переключениям задач. Использовать нужно "с головой" и на очень короткий срок (понимая, что задержка на переключение более приоритетной задачи увеличится на некоторую известную величину).

4. Типичный бардак, обусловленный повышением производительности. POSIX вызовы - это, скорее всего, обертки для нейтивных функций, поэтому когда можно использовать нейтив вызовы - их и используют. Еще можно покурить доку на предмет их отличий smile.gif

А вообще, ОС не может быть супер-пупер надежной и устойчивой, т.к. эти характеристики больше зависят от программиста. В лучшем случае, система не будет мешать программисту и отвлекать его своими "багами" и "фичами". Так что к заявлениям маркетологов нужно относиться как к заявлениям маркетологов smile.gif
AlexandrY
Я считаю, что это неправильное определение.

Round-Robin это просто циклическое выполнение задач с одинаковым приоритетом. Если задача получила время на выполнение, то после завершения следующая ее заявка становится в конец очереди. Таймера здесь не причем.

И вот такой способ выполнения очень важен.
О том какие проблемы может вызвать чиcтое приоритетное выпонение читать здесь:
http://www.rtos.com/page/imgpage.php?id=210

Из жизни приведу простой сценарий:

Имеем кучу задач-источников событий, допустим разные коммуникационные каналы низкого уровня, внешние сигналы, периодические задачи и т.д.
Имеем коллекционер-менеджер сигналов от этих задач. Он, так скажем, дает необходимый уровень абстракции и централизует логику приложения, и имеем исполнителей связанных с менежером это могут быть драйвера, а могут быть и более высокие уровни приложения.
Понятно что выбрать оптимальную стратегию назначения приоритетов здесь практически невозможно.

И спецы из Express Logic правильно говорят, что в этой ситуации вы получите солидную деградацию производительности из-за лишних переключений контекста.
И выход в осях не имеющих фичи "Preemption-Threshold" это довольствоваться Round Robin

Цитата(yuri_t @ Feb 2 2008, 22:40) *
Давайте определимся с терминологией.

Round-robin - это когда задачи преключаются по таймеру, т.е работала себе задача и вдруг - сработал некий глобальный системный таймер и задача снята с исполнения - не потому, что ждет семафор или появления нового элемента в очереди и т.п. и не потому, что после прерывания задача с более высоким приоритетом стала активной, а просто потому, что истекло время, отведенное данной задаче на работу.

Так вот, такой механизм в real-time системах не нужен и, более того - вреден.

Если же нужно множество задач с одинаковым приоритетом - то нужно просто создать множество threads(tasks) c одинаковым приоритетом (но это не Round-robin !!!)
tag
Цитата(AlexandrY @ Feb 4 2008, 16:15) *
Round-Robin это просто циклическое выполнение задач с одинаковым приоритетом.


...на самом деле это просто циклическое выполнение задач. Понятие приоритета в данном случае не вводится. Задача получает управление если истек квант времени предыдущей задачи в списке, либо предыдущая задача сама вернула управление с помощью системного вызова.


Цитата(AlexandrY @ Feb 4 2008, 16:15) *
Понятно что выбрать оптимальную стратегию назначения приоритетов здесь практически невозможно.


...ее и не надо выбирать. Создаются задачи равного приоритета и включается механизм Time slicing
yuri_t
Вот, например, цитата из VxWorks 5.5 Programmer’s Guide (Part #: DOC-14617-ZD-00)


Round-Robin Scheduling

A round-robin scheduling algorithm attempts to share the CPU fairly among all
ready tasks of the same priority. Round-robin scheduling uses time slicing
to achieve fair allocation of the CPU to all tasks with the same priority. Each task, in a group
of tasks with the same priority, executes for a defined interval or time slice.
Round-robin scheduling is enabled by calling kernelTimeSlice( ), which takes a
parameter for a time slice, or interval. This interval is the amount of time each task
is allowed to run before relinquishing the processor to another equal-priority task.
Thus, the tasks rotate, each executing for an equal interval of time. No task gets a
second slice of time before all other tasks in the priority group have been allowed
to run.
In most systems, it is not necessary to enable round-robin scheduling, the
exception being when multiple copies of the same code are to be run, such as in a
user interface task.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.