On Thu, 08 Dec 2011 11:02:16 +0100, David Wührer wrote:
> Bernd Petrovitsch wrote:
>> On Thu, 01 Dec 2011 12:47:14 +0100, David Wührer wrote:
>>> Bernd Petrovitsch wrote:
>>>> On Tue, 29 Nov 2011 17:20:35 +0100, David Wührer wrote:
>
>> Du hast eine erschreckende komische Vorstellung von Hardware.
>
> Wie viele Pages parallel kann eine Festplatte schreiben?
- Hängt von der Festplatte ab.
- "Parallel" in welchem Sinne bzw. auf welcher Ebene/Layer?
Hat der OP überhaupt etwas von einer Festplatte geschrieben?
Der hat das Filesystem drunter - WIMRE - gar nicht erwähnt.
>> ?? Zuerts versuchst Du, Cache-Kohärenz-Probleme zu konstruieren und dann
>> wird der n+1. Cache ignoriert?
>
> Weil das ein völlig anderer Cache an einer völlig anderen Stelle ist.
> Wäre die Festplatte oder deren Cache kaputt, würde es mit ksh auch nicht
> gehen.
Selbiges gilt für den Page-Cache, Buffer-Cache, 1st und 2nd-Level-RAM-Cache,
die Pipeline und Register der CPU (und ich hab bestimmt noch irgendwo einen
Cache iwS vergessen ....).
>> Ja, aber die existiert unter dem VFS-Layer und der gesamte User-Space
>> sieht über den einzigen VFS dasselbe von drunter existierenden Diskspace.
>
> Was nicht bedeutet, dass die Geräte darunter sich auch identisch verhalten.
Das ist der Job (und der originäre Sinn) des Gerätetreibers, daß sich die
Geräte drunter "identisch verhalten" - und zwar so, wie es der VFS von oben
vorgibt. Und oberhalb des VFS verhält sich alles identisch - sonst hätte
der VFS ja keinen (besonderen) Sinn.
> Aber da der Fehler in der RAM-Disk genauso auftritt, liegt er wohl nicht an
> irgend einem Gerät.
An der RAM-Disk - die ist auch ein "Gerät" (wenn es als deutsche Übersetzung
von "Device" versteht).
Ist das Verhalten verschieden, wenn man das Filesystem drunter wechselt?
Da von kann ich nirgendwo etwas finden.
>> Die ksh verläßt sich auf den Kernel - in Ermangelung von Alternativen.
>
> So wenig wie möglich.
Aber am Sys-Call-Layer kommt die auch nicht vorbei - und das ist so minimal
wie möglich.
> Dateien werden zwar mit open() geöffnet, aber die ksh merkt sich auch, von
> welchem Dateisystem (das dann dort disc heißt) jede Datei stammt.
> Synchronisiert werden die Dateien über eigene Mutexes, und geschrieben mit
> memmove(). read() und write() werden nicht gebraucht.
Die mmap()ed die Files? Oder wie kommen der Inhalt des Files in den Adreßraum
des Prozesses?
Und ja, ich will hier Sys-Calls (inkl. relevanter Parameter) lesen und keine
flapsigen Ausdrücke, die mehrere verschiedenen Interpretationen zu lassen,
> Die Funktionalität des Betriebssystems wird also dupliziert.
Tja, ein Punkt mehr, die ksh nicht zu verwenden.
> Nicht die gesamte natürlich, aber der Teil, der sich um die logische
> Integrität von Dateien kümmert, und ein Teil der Optimierung des
> Zurückschreibens von Daten.
Das ist mbMn ein großer strategischer Fehler, daß eine Applikation auf
einem relativ hohen Layer versucht, intelligenter wie die drunteren zu
sein und das ohne spezielles Wissen bzw. Annahmen über die drunteren
Layer. Vom "optimieren" (was immer das im Detail wirklich meint) mal
ganz abgesehen. Tja ....
>> Abgesehen davon hat die Existenz vs Nicht-Existenz eines Files nichts mit
>> der Implementierung einer stdio-Lib zu tun - die verwendet unten ja auch
>> nur open(2) und entweder geht das gut oder nicht.
>
> Sobald eine Datei gelöscht oder überschrieben wird, während sie geöffnet
> oder gelesen wird, hängt das schon von der Implementierung ab.
Am Sys-Call-Layer kenn' ich nur eine korrekte Implementierung (die mbMn von
POSIX zwingend die Folge ist - bzw. umgekehrt):
- Das obige flapsige untechnische "File wird gelöscht" heißt ja in
technischer Realität nur, daß der Hardlink vom (später gelöschten)
Filenamen zum Inode entfernt wird (und sonst nichts anderes!).
Gibt es weitere Hardlinks, gibt es das File weiter (und wenn nicht, wird
es gelöscht und der verbrauchte Diskspace freigegeben, wenn der letzte
Prozeß, der es verwendet hat, das File geschlossen hat).
Und wenn das File von anderen Prozessen geöffnet wurde, ändert sich für
diese Prozesse auch nichts - die können weiter drauf lesen, schreiben,
etc. unabhängig davon, ob der Linkcount == 0 oder != 0 ist.
Und ob es 2 Sekunden später den Filenamen wieder gibt, ist auch
unerheblich.
- Das obige flapsige untechnische "File wird überschrieben" interpretier'
ich als "read/write-Öffen und dann drauf schreiben".
Da ändert sich am File als solchem nur der Inhalt und ein paar Meta-Daten
(wie z.B. Last-Modified-Time und u.U. die Größe).
Alle *Prozesse*, die dasselbe File auch offen haben, sehen die Änderungen
nach einem write(2) bzw. - wenn der Prozeß es ge-mmap(2)t hat - (spätestens)
nach einem msync(2) ganz egal, ob bzw. wann das auf etwaiger Hardware
landet.
Das "nach einem" ist spätestens bei Multi-Core-CPUs u.ä. nicht näher
definierbar (aber letztendlich auch auf Single-CPU-Systemen nicht - hängt
ja immer vom Scheduling ab .....).
Aber in dem Fall, daß mehrere Prozesse (potentiell) parallel den Inhalt des
*selben* Files verändern, muß man sich um die Synchronisation sowieso
Gedanken machen und das auf Applikationsebene lösen - das geht weiter unten
ja sowieso nicht, daß der Kernel Synchronisation im Sinne einer Applikation
macht.
Und das ist das Verhalten am Sys-Call-Level und es spielt keine Rolle, ob das
Filesystem drunter irgendeine Art von RAM-Disk oder echter Festplatte oder
NAND-Flash ist.
> In diesem Fall wird eine Datei mehrere hundert Mal geöffnet, geschrieben und
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> geschlossen, aber die ksh macht genau ein open() dafür.
^^^^^^^^^^
Magst Du das nicht etwas (wenigstens in sich) widerspruchfreies hinschreiben?
Inhaltlich ist es auch falsch i.Ü. - da wird jedesmal ein neues File geöffnet.
Diese verschiedenen Files haben halt denselben Filenamen den es dazwischen
kurzzeitig nicht gibt.
>> Ah ja, das Rad neu erfunden und parallel implementiert ....
>
> Und einen Bug vermieden oder umgangen dabei, wie es scheint.
Ein Bug in der bash wird umgangen, in dem die ksh verwendet wird?
Oh welch Wunder ...
Oder was *genau* hast Du gemeint?
Daß die ksh-Entwickler Code schreiben, der eine Linux-Kernel-Bug kaschiert?
Daß mehrere unixoide Kernels denselben "Bug" haben und deshalb in der ksh
Code steht, der um diesen herumarbeitet?