Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
sp-quiz
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Monitor
Service Desk
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Philip Kaluđerčić
sp-quiz
Commits
2eaf5a60
Commit
2eaf5a60
authored
1 year ago
by
Philip Kaluđerčić
Browse files
Options
Downloads
Patches
Plain Diff
Elaborate some of the answers to the recently added ss21 questions
parent
33f186e9
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
ss21.q
+104
-20
104 additions, 20 deletions
ss21.q
with
104 additions
and
20 deletions
ss21.q
+
104
−
20
View file @
2eaf5a60
...
...
@@ -2,22 +2,21 @@
-
Bei
kooperativem
Scheduling
sind
Prozessumschaltungen
unm
ö
glich
,
wenn
ein
Prozess
in
einer
Endlosschleife
l
ä
uft.
Selbst
wenn
er
bei
jedem
Schleifendurchlauf
einen
Systemaufruf
macht.
Nein
,
laufender
Prozess
gibt
CPU
mit
Systemaufruf
ab.
-
Online
-
Schedulingverfahren
sind
f
ü
r
den
Einsatz
in
Rechnern
ohne
Netzwerkschnittstelle
ungeeignet.
Nein.
Nein
,
mit
dem
Begriff
"online"
ist
nicht
gemeint
,
dass
die
Schedulingverfahren
mit
einem
Netzwerk
interagieren
,
sondern
eine
Klasse
von
Algorithmen
,
welche
ihre
Daten
zur
Ausf
ü
hrungszeit
erhalten
,
im
Gegesatz
zu
"offline"
Algorithmen
,
welche
von
Anfang
an
alle
Daten
zur
Verf
ü
gung
haben
.
+
Verdr
ä
ngende
Schedulingverfahren
k
ö
nnen
nur
mit
Hilfe
von
Unterbrechungen
realisiert
werden.
Ja.
Ja
,
spezifisch
Timer
-
Interrupts
werden
dazu
benutzt
um
selbst
nicht
-
kooperative
Programme
_
unterbrechen_
zu
k
ö
nnen.
Wenn
diese
Ankommen
,
welchselt
die
Ausf
ü
hrung
zum
Betriebsystem
,
und
das
Betriebsystem
kann
den
Scheduler
ansto
ß
en
,
damit
dieser
beliebige
Prozesse
ein
-
und
auslagern
kann
.
-
Deterministische
Schedulingverfahren
sind
nur
in
der
Theorie
relevant
,
da
die
genaue
L
ä
nge
der
CPU
-
St
öß
e
nie
vorhergesagt
werden
kann.
Nein.
.
0
Welche
der
folgenden
Aussagen
zum
Thema
Prozesse
und
Threads
ist
richtig
?
(
2022
-
07
)
+
Bei
schwergewichtigen
Prozessen
ist
die
Schedulingstrategie
durch
das
Betriebssystem
vorgegeben.
Ja.
Ja
,
dieses
ist
der
Fall
f
ü
r
schwer
-
und
leichtgewichtige
Prozesse
,
aber
nicht
mehr
f
ü
r
federgewichtige
,
wo
die
Schedulingstrategie
durch
einen
Scheduler
im
User
-
Space
umgesetzt
wird
.
-
Jeder
federgewichtige
Prozess
(
User
-
Thread
)
und
jeder
leichtgewichtige
Prozess
(
Kern
-
Thread
)
hat
seinen
eigenen
,
gesch
ü
tzten
Adressraum.
Nein
,
teilen
sich
einen
Adressraum.
Nein
,
teilen
sich
einen
Adressraum.
Dieses
w
ä
re
bei
schwergewichtigen
Prozessen
der
Fall.
-
Bei
Blockade
eines
schwergewichtigen
Prozesses
werden
alle
anderen
schwergewichtigen
Prozesse
,
die
das
selbe
Progamm
ausf
ü
hren
,
ebenfalls
blockiert.
Nein
,
schwergewichtige
Prozesse
sind
unabh
ä
ngig
voneinander
,
d.h.
sie
haben
einen
eigenen
Ausf
ü
hrungsfaden.
Nein
,
schwergewichtige
Prozesse
sind
unabh
ä
ngig
voneinander
,
d.h.
sie
haben
einen
eigenen
Ausf
ü
hrungsfaden.
Bei
federgewichtigen
Prozessen
w
ü
rde
das
Problem
bestehen
(
beschr
ä
nkt
auf
den
Kontext
von
einem
Prozess
)
.
-
Unabh
ä
ngig
von
leichtgewichtigen
Prozessen
(
Kernel
-
Threads
)
k
ö
nnen
federgewichtige
Prozesse
(
User
-
Threads
)
Multiprozessoren
ausnutzen.
Nein.
Nein
,
federgewichtige
Prozesse
(
engl.
oft
"[user threads](https://de.wikipedia.org/wiki/User-Thread)"
)
k
ö
nnen
h
ö
chstens
so
viele
Kerne
ausnutzen
,
wie
es
leichtgewichtige
Prozesse
gibt
,
insofern
der
Scheduler
auch
darauf
ausgelegt
ist
die
federgewichtigen
Prozesse
zwischen
kernen
bzw.
leichtgewichtigen
Prozessen
hin
und
her
zu
schalten
.
.
0
Welche
der
folgenden
Aussagen
zum
Thema
RAID
ist
richtig
?
(
2022
-
07
)
...
...
@@ -26,39 +25,124 @@ Ja, da die Paritätsbits auf alle Platten aufgeteilt sind.
-
Bei
RAID
0
k
ö
nnen
nach
Ausfall
einer
der
beteiligten
Platten
die
Daten
durch
die
Information
der
anderen
rekonstruiert
werden.
Nein
,
wenn
eine
Platte
ausf
ä
llt
,
f
ä
llt
das
System
aus.
-
Der
Lesedurchsatz
eines
RAID
-
Systems
mit
mehreren
Platten
ist
prinzipbedingt
geringer
als
der
Lesedurchsatz
einer
einzelnen
Platte.
Nein.
Nein
,
weil
mehr
als
eine
Platte
gleichzeitig
angefragt
werden
kann
um
Daten
zu
liefern
,
und
man
auf
all
diese
Anfragen
gleichzeitig
warten
kann
,
was
schneller
ist
als
wenn
diese
Anfragen
sequenziell
abgearbeitet
werden
m
ü
ssten
.
-
Bei
RAID
4
werden
alle
im
Verbund
beteiligten
Platten
gleichm
äß
ig
beansprucht.
Nein
,
die
Parit
ä
tsplatte
bei
RAID
4
wird
mehr
beansprucht
als
die
anderen
Platten.
.
0
F
ü
r
lokale
Variablen
,
Aufrufparameter
usw.
einer
Funktion
wird
bei
vielen
Prozessoren
ein
Stack
-
Frame
angelegt.
Welche
Aussage
ist
richtig
?
(
2022
-
07
)
-
Ein
Puffer
ü
berlauf
eines
lokalen
Arrays
wird
immer
zu
einem
Segmentation
Fault
f
ü
hren
und
kann
somit
keine
sicherheitskritischen
Auswirkungen
haben.
Nein.
Nein
,
wie
in
der
_
Hacking
Ü
bung_
gezeigt
wird
,
ist
es
m
ö
glich
ü
ber
den
Speicher
eines
Arrays
hinweg
zu
lesen
und
zu
schreiben
,
was
mit
dem
richtigem
Wissen
ausgenutzt
werden
kann.
C
als
Sprache
gibt
nicht
vor
,
welches
verhalten
richtig
ist
(
_
Undefined
Behaviour_
)
,
und
k
ö
nnte
prinzipiell
zur
Laufzeit
oder
insofern
m
ö
glich
statisch
vorhersagen
ob
es
zu
einem
solchem
Fehler
kommt
,
und
das
dann
entsprechend
Behandeln
(
wie
im
Fall
von
anderen
Sprachem
mit
h
ö
here
Typsicherheit
:
Java
,
Ada
,
Rust
,
...
)
.
Ein
Fehler
wie
ein
Segmentation
-
Fault
h
ä
ngt
mit
der
Speichervirtualisierung
,
und
nicht
mit
dem
Sprach
-
Konzept
eines
Arrays
zusammen
,
und
muss
daher
nicht
auftreten
,
wenn
der
Speicher
hinter
dem
Array
verf
ü
gbar
ist
,
auch
wenn
der
Inhalt
aus
sprachlicher
sicht
nicht
definier
ist.
-
Es
ist
nicht
m
ö
glich
auf
lokale
automatic
-
Variablen
zuzugreifen
,
die
sich
im
Stack
-
Frame
einer
anderen
Funktion
befinden.
Doch
,
innerhalb
eines
Threads
k
a
nn
man
auf
den
gesamten
Stack
zugreif
en.
Doch
,
aber
diese
sind
nur
nicht
sichtbar
(
auser
im
Fall
von
Lokalen
Funktionen
)
,
und
m
ü
ssten
als
Speicherreferenzen
ü
bergeben
werden.
Alternativ
k
ö
nn
te
man
mit
Wissen
ü
ber
die
ABI
die
Addresse
von
Variablen
aus
einem
anderem
Stack
Frame
im
gleichem
Thread
berechen.
Aber
inh
ä
rr
ä
nt
gibt
es
allgemein
hierzu
keine
Einschr
ä
nkung
mittels
Speicherschutzmechanism
en.
-
Bei
rekursiven
Funktionsaufrufen
kann
der
Speicher
des
Stack
-
Frames
in
jedem
Fall
wiederverwendet
werden
,
weil
die
gleiche
Funktion
aufgerufen
wird.
Nein
,
Variablen
m
ü
ssen
neu
initialisiert
werden
,
bei
jedem
Funktions
-
Aufruf
->
Stackoverflow
Nein
,
das
ist
nur
dann
m
ö
glich
wenn
die
Funktionen
endrekursiv
sind
,
und
der
Ü
bersetzer
in
der
Lage
ist
diese
zu
entrekursivieren
(
Tail
Call
Optimisation
)
.
Allgemein
ben
ö
tigen
Rekursive
Funktionen
den
Speicher
der
mit
jedem
Aufruf
angelegt
wird
,
um
ihr
Ergebnis
zu
bestimmen
,
bswp.
eine
naive
Implementierung
der
Fakult
ä
tsfunktion
~~~
unsigned
fact
(
unsigned
n
)
{
if
(
n
<=
1
)
{
return
1
;
}
return
n
*
fact
(
n
-
1
);
}
~~~
Speichert
sich
auf
dem
Stack
alle
Werte
von
`n`
bis
`1`
,
und
multipliziert
diese
am
Ende
zusammen
beim
Abwickeln
des
Aufrufbaums.
W
ü
rde
der
Stack
-
Frame
wiederbenutzt
werden
,
w
ü
rde
jeder
Aufruf
die
Speicherstelle
ü
berschreiben
wo
der
Wert
von
`n`
aus
jedem
vorherigem
Aufruf
auch
gespeichert
w
ä
re
,
und
das
Endergebnis
w
ä
re
damit
verf
ä
lscht
(
in
dem
Fall
w
ä
re
es
`n`
quadriert
)
.
+
Wenn
in
einem
UNIX
-
Prozess
mehrere
Threads
parallel
laufen
,
ben
ö
tigt
jeder
von
ihnen
einen
eigenen
Stack.
Ja.
Ja.
Wenn
die
Anzahl
der
Threads
nicht
statisch
bekannst
ist
(
wie
in
C
mit
Pthreads
im
Allgemeinem
der
Fall
ist
)
,
dann
wird
der
Speicher
f
ü
r
jeden
Thread
dynamisch
auf
der
Halde
angelegt.
.
1
Welche
der
folgenden
Aussagen
zu
UNIX
/
Linux
-
Dateideskriptoren
sind
korrekt
?
(
2022
-
07
)
-
Ein
Dateideskriptor
ist
eine
Verwaltungsstruktur
,
die
auf
der
Festplatte
gespeichert
ist
und
Informationen
ü
ber
Gr
öß
e
,
Zugriffsrechte
,
Ä
nderungsdatum
usw.
einer
Datei
enth
ä
lt.
Nein
,
ist
p
rozess
l
okal
gespeicher
t.
Nein
,
mit
dieser
Aussage
ist
die
Inode
Abstraktion
gemeint.
Au
ß
erdem
geht
es
nicht
um
die
Speicherung
eines
Deskriptors
bei
der
P
rozess
-
L
okal
it
ä
t
,
sondern
dass
die
Interpretation
des
Wertes
von
einem
Deskriptors
vom
Betriebsystem
bei
Systemaufrufen
get
ä
tigt
wird
,
indem
dieser
ü
berpr
ü
ft
welcher
Prozess
den
Systemaufruf
abgesetzt
ha
t.
+
Nach
dem
Aufruf
von
fork
(
2
)
teilen
sich
die
Prozesse
die
den
gemeinsamen
Dateideskriptoren
zu
Grunde
liegenden
Kernel
-
Datenstrukturen.
Ja
,
definiert
von
fork
(
2
)
.
Ja
,
ist
auch
sinnvoll
,
wenn
man
will
,
dass
Prozesse
die
Standard
Ein
-
und
Ausgabe
vererben
,
was
die
Grundlage
von
einer
Shell
bildet.
Dieses
kann
zu
Nebenl
ä
ufigkeitsfehlern
f
ü
hren
!
Nimmt
man
Beispielsweise
dieses
Programm
,
welches
in
zwei
Prozessen
ausgef
ü
hrt
wird
:
~~~
#
include
<
stdio.h
>
#
include
<
unistd.h
>
int
main
()
{
/* disable output buffering: */
setvbuf
(
stdout
,
NULL
,
_
IONBF
,
0
);
/* child writes "a\n", parent writes "b\n" */
char
*
line
=
0
==
fork
()
?
"a"
:
"b"
;
for
(;;)
puts
(
line
);
return
0
;
}
~~~
und
l
ä
sst
es
eine
Sekunde
lang
laufen
,
~~~
$
timeout
0.1
./
a.out
>
out
$
uniq
-
c
out
|
sort
|
uniq
1
1
a
1
ab
1
b
1
ba
2
a
2
b
3
b
4
a
4
b
63
b
7
a
~~~
sieht
man
,
dass
die
Ausgabe
irregul
ä
r
ist
,
und
davon
abh
ä
ngt
wie
der
Scheduler
die
Prozesse
ein
und
ausgelagert
hat.
Wenn
man
mit
dem
Systemaufruf
`nice
(
2
)
`
die
Priorit
ä
t
eines
Prozesses
ver
ä
ndert
,
dann
ä
ndert
sich
entsprechend
auch
die
Ausgabe.
Hier
bspw.
hat
man
nach
dem
`fork
(
2
)
`
die
Priorit
ä
t
vom
Eltern
-
Prozess
(
`
"b
\n
"
`
)
erh
ö
rt
:
~~~
$
timeout
0.1
./
a.out
>
out
$
uniq
-
c
out
|
sort
|
uniq
|
sort
-
nr
189
b
50
a
44
a
34
b
31
b
27
b
20
b
16
b
13
b
11
b
10
b
5
b
5
a
4
b
4
a
3
b
3
a
2
b
2
a
1
ba
1
b
1
ab
1
a
1
~~~
+
Ist
das
Flag
FD_CLOEXEC
eines
Dateideskriptors
gesetzt
,
dann
wird
dieser
Dateideskriptor
geschlossen
,
sobald
der
Prozess
eine
Funktion
der
exec
-
Familie
aufruft.
Ja
,
definiert
von
FD_CLOEXEC.
Ja
,
definiert
von
`
FD_CLOEXEC
`
.
+
Ein
Dateideskriptor
ist
eine
prozesslokale
Integerzahl
,
die
der
Prozess
zum
Zugriff
auf
eine
Datei
benutzen
kann.
Ja.
Ja.
Dabei
ist
wichtig
,
dass
diese
Zahl
keine
Bedeutung
f
ü
r
den
Prozess
selbst
hat
,
sondern
nur
als
Identifikation
einer
Ressourcenzuteilung
f
ü
r
den
jeweiligen
Prozess
dienst.
Daher
kann
der
Wert
nicht
ohne
weiteres
zwischen
Prozessen
umher
gereicht
werden.
-
Ein
Dateideskriptor
ist
eine
Integerzahl
,
die
ü
ber
gemeinsamen
Speicher
an
einen
anderen
Prozess
ü
bergeben
werden
kann
und
von
letzterem
zum
Zugriff
auf
eine
ge
ö
ffnete
Datei
verwendet
werden
kann.
Nein
,
ist
eine
prozesslokale
Integerzahl.
+
Auch
Netzwerkverbindungen
werden
ü
ber
einen
Dateideskriptor
referenziert.
Ja.
-
Wird
ein
Dateideskriptor
mittels
des
dup
(
2
)
-
Systemaufruf
vervielf
ä
ltigt
,
k
ö
nnen
die
Zugriffsrechte
auf
dem
resultierendem
Deskriptor
unabh
ä
ngig
vom
urspr
ü
nglichen
ge
ä
ndert
werden.
Nein.
Nein
,
weil
diese
sich
auf
die
gleiche
Verwaltungsstruktur
im
Betriebssystemkern
beziehen
.
-
Dateideskriptoren
sind
Zeiger
auf
Betriebssystem
-
interne
Strukturen
,
die
von
den
Systemaufrufen
ausgewertet
werden
,
um
auf
Dateien
zuzugreifen.
Nein
,
ist
eine
Integerzahl
.
Nein
,
obzwar
ein
Zeiger
f
ü
r
ü
blich
auch
ein
Integerzahl
ist
,
verweist
ein
Datei
-
Deskriptor
nicht
direkt
auf
eine
Speicherstelle
welche
direkt
derefernziert
werden
kann
,
wie
bei
einem
gew
ö
hnlichem
Zeiger.
Um
auf
die
jeweiligen
Strukturen
im
Betriebsystem
zu
verweisen
,
muss
das
Betriebsystem
den
Datei
-
Deskriptor
interpretieren
(
oft
bspw.
als
Index
in
einem
Array
von
Zeigern
auf
eben
die
Betriebssystem
-
interne
Strukturen
)
.
.
1
Welche
der
folgenden
Aussagen
zum
Thema
persistenter
Datenspeicherung
sind
richtig
?
(
2022
-
07
)
...
...
@@ -71,9 +155,9 @@ Nein.
-
Bei
indizierter
Speicherung
kann
es
prinzipbedingt
nicht
zu
Verschnitt
kommen.
Doch
,
es
kann
zu
Verschnitt
kommen
,
da
der
Speicher
in
Bl
ö
cke
unterteilt
wird.
(
Verschnitt
:
manche
Speicherbl
ö
cke
bei
Aufteilung
von
Daten
k
ö
nnen
nur
zum
Teil
gef
ü
llt
werden
)
+
Bei
kontinuierlicher
Speicherung
von
Daten
ist
es
unter
Umst
ä
nden
mit
enormem
Aufwand
verbunden
,
eine
bestehende
Datei
zu
vergr
öß
ern.
Ja
,
dynamisches
Erweitern
schwierig.
Ja
,
dynamisches
Erweitern
schwierig
,
weil
es
das
umherbewegen
ganzer
Dateien
ben
ö
tigen
k
ö
nnte
,
welche
jeweils
alle
wieder
in
freien
,
kontinuierlichen
Speicherbereichen
gelegt
werden
m
ü
ssten.
Das
wird
besonders
dann
erschwert
,
wenn
mehre
Prozesse
versuchen
lesend
oder
schreibend
auf
das
Dateisystem
zuzugreifen
.
-
Im
Vergleich
zu
den
anderen
Verfahren
ist
bei
indizierter
Speicherung
die
Positionierzeit
des
Festplatten
-
Armes
beim
Zugriff
auf
alle
Datenbl
ö
cke
einer
Datei
minimal.
Nein.
Nein.
Allgemein
hat
die
Positionierzeit
nichts
direkt
mit
dem
Dateisystem
zu
tun.
Ein
Dateisystem
k
ö
nnte
so
ausgelegt
sein
,
um
gro
ß
e
Spr
ü
nge
des
Festplatten
-
Armes
zu
vermeiden.
+
Journaling
-
Dateisysteme
garantieren
,
dass
auch
nach
einem
Systemausfall
alle
Metadaten
wieder
in
einen
konsistenten
Zustand
gebracht
werden
k
ö
nnen.
Ja
,
mit
Hilfe
der
Log
-
File.
+
Festplatten
eignen
sich
besser
f
ü
r
sequentielle
als
f
ü
r
wahlfreie
Zugriffsmuster.
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment