Ich brauche Unterstützung, um zu verstehen, was meines Erachtens ein grundlegendes Konzept in Linux ist: das Limit für offene Dateien. Insbesondere bin ich verwirrt darüber, warum offene Sockets zur Gesamtzahl der "offenen Dateien" auf einem System zählen können.
Kann jemand bitte den Grund erläutern, warum? Ich verstehe, dass dies wahrscheinlich auf das gesamte Prinzip "Alles ist eine Datei" in Linux zurückgeht, aber jedes weitere Detail wäre willkommen.
quelle
read
/write
, die das Herzstück dessen ist, was es bedeutet, eine Datei zu sein.shutdown(2)
Syscall drauf, aber nicht auf Dateien, und du kannst nicht mit einem Socket lesencat
- das ist der Grund, warumnetcat
das erstellt wurde. Ich würde sagen, dass sich (glücklicherweise) Sockets in Unix-ähnlichen Kerneln wie Dateien in Bezug auf E / A verhalten, aber die Ähnlichkeit endet genau dort. (Ganz ehrlich, ich würde auch gerne von jemandem mit Plan 9-Erfahrung hören, da ich gehört habe, dass sie diese Dinge weiter vereinheitlichen als herkömmliche Unices).Der Grund , warum TCP / IP - Sockets verwenden Filedeskriptoren das heißt, wenn die Sockets - Schnittstelle erste (entworfen und implementiert wurde im Jahr 1983 in BSD Unix, ), die Designer das Gefühl , dass eine Netzwerkverbindung zu einer Datei analog war - man kann
read
,write
undclose
beide , und dass es gut zur Unix-Idee "Alles ist eine Datei" passt.Andere TCP / IP-Netzwerkstapelimplementierungen waren nicht unbedingt in das Datei-E / A-Subsystem ihres Betriebssystems integriert, beispielsweise MacTCP . Aber weil die BSD-Sockets-Schnittstelle so beliebt war, haben sich auch diese anderen Implementierungen dafür entschieden, die Socket-API mit ihren Unix-ähnlichen Funktionen zu replizieren, sodass Sie "Dateideskriptoren" erhalten, die nur für die TCP / IP-Kommunikation auf Systemen verwendet werden, auf denen dies nicht der Fall war Dateideskriptoren haben.
Der andere Teil Ihrer Frage ist, warum es ein Limit gibt. Dies liegt daran, dass eine Nachschlagetabelle für Dateideskriptoren am schnellsten mit einem Array implementiert werden kann. In der Vergangenheit war das Limit im Kernel fest programmiert.
Hier ist der Code in Unix Release 7 (1979) mit einer fest codierten Beschränkung von 20 Dateideskriptoren pro Prozess:
struct file *u_ofile[NOFILE]
#define NOFILE 20
Zum Vergleich: Linux reserviert dynamisch Speicherplatz für die Dateideskriptortabelle eines Prozesses. Das absolute Limit ist standardmäßig 8192, aber Sie können es auf jeden beliebigen Wert einstellen. Mein System listet 191072 in
/proc/sys/fs/file-max
.alloc_fdtable()
struct fdtable
#define NR_FILE 8192
Obwohl es unter Linux kein absolutes Limit mehr gibt, möchten wir Programme nicht verrückt machen, weshalb der Administrator (oder der Distributions-Packager) im Allgemeinen Ressourcenlimits festlegt. Schauen Sie sich das an
/etc/security/limits.conf
oder rennen Sie davonulimit -n
.quelle
Dateien sind nicht nur Dateien auf der Festplatte oder im Speicher. Sie sind Datenströme, von denen dies nur zwei Beispiele sind.
Remote-Endpunkte sind ein drittes Beispiel, mit denen Sie über Sockets interagieren.
quelle