profil(2) profil(2)
NAME
profil - Ausführungsprofil erstellen
SYNTAX
#include <unistd.h>
void profil(unsigned short *buff, sizet bufsiz, int offset,
unsigned scale);
BESCHREIBUNG
profil() stellt Statistiken über den CPU-Verbrauch eines Programmes
bereit, indem es die aufgewendete Zeit mitprotokolliert. profil
erzeugt Statistiken, indem es ein Ausführungshistogramm für einen lau-
fenden Prozeß erstellt. Das Histogramm ist für einen spezifischen Pro-
grammbereich definiert, für den das Profil erstellt werden soll. Der
definierte Bereich wird in mehrere Teile gleicher Größe aufgegelie-
dert, von denen jeder einzelne einer Zählung im Histogramm entspricht.
Mit jedem Prozeßwechsel wird der aktive Teil identifiziert und seine
entsprechende Histogrammzählung erhöht. Diese Zählungen geben einen
relativen Wert, wieviel Zeit in jedem Code-Teil verbraucht wird. Die
für einen protokollierten Bereich resultierenden Histogrammzählungen
können zur Identifizierung jener Funktionen benutzt werden, die einen
unverhältnismäßig großen prozentualen Anteil an CPU-Zeit verbrauchen.
buff ist ein Puffer mit bufsiz-Bytes, in welchem die Histogrammzählun-
gen als eine Reihe von unsigned short int gespeichert sind.
offset, scale und bufsiz geben den zu protokollierenden Bereich an.
offset ist die Startadresse des zu profilierenden Bereichs.
scale ist ein Kontraktionsfaktor, der anzeigt, um wieviel kleiner der
Histogrammpuffer im Gegensatz zu dem zu profilierenden Bereich ist.
scale wird also als eine 16-Bit-Festpunktzahl ohne Vorzeichen inter-
pretiert, deren Dezimalpunkt links vor dem ersten Bit steht. Sein Wert
ist das Reziproke der Anzahl an Bytes in einer Histogrammunterteilung.
Da es zwei Bytes pro Histogrammzähler gibt, ist die tatsächliche
Anzahl Bytes pro Histogrammunterteilung das Doppelte der angegebenen
Skala.
- Der maximale Wert von scale, 0xffff (etwa 1), erzeugt Abbildungsun-
terteilungen mit einer Länge von 2 Bytes für jeden Zähler.
- Der minimale Wert von scale (dafür wird protokolliert), 0x0002
(1/32768), erzeugt Abbildungsunterteilungen mit einer Länge von
65536 Bytes für jeden Zähler.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
profil(2) profil(2)
- Der Standardwert von scale (momentan benutzt von cc -qp), 0x4000,
erzeugt Abbildungsunterteilungen mit einer Länge von 8 Bytes für
jeden Zähler.
Die Werte werden innerhalb des Betriebssystemkerns folgenderweise
benutzt: Sobald der Prozeß für einen Prozeßwechsel unterbrochen ist,
wird der Wert von offset vom aktuellen Wert des Programmzählers sub-
trahiert und mit dem Rest von scale multipliziert, um ein Ergebnis
abzuleiten. Dieses Ergebnis wird in der Histogrammreihe als Index
benutzt, womit die zu inkrementierende Speicherzelle lokalisiert wird.
Daher repräsentiert die Speicherzellenzählung die Anzahl der Zeit-
punkte, in denen der Prozeß den Code in der mit dieser Speicherzelle
verbundenen Unterteilung ausgeführt hat, als der Prozeß unterbrochen
wurde.
scale kann als (RATIO * 0200000) berechnet werden, wobei RATIO das
erwünschte Zahlenverhältnis von bufsiz zur profilierten Bereichsgröße
ist und einen Wert zwischen 0 und 1 hat. Je näher RATIO also 1 kommt,
umso höher ist die Auflösung der Profil-Information.
bufsiz kann als (sizeofregiontobeprofiled * RATIO) berechnet wer-
den.
HINWEISE
Die Profilierung wird abgeschaltet, wenn eine scale von 0 oder 1 gege-
ben wird. Sie wird wirkungslos, wenn eine Größe bufsiz von 0 eingege-
ben wird. Die Profilierung wird abgeschaltet, wenn ein exec(2) ausge-
führt wird. Sie bleibt jedoch in einem Sohn- und Vaterprozeß nach
einem fork(2) eingeschaltet. Die Profilierung wird abgeschaltet, wenn
eine Änderung in buff einen Speicherfehler verursachen würde.
SIEHE AUCH
times(2), monitor(3C).
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98