Re: System-Zeitgeber programmieren

From: Marc Santhoff <M.Santhoff(at)t-online.de>
Date: Tue, 06 Mar 2007 06:05:36 +0100

Am Montag, den 05.03.2007, 17:32 +0100 schrieb Oliver Fromme:
> 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?

Das ist leider im Vorweg nicht zu sagen.

Ich persönlich brauche ihn, um 1s-Intervalle oder etwas mehr abzumessen,
also durchaus geeignet.

Ziel ist aber, eine existierende Timerkomponente aus eine GTK-basierten
Framework durch ein GTK-unabhängige zu ersetzen, also wenn man 1ms
Auflösung anbietet, sollte sie auch wirklich möglich sein.

> > 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.

Gut zu wissen.

> 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«.

Hmm, derzeit 4.11 also HZ=100 ... ist aber nicht mehr lange so.

> 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.

Das ist klar, jemand der auf einem P1 oder 486er oder äquivalent mit so
kleinen Intervallen arbeitet, muß schon wissen was er tut. Auf heute
üblichen Desktop-Maschinen sehe ich damit physikalisch aber kein
Problem. Und die Zielgruppe "Systemprogrammierer" kann damit umgehen
(wenn wenigstens in der Doku ein Hinweis zu finden ist).

> > - 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.

S.o., wie erreiche ich denn auch auf langsamerer Hardware leidlich
genaue 1ms? Mit usleep() sollte es zumindest möglich sein, aber dann
müßte ich einen parallelen Thread für die Benachrichtigung benutzen,
solche Konstruktion wollte ich eigentlich umschiffen.

> > - Gibt es eine bessere Möglichkeit (weniger Ressourcen, portabler, ...)?
>
> ualarm() und sigaction() entsprechen SUSv3 und POSIX-2001,
> insofern ist das schon recht portabel.

Das zumindest spricht für diese Lösung.

Ich hätte als Alternative noch eine Quelle, die teils in Assembler
geschrieben ist und die Performance-Timer der x86-CPU benutzt, ich muß
nochmal gucken, ob die auch auf anderer Hardware was tut ...

Danke soweit,
Marc

To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Tue 06 Mar 2007 - 06:09:37 CET

search this site