Hallo *, unter Linux zählen Pipes zu den häufig benutzten Dingen. (bedingt durch das Prinzip "keep-it-small-and-simple") Mich würde mal interessieren wie dieser Pipe-Mechanismus "intern" aussieht. Legt der Kernel bei _jeder_ Pipe-Datenübergabe zwischen zwei Programmen (für den Benutzer unmerkbar) kurzzeitig eine temporäre "Zwischendatei" an, oder läuft das nur im RAM ab? Wenn sehr viele Daten von einem zum nächsten Programm übergeben werden dann müßte dem Kernel doch eigentlich gar nichts anderes übrig bleiben als mal kurz eine temporäre "Zwischendatei" anzulegen? Schließlich ist auch der größte Arbeitsspeicher irgendwann mal "aufgebraucht". Oder? Aber macht er das auch bei wenig Daten? Hintergrund meiner Frage ist ein Laufzeitproblem eines Bash-Skripts, und die Überlegung ob eine Datenübergabe per Pipes vielleicht schneller geht als per temporärer "Zwischendateien" auf einer Ramdisk. Ralph
Moin,
* Ralph Müller
Mich würde mal interessieren wie dieser Pipe-Mechanismus "intern" aussieht. Legt der Kernel bei _jeder_ Pipe-Datenübergabe zwischen zwei Programmen (für den Benutzer unmerkbar) kurzzeitig eine temporäre "Zwischendatei" an, oder läuft das nur im RAM ab? Das läuft nur im RAM ab. Der eine Prozess schreibt in die Pipe, der andere liest daraus. Da wird im Kernelspeicher vermutlich erwas gepuffert, der Rest spielt sich aber in den beiden Prozessen ab.
Wenn sehr viele Daten von einem zum nächsten Programm übergeben werden dann müßte dem Kernel doch eigentlich gar nichts anderes übrig bleiben als mal kurz eine temporäre "Zwischendatei" anzulegen? Schließlich ist auch der größte Arbeitsspeicher irgendwann mal "aufgebraucht". Oder? Aber macht er das auch bei wenig Daten? Das ist nicht nötig, weil die Daten 'sofort' vom zweiten Prozess verbraucht werden.
Hintergrund meiner Frage ist ein Laufzeitproblem eines Bash-Skripts, und die Überlegung ob eine Datenübergabe per Pipes vielleicht schneller geht als per temporärer "Zwischendateien" auf einer Ramdisk. Davon würde ich ausgehen.
Thorsten -- Fear leads to anger. Anger leads to hate. Hate leads to using Windows NT for mission-critical applications.
Am Sonntag, 17. Februar 2002 17.46 schrieb Thorsten Haude:
Moin,
* Ralph Müller
[02-02-17 17:04]: Mich würde mal interessieren wie dieser Pipe-Mechanismus "intern" aussieht.
Das läuft nur im RAM ab. Der eine Prozess schreibt in die Pipe, der andere liest daraus. Da wird im Kernelspeicher vermutlich erwas gepuffert, der Rest spielt sich aber in den beiden Prozessen ab.
Wenn sehr viele Daten von einem zum nächsten Programm übergeben werden dann müßte dem Kernel doch eigentlich gar nichts anderes übrig bleiben als mal kurz eine temporäre "Zwischendatei" anzulegen? Schließlich ist auch der größte Arbeitsspeicher irgendwann mal "aufgebraucht". Oder? Aber macht er das auch bei wenig Daten?
Das ist nicht nötig, weil die Daten 'sofort' vom zweiten Prozess verbraucht werden.
Pipes werden normalerweise auf ca. 4KB Grösse begrenzt. IIRC gibt es da sogar ein define in irgendeiner Header Datei. Die Grösse kann wahrscheinlich auch irgendwo in den Kernel Quellen festgelegt werden. Wenn nämlich der Daten verarbeitende(lesende) Prozess langsamer als der Produzierende(schreibende) ist, würde irgendwann der Speicher knapp. -- Grüsse Urs Registered Linux-User: #248694
Moin,
* Urs Schaffner
Am Sonntag, 17. Februar 2002 17.46 schrieb Thorsten Haude:
* Ralph Müller
[02-02-17 17:04]: Wenn sehr viele Daten von einem zum nächsten Programm übergeben werden dann müßte dem Kernel doch eigentlich gar nichts anderes übrig bleiben als mal kurz eine temporäre "Zwischendatei" anzulegen? Schließlich ist auch der größte Arbeitsspeicher irgendwann mal "aufgebraucht". Oder? Aber macht er das auch bei wenig Daten? Das ist nicht nötig, weil die Daten 'sofort' vom zweiten Prozess verbraucht werden. Pipes werden normalerweise auf ca. 4KB Grösse begrenzt. IIRC gibt es da sogar ein define in irgendeiner Header Datei. Die Grösse kann wahrscheinlich auch irgendwo in den Kernel Quellen festgelegt werden. Wenn nämlich der Daten verarbeitende(lesende) Prozess langsamer als der Produzierende(schreibende) ist, würde irgendwann der Speicher knapp. Würde es nicht reichen, den schreibenden Prozess zu blockieren?
Thorsten -- Wasn't the storming of the Bastille an act of terrorism? Probably. Now it's a holiday. - umarsyed
hi, On Sun, Feb 17, 2002 at 06:32:39PM +0100, Thorsten Haude wrote:
Würde es nicht reichen, den schreibenden Prozess zu blockieren? das wird er auch. oder zumindest kann und sollte er das selber tun. wenn die pipe voll ist schlaegt der schreibbefehl fehl. man kann auch irgendwie nachschauen warum, aber das war nicht die frage. man kann dann die pipe 'pollen' bis man weiterschreiben kann.
ciao sascha -- Sascha Andres linux@programmers-world.com http://www.programmers-world.com
Moin,
* Sascha Andres
On Sun, Feb 17, 2002 at 06:32:39PM +0100, Thorsten Haude wrote:
Würde es nicht reichen, den schreibenden Prozess zu blockieren? das wird er auch. oder zumindest kann und sollte er das selber tun. wenn die pipe voll ist schlaegt der schreibbefehl fehl. man kann auch irgendwie nachschauen warum, aber das war nicht die frage. man kann dann die pipe 'pollen' bis man weiterschreiben kann. Was nun, blockiert er oder schlägt er fehl?
Thorsten -- He who receives an idea from me, receives instruction himself without lessening mine; as he who lights his taper at mine, receives light without darkening me. - Thomas Jefferson
Was nun, blockiert er oder schlägt er fehl? schlaegt nicht fehl. mein fehler, ist nicht mein tag heute... der schreibende prozess wird, wenn die pipe voll ist 'schlafen' geschickt. wenn ein prozess nun aus der pipe
hi, On Sun, Feb 17, 2002 at 06:59:08PM +0100, Thorsten Haude wrote: liest, weiss der kernell anhand seiner prozesstabellen, dass ein prozess in die pipe schreiben wollte, und schaeft. dieser wird nun geweckt. fehl schlagen tut er wenn ich das ganze asynchron mache, also explizit nicht schlafen geschickt werde. ciao sascha -- Sascha Andres linux@programmers-world.com http://www.programmers-world.com
Am Sonntag, 17. Februar 2002 18.59 schrieb Thorsten Haude:
Moin,
* Sascha Andres
[02-02-17 18:29]: On Sun, Feb 17, 2002 at 06:32:39PM +0100, Thorsten Haude wrote:
Würde es nicht reichen, den schreibenden Prozess zu blockieren?
das wird er auch. oder zumindest kann und sollte er das selber tun. wenn die pipe voll ist schlaegt der schreibbefehl fehl. man kann auch irgendwie nachschauen warum, aber das war nicht die frage. man kann dann die pipe 'pollen' bis man weiterschreiben kann.
Was nun, blockiert er oder schlägt er fehl?
Normalerweise blockiert das 'write', ausser man schreibt nichtblockierend (NONBLOCKING), was ein Fehlschlagen des write zur Folge hat. -- Grüsse Urs Registered Linux-User: #248694
* Thorsten Haude schrieb am 17.Feb.2002:
* Sascha Andres
[02-02-17 18:29]:
On Sun, Feb 17, 2002 at 06:32:39PM +0100, Thorsten Haude wrote:
Würde es nicht reichen, den schreibenden Prozess zu blockieren? das wird er auch. oder zumindest kann und sollte er das selber tun. wenn die pipe voll ist schlaegt der schreibbefehl fehl. man kann auch irgendwie nachschauen warum, aber das war nicht die frage. man kann dann die pipe 'pollen' bis man weiterschreiben kann. Was nun, blockiert er oder schlägt er fehl?
Probier es doch aus. man pipe Bernd -- Was ist quoten? Quoten ist das Zitieren aus einer mail, der man antwortet. Und wie macht man es richtig? Zitate werden mit "> " gekennzeichnet. Nicht mehr als nötig zitieren. Vor den Abschnitten das Zitat, auf das man sich bezieht, mit einer Zeile Abstand oben und unten. |Zufallssignatur 12
* On Sun, 17 Feb 2002 at 18:32 +0100, Thorsten Haude wrote:
* Urs Schaffner
[02-02-17 18:06]: Am Sonntag, 17. Februar 2002 17.46 schrieb Thorsten Haude:
* Ralph Müller
[02-02-17 17:04]: Wenn sehr viele Daten von einem zum nächsten Programm übergeben werden dann müßte dem Kernel doch eigentlich gar nichts anderes übrig bleiben als mal kurz eine temporäre "Zwischendatei" anzulegen? Schließlich ist auch der größte Arbeitsspeicher irgendwann mal "aufgebraucht". Oder? Aber macht er das auch bei wenig Daten? Das ist nicht nötig, weil die Daten 'sofort' vom zweiten Prozess verbraucht werden. Pipes werden normalerweise auf ca. 4KB Grösse begrenzt. IIRC gibt es da sogar ein define in irgendeiner Header Datei. Die Grösse kann wahrscheinlich auch irgendwo in den Kernel Quellen festgelegt werden. Wenn nämlich der Daten verarbeitende(lesende) Prozess langsamer als der Produzierende(schreibende) ist, würde irgendwann der Speicher knapp. Würde es nicht reichen, den schreibenden Prozess zu blockieren?
Ich würde sagen, nachdem die Pipes in der Grösse begrenzt sind, wird der schreibende Prozeß solange blockiert, bis wieder was frei ist - interpretiere ich da falsch? -- Adalbert PGP welcome, request public key: mailto:adalbert+key@lopez.at
Moin,
* Adalbert Michelic
* On Sun, 17 Feb 2002 at 18:32 +0100, Thorsten Haude wrote:
Würde es nicht reichen, den schreibenden Prozess zu blockieren? Ich würde sagen, nachdem die Pipes in der Grösse begrenzt sind, wird der schreibende Prozeß solange blockiert, bis wieder was frei ist - interpretiere ich da falsch? Das meinte ich.
Thorsten -- It has become appallingly obvious that our technology has exceeded our humanity. - Albert Einstein
Am Sonntag, 17. Februar 2002 18.32 schrieb Thorsten Haude:
* Urs Schaffner
[02-02-17 18:06]: Am Sonntag, 17. Februar 2002 17.46 schrieb Thorsten Haude:
* Ralph Müller
[02-02-17 17:04]:
Pipes werden normalerweise auf ca. 4KB Grösse begrenzt. IIRC gibt es da sogar ein define in irgendeiner Header Datei. Die Grösse kann wahrscheinlich auch irgendwo in den Kernel Quellen festgelegt werden. Wenn nämlich der Daten verarbeitende(lesende) Prozess langsamer als der Produzierende(schreibende) ist, würde irgendwann der Speicher knapp.
Würde es nicht reichen, den schreibenden Prozess zu blockieren?
Der wird auch durch das Betriebssystem (Linux/Unix) blockiert (bleibt im write hängen). Ist dann wieder Platz vorhanden (beim lesen entsteht ja wieder Platz), wird er wieder geweckt. -- Grüsse Urs Registered Linux-User: #248694
participants (6)
-
Adalbert Michelic
-
B.Brodesser@t-online.de
-
Ralph Müller
-
Sascha Andres
-
Thorsten Haude
-
Urs Schaffner