<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: POSIX сигналы. Реализация программного прерывания по таймеру</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8796.html</link>
    <description>Народ в общем такая проблема.&lt;br&gt;Есть таймер (200Гц) , выдающий сигналы SIGUSR1. Есть процесс состоящий из двух потоков - каждый&lt;br&gt;просто бесконечно инкрементирует и сбрасывает счетчик - тем самым создают полную загрузку процессора.&lt;br&gt;Необходимо реализовать немедленную реакцию на сигналы таймера (фактически вне зависимости от приоритетов и операций выполняемых потоками)&lt;br&gt;На первый взгляд самое просто повесить обработчик сигналов с помощью sigaction(). Что я и пытаюсь делать. Проверка &quot;немедленной реакции &quot; осуществляется банально - внутри обработчика инкрементирую счетчик по достижению числа кратного 200 инкрементирую 2ой счетчик и вывожу на экран. Таким образом выводимые значения должны просто соответствовать значению секундомера (в сек).Но в реальности происходит очень сильное отставание (секунд 15-20 за минуту). Вот реализация:&lt;br&gt;&lt;br&gt;#include &amp;lt;cstdio&amp;gt;&lt;br&gt;#include &amp;lt;signal.h&amp;gt;&lt;br&gt;#include &amp;lt;iostream&amp;gt;&lt;br&gt;#include &amp;lt;unistd.h&amp;gt;&lt;br&gt;#include &amp;lt;pthread.h&amp;gt;&lt;br&gt;#include &quot;../libraries/timer_200.h&quot;//таймер 200Гц&lt;br&gt;&lt;br&gt;using namespace std;&lt;br&gt;&lt;br&gt;v</description>

<item>
    <title>POSIX сигналы. Реализация программного прерывания по таймеру (f00l)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8796.html#3</link>
    <pubDate>Mon, 12 Jul 2010 05:56:41 GMT</pubDate>
    <description>&amp;gt;Соответственно в чем может быть проблема ? Кто не успевает? немедленно ли &lt;br&gt;&amp;gt;процесс реагирует на сигнал и если этот вариант плох - что &lt;br&gt;&amp;gt;можно сделать, чтобы реализовать немедленный вызов некоторой функции (обработки) с заданной &lt;br&gt;&amp;gt;частотой с прерыванием других потоков. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;ВСЕМ ЗАРАНЕЕ СПАСИБО ! &lt;br&gt;&lt;br&gt; Если нужна высокая точность , то такими операторами как cout уже не пользуются и по не зависимому секундомеру не замеряют .&lt;br&gt;&lt;br&gt; Возможный алгоритм, используется функция clock() минимальная информация записывается в память и по прошествии нескольких минут выводится на экран , при выводи на экран есть понятие буферизация , то есть накопление и задержка в отображении .&lt;br&gt; &lt;br&gt; По умолчанию ядро работает на 100 Hz, то есть планировщик задач переключает процессы и передает им сигналы раз в 1/100 с , здесь требуется скорость в два раза выше .&lt;br&gt;&lt;br&gt; Либо изменять условия задачи, либо писать модуль ядра .&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>POSIX сигналы. Реализация программного прерывания по таймеру (кошечка)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8796.html#2</link>
    <pubDate>Sun, 11 Jul 2010 19:18:23 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;    &#125; &lt;br&gt;&amp;gt;return 0; &lt;br&gt;&amp;gt;&#125; &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Соответственно в чем может быть проблема ? Кто не успевает? немедленно ли &lt;br&gt;&amp;gt;процесс реагирует на сигнал и если этот вариант плох - что &lt;br&gt;&amp;gt;можно сделать, чтобы реализовать немедленный вызов некоторой функции (обработки) с заданной &lt;br&gt;&amp;gt;частотой с прерыванием других потоков. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;ВСЕМ ЗАРАНЕЕ СПАСИБО ! &lt;br&gt;&lt;br&gt;собсно проблема в том что выполнение обработчика сигнала требует&lt;br&gt;контекста процесса. так что выглядит все таким образом&lt;br&gt;1) истекает таймер, ядро шлет процессу SIGUSR1&lt;br&gt;2) _КОГДА ПРОЦЕСС ЗАСКЕДУЛИТСЯ__, управление получит обработчик сигнала&lt;br&gt;&lt;br&gt;соответственно момент 2 вовсе не обязан настать сразу после истечения таймера.&lt;br&gt;похоже что вам нужно спустится в ядро &lt;br&gt;</description>
</item>

<item>
    <title>теряются сигналы  (Вова)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8796.html#1</link>
    <pubDate>Fri, 09 Jul 2010 08:26:47 GMT</pubDate>
    <description>&lt;br&gt;&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;static unsigned long int  counter=0; &lt;br&gt;&amp;gt;    counter++; &lt;br&gt;&amp;gt;    if (counter &amp;gt; 4000000) counter =1;&lt;br&gt;&amp;gt;    if (counter &#037; 200 == 0) &lt;br&gt;&amp;gt;    &#123; &lt;br&gt;&amp;gt;        time++; &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;            &lt;br&gt;&amp;gt;   cout&amp;lt;&amp;lt;&quot;The handler works !!! Time=&quot;&amp;lt;&amp;lt;time&amp;lt;&amp;lt;endl; &lt;br&gt;&amp;gt;    &#125; &lt;br&gt;&lt;br&gt;необходимо блокировать сигналы в обработчике, они теряются - http://www1.lib.ru/CTOTOR/book.txt_with-big-pictures.html&lt;br&gt;</description>
</item>

</channel>
</rss>
