stellt bis zu 7 gültige Ziffern im Bereich F = [min F, max F] zur Verfügung; der Fehler für jede in F liegende reelle Zahl x durch ihre Approximation trunc(x) bzw. durch ihre Rundung round(x) ist absolut

|x − trunc(x)| ≤ 10^{−3}
|x − round(x)| ≤ \frac{1}{2} · 10^{−3},

also z.B. |\frac{2}{3} − 0.666| bzw. |\frac{2}{3} − 0.667|. Dagegen kann der relative Fehler

|\frac{x − trunc(x)}{x}| bzw. |\frac{x − trunc(x)}{trunc(x)}|

beliebig groß werden, es kann sogar passieren, daß keine Ziffer der Näherung stimmt! Für viele naturwissenschaftlichen Rechnungen reichen etwa obige 7 Stellen (7 richtige führende Stellen) aus, aber der abgedeckte Zahlenbereich erstreckt sich über viele Größenordnungen wie μV,...,kV, also 10^{−6}V,...,10^{3}V, obwohl viele analoge Voltmeter nur ±1% Ablesegenauigkeit haben.

Definition 1.3 Eine Abbildung ∘ : IR → F_{n}^{ν} mit den Eigenschaften

Projektion : ∘|_{F_{n}^{ν}} = id
Monotonie : x ≤ y ⇐ ∘x ≤ ∘y

heißt Rundung .

IEEE stellt 4 Rundungen zur Verfügung:

unsym. sym. unsym. sym. r_{−∞} r_{∞} r_{0} = trunc r_{near} = round

Sei x̃ ∈ F_{n}^{ν} eine Näherung von x, z.B. x̃ = ∘x mit ∘ ∈ {r_{−∞}, r_{∞}, r_{0}, r_{near}}, so bezeichnet man

Δx̃ := |x̃ − x|

als absoluten Fehler des Näherungswertes x̃,

ε̄x̃ := |\frac{x̃ − x}{x}|

für x ≠ 0 als relativen Fehler von x̃. Da x häufig nicht bekannt ist, man also nur weiß, daß x̃ maximal Δx̃ von x entfernt ist, benutzt man

εx̃ := |\frac{x̃ − x}{x̃}|

für x̃ ≠ 0 als relativen Fehler. Weiß man (z.B. bei x̃ = ∘x gerundet), daß x̃ genau zwischen zwei Rasterpunkten von F_{3}^{4} liegt, so kann man grob abschätzen:

Δx̃ ≤ 10^{−3}
ε̄x̃ ≤ \frac{10^{−3}}{x} ∀x ≠ 0
εx̃ ≤ \frac{10^{−3}}{x̃} ∀x̃ ≠ 0

Ist die Art der Rundung nicht bekannt, ergibt sich also:

x̃ = 0 ⇒ x ∈ (−0.001, 0.001) ⇒ |\frac{Δx̃}{x}| ≤ ∞
x̃ = 0.001  ⇒ x ∈ (0.000, 0.002) ⇒  |\frac{Δx̃}{x}| ≤ ∞
x̃ = 0.002  ⇒ x ∈ (0.001, 0.003) ⇒  |\frac{Δx̃}{x}| ≤ 1
x̃ = 0.003  ⇒ x ∈ (0.002, 0.004) ⇒  |\frac{Δx̃}{x}| ≤ 0.5
⋮
x̃ = 9999.998 ⇒ x ∈ (9999.997, 9999.999) ⇒ |\frac{Δx̃}{x}| ≤ 10^{−7}
x̃ = 9999.999  ⇒ ???

Kennt man die Art der Rundung, so läßt sich genauer feststellen

1. Rundung zur Null:

x̃ = 0 ⇒ x ∈ (−0.001, 0.001) ⇒ |\frac{Δx̃}{x}| ≤ ∞

x̃ = 0.001 ⇒ x ∈ [0.001, 0.002) ⇒ |\frac{Δx̃}{x}| ≤ 1
x̃ = 0.002 ⇒ x ∈ [0.002, 0.003) ⇒ |\frac{Δx̃}{x}| ≤ 0.5
⋮

Ein analoges Ergebnis gilt für r_{+∞} und r_{−∞}.

2. r_{near} : Δx̃ = |x − x̃| ≤ \frac{1}{2} · 10^{−3}

x̃ = 0 ⇒ x ∈ [−0.0005, 0.0005) ⇒ |\frac{Δx̃}{x}| ≤ ∞
x̃ = 0.001  ⇒ x ∈ [0.0005, 0.0015) ⇒  |\frac{Δx̃}{x}| ≤ 1
x̃ = 0.002  ⇒ x ∈ [0.0015, 0.0025) ⇒  |\frac{Δx̃}{x}| ≤ 0.33
x̃ = 0.003  ⇒ x ∈ [0.0025, 0.0035) ⇒  |\frac{Δx̃}{x}| ≤ 0.20
⋮
x̃ = 9999.998 ⇒ x ∈ [9999.9975, 9999.9985) ⇒ |\frac{Δx̃}{x}| ≤ \frac{1}{2} · 10^{−7}

Für naturwissenschaftliche/technische Anwendungen sind also etwa nur zwei führende Ziffern sinnvoll. Im Beispiel heißt das

(−1)^{s} · \underbrace{(z_{1}10^{−1} + z_{2}10^{−2})}_{norm. Mantisse} · \underbrace{10^{e}}_{Basis}

mit s ∈ {0, 1}, z_{1/2} ∈ {0, …, 9}, z_{1} ≠ 0 und einem Exponenten e ∈ {−6, −5, …, 5}. Allgemein ergibt sich

(−1)^{s} · (∑_{i=1}^{N} z_{i}b^{−i}) · b^{e}, z_{1} ≠ 0  (∘)

oder

(−1)^{s} · (∑_{i=0}^{N} z_{i}b^{−i}) · b^{e}, z_{0} ≠ 0

Zur Untersuchung des Zahlenbereichs der durch (∘) gegebenen Zahlen sei

G̃:= {(−1)^{s} · (∑_{i=1}^{N} z_{i}b^{−i}) · b^{e}|s ∈ {0, 1}, z_{i} ∈ {0, 1, …, b − 1}, z_{1} ≠ 0, e ∈ {e_{min}, …, e_{max}}}

Man beachte, daß G̃ \underline{nicht} die 0 enthält! Man setzt daher G := G̃∪ \{0\}, max G := max G̃ und min G := min G̃. Für G̃ erhält man z.B. mit b = 10, N = 2 und e ∈ {−6, …, 5}:

{−0.99 · 10^{5}, −0.98 · 10^{5}, …, −0.11 · 10^{5}, −0.10 · 10^{5},
−0.99 · 10^{4}, −0.98 · 10^{4}, …, −0.11 · 10^{4}, −0.10 · 10^{4},
…
−0.99 · 10^{−6}, −0.98 · 10^{−6}, …, −0.11 · 10^{−6}, −0.10 · 10^{−6},
0.10 · 10^{−6}, 0.11 · 10^{−6}, …, 0.98 · 10^{−6}, 0.99 · 10^{−6},
0.10 · 10^{−5}, 0.11 · 10^{−5}, …, 0.98 · 10^{−5}, 0.99 · 10^{−5},
…
0.10 · 10^{4}, 0.11 · 10^{4}, … 0.98 · 10^{4}, 0.99 · 10^{4},
0.10 · 10^{5}, 0.11 · 10^{5}, … 0.98 · 10^{5}, 0.99 · 10^{5}}

Für die Rundungsfehler ergibt sich im Beispiel mit r_{0} folgendes Bild:

...  ...  ... ...  ...  ... ...  ... 0.0 ... 0.10 · 10^{−6} 0.11 · 10^{−6}  0.98 · 10^{−6}  0.99 · 10^{−6} 0.10 · 10^{−5} 0.11 · 10^{−5}  0.98 · 10^{−5}  0.99 · 10^{−5} 0.10 · 10^{5}  0.11 · 10^{5}  0.98 · 10^{5}  0.99 · 10^{5} 10^{−8}  10^{−8} 10^{−7}  10^{−7} 10^{3}  10^{3}

Eine Rechnung liefert für die relativen Fehler:

x̃ = 0.0 ⇒ x ∈ (−0.10 · 10^{−6}, 0.10 · 10^{−6}) ⇒ |\frac{x̃ − x}{x}| ≤ ∞
x̃ = 0.10 · 10^{−6} ⇒ x ∈ [0.10 · 10^{−6}, 0.11 · 10^{−6}) ⇒ |\frac{x̃ − x}{x}| ≤ \frac{10^{−8}}{10^{−7}} = 0.1
x̃ = 0.11 · 10^{−6} ⇒ x ∈ [0.11 · 10^{−6}, 0.12 · 10^{−6}) ⇒ |\frac{x̃ − x}{x}| ≤ \frac{10^{−8}}{0.11 · 10^{−6}} ≤ 0.\overline{09}
⋮
x̃ = 0.99 · 10^{−6} ⇒ x ∈ [0.99 · 10^{−6}, 1.00 · 10^{−6}) ⇒ |\frac{x̃ − x}{x}| ≤ \frac{10^{−8}}{0.99 · 10^{−6}} ≤ 0.\overline{01} …

Also mit p = N:

Δx̃ ≤ b^{exponent(x̃)−p}

Ist nun x̃ ∈ S(b, p, emin, emax) \ {0.0} und dabei ohne Einschränkung x̃ > 0, so gilt bei der Rundung r_{0} für x ∈ [x̃, x̃ + b^{−p+exponent(x̃)})

|\frac{x − x̃}{x}| ≤ |\frac{x̃}{x} − 1|
≤ |\frac{x̃}{x̃ + b^{−p+exponent(x̃)}} − 1|
= |\frac{mantisse(x̃)}{mantisse(x̃) + b^{−p}} − 1|
= |\frac{b^{−p}}{mantisse(x̃) + b^{−p}} |
= (\frac{mantisse(x̃)}{b^{−p}} + 1)^{−1}
≈ \frac{b^{−p}}{mantisse(x̃)}
∈ (b^{−p}, b^{1−p}] ,

wobei benutzt wurde, daß für große α gilt: \frac{1}{1+α} ≈ \frac{1}{α}. Bei der Rundungsart r_{near} erhält man folgende Abschätzungen:

x̃ = 0.0  ⇒ ?
x̃ = 0.10 · 10^{−6}  ⇒ ?
x̃ = 0.11 · 10^{−6} ⇒ x ∈ [0.105 · 10^{−6}, 0.115 · 10^{−6}) ⇒ |\frac{x̃ − x}{x}| ≤ \frac{\frac{1}{2} · 10^{−8}}{0.105 · 10^{−6}} ≤ 0.0476...
⋮

x̃ = 0.99 · 10^{−6} ⇒ x ∈ [0.985 · 10^{−6}, 0.995 · 10^{−6}) ⇒ |\frac{x̃ − x}{x}| ≤ \frac{\frac{1}{2} · 10^{−8}}{0.985 · 10^{−6}} ≤ 0.005076...
⋮
x̃ = 0.99 · 10^{5}  ⇒ ?

Für r_{near} gilt also:

Δx̃ ≤ \frac{1}{2} · 10^{exponent(x̃)−p}

Damit die Formel von r_{near} auch für x̃ = 0.99 · 10^{5} gilt, muß

x ∈ [0.985 · 10^{5}, 0.995 · 10^{5})

auf x̃ gerundet werden; alle x ≥ 0.995 · 10^{5} werden zu +infty.

+infty 0.98 · 10^{5}  0.99 · 10^{5} max G G(b, p, e_{min}, e_{max}) = G(10, 2, −6, 5) 0.995 · 10^{5} = b^{e_{max}}(1 − \frac{1}{2}b^{−p})

Nahe 0 arbeiten alte Arithmetiken mit

x̃ = 0.10 · 10^{−6} ⇒ x ∈ [0.10 · 10^{−6}, 0.15 · 10^{−6}),

d.h. die Formel gilt auch hier, könnte jedoch noch verschärft werden, und

x̃ = 0.0 ⇒ x ∈ (−0.10 · 10^{−6}, +0.10 · 10^{−6}) ⇒ \{ \begin{matrix}Δx̃ & = & 2 · 0.10 · 10^{−6} \\ |\frac{x̃−x}{x} | & < & ∞ \end{matrix}

Es ergibt sich folgendes Problem: Die Äquivalenz

x − y > 0 ⇔ x > y

gilt im allgemeinen hier nicht mehr. So wird z.B. die Differenz 0.11 · 10^{−6} − 0.10 · 10^{−6} nach 0 gerundet, weil 10^{−8} < 0.10 · 10^{−6} = minReal ist, aber natürlich ist 0.11 · 10^{−6} > 0.10 · 10^{−6}. Da Festpunktsysteme die Addition exakt ausführen, ergänzen wir G(b, p, e_{min}, e_{max}) um Null herum um die Rasterpunkte des Festkommasystems mit Δ = b^{e_{min}−p}, d.h. im Beispiel Δ = b^{−8}.

0.0  0.08 · 10^{−6}  0.10 · 10^{−6} 0.02 · 10^{−6} 0.01 · 10^{−6}  0.09 · 10^{−6}  0.11 · 10^{−6} D ...

Damit ergeben sich in D folgende Fehlerformeln für x̃ ∈ D \ {0.0}: Bei der Rundungsart r_{0} ist Δx̃ = b^{minexp} und somit mit m̃ant(x̃) = \frac{x̃}{b^{minexp}}

|\frac{x̃ − x}{x̃}| ≤ \frac{b^{minexp−p}}{m̃ant(x̃) · b^{minexp}} = \frac{b^{−p}}{m̃ant(x̃)}
|\frac{x̃ − x}{x}| ≤ (\frac{m̃ant(x̃)}{b^{−p}} + 1)^{−1} .

Für r_{near} ist Δx̃ = \frac{1}{2}b^{minexp−p} und daher

|\frac{x̃ − x}{x}| ≤ \frac{1}{2} \frac{b^{−p}}{m̃ant(x̃) − \frac{1}{2}b^{−p}}

Aufgabe 1.5 Berechne für 0.01 · 10^{−6} die Abschätzungen für r_{0} und r_{near}.

Hochgenaue Standardfunktionen können i.a. nur auf drei benachbarte Gitterpunkte genau berechnet werden:

\frac{1}{3} · 3 ∈ [0.99...9, 1.00...01]

Für ein (unbekanntes) Funktionsergebnis x und die gelieferte Näherung x̃ gilt dann also z.B. bei der Rundung r_{0}:

x̃ = 0.15 · 10^{−6} ⇒ x ∈ [0.15 · 10^{−6}, 0.17 · 10^{−6}]
⇒ |\frac{x − x̃}{x}| ≤ |\frac{mant(x̃)}{mant(x̃) + 2 · 10^{−2}} − 1| = (\frac{mant(x̃)}{2 · 10^{−2}} + 1)^{−1}
∈ [0.0198..., 0.166...]

für Argumente im normalisierten Bereich.

Aufgabe 1.6 Wie sieht das im unnormierten Bereich aus?

1.2.2.12 IEEE-Gleitkommazahlen

IEEE-Gleitkommazahlen im 64 Bitformat sind von der Form

x_{d} = s · 2^{e} · ∑_{k=1}^{53} f_{k} · 2^{−k}  (1.1)

mit genau 53 signifikanten Dualstellen, wobei s = ±1, −1021 ≤ e ≤ 1024 und f_{i} ∈ {0, 1} mit f_{1} ≠ 0 oder

x_{d} = s · 2^{−1021} · ∑_{k=2}^{53} f_{k} · 2^{−k}  (1.2)

(inklusive der 0). Zusätzlich sind folgende drei Ausdrücke vordefiniert:

NaN not a number
+infty +∞
−infty −∞

Man beachte, daß sich die Zahl \frac{1}{3} nicht exakt im IEEE-Format darstellen läßt. Die Darstellung einer Zahl im IEEE-Format erfolgt dabei durch das folgende Bitmuster:

s  e[52:62]  f[51:32] f[31:0] 63 62  52 51  32 31  0

Werte werden dabei entsprechend der folgenden Tabelle angenommen:

Double-Format Bitmuster  Wert
0 < e < 2047  (−1)^{s} · 2^{e−1023} · 1.f (normal numbers)
e = 0, f ≠ 0  (−1)^{s} · 2^{−1022} · 0.f (subnormal numbers)

(mindestens ein Bit in f ist ungleich 0)

e = 0, f = 0  (−1)^{s} · 0.0 (signed zero)

(alle Bits in f sind 0)

s = 0, e = 2047, f = .000 ⋯ 0  +INF (positive infinity)

(alle Bits in f sind 0)

s = 1, e = 2047, f = .000 ⋯ 0  -INF (negative infinity)

(alle Bits in f sind 0)

s = u, e = 2047, f ≠ 0  NaN (not a number)

(mindestens ein Bit in f ist ungleich 0)

• Maximum positive normal number — die größte im IEEE Double-Format darstellbare endliche Zahl

• Minimum positive normal number — die kleinste im IEEE Double-Format darstellbare positive Zahl, bei der sicher ist, daß nur die letzte Binärstelle unsicher ist.

• Maximum subnormal number — die größte im IEEE Double-Format darstellbare Zahl, bei der es möglich ist, daß mehr als die letzte Binärstelle unsicher ist.

• Minimum positive subnormal number — die kleinste im IEEE Double-Format darstellbare positive Zahl; hier ist es möglich, daß mehr als die letzte Binärstelle unsicher ist.

Es ergeben sich dabei folgende Beispiele:

Üblicher Name Bitmuster (Hex) Äquivalenter Wert

+0  00000000 00000000 0.0
−0  80000000 00000000 −0.0
1  3ff00000 00000000 1.0
2  40000000 00000000 2.0

max normal  7fefffff ffffffff 1.7976931348623157e+308

number

min positve  00100000 00000000 2.2250738585072014e−308

normal number

max subnormal 000fffff ffffffff 2.2250738585072009e−308

number

min positve  00000000 00000001 4.9406564584124654e−324

subnormal number

+∞  7ff00000 00000000 Infinity
−∞  fff00000 00000000 −Infinity
Not-a-Number  7ff80000 00000000 NaN

Im IEEE 32 Bitformat (single precision) gilt analog:

Gleitkomma Single-Precision Format

s = sign (1 bit) e = biased exponent (8 bits) f = fraction (23 bits) u = undefined

Normalized value (0 < e < 255) (−1)^{s} · 2^{e−127} · 1.f
Subnormal value (e = 0)  (−1)^{s} · 2^{−126} · 0.f
Zero (e = 0)  (−1)^{s} · 0
Signalling NaN  s = u, e = 255 (max) f = .0uu ⋯ uu

(mindenstens ein Bit in f ≠ 0)

Quiet NaN  s = u, e = 255 (max) f = .1uu ⋯ uu
−∞  s = 1, e = 255 (max) f = .000 ⋯ 00
+∞  s = 0, e = 255 (max) f = .000 ⋯ 00

Dazu noch einmal vergleichend das 64 Bitformat

Gleitkomma Double-Precision Format

s = sign (1 bit) e = biased exponent (11 bits) f = fraction (52 bits) u = undefined

Normalized value (0 < e < 2047) (−1)^{s} · 2^{e−1023} · 1.f
Subnormal value (e = 0)  (−1)^{s} · 2^{−1022} · 0.f
Zero (e = 0)  (−1)^{s} · 0
Signalling NaN  s = u, e = 2047 (max) f = .0uu ⋯ uu

(mindenstens ein Bit in f ≠ 0)

Quiet NaN  s = u, e = 2047 (max) f = .1uu ⋯ uu
−∞  s = 1, e = 2047 (max) f = .000 ⋯ 00
+∞  s = 0, e = 2047 (max) f = .000 ⋯ 00

und das 128 Bitformat:

Gleitkomma Quad-Precision Format

s = sign (1 bit) e = biased exponent (15 bits) f = fraction (112 bits) u = undefined

Normalized value (0 < e < 32767) (−1)^{s} · 2^{e−16383} · 1.f
Subnormal value (e = 0)  (−1)^{s} · 2^{−16382} · 0.f
Zero (e = 0)  (−1)^{s} · 0
Signalling NaN  s = u, e = 32767 (max) f = .0uu ⋯ uu

(mindenstens ein Bit in f ≠ 0)

Quiet NaN  s = u, e = 32767 (max) f = .1uu ⋯ uu
−∞  s = 1, e = 32767 (max) f = .000 ⋯ 00
+∞  s = 0, e = 32767 (max) f = .000 ⋯ 00

Zur Veranschaulichung der absoluten Abstände in Gleitkomma-Zahlensystemen:

0  1  2  3  4  5  6  7  8  9  10 0  10^{0}  10^{1} 0 ^{\frac{1}{2}} 1  2  4  8 0 2^{−1} 2^{0}  2^{1}  2^{2}  2^{3} Decimal Representation Binary Representation

Die Lücken zwischen darstellbaren Single-Precision Format Gleitkommazahlen:

x  Nachbarzahl von x in Richtung +∞ Lücke
0.0 1.4012985e-45 1.4012985e-45
1.1754944e-38 1.1754945e-38  1.4012985e-45
1.0  1.0000001  1.1920929e-07
2.0  2.0000002  2.3841858e-07
16.000000  16.000002  1.9073486e-06
128.00000  128.00002  1.5258789e-05
1.0000000e+20 1.0000001e+20  8.7960930e+12
9.9999997e+37 1.0000001e+38  1.0141205e+31

Die üblichen Gleitkomma-Zahlensysteme im Vergleich:

Wertebereich und Genauigkeit

Format Signifikante min positiv  max normal Signifikante
Binärstellen normal number number  Dezimalstellen
single  24  1.175 … 10^{−38}  3.402 … 10^{+38} 6-9
double  53  2.225 … 10^{−308}  1.797 … 10^{+308} 15-17
double  113  3.362 … 10^{−4932} 1.189 … 10^{+4932} 33-36

extended (SPARC)

double 64 3.362 … 10^{−4932} 1.189 … 10^{+4932} 18-21

extended (x86)

Format  Underflow-Schwelle
Single Smallest Normal Number 1.17549435e-38
Largest Subnormal Number 1.17549421e-38
Double  Smallest Normal Number  2.2250738585072014e-308
Largest Subnormal Number 2.2250738585072009e-308
Double extended Smallest Normal Number  3.3621031431120935062626778173217526e-4932
(SPARC)  Largest Subnormal Number 3.3621031431120935062626778173217520e-4932
Double extended Smallest Normal Number  3.36210314311209350626e-4932
(x86)  Largest Subnormal Number 3.36210314311209350590e-4932

IEEE double precision entspricht dem Zahlenbereich S(2, 53, −1021, +1024). Damit ist die größte darstellbare Zahl

maxReal = ∑_{k=1}^{53} 2^{−k} · 2^{1024} = (1 − 2^{−53}) · 2^{1024} = (1 − 2^{−p}) · 2^{emax}

und für [maxReal, +∞) ergibt sich bei der Rundungsart r_{near} und b = 2:

maxReal maxReal −2^{1024−53}  maxReal + \frac{1}{2}b^{emax−p} = b^{emax}(1 − \frac{1}{2}b^{−p})

Beispiele für gute IEEE-Algorithmen

1. Invarianz von Eigenschaften in IR auch in real:

function arithMittel(x,y : real) : real; {IEEE} begin

if sign(x)=sign(y) then

arithMittel := x + (y-x)/2.0 else

arithMittel := (x+y)/2.0

end; {arithMittel}

Dieser Algorithmus weist folgende Eigenschaften auf, wobei ohne Einschränkung davon ausgegangen werden kann, daß x ≤ y gilt:

(a) Fehler ≤ 1 ulp, wobei ulp für unit in last place steht

(b) Allgemein gilt x ≤ arithMittel ≤ y; falls zwischen x und y ein weiterer Gitterpunkt liegt, so gilt x < arithMittel < y.

(c) Es tritt in keinem Fall Over- oder Underflow auf.

Die angegebene zweite Eigenschaft des Algorithmus ist keineswegs selbstverständlich. Es gibt nämlich x, y; x ≠ y mit:

\frac{x ⊕ y}{2} ∉ [min(x, y), max(x, y)]

Man betrachte etwa im 13-stelligen Dezimalsystem die Zahlen

x = 0.9 ⋯ 96 · 10^{0}
y = 0.9 ⋯ 98 · 10^{0}

Dann ist x ⊕ y = 0.19 ⋯ 9 · 10^{1} und somit

\frac{x ⊕ y}{2} = 0.9 ⋯ 95 · 10^{0}.

Es wird nun der Zahlenbereich S(10, 2, −5, +5) mit S′ := S∪{Underflowbereich} und die Operation

\frac{x}{2} + \frac{y}{2}

behandelt.

(a) Für

x = 0.13 · 10^{−5}, y = 0.50 · 10^{−4}

erhält man:

\frac{x}{2} = 0.065 · 10^{−5} =^{in S′} \{ \begin{matrix}0.07 · 10^{−5} & bei grad. Underflow \\ 0.0 & trad. \end{matrix}
\frac{y}{2} = 0.25 · 10^{−4}
\frac{x}{2} + \frac{y}{2} = \{ \begin{matrix}0.257 · 10^{−4} =^{in S′} 0.26 · 10^{−4} \\ 0.25 · 10^{−4} & trad. \end{matrix}

(b) Für

x = 0.13 · 10^{−5}, y = 0.10 · 10^{−5}

erhält man:

\frac{x}{2} =^{in S′} 0.07 · 10^{−5}
\frac{y}{2} =^{in S′} 0.05 · 10^{−5}
\frac{x}{2} + \frac{y}{2} =^{in S′} 0.12 · 10^{−5}

(c) Sind

x = 0.13 · 10^{−5}, y = 0.11 · 10^{−5},

so erhält man bei trad. Rechnung \frac{x}{2} + \frac{y}{2} = 0 und x + \frac{y−x}{2} = x. In S′ ist jedoch

\frac{x}{2} =^{in S′} 0.07 · 10^{−5}
\frac{y}{2} =^{in S′} 0.06 · 10^{−5}
\frac{x}{2} + \frac{y}{2} =^{in S′} 0.13 · 10^{−5}

während

y − x =^{in S′} −0.02 · 10^{−5}
(y − x)/2 =^{in S′} −0.01 · 10^{−5}
x + (y − x)/2 =^{in S′} 0.12 · 10^{−5}.

2. Monotonie (Voraussetzung für Nullstellensuchverfahren, z.B. Bijektion,...) Der Graph von

p(x) = 170.4x^{3} − 356.41x^{2} + 168.97x + 18.601

liegt in [1.09160791, 1.09160805] × [−2 · 10^{−13}, 5 · 10^{−13}].

In beiden Fällen wurde mit 16-stelliger Arithmetik gerechnet bzw. auf ebenso viele Stellen (automatisch) verifiziert. Die beiden positiven Nullstellen des obigen Polynoms liegen sehr nahe zusammen, wie die Zerlegung in Linearfaktoren

p(x) = 170.4 · (x − \frac{5 + \sqrt{35}}{10}) (x − \frac{5 − \sqrt{35}}{10}) (x − \frac{18601}{17040})

und die unter Verwendung von ADE berechneten Einschließungen

\frac{5 + \sqrt{35}}{10} = 1.09160797830996_{1}^{2} und \frac{18601}{17040} = 1.09160798122065_{7}^{8}

zeigen.

3. Lösung einer quadratischen Gleichung (Auslöschung): Es wird der Rundungsfehlereinfluß bei 4-stelliger Arithmetik, also bei Gleitkommazahlen mit 4 Mantissenstellen betrachtet. Wir wollen das wohlbekannte Problem

ax^{2} + bx + c = 0.0

nach der Lösungsformel x_{1/2} = (−b±\sqrt{b^{2} − 4.0 · a · c})/(2.0·a) mit 4-stelliger Arithmetik (d.h. alle Zwischenergebnisse haben nur 4 signifikante Stellen!) lösen für

a = +1.0004, b = −200.01, c = +1.0003  (1.3)

\underline{1. Fehler:} Representation von a, b, c nur vierstellig, also

ā = +1.000, b̄ = −200.0, c̄ = 1.000

Die Rechnung ergibt im 1. Schritt den \underline{2. Fehler}, nämlich einen Rundungsfehler bei der Subtraktion:

b̄^{2} − 4.0 · ā · c̄ = 40000 − 4.000 = 40000

Der 2. Schritt liefert

x̄_{1} = (200.0 + 200.0)/2.0 = 200.0

und im 3. Schritt ergibt sich durch einen \underline{Folgefehler} des 2. Fehlers

x̄_{2} = (200.0 − 200.0)/2.0 = 0.0

Die exakten Lösungen lauten jedoch auf 4 signifikante Ziffern genau

x̄_{1} = 200.0
x̄_{2} = 0.005000

Die exakten Lösungen des gestellten Problems (1.3) wären auf 4 Ziffern genau

x_{1} = 200.0
x_{2} = 0.004999

gewesen. Als stabilere Lösungsidee bietet sich für a ≠ 0 nach der Umformung

ax^{2} + bx + c = 0 ⇔ x_{1/2} = \frac{−b ± \sqrt{b^{2} − 4ac}}{2a}

die vorzeichengünstige Wurzel

x_{1} := \frac{−b + sign(−b)\sqrt{b^{2} − 4ac}}{2a}

an. Der entscheidende Vorteil ist, daß die Summanden im Zähler das gleiche Vorzeichen besitzen. Nach dem Satz von Vieta ist dann die zweite Wurzel gegeben durch:

x_{2} := \frac{c}{a · x_{1}} ,

wegen x_{1}x_{2} = \frac{c}{a} und x_{1} + x_{2} = −\frac{b}{a}.

4. Unvergleichbare IEEE-Zahlen: Man betrachte den folgenden Programmausschnitt (Fraktale/Apfelmännchen);

⋮

y1 = 0 ;
y2 = 0 ;
for (i=0;i<ITERATIONS;i++)

{

      x1 = y1 ;
      x2 = y2 ;
      y1 = x1*x1-x2*x2+c1 ;
      y2 = 2.0*x1*x2+c2 ;
      n2 = y1*y1+y2*y2 ; /* Norm ↑ 2 */
      if (n2>4.0) then
         /* skip */
      else plot(y1,y2) ;

}

Geplotten wird, wenn ∥y∥_{2} ≤ 2.0, aber: Falls y_{i} sehr groß (nahe +∞), so wird wegen y_{1} = +∞−∞+c = NaN ebenfalls geplottet! Besser wäre also:

if (n2>4.0) then

⋯

else if unordered(n2,4.0) then

⋯

else · · ·

Beachte also:

if (a>b) then

⋯ else {a ≤ b ∨ unordered(a, b)}

⋯

Extremsituationen

Ausnahmebedingungen:

IEEE- Ausnah- mebedin- gungen Grund des Auftretens Beispiel Ergebnisse ohne Exception-Header

Ungültige Operation Die Operation ist für den auftretenden Operanden nicht definiert. Diese Ausnahmebedingung kann beim x86 auch bei Stack-Fehlern auftreten \sqrt{(−x)} für x > 0 fp op (signaling NaN) 0 · ∞, 0/0, ∞/∞, x rem 0 ungeordneter Vergleich unerlaubte Umwandlung

Quiet NaN

Division durch Null Der Divisor ist gleich Null und der Dividend ist eine endliche Zahl ungleich Null. Allgemeiner: ein exaktes unendliches Ergebnis wird durch eine Operation auf endlichen Operanden geliefert. x/0 für x ≠ 0, ∞ oder NaN log(0)

∞ mit richtigem Vorzeichen Tabellenfortsetzung

Überlauf Ein korrekt gerundetes Ergebnis ist größer als die größte darstellbare Zahl, d.h. der Bereich des Exponenten ist erschöpft.

Double precision: MAXDOUBLE+1.0e294 exp(709.8) Single precision: (float)MAXDOUBLE MAXFLOAT+1.0e32 expf(88.8)

Abhängig

von der Rundungsart (RM) und dem Vorzeichen des Zwischenergebnisses

RM +  −
RN +∞  −∞
RZ + max − max
R− + max −∞
R+ +∞  − max

Unterlauf Tritt auf, wenn das exakte Ergebnis von Null verschieden ist, liegt stets im zwischen ±2^{e_{min}} Double precision: nextafter(min normal,−∞) nextafter(min subnormal,−∞) MINDOUBLE/3.0 exp(−708.5) Single precision: (float)MINDOUBLE nextafterf(MINFLOAT,−∞) expf(-87.4)

Subnormal oder Null

Ungenauig- keit Das gerundete Ergebnis stimmt nicht mit dem exakten Ergebnis überein.

2.0/3.0 (float)1.12345678 log(1.1) MAXDOUBLE+MAXDOUBLE, falls kein Überlauf auftritt Ergebnis der Operation (gerundet), Unter- oder Überlauf

Unnorma- lisierter Ope- rand (nur bei x86)

Versuch, eine arithmetische Operation mit unnormalen Operanden durchzuführen 1.0+MINDOUBLE/2.0 Ergebnis der Operation (gerundet), Unter- oder Überlauf IEEE Funktionen:

Funktion  Beschreibung
math.h  header file
copysign(x,y) x mit y’s Vorzeichen
fabs(x)  Absolutbetrag von x
fmod(x,y)  Rest bei Division von x durch y
ilogb(x)  Exponent zur Basis 2 von x
nextafter(x,y) Nächste darstellbare Zahl von x in Richtung y
remainder(x,y) Rest bei Division von x durch y

scalbn(x,n)  x × 2^{n}

Funktion  Beschreibung

sunmath.h  header file

fp class(x)  Klassifikationsfunktion
isinf(x)  Klassifikationsfunktion
isnormal(x)  Klassifikationsfunktion
issubnormal(x)  Klassifikationsfunktion
iszero(x)  Klassifikationsfunktion
signbit(x)  Klassifikationsfunktion

nonstandard arithmetic(void) Toggle hardware
standard arithmetic(void)  Toggle hardware

IEEE Werte: Single Precision

IEEE Wert  Dezimalwert und  C, C++ und FORTRAN

hexadezimale Darstellung

max normal  3.40282347e+38  r = max normalf();

7f7fffff                        r = r max normal();

min normal  1.17549435e−38  r = min normalf();

00800000                        r = r min normal();

max subnormal 1.17549421e−38  r = max subnormalf();

007fffff                        r = r max subnormal();

min subnormal 1.40129846e−45  r = min subnormalf();

00000001                        r = r min subnormal();
∞  Infinity  r = infinityf();
7f800000                        r = r infinity();
quiet NaN  Nan  r = quiet nanf(0);
7fffffff (SPARC, PowerPC,x86)   r = r quiet nan(0);

7fbfffff (HP700)

signaling NaN NaN  r = signaling nanf(0);
7f800001 (SPARC, PowerPC, x86)  r = r signaling nan(0);

7fc00001 (HP700)

IEEE Werte: Double Precision

IEEE Wert  Dezimalwert und  C, C++ und
hexadezimale Darstellung  FORTRAN
max normal  1.7976931348623157e+308  x = max normal();

7fefffff ffffffff                        x = d max normal();

min normal  2.2250738585072014e−308  x = min normal();

00100000 00000000                        x = d min normal();

max subnormal 2.2250738585072009e−308  x = max subnormal();

000fffff ffffffff                        x = d max subnormal();

min subnormal 4.9406564584214654e−324  x = min subnormal();

00000000 00000001                        x = d min subnormal();
∞  Infinity  x = infinity();
7ff00000 00000000                        x = d infinity();
quiet NaN  Nan  x = quiet nan(0);
7fffffff ffffffff (SPARC, PowerPC,x86)   x = d quiet nan(0);

7ff7ffff ffffffff (HP700)

signaling NaN NaN  x = signaling nan(0);
7ff00000 00000001 (SPARC, PowerPC, x86)  x = d signaling nan(0);

7ff80000 00000001 (HP700)

ulp error

Function Range  f77 1.4 f77 2.0
exp  [−665.42,665.42] −0.87 ulp −0.85 ulp
log  [2^{−16.5}, 2^{16.5}]  +0.81 ulp +0.81 ulp
atan  (−∞, +∞)  −0.59 ulp −0.64 ulp
sin  [0.π/2)  −0.64 ulp −0.60 ulp
cos  [0.π/2)  +0.63 ulp +0.63 ulp

1 ulp ˆ= 1 unit in the last place

1.3 Peripherie

1.3.1 Eingabe

• Tastatur

• Maus (mechanisch, optisch), Trackball

• Strichcodeleser, Magnetkartenleser, aktive Telefonkarten • Scanner mit OCR: maschninelle Schrift, Handschrift • Spracheingabe

• CD’s

1.3.2 Ausgabe

1. Bildschirm • alphanumerisch

• graphisch (schwarz/weiß, bunt mit 8Bit/24Bit-Farbtiefe)

• LCD-Displays für Overhead-Projektionen

• Drucker (Tintenstrahl-, Laser-, Thermotransfer-)

• Plotter

• Diabelichter, Filmbelichter

1.3.3 Massenspeicher

1. Diskette, Festplatten, Disk-Array, MO-Platten, Wechselplatten

2. Magnetkassetten-Laufwerke für Backup: QIC, Exabyte, DAT, DLT

3. ZIP-, Syquest-Magnetwechselplatten

1.4 Datennetze

1. LAN • HW: TokenRing, Ethernet, FDDI, ATM

• Protokolle: TCP/IP, OSI, IPX, DECnet, AppleTalk, ...

2. WAN • analog: Telex, Modems V.34

• analog/digital: Modems V.90, K56flex, X2

• digital: ISDN, X.25, ATM, ADSL

3. Ethernet-Rahmen: IEEE 802.3 CSMA/CD

4. Token (Token-Ring)

[figure: Präambel; Zieladresse; Quelladresse; Daten; PAD; Beginn; Rahmenbegrenzer; Ethernetadresse; Länge; Datenfeld; Prüfsumme; Bytes; 7; 1; 2 oder 6; 2 oder 6; 2; 0-1500; 0-46; 4]

SD AC ED Byte 1 1 1 SD AC Byte 1 1 1 FC Zieladresse Quelladresse Daten Prüfsumme ED FS Token  Datenrahmen 2 oder 6  2 oder 6 unbegrenzt  4 access control starting delimiter  ending delimiter frame status

5. IP-Kopf

je 32 Bit 4 Bit 4  8  1 1 1  13
Version HL Dienstart  Gesamtlänge ≤ 65536
Kennung  NF MF Fragment-Offset
Lebensdauer Protokoll  Prüfsumme des Kopfes
≤ 255sek

Quelladresse Zieladresse Option

HL=header length, NF=non fragmented, MF=more fragments

6. Ethernet

• Kabel: im Backbone Lichtwellenleiter nach FOIRL (alt) oder IEEE 802.3, oder

(a) 10BASE5, Thick Wire, yellow cable

[figure: T; T; Transceiver; 50Ω; ≤ 500m; 50Ω; 2,5m; 2,5m]

mit maximal ansteckbaren 100 Transceivern, Kaskadierung durch

{T \atop FanOut}

(b) 10BASE2, Thin Wire, Cheapernet

≤ 185m T-Stück BNC ≤ 30 Stationen Abstand ≥ 0.5m Koaxidkabel

(c) 10BASE-T, Twisted Pair

[figure: Backbone]

• Große Netze

(a) Repeater: für längere Netze, um elektrischen Störungen zu begegnen, höhere Verfügbarkeit des Netzes: (maximal 2 Repeater dürfen zwischen je zwei Stationen hängen!)

Repeater 500m  500m

(b) Bridge: filtert zusätzlich nach Kennung und Adresse, aber Zeitverzögerung

Bridge Teilnetz  Teilnetz

(c) Bus-Sternstruktur: Ethernet-Switch (∼ Multiport-Bridge mit schnellem internen Bus) oder schneller Backbone nach ATM/FDDI

Bus-Sternstruktur

i.

[figure: Ethernet; X25; ISDN; Router]

ii. Hubs: z.B. auf G.15 (Etagenverteiler)

(d) SNMP-Management

Bridges Transceiver Repeater Switches Router

• Protokolle (a) TCP/IP (UNIX und heterogene Netze)

(b) OSI

(c) IPX (Netware), NetBEUI (Windows NT Server, Windows for Workgrous), NetBIOS (OS/2)

(d) DECnet (Digital-Equipment)

(e) LAT (Digital-Equipment)

(f) AppleTalk (Apple)

• Dienste: NFS, ftp, telnet, rsh/rlogin, smtp, http, ...

1.5 Internet

WWW-Suchmaschinen (Netsearch: Yahoo, Infosearch, Lycos, Magellan, ...), telnet/rlogin, ftp, archie/xarchie, e-mail (smtp, POP3, IMAP4), news (nntp, Schwarzes Brett), whois, X.500, www (gopher), wais = wide area information server, rsh, date, rcp, rdist, X-Window, NFS, RFS, NTP (time), talk, chat, Fax & Telefon übers Internet

• telnet

wminf4%:  telnet rs1.rrz.uni-koeln.de
Trying 134.95.100.208 ...
Connected to rs1.rrz.uni-koeln.de.
Escape character ist 'ˆ]'.
AIX telnet (rs1)
IDM AIX Version 3.2.5 on rs1
(C) Copyrights by IBM and by others 1982, 1991
login:  kg099
kg099's Password:  NNNN

      Welcome to rs1.rrz.Uni-Koeln.DE (IBM RS/6000 58F, AIX 3.2.5)
      - Die Beratung (Tel:  0221-470-4563) ist per E-Mail
       unter beratung@rrz.Uni-Koeln.DE erreichbar
      - Betriebssystemprobleme, Anregungen etc.  bitte
       per E-Mail an mgr@rrz.Uni-Koeln.DE mitteilen
      - Antraege auf Aenderung der File Quota bitte per E-Mail
       an aixmgr@rrz.Uni-Koeln.DE.
      - Bitte beachten Sie die Batch-NQS-Betriebsregelung unter
       news nqs betrieb
Last unsuccesful login:  Fri Jan 26 14:30:04 1996 on pts/28 from
wminf4.math.uni-wuppertal.de
Last login:  Tue Jul 2 14:30:20 1996 on pts/18 from wminf4@math.uni-wuppertal.de

⋮

<↑]>
telnet> help

⋮ • ftp

Name(xxx): account oder anonymous Password: xxxx oder account@

ftp> hash
ftp> binary
ftp> dir
ftp> get abc.txt oder put my.txt
ftp> help
ftp> quit

Auch Netscape benutzbar: ftp.uni-koeln.de, ftp.uni-stuttgart.de, ...

• e-Mail Z.B. mailtool; netscape; mailx

Subject: Cc: To:

Adressen lauten dann beispielsweise account@wmcip4.math.uni-wuppertal.de, ...@compuserve.com, ...@aol.com, ...@uiucrmd.bitnet, ...@xxxxxx.uucp. Bei der Eingabe sollen möglichst keine Umlaute verwendet werden und reines 7Bit ASCII. Multimedia-Inhalte können durch uuencode/uudecode oder (automatisch) MIME (=multi purpose Internet Mail Extensions) ermöglicht werden.

• Newsgroups

rtin/xrn/netscape

• Archie

Einstellungen:

Archie-Host: archie.th-darmstadt.de, archie.switch.ch, archie.doc.ic.ac.uk

Search Type: Exact, Subcase, Regexp, Substring

Other: FTP email address, xxx@wmcip4.math.uni-wuppertal.de

• whois

wminf4% whois buhl

Buhl, Fred (FB73)      fred@PURPLEFROG.COM    904-377-3376
Buhl, Ole (OB167)      hostmaster@MICRONET.DK
                                 +45 4289 3055 (FAX) +45 4566 1015
Buhl, Peter (PB539)    nomailbox@NOWHERE      45-7488-2222
Buhl, Timothy (TB2685) tcb1@ODYSSEY.NET
                                 607-753-9621 (FAX) 607-753-1547
The InterNIC Registration Services Host contains ONLY Internet
Information (Networks, ASN's, Domains, and POC's).
Please use the whois server at nic.ddn.mil for MILNET Information.

• finger

finger @rs1.rrz.uni-koeln.de, finger hg091@rs1.rrz.uni-koeln.de

• rwho im LAN: rup/rusers im LAN

• X.500

Vergleiche: http://www.uni-koeln.de/dienste/x500.html

• netfind

telnet monolith.cc.ic.ac.uk

• gopher

Vergleiche: gopher://gopher.rrz.uni-koeln.de/1,
gopher://gopher.rrz.uni-koeln.de/11/welt

• WWW

Vergleiche http://www.uni-koeln.de/dienste/www/index.html

• Hyper-G

Vergleiche http://www.tu-graz.ac.at

• Wais

Vergleiche: http://gopher.rrz.uni-koeln.de/77/.wais/gopher-data/

• rlogin

rlogin wmcip4 -l account

• rsh rsh wmcip4

• rcp rcp wmcip4:Dateiname .

• rdate rdate wmcip4

• rdist zur Verteilung von Daten

• talk

%mesg n
%mesg y
%talk buhl@wminf1

• irc % irc Nickname (= interrelay chat)

Kapitel 2 Systemsoftware / Basissoftware

2.1 Compiler und Programmentwicklung

Ein Compiler führt einen in einer höheren Programmiersprache geschriebenen Algorithmus in ein Maschinenprogramm über:

[figure: const b = 10.0;; var i : integer;; for i := 0 to 20 do writeln(i/10.0,f(i/10.0);; ...; ...; const; id; =; real; ;; var; id; :; integer; ;; ...; ∈ Token*; ...; relokatibler Code; ohne; a) Dienstleistungen aus Laufzeitbibliothek der Programmiersprache; b) allgemeine Bibliothek; call PCO UNIT,1; ...; call sin,2; Zugleich Überprüfung:; 1) Werden Namen auf einem; Level nur einmal definiert?; 2) Sind definierte Namen zulässig?; 3) Ist *) ein Typname?; ...; Adressenoffset; NNN; 10.0; Datentyp; integer; real; var/const; Variable; const; Name; b; i; ...; Programm; for-Schleife; ;; ;; Name; =; Literal; Name; :; Name *); a.out; executable and linking format (ELF); lexikalische Analyse; syntaktische Analyse; Parsbaum; semantische Analyse; Link-Editor; Programmrumpf; Var-Deklaration; Variablendeklarationen; Konstantendefinitionen; Konstantendefinition]

111 Relokatibler Code:

• CP/M-System: Falls ein Overlay oder ROM-Code erzeugt werden soll, ist eine neue Compilation mit anderer Startadresse nötig.

[figure: ausführbarer Code; mit absoluten Adressen; ab 0x400; Programm; overlay; 0x400; 64 kB]

• Idee: Overlays, Bibliotheksmodule, ... werden verschiebbar mit relativen Adressen erzeugt.

**** RELOCATION INFORMATION ****
.rela.text:

Offset   Symndx  Type  Addend
0x10a9c  63      12    0
0x10aec  63      12    0
0x10ae8  63      9     0
0x10a98  63      9     0

.rela.ex shared:

Offset   Symndx  Type  Addend
0x215cc  56      3     0
0x215c8  36      3     0

.rela.bss:

Offset   Symndx  Type  Addend
0x21648  46      19    0
0x21a70  53      19    0

.rela.plt:

Offset   Symndx  Type  Addend
0x21558  40      21    0
0x21564  68      21    0
0x21570  41      21    0
0x2157c  55      21    0
0x21588  47      21    0
0x21594  52      21    0
0x215a0  71      21    0
0x215ac  45      21    0
0x215b8  66      21    0

• Möglichkeit zur Sicherheit von Prozess-Datenbereichen mit Hilfe von relokatiblem Code:

::::Filemanager Excel In Mehrprozesssystemen (preemptiv) sind zur selben Zeit viele Applikationen im Hauptspeicher:

1. relokatibler Code nötig!

2. Falls per Soft-/Hardware die Adressen von Speicherzugriffen validiert werden, so kann der Zugriff auf Datenbereiche anderer Applikationen unterdrückt werden.

Genauer gilt:

ops .text .data für Filemanager .data für Excel Filemanager Excel  .text .data .bss ... ... ...  Programm (inkl. Konstanten), r-x initialisierte Daten, rwx nicht initialisierte Daten, rwx System

wminf4% size -f xspread
17(.interp) + 4796 (.hash) + 9536(.dynsym) + 5184(.dynstr)
+ 24(.rela.got) + 48(.rela.plt) + 181176(.text) + 12(.init)
+ 12(.fini) + 13872(.rodata) + 6995(.rodata1) + 72(.got) +
152(.dynamics) + 1360(.plt) + 31676(.data) + 28698(.data1)
+ 14708(.bss) = 299646
wminf%4 size -F xspread
223195(r-x) + 76672(rwx) = 300027

wminf%4 size xspread
223195 + 61964 + 14708 = 299867

[figure: Appl. A; Appl. B; Appl. A; Appl. B; Statisches Linken; sin; sin]

[figure: Appl. A; Appl. B; lib; .text; .data Appl A; ...; Appl. A; Appl. B; sin; sin; dynamisches Linken]

dump -Lv Tabelle liefert:
**** DYNAMIC SECTION INFORMATION ****
              .dynamic:
[INDEX] Tag    Value
[1]  NEEDED libpc.so.4
[2]  NEEDED libm.so.1
[3]  NEEDED libc.so.1
[4]  INIT   0x110ec
[5]  FINI   0x11124
[6]  RPATH  /opt/SUNWspro/lib

[7]  HASH   0x100e8
[8]  STRTAB 0x10778
[9]  STRSZ  0x225
[10]  SYMTAB 0x102e8
[11]  SYMENT 0x10
[12]  DEBUG  0x0
[13]  TEXTREL0x0
[14]  PLTGOT 0x21528
[15]  PLTSZ  0x6c
[16]  PLTREL 0x7
[17]  JMPREL 0x10a00
[18]  RELA   0x109a0
[19]  RELASZ 0xcc
[20]  RELAENT0xc

nm Tabelle.o liefert:
[Index] Value Size Type Bind Other Shndx Name
[1]  0     0    FILE LOCL 0     ABS   ./Tabelle.p
[2]  0     0    SECT LOCL 0     2
[3]  0     0    SECT LOCL 0     3
[4]  0     0    SECT LOCL 0     4
[5]  0     0    SECT LOCL 0     5
[6]  0     0    SECT LOCL 0     6
[7]  0     0    SECT LOCL 0     7
[8]  4     4    OBJT GLOB 0     COMMON1
[9]  4     4    OBJT GLOB 0     COMMONPROGFRAME
[10]  16    132  FUNC GLOB 0     2     f
[11]  0     0    NOTY GLOB 0     UNDEF  sin
[12]  0     0    NOTY GLOB 0     UNDEF output
[13]  176   396  FUNC GLOB 0     2     program
[14]  0     0    NOTY GLOB 0     UNDEF  PC0 tb init
[15]  0     0    NOTY GLOB 0     UNDEF  PC0 UNIT
[16]  0     0    NOTY GLOB 0     UNDEF fputc
[17]  0     0    NOTY GLOB 0     UNDEF fprintf

nm hello zeigt auch die Symbole der eingebundenen Bibliotheksmodule:

Symbols from hello:
[Index] Value    Size Type Bind OtherShndx Name

[1]  0        0    FILE LOCL 0    ABS   hello
[2]  65748    0    SECT LOCL 0    1
[3]  65768    0    SECT LOCL 0    2
[4]  66280    0    SECT LOCL 0    3
[5]  67448    0    SECT LOCL 0    4
[6]  68000    0    SECT LOCL 0    5
[7]  68048    0    SECT LOCL 0    6
[8]  68072    0    SECT LOCL 0    7
[9]  68096    0    SECT LOCL 0    8
[10]  68208    0    SECT LOCL 0    9
[11]  69868    0    SECT LOCL 0    10
[12]  69924    0    SECT LOCL 0    11
[13]  69980    0    SECT LOCL 0    12
[14]  69984    0    SECT LOCL 0    13
[15]  69988    0    SECT LOCL 0    14
[16]  136316   0    SECT LOCL 0    15
[17]  136320   0    SECT LOCL 0    16
[18]  136488   0    SECT LOCL 0    17
[19]  136648   0    SECT LOCL 0    18
[20]  136680   0    SECT LOCL 0    19
[21]  136768   0    SECT LOCL 0    20
[22]  0        0    SECT LOCL 0    21
[23]  0        0    SECT LOCL 0    22
[24]  0        0    SECT LOCL 0    23
[25]  0        0    SECT LOCL 0    24
[26]  0        0    SECT LOCL 0    25
[27]  0        0    SECT LOCL 0    26
[28]  0        0    SECT LOCL 0    27
[29]  0        0    SECT LOCL 0    28
[30]  0        0    FILE LOCL 0    ABS   crti.s
[31]  68208    0    NOTY LOCL 0    9      ex text0
[32]  69980    0    NOTY LOCL 0    12     ex range0
[33]  136656   0    NOTY LOCL 0    18     ex shared0
[34]  0        0    FILE LOCL 0    ABS   crt1.s
[35]  136708   0    NOTY LOCL 0    19     crt scratch
[36]  0        0    FILE LOCL 0    ABS   values-Xa.c
[37]  0        0    NOTY LOCL 0    UNDEF
[38]  0        0    NOTY LOCL 0    UNDEF
[39]  0        0    FILE LOCL 0    ABS   ./hello.p
[40]  136768   0    NOTY LOCL 0    20    Bbss.bss
[41]  136720   0    NOTY LOCL 0    19    Ddata.data
[42]  0        0    FILE LOCL 0    ABS   ieee retro.c

[43]  136728   35   OBJT LOCL 0    19    sccsid
[44]  0        0    NOTY LOCL 0    UNDEF
[45]  0        0    NOTY LOCL 0    UNDEF
[46]  0        0    FILE LOCL 0    ABS    ieee retro.S
[47]  0        0    FILE LOCL 0    ABS   crtn.s
[48]  69868    0    NOTY LOCL 0    9      ex text1
[49]  69980    0    NOTY LOCL 0    12     ex range1
[50]  136672   0    NOTY LOCL 0    18     ex shared1
[51]  68208    244  FUNC GLOB 0    9      start
[52]  68688    1024 FUNC WEAK 0    9     ieee retrospective
[53]  136768   4    OBJT GLOB 0    20    i
[54]  136680   4    OBJT GLOB 0    19     environ
[55]  138160   0    OBJT GLOB 0    20     end
[56]  137840   320  OBJT WEAK 0    20     iob
[57]  69796    28   FUNC GLOB 0    9      get accrued
[58]  0        0    NOTY WEAK 0    UNDEF  ex register
[59]  136772   4    OBJT GLOB 0    20    PROGFRAME
[60]  136316   0    OBJT GLOB 0    15     GLOBAL OFFSET TABLE
[61]  69768    28   FUNC GLOB 0    9      get traps
[62]  136536   0    FUNC GLOB 0    UNDEF atexit
[63]  136560   0    FUNC GLOB 0    UNDEF exit
[64]  69824    28   FUNC GLOB 0    9      get direction
[65]  68688    1024 FUNC GLOB 0    9      ieee retrospective
[66]  69868    56   FUNC GLOB 0    10     init
[67]  136620   0    FUNC GLOB 0    UNDEF fputc
[68]  136776   1060 OBJT GLOB 0    20    output
[69]  136584   0    FUNC GLOB 0    UNDEF  PC0 tb init
[70]  136716   4    OBJT GLOB 0    19      Argv
[71]  69740    28   FUNC GLOB 0    9      get nonstandard
[72]  69852    16   FUNC GLOB 0    9      get precision
[73]  136320   0    OBJT GLOB 0    16     DYNAMIC
[74]  136596   0    FUNC GLOB 0    UNDEF  PC0 UNIT
[75]  137840   320  OBJT GLOB 0    20     iob
[76]  68480    208  FUNC GLOB 0    9     program
[77]  136572   0    FUNC GLOB 0    UNDEF  exit
[78]  0        0    NOTY WEAK 0    UNDEF  ex deregister
[79]  136680   4    OBJT WEAK 0    19    environ
[80]  136712   4    OBJT GLOB 0    19     cg89 used
[81]  136712   4    OBJT GLOB 0    19     cg92 used
[82]  136712   4    OBJT GLOB 0    19     fnonstd used
[83]  136763   0    OBJT GLOB 0    19     edata
[84]  136488   0    OBJT GLOB 0    17     PROCEDURE LINKAGE TABLE

[85]  0        0    NOTY GLOB 0    ABS    fsr init value
[86]  70779    0    OBJT GLOB 0    14     etext
[87]  69984    4    OBJT GLOB 0    13     lib version
[88]  136632   0    FUNC GLOB 0    UNDEF fflush
[89]  69712    28   FUNC WEAK 0    9     ieee retrospective
[90]  136548   0    FUNC GLOB 0    UNDEF main
[91]  136684   24   OBJT GLOB 0    19     environ lock
[92]  69924    56   FUNC GLOB 0    11     fini
[93]  136608   0    FUNC GLOB 0    UNDEF fprintf
[94]  69712    28   FUNC GLOB 0    9      ieee retrospective

truss a.out enthüllt die komplexen Systemprozesse, die ein Programmstart initiiert:

execve("./a.out", 0xEFFFF3B0, 0xEFFFF3B8) argc = 1
open("/dev/zero", O RDONLY) = 3
mmap(0x00000000, 4096, PROT READ|PROT WRITE|PROT EXEC, MAP PRIVATE,
3, 0) = 0xEF7C0000
open("/usr/lib/libpc.so.4", O RDONLY) Err#2 ENOENT
open("/usr/openwin/lib/libpc.so.4", O RDONLY) Err#2 ENOENT
open("/usr/ucblib/libpc.so.4", O RDONLY) Err#2 ENOENT
open("/usr/dt/lib/libpc.so.4", O RDONLY) Err#2 ENOENT
open("/opt/local/lib/libpc.so.4", O RDONLY) Err#2 ENOENT
open("/opt/SUNWspro/lib/libpc.so.4", O RDONLY) = 4
fstat(4, 0xEFFFF064) = 0
mmap(0x00000000, 4096, PROT READ|PROT EXEC, MAP SHARED, 4, 0)
= 0xEF7B0000
mmap(0x00000000, 143360, PROT READ|PROT EXEC, MAP PRIVATE, 4,
0) = 0xEF780000
munmap(0xEF790000, 61440) = 0
mmap(0xEF79F000, 12384, PROT READ|PROT WRITE|PROT EXEC, MAP PRIVATE|MAP FIXED,
4, 61440) = 0xEF79F000
close(4) = 0
open("/usr/lib/libm.so.1", O RDONLY) = 4
fstat(4, 0xEFFFF064) = 0
mmap(0xEF7B0000, 4096, PROT READ|PROT EXEC, MAP SHARED|MAP FIXED,
4, 0) = 0xEF7B0000
mmap(0x00000000, 155648, PROT READ|PROT EXEC, MAP PRIVATE, 4,
0) = 0xEF750000
munmap(0xEF765000, 61440) = 0
mmap(0xEF774000, 6056, PROT READ|PROT WRITE|PROT EXEC, MAP PRIVATE|MAP FIXED,
4, 81920) = 0xEF774000
close(4) = 0

open("/usr/lib/libc.so.1", O RDONLY) = 4
fstat(4, 0xEFFFF064) = 0
mmap(0xEF7B0000, 4096, PROT READ|PROT EXEC, MAP SHARED|MAP FIXED,
4, 0) = 0xEF7B0000
mmap(0x00000000, 618496, PROT READ|PROT EXEC, MAP PRIVATE, 4,
0) = 0xEF680000
munmap(0xEF6FE000, 61440) = 0
mmap(0xEF70D000, 28768, PROT READ|PROT WRITE|PROT EXEC, MAP PRIVATE|MAP FIXED,
4, 512000) = 0xEF70D000
mmap(0xEF715000, 4792, PROT READ|PROT WRITE|PROT EXEC, MAP PRIVATE|MAP FIXED,
3, 0) = 0xEF715000
close(4) = 0
open("/usr/lib/libdl.so.1", O RDONLY) = 4
fstat(4, 0xEFFFF064) = 0
mmap(0xEF7B0000, 4096, PROT READ|PROT EXEC, MAP SHARED|MAP FIXED,
4, 0) = 0xEF7B0000
close(4) = 0
mprotect(0x00010000, 5243, PROT READ|PROT WRITE|PROT EXEC) =
0
open("/usr/platform/SUNW,SPARCstation-10/lib/libc psr.so.1",
O RDONLY) Err#2 ENOENT
mprotect(0x00010000, 5243, PROT READ|PROT EXEC) = 0
close(3) = 0
getrlimit(RLIMIT NOFILE, 0xEFFFEEE8) = 0
brk(0x00021BB0) = 0
brk(0x00023BB0) = 0
access("/usr/lib/locale/de/LC CTYPE/ctype", 4) = 0
open("/usr/lib/locale/de/LC CTYPE/ctype", O RDONLY) = 3
read(3, " \ 0 ( (".., 521) = 521
close(3) = 0
access("/usr/lib/locale/de/LC NUMERIC/numeric", 4) = 0
open("/usr/lib/locale/de/LC NUMERIC/numeric", O RDONLY) = 3
read(3, " , ", 2) = 2
close(3) = 0
open("/usr/lib/locale/de/LC TIME/time", O RDONLY) = 3
close(3) = 0
access("/usr/lib/locale/de/LC COLLATE/coll.so", 4) Err#2 ENOENT
access("/usr/lib/locale/de/LC COLLATE/CollTable", 4) = 0
open("/usr/lib/locale/de/LC MONETARY/monetary", O RDONLY) =
3
close(3) = 0
stat("/usr/lib/locale/de/", 0xEFFFEAE0) = 0
open("/usr/dt/lib/nls/msg/de/SUNW SPRO SC libpc.cat.cat", O RDONLY)

Err#2 ENOENT
open("/usr/dt/lib/nls/msg/C/SUNW SPRO SC libpc.cat.cat", O RDONLY)
Err#2 ENOENT
open("../../lib/locale/de/LC MESSAGES/SUNW SPRO SC libpc.cat",
O RDONLY) Err#2 ENOENT
open("/usr/lib/locale/de/LC MESSAGES/SUNW SPRO SC libpc.cat",
O RDONLY) Err#2 ENOENT
sigaction(SIGQUIT, 0x00000000, 0xEFFFF238) = 0
sigaction(SIGQUIT, 0xEFFFF1B8, 0x00000000) = 0
sigaction(SIGILL, 0x00000000, 0xEFFFF238) = 0
sigaction(SIGILL, 0xEFFFF1B8, 0x00000000) = 0
sigaction(SIGTRAP, 0x00000000, 0xEFFFF238) = 0
sigaction(SIGTRAP, 0xEFFFF1B8, 0x00000000) = 0
sigaction(SIGEMT, 0x00000000, 0xEFFFF238) = 0
sigaction(SIGEMT, 0xEFFFF1B8, 0x00000000) = 0
sigaction(SIGFPE, 0x00000000, 0xEFFFF238) = 0
sigaction(SIGFPE, 0xEFFFF1B8, 0x00000000) = 0
sigaction(SIGBUS, 0x00000000, 0xEFFFF238) = 0
sigaction(SIGBUS, 0xEFFFF1B8, 0x00000000) = 0
sigaction(SIGSEGV, 0x00000000, 0xEFFFF238) = 0
sigaction(SIGSEGV, 0xEFFFF1B8, 0x00000000) = 0
sigaction(SIGSYS, 0x00000000, 0xEFFFF238) = 0
sigaction(SIGSYS, 0xEFFFF1B8, 0x00000000) = 0
sigaction(SIGXCPU, 0x00000000, 0xEFFFF238) = 0
sigaction(SIGXCPU, 0xEFFFF1B8, 0x00000000) = 0
sigaction(SIGXFSZ, 0x00000000, 0xEFFFF238) = 0
sigaction(SIGXFSZ, 0xEFFFF1B8, 0x00000000) = 0
ioctl(1, TCGETA, 0xEFFFE8FC) = 0
ioctl(1, TCGETA, 0xEFFFE8FC) = 0
0,00000000000000e+00
write(1, " 0 , 0 0 0 0 0 0 0 0 0".., 22) = 22
1,00000000000000e-01
write(1, " 1 , 0 0 0 0 0 0 0 0 0".., 22) = 22
2,00000000000000e-01
write(1, " 2 , 0 0 0 0 0 0 0 0 0".., 22) = 22
3,00000000000000e-01
write(1, " 3 , 0 0 0 0 0 0 0 0 0".., 22) = 22
4,00000000000000e-01
write(1, " 4 , 0 0 0 0 0 0 0 0 0".., 22) = 22
5,00000000000000e-01
write(1, " 5 , 0 0 0 0 0 0 0 0 0".., 22) = 22
6,00000000000000e-01
write(1, " 6 , 0 0 0 0 0 0 0 0 0".., 22) = 22

7,00000000000000e-01
write(1, " 7 , 0 0 0 0 0 0 0 0 0".., 22) = 22
8,00000000000000e-01
write(1, " 8 , 0 0 0 0 0 0 0 0 0".., 22) = 22
9,00000000000000e-01
write(1, " 9 , 0 0 0 0 0 0 0 0 0".., 22) = 22
1,00000000000000e+00
write(1, " 1 , 0 0 0 0 0 0 0 0 0".., 22) = 22
1,10000000000000e+00
write(1, " 1 , 1 0 0 0 0 0 0 0 0".., 22) = 22
1,20000000000000e+00
write(1, " 1 , 2 0 0 0 0 0 0 0 0".., 22) = 22
1,30000000000000e+00
write(1, " 1 , 3 0 0 0 0 0 0 0 0".., 22) = 22
1,40000000000000e+00
write(1, " 1 , 4 0 0 0 0 0 0 0 0".., 22) = 22
1,50000000000000e+00
write(1, " 1 , 5 0 0 0 0 0 0 0 0".., 22) = 22
1,60000000000000e+00
write(1, " 1 , 6 0 0 0 0 0 0 0 0".., 22) = 22
1,70000000000000e+00
write(1, " 1 , 7 0 0 0 0 0 0 0 0".., 22) = 22
1,80000000000000e+00
write(1, " 1 , 8 0 0 0 0 0 0 0 0".., 22) = 22
1,90000000000000e+00
write(1, " 1 , 9 0 0 0 0 0 0 0 0".., 22) = 22
2,00000000000000e+00
write(1, " 2 , 0 0 0 0 0 0 0 0 0".., 22) = 22
lseek(0, 0, SEEK CUR) = 18206
 exit(0)

ldd -r hello zeigt die benötigten (dynamisch gelinkten) Bibliotheken:

libpc.so.4 => /opt/SUNWspro/lib/libpc.so.4
libc.so.1 => /usr/lib/libc.so.1
libdl.so.1 => /usr/lib/libdl.so.1

truss hello im Falle einer statisch gelinkten Applikation (erzeugt

mittels pc -Bstatic ...):

execve(′′./hello′′, 0xEFFFF3A8, 0xEFFFF3B4) argc = 2
open(′′/dev/zero′′, O RDONLY) = 3
mmap(0x00000000, 4096, PROT READ|PROT WRITE|PROT EXEC, MAP PRIVATE,
3, 0) = 0xEF7C0000
close(3) = 0
getrlimit(RLIMIT NOFILE, 0xEFFFEEE0) = 0
brk(0x00046D90) = 0
brk(0x00048D90) = 0
access(′′/usr/lib/locale/de/LC CTYPE/ctype′′, 4) = 0
open(′′/usr/lib/locale/de/LC CTYPE/ctype′′, O RDONLY) = 3
read(3, ′′\ 0 ( (′′.., 521) = 521
close(3) = 0
access(′′/usr/lib/locale/de/LC NUMERIC/numeric′′, 4) = 0
open(′′/usr/lib/locale/de/LC NUMERIC/numeric′′, O RDONLY) = 3
read(3, ′′ , ′′, 2) = 2
close(3) = 0
open(′′/usr/lib/locale/de/LC TIME/time′′, O RDONLY) = 3
close(3) = 0
access(′′/usr/lib/locale/C/LC CTYPE/ctype′′, 4) = 0
open(′′/usr/lib/locale/C/LC CTYPE/ctype′′, O RDONLY) = 3
read(3, ′′\ 0 ( (′′.., 521) = 521
close(3) = 0
access(′′/usr/lib/locale/C/LC NUMERIC/numeric′′, 4) = 0
open(′′/usr/lib/locale/C/LC NUMERIC/numeric′′, O RDONLY) = 3
read(3, ′′ .\ 0′′, 2) = 2
close(3) = 0
open(′′/usr/dt/lib/nls/msg/de/SUNW SPRO SC libpc.cat.cat′′, O RDONLY)
Err#2 ENOENT
open(′′/usr/dt/lib/nls/msg/C/SUNW SPRO SC libpc.cat.cat′′, O RDONLY)
Err#2 ENOENT
open(′′../../lib/locale/de/LC MESSAGES/SUNW SPRO SC libpc.cat′′,
O RDONLY) Err#2 ENOENT
open(′′/usr/lib/locale/de/LC MESSAGES/SUNW SPRO SC libpc.cat′′,
O RDONLY) Err#2 ENOENT
sigaction(SIGQUIT, 0x00000000, 0xEFFFF230) = 0
sigaction(SIGQUIT, 0xEFFFF1B0, 0x00000000) = 0
sigaction(SIGILL, 0x00000000, 0xEFFFF230) = 0
sigaction(SIGILL, 0xEFFFF1B0, 0x00000000) = 0
sigaction(SIGTRAP, 0x00000000, 0xEFFFF230) = 0
sigaction(SIGTRAP, 0xEFFFF1B0, 0x00000000) = 0
sigaction(SIGEMT, 0x00000000, 0xEFFFF230) = 0
sigaction(SIGEMT, 0xEFFFF1B0, 0x00000000) = 0
sigaction(SIGFPE, 0x00000000, 0xEFFFF230) = 0

sigaction(SIGFPE, 0xEFFFF1B0, 0x00000000) = 0
sigaction(SIGBUS, 0x00000000, 0xEFFFF230) = 0
sigaction(SIGBUS, 0xEFFFF1B0, 0x00000000) = 0
sigaction(SIGSEGV, 0x00000000, 0xEFFFF230) = 0
sigaction(SIGSEGV, 0xEFFFF1B0, 0x00000000) = 0
sigaction(SIGSYS, 0x00000000, 0xEFFFF230) = 0
sigaction(SIGSYS, 0xEFFFF1B0, 0x00000000) = 0
sigaction(SIGXCPU, 0x00000000, 0xEFFFF230) = 0
sigaction(SIGXCPU, 0xEFFFF1B0, 0x00000000) = 0
sigaction(SIGXFSZ, 0x00000000, 0xEFFFF230) = 0
sigaction(SIGXFSZ, 0xEFFFF1B0, 0x00000000) = 0
ioctl(1, TCGETA, 0xEFFFE8FC) = 0
ioctl(1, TCGETA, 0xEFFFE8FC) = 0
0.00000000000000e+00
write(1, ′′ 0 .  0 0 0 0 0 0 0 0 0′′.., 22) = 22
1.00000000000000e-01
write(1, ′′ 1 .  0 0 0 0 0 0 0 0 0′′.., 22) = 22
2.00000000000000e-01
write(1, ′′ 2 .  0 0 0 0 0 0 0 0 0′′.., 22) = 22
3.00000000000000e-01
write(1, ′′ 3 .  0 0 0 0 0 0 0 0 0′′.., 22) = 22
4.00000000000000e-01
write(1, ′′ 4 .  0 0 0 0 0 0 0 0 0′′.., 22) = 22
5.00000000000000e-01
write(1, ′′ 5 .  0 0 0 0 0 0 0 0 0′′.., 22) = 22
6.00000000000000e-01
write(1, ′′ 6 .  0 0 0 0 0 0 0 0 0′′.., 22) = 22
7.00000000000000e-01
write(1, ′′ 7 .  0 0 0 0 0 0 0 0 0′′.., 22) = 22
8.00000000000000e-01
write(1, ′′ 8 .  0 0 0 0 0 0 0 0 0′′.., 22) = 22
9.00000000000000e-01
write(1, ′′ 9 .  0 0 0 0 0 0 0 0 0′′.., 22) = 22
1.00000000000000e+00
write(1, ′′ 1 .  0 0 0 0 0 0 0 0 0′′.., 22) = 22
1.10000000000000e+00
write(1, ′′ 1 .  1 0 0 0 0 0 0 0 0′′.., 22) = 22
1.20000000000000e+00
write(1, ′′ 1 .  2 0 0 0 0 0 0 0 0′′.., 22) = 22
1.30000000000000e+00
write(1, ′′ 1 .  3 0 0 0 0 0 0 0 0′′.., 22) = 22
1.40000000000000e+00
write(1, ′′ 1 .  4 0 0 0 0 0 0 0 0′′.., 22) = 22

1.50000000000000e+00
write(1, ′′ 1 .  5 0 0 0 0 0 0 0 0′′.., 22) = 22
1.60000000000000e+00
write(1, ′′ 1 .  6 0 0 0 0 0 0 0 0′′.., 22) = 22
1.70000000000000e+00
write(1, ′′ 1 .  7 0 0 0 0 0 0 0 0′′.., 22) = 22
1.80000000000000e+00
write(1, ′′ 1 .  8 0 0 0 0 0 0 0 0′′.., 22) = 22
1.90000000000000e+00
write(1, ′′ 1 .  9 0 0 0 0 0 0 0 0′′.., 22) = 22
2.00000000000000e+00
write(1, ′′ 2 .  0 0 0 0 0 0 0 0 0′′.., 22) = 22
lseek(0, 0, SEEK CUR) = 4840
exit(0)

Für eine kurze Übersicht der durchgeführten System-Calls benutze

man truss -c hello:

syscall      seconds  calls  errors
 exit            .00      1
read             .00      2
write            .00     21
open             .01     19      10
close            .01      9
brk              .00      2
stat             .00      1
lseek            .00      1
fstat            .00      4
access           .01      4       1
ioctl            .00      2
execve           .00      1
sigaction        .01     20
mmap             .01     12
mprotect         .00      2
munmap           .00      3
getrlimit        .00     17
sys totals:      .05   1057      11
usr time:        .04
elapsed:         .29

Source and^{include}^{files}  ^{Compiler}^{preprocess.}^{cpp/cppas}  Compiler fronted pc0  Code generator cg  Link editor ld  Executable a.out Symbol conflict checking pc3 Compiler pc Optimizer iropt^{Optimize with}^{-o [level] option}  Libraries Organisation der Pascal-Compilation

Paging: Virtuelles Memory. Problem: Es ergibt sich bei wachsender Laufzeit auch ein erhöter Speicherbedarf!

4 kB 4 kB 4 kB 4 kB 4 kB ⋮ Appl. A Appl. B free  Memory DRAM zusätzliche Memory- Anforderungen  ⋮ 0 4096 8192 12288 16384 Appl. A 100 0x100 - 4096 8192 Zerlegung des Adressraums!! CPU virtuell adress Cache SRAM MMU  RAM

Swapping: Problem: Der aktuelle Applikations-Hauptspeicherbedarf ist größer als das vorhandender RAM.

SWAP- Partition  RAM Appl. A ... Appl. A

1. .text braucht nicht geswapt zu werden. Warum?

2. Mischung von Swapping und Paging:

memory fault ⟶ geswappte Page ⟶ RAM