<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: переключение задачи до завершения временного кванта</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9642.html</link>
    <description>Задача: отслеживается событие и при его возникновении обрабатывается.&lt;br&gt;Решение:&lt;br&gt;while (1) &#123;&lt;br&gt;if ( &amp;lt;событие&amp;gt; ) &#123;&lt;br&gt;&amp;lt;обработка&amp;gt;&lt;br&gt;&#125;&lt;br&gt;&#125;&lt;br&gt;Проблема: много холостых ходов цикла, загрузка процессора до 100&#037;&lt;br&gt;&lt;br&gt;В Windows решается просто:&lt;br&gt;while (1) &#123;&lt;br&gt;if ( &amp;lt;событие&amp;gt; ) &#123;&lt;br&gt;&amp;lt;обработка&amp;gt;&lt;br&gt;continue;&lt;br&gt;&#125;&lt;br&gt;else &#123;&lt;br&gt;Sleep (0);&lt;br&gt;&#125;&lt;br&gt;&#125;&lt;br&gt;здесь функция Sleep(0) позволяет планировщику передать исполнение другому потоку до истечения кванта времени выделенного текущему потоку.&lt;br&gt;&lt;br&gt;Вопрос: Как подобный механизм реализовать в UNIX ?&lt;br&gt;</description>

<item>
    <title>переключение задачи до завершения временного кванта (Аноним)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9642.html#13</link>
    <pubDate>Mon, 01 Apr 2013 10:54:35 GMT</pubDate>
    <description>&amp;gt; select() не пробовал, но использование poll(), как в приведённом примере, оставляет загрузку &lt;br&gt;&amp;gt; CPU ~100&#037;.&lt;br&gt;&lt;br&gt;Если загрузка 100&#037;, то timeout=0. Ну уж тогда извините, что написали - то и получили.&lt;br&gt;select() не поможет, так как на уровне ядра всё равно реализован через poll().&lt;br&gt;</description>
</item>

<item>
    <title>переключение задачи до завершения временного кванта (anonymous)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9642.html#12</link>
    <pubDate>Sun, 17 Mar 2013 18:02:41 GMT</pubDate>
    <description>&amp;gt;&amp;gt; Зря, что ли, придумывали асинхронно-событийную парадигму?&lt;br&gt;&amp;gt; А не из теории что-нибудь?!&lt;br&gt;&lt;br&gt;http://libevent.org/ &amp;#124;&amp;#124; http://software.schmorp.de/pkg/libev.html&lt;br&gt;</description>
</item>

<item>
    <title>переключение задачи до завершения временного кванта (pavlinux)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9642.html#11</link>
    <pubDate>Sat, 16 Mar 2013 18:17:47 GMT</pubDate>
    <description>&amp;gt; Зря, что ли, придумывали асинхронно-событийную парадигму?&lt;br&gt;&lt;br&gt;А не из теории что-нибудь?!&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>переключение задачи до завершения временного кванта (anonymous)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9642.html#10</link>
    <pubDate>Fri, 15 Mar 2013 17:07:10 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt; &#125; &lt;br&gt;&amp;gt;&amp;gt; здесь функция Sleep(0) позволяет планировщику передать исполнение другому потоку до истечения &lt;br&gt;&amp;gt;&amp;gt; кванта времени выделенного текущему потоку.&lt;br&gt;&amp;gt;&amp;gt; Вопрос: Как подобный механизм реализовать в UNIX ?&lt;br&gt;&amp;gt; То что ты делаешь называется опрос. И это именно то, чего делать &lt;br&gt;&amp;gt; не стоит. Для этого алгоритма избежать 100&#037; загрузки цпу невозможно. Вариант &lt;br&gt;&amp;gt; с usleep - костыль, который резко уменьшает время ответа системы.&lt;br&gt;&amp;gt; Само получение ивента должно быть блокируемым. Самое простое решение - завести дескриптор &lt;br&gt;&amp;gt; при помощи man 2 pipe и с одной стороны - писать, &lt;br&gt;&amp;gt; а с другой - читать в блокирующем режиме ивенты.&lt;br&gt;&lt;br&gt;Зря, что ли, придумывали асинхронно-событийную парадигму?&lt;br&gt;</description>
</item>

<item>
    <title>переключение задачи до завершения временного кванта (Mr. Mistoffelees)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9642.html#9</link>
    <pubDate>Wed, 13 Mar 2013 10:36:57 GMT</pubDate>
    <description>Привет,&lt;br&gt;&lt;br&gt;&amp;gt; Реальная задача в получении пакетов на неблокированные сокеты: &lt;br&gt;&amp;gt; select() не пробовал, но использование poll(), как в приведённом примере, оставляет загрузку &lt;br&gt;&amp;gt; CPU ~100&#037;.&lt;br&gt;&lt;br&gt;Тогда попробуйте select(), он и есть ваше решение. &lt;br&gt;&lt;br&gt;WWell,&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>переключение задачи до завершения временного кванта (nanoo_linux)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9642.html#8</link>
    <pubDate>Tue, 12 Mar 2013 16:05:57 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;   &amp;lt;обработка&amp;gt; &lt;br&gt;&amp;gt;   continue; &lt;br&gt;&amp;gt;  &#125; &lt;br&gt;&amp;gt;  else &#123; &lt;br&gt;&amp;gt;   Sleep (0); &lt;br&gt;&amp;gt;  &#125; &lt;br&gt;&amp;gt; &#125; &lt;br&gt;&amp;gt; здесь функция Sleep(0) позволяет планировщику передать исполнение другому потоку до истечения &lt;br&gt;&amp;gt; кванта времени выделенного текущему потоку.&lt;br&gt;&amp;gt; Вопрос: Как подобный механизм реализовать в UNIX ?&lt;br&gt;&lt;br&gt;То что ты делаешь называется опрос. И это именно то, чего делать не стоит. Для этого алгоритма избежать 100&#037; загрузки цпу невозможно. Вариант с usleep - костыль, который резко уменьшает время ответа системы.&lt;br&gt;&lt;br&gt;Само получение ивента должно быть блокируемым. Самое простое решение - завести дескриптор при помощи man 2 pipe и с одной стороны - писать, а с другой - читать в блокирующем режиме ивенты.&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>переключение задачи до завершения временного кванта (Нестор)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9642.html#7</link>
    <pubDate>Thu, 28 Feb 2013 10:26:10 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;  if ( &amp;lt;событие&amp;gt; ) &#123; &lt;br&gt;&amp;gt;&amp;gt;   &amp;lt;обработка&amp;gt; &lt;br&gt;&amp;gt;&amp;gt;  &#125; &lt;br&gt;&amp;gt; Ответ зависит от того, в чем заключается обработка и точнее, насколько она &lt;br&gt;&amp;gt; должна быть в реальном времени. Лучший вариант, конечно, select() - есил &lt;br&gt;&amp;gt; есть возможность его использовать. usleep() позволит снизить нагрузку, а интервал зависит &lt;br&gt;&amp;gt; от того, как часто случается событие и насколько его обработка может &lt;br&gt;&amp;gt; подождать - напр., если &quot;событие&quot;, это уборка за каким-то &quot;мусором&quot; (типа &lt;br&gt;&amp;gt; wait() после fork()), то и раз в секунду подойдет.&lt;br&gt;&amp;gt; WWell, &lt;br&gt;&lt;br&gt;Доброго времени суток!&lt;br&gt;&lt;br&gt;Реальная задача в получении пакетов на неблокированные сокеты:&lt;br&gt;&lt;br&gt;   while (1) &#123;&lt;br&gt;      . . .&lt;br&gt;      if ( !poll(. . .) ) &#123;&lt;br&gt;         continue;&lt;br&gt;      &#125;&lt;br&gt;&lt;br&gt;      &amp;lt;обработка&amp;gt;&lt;br&gt;&lt;br&gt;   &#125;&lt;br&gt;&lt;br&gt;select() не пробовал, но использование poll(), как в приведённом примере, оставляет загрузку CPU ~100&#037;.&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>переключение задачи до завершения временного кванта (Mr. Mistoffelees)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9642.html#6</link>
    <pubDate>Thu, 28 Feb 2013 09:41:04 GMT</pubDate>
    <description>Привет,&lt;br&gt;&lt;br&gt;&amp;gt;  if ( &amp;lt;событие&amp;gt; ) &#123; &lt;br&gt;&amp;gt;   &amp;lt;обработка&amp;gt; &lt;br&gt;&amp;gt;  &#125; &lt;br&gt;&lt;br&gt;Ответ зависит от того, в чем заключается обработка и точнее, насколько она должна быть в реальном времени. Лучший вариант, конечно, select() - есил есть возможность его использовать. usleep() позволит снизить нагрузку, а интервал зависит от того, как часто случается событие и насколько его обработка может подождать - напр., если &quot;событие&quot;, это уборка за каким-то &quot;мусором&quot; (типа wait() после fork()), то и раз в секунду подойдет. &lt;br&gt;&lt;br&gt;WWell,&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>переключение задачи до завершения временного кванта (Нестор)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9642.html#5</link>
    <pubDate>Thu, 28 Feb 2013 05:14:47 GMT</pubDate>
    <description>Спасибо за ответы. Я действительно немного промахнулся с темой, поищу в теме про потоки и нити.&lt;br&gt;&lt;br&gt;К сожалению sched_yield() не помогает в данном случае, например:&lt;br&gt;&lt;br&gt;   void main () &#123;&lt;br&gt;      while (1) &#123;&lt;br&gt;      &#125;&lt;br&gt;   &#125;&lt;br&gt;&lt;br&gt;и&lt;br&gt;&lt;br&gt;   void main () &#123;&lt;br&gt;      while (1) &#123;&lt;br&gt;         sched_yield ();&lt;br&gt;      &#125;&lt;br&gt;   &#125;&lt;br&gt;&lt;br&gt;согласно top дают одинаковую загрузку CPU ~100&#037; &lt;br&gt;&lt;br&gt;Однако&lt;br&gt;&lt;br&gt;   void main () &#123;&lt;br&gt;      while (1) &#123;&lt;br&gt;         usleep (1000);&lt;br&gt;      &#125;&lt;br&gt;   &#125;&lt;br&gt;&lt;br&gt;резко уменьшает нагрузку до 0.3&#037;&lt;br&gt;&lt;br&gt;Наверное это и есть решение.&lt;br&gt;</description>
</item>

</channel>
</rss>
