Игра с системными таймерами (обсуждение возможностей)

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Виктория
Писатель
Сообщения: 113
Зарегистрирован: 28 дек 2012, 14:05
Откуда: Самара
Контактная информация:

Игра с системными таймерами (обсуждение возможностей)

Непрочитанное сообщение Виктория » 29 янв 2013, 07:57

Есть такая задача, или незадача. Кому как нравится, потому что мой вопрос относится пока только к начальному уровню проектирования, а раздела "Для начинающих" на этом форуме не нашла, к сожалению.
Объект измерения требует три таймера, независимых в вероятностном смысле, т.е. с независимыми тактовыми частотами (от разных кварцев)
(мой вопрос http://www.rus-linux.net/forum/viewtopi ... 7086#p7086
С точки зрения ОС это можно интерпретировать как три (или четыре, это не суть как важно) системных таймера. Вопрос "Это три ядра или три аппаратных таймера?" открытый для технических решений.

Зачем это нужно? Что это за объект измерения такой? Зачем ещё три системных таймера? Куда Вам такую параллельность? :-?
А я ухожу от конкретного ответа :-) К поиску побуждают два посыла:
1) Быстрый объект, ищу дополнительные способы ускорения вычислений.
2) Есть желание "лечить геморрой колом" :-D - бороться с неопределенностью измерений самой же неопределенностью. Неопределенность - следствие трех измерительных каналов с индивидуальными метрологическими характеристиками, то бишь погрешностями в измерительном тракте.
По поводу 1-10 мкс...
Это какой-то совершенно мизерный интервал (период), чтобы он осознанно распознавался QNX. Самый минимальный размер системного тика, который может быть принудительно установлен в QNX - 10мкс. Любые события, следующие чаще системного тика - неразличимы системой.
Согласна, устроит и 10 мкс. Хотя одна мкс гораздо лучше :-) Система измерения работает в режиме реального времени, но ничем не управляет, кроме своих погрешностей.
В Linux можно попытаться разобраться с тем, что не освещено документацией. Кроме того в Linux начиная с ядер (очень примерно!) 2.6.18 и далее, есть такая вещь, как поддержка таймеров высокого разрешения, реализованная на таймерах APIC.
Ориентироваться ли сразу на версии ядер? Это, наверно, очень сложно! Пошерстила по таймерам APIC - попадаешь только на форумы провайдеров. В сетевых картах, похоже, это уже пройденный этап?!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Игра с системными таймерами (обсуждение возможностей)

Непрочитанное сообщение Olej » 29 янв 2013, 13:11

Виктория писал(а):Пошерстила по таймерам APIC - попадаешь только на форумы провайдеров. В сетевых картах, похоже, это уже пройденный этап?!
... не только к этим фразам комментарий, ко всему тексту, но не хотелось много цитировать:

Мне (например) гораздо понятнее рассматривать тестовые примеры, а ещё более - их результаты, особенно когда они не совпадают с тем, что ожидается ;-)

Я не могу знать, смотрели ли вы вот этот, например, текст Время: измерение и задержки (это старый вариант ... но его достаточно) - там результаты некоторых экспериментов, не всегда до конца понятных, но конкретных... Там же есть об использовании таймеров APIC.

На версии ядра Linux я сослался только потому, что только в относительно свежих версиях включается поддержка тех новых аппаратных средств, которые появляются в архитектуре. Естественно, что поддержка таких аппаратных средств в ОС заметно отстаёт по времени реализации от появления этих средств "в железке".

По поводу измерения времени и таймеров.
Измерять временные интервалы (или ставить временные отметки, зарубки) можно с куда большей (на порядки) точностью, чем планировать на будущее какие-то действия. На архитектуре x86 это счётчик процессорных тактов (RDTSC), который позволяет измерять временные интервалы в наносекундном диапазоне. Для первого действия (измерять) вовсе не нужны таймеры, по крайней мере таймеры в смысле прерывающие таймеры.

В принципе, если у вас будет в аппаратуре 3, 5, или 10 интервальных таймеров с любым разрешением, хоть наносекундным - я не вижу никаких проблем в написании специализированного модуля ядра, который по срабатыванию таких таймеров выполнял бы какие-то действия.

С другой стороны, организовывать периодический таймер с частотой в микросекундном диапазоне, с тем, чтобы в модуле ядра только тупо считать возбуждаемые ним прерывания - это не умная работа (IMHO): обработка прерывания это достаточно дорогое удовольствие в операционной системе.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Игра с системными таймерами (обсуждение возможностей)

Непрочитанное сообщение Olej » 29 янв 2013, 20:24

Виктория писал(а):
Объект измерения требует три таймера, независимых в вероятностном смысле, т.е. с независимыми тактовыми частотами (от разных кварцев)
С точки зрения ОС это можно интерпретировать как три (или четыре, это не суть как важно) системных таймера. Вопрос "Это три ядра или три аппаратных таймера?" открытый для технических решений.

Зачем это нужно? Что это за объект измерения такой? Зачем ещё три системных таймера? Куда Вам такую параллельность? :-?
А я ухожу от конкретного ответа :-)
Неопределённость дополнительную создаёт эпитет ;-) "системные" относительно этих таймеров. :-o
Мне как-то показалось, что это не совсем точно ... в сочетании с тем, что прозвучало позже.
Системный таймер в Linux один - это тот, который задаёт тик, диспетчирование потоков/процессов, и все таймерные процедуры API ядра.
То, что вы описываете, мне кажется - это дополнительные измерительные таймеры ... которые могут работать и с очень малой дискретностью.

В дополнение, эти таймеры можно было бы проектировать (или они могли бы быть в зависимости от того, что позволяет аппаратная реализация), как уже называлось:

- периодические - которые щёлкали бы IRQ каждую 1 мкс., скажем, а уже в обработчике прерываний что-то там инкрементировалось бы ... это совсем примитивная аппаратная реализация, чуть ли не просто периодического меандра сигнал на линию прерывания припаять ... но это и очень ресурсоёмкий способ;

- интервальные - когда в регистр счётчика таймера можно бы записать длительность интервала, с тем же 1 мкс. разрешением (как 12345654321), счётчик будет декрементироваться с 1 мкс., и только при обнулении счётчика (истечении интервала) прозвучит IRQ от таймера с микросекундной точностью (так работает штатный x86 таймер реального времени RTC).

Аватара пользователя
Виктория
Писатель
Сообщения: 113
Зарегистрирован: 28 дек 2012, 14:05
Откуда: Самара
Контактная информация:

Re: Игра с системными таймерами (обсуждение возможностей)

Непрочитанное сообщение Виктория » 30 янв 2013, 08:35

Системный таймер в Linux один - это тот, который задаёт тик, диспетчирование потоков/процессов, и все таймерные процедуры API ядра.
То, что вы описываете, мне кажется - это дополнительные измерительные таймеры ... которые могут работать и с очень малой дискретностью.

В дополнение, эти таймеры можно было бы проектировать (или они могли бы быть в зависимости от того, что позволяет аппаратная реализация), как уже называлось:

- периодические - которые щёлкали бы IRQ каждую 1 мкс., скажем, а уже в обработчике прерываний что-то там инкрементировалось бы ... это совсем примитивная аппаратная реализация, чуть ли не просто периодического меандра сигнал на линию прерывания припаять ... но это и очень ресурсоёмкий способ;
Такой обработчик прерывания я могу использовать как простенький диспетчер своих задач? Задачи - регистрация отсчетов и простейшие вычисления (думаю, что не сложнее КИХ-фильтра). Ресурсы - память для отсчетов и процессорное время. Хотелось бы иметь какой-нибудь механизм синхронизации, может быть достаточно и каналов /pipe/chan1, ... Или операционная система где-то накажет меня за мою наивность?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Игра с системными таймерами (обсуждение возможностей)

Непрочитанное сообщение Olej » 30 янв 2013, 10:48

Виктория писал(а): Такой обработчик прерывания я могу использовать как простенький диспетчер своих задач? Задачи - регистрация отсчетов и простейшие вычисления (думаю, что не сложнее КИХ-фильтра). Ресурсы - память для отсчетов и процессорное время.
Как ручной синхронизатор в своих потребностях вы вполне можете использовать такой источник прерываний.
("ручной" в том смысле, что использующий не стандартные таймерные механизмы и API ядра Linux, а свои собственные, созданные в проекте)
Виктория писал(а): Хотелось бы иметь какой-нибудь механизм синхронизации, может быть достаточно и каналов /pipe/chan1, ... Или операционная система где-то накажет меня за мою наивность?
Вы можете написать модуль ядра над таким источником (-ками) прерываний что-то на манер штатных часов реального времени /dev/rtc в x86.
См.: Часы реального времени (RTC), там же есть примеры программного кода.
Здесь вам и будут механизмы синхронизации.

P.S. см. например Написание обработчика прерывания

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 12 гостей