Re: System-Zeitgeber programmieren

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Mon, 5 Mar 2007 17:32:07 +0100 (CET)

Marc Santhoff wrote:
> ich bin auf der Suche nach einem Zeitgeber unter FreeBSD, der auch gerne
> einigermaßen streßfrei portierbar sein sollte (ja, ggf. auch nach
> Linux ;).

Für welchen Zweck benötigst Du ihn denn?

> Da das Intervall, in dem meine Programm benachrichtigt werden soll, mit
> einer Auflösung von 1 ms einstellbar sein soll, bin ich nach lesen
> einiger manpages gedanklich erstmal bei folgender Idee hängengeblieben:
>
> - Der Zeitgeber wird mit ualarm(3) eingestellt und gestartet.
>
> - Dazu muß mit signal(3) ein handler in meinem Code installiert werden,
> der bei auftreten des Signals "SIGALRM" seine Aufgabe (möglichst schnell
> wg. blocking) erfüllt.
>
> Dazu meine Fragen:
> - Hab' ich das richtig verstanden?

Ja, das würde im Prinzip so funktionieren. Du musst natür-
lich darauf achten, dass innerhalb des Signal-handlers nur
bestimmte Dinge erlaubt sind. Außerdem solltest Du besser
sigaction(2) statt signal(3) verwenden, da letzteres keine
so portable Semantik hat, insbesondere was das Rücksetzen
des Signal-handlers nach dem Setzen eines Signals betrifft.

Außerdem muss man natürlich berücksichtigen, dass der Timer
nur mit der »HZ«-Granularität des Kernels arbeitet. Unter
FreeBSD 6 ist der Default dafür 1000 Hz, was für Intervalle
von 1 ms gerade noch ausreichen würde. Bei älteren Free-
BSD-Versionen (oder gar bei ganz anderen Betriebssystemen)
kann die Granularität eine ganz andere sein. Bei FreeBSD 4
ist der Default nur 100 Hz (also 10 ms Granularität). Ich
persönlich stelle auf meinen Rechnern häufig absichtlich
niedrigere Werte ein (mein Notebook hat z.B. HZ=300, was
für das Abspielen von Videos günstiger ist als der Default
von HZ=1000).

Die aktuelle Einstellung sagt Dir »sysctl kern.clockrate«.

Darüber hinaus ist FreeBSD kein Echtzeit-Betriebssystem
(mal ganz davon abgesehen, dass PC-Hardware ohnehin nicht
für »harte« Echtzeitanwendungen geeignet ist). Das heißt,
selbst wenn Du vom Timer her eine Granularität von 1 ms
erhältst, heißt das noch lange nicht, dass Dein Prozess
nach genau 1 ms wieder vom Scheduler ausgeführt wird. Du
kannst rtprio(1) verwenden, aber selbst dann gibt es noch
Faktoren, die da mit hineinspielen und die außerhalb der
Kontrolle Deines Programms liegen.

> - Sollte ich diesen Timer benutzen oder ist ein anderer geeigneter?

Geeigneter _wofür_? Deine Frage lässt sich nicht beantwor-
ten, wenn man nicht weiss, wofür genau Du die ganze Sache
überhaupt einsetzen willst.

> - Gibt es eine bessere Möglichkeit (weniger Ressourcen, portabler, ...)?

ualarm() und sigaction() entsprechen SUSv3 und POSIX-2001,
insofern ist das schon recht portabel.

Gruß
   Olli

-- 
Oliver Fromme, secnetix GmbH & Co. KG, Marktplatz 29, 85567 Grafing b. M.
Handelsregister: Registergericht Muenchen, HRA 74606,  Geschäftsfuehrung:
secnetix Verwaltungsgesellsch. mbH, Handelsregister: Registergericht Mün-
chen, HRB 125758,  Geschäftsführer: Maik Bachmann, Olaf Erb, Ralf Gebhart
Any opinions expressed in this message are personal to the author and may
not necessarily reflect the opinions of secnetix GmbH & Co KG in any way.
FreeBSD-Dienstleistungen, -Produkte und mehr:  http://www.secnetix.de/bsd
"Life is short (You need Python)"
        -- Bruce Eckel, ANSI C++ Comitee member, author
           of "Thinking in C++" and "Thinking in Java"
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Mon 05 Mar 2007 - 17:34:00 CET

search this site