Necesito ayuda para comprender lo que estoy seguro es un concepto fundamental en Linux: el límite para archivos abiertos. Específicamente, estoy confundido sobre por qué los sockets abiertos pueden contar para el número total de "archivos abiertos" en un sistema.
¿Alguien puede explicar por qué? Entiendo que esto probablemente se remonta a todo el principio de "todo es un archivo" en Linux, pero cualquier detalle adicional sería apreciado.
fuente
read
/write
, que es el corazón de lo que significa ser un archivo.shutdown(2)
llamada al sistema en ellos, pero no en los archivos, y no puedes leer desde un socket usandocat
, esa es la razón por la quenetcat
se ha creado. Diría que (afortunadamente) los sockets en núcleos tipo Unix se comportan como archivos en términos de E / S, pero la similitud termina allí. (Honestamente, también me gustaría saber de alguien con experiencia en el Plan 9, ya que escuché que obtuvieron la unificación de estas cosas más allá de los unices tradicionales).La razón por qué sockets TCP / IP descriptores de fichero uso es que, cuando la interfaz de sockets fue diseñado e implementado (primero en BSD Unix, en 1983 ), sus diseñadores consideró que una conexión de red fue análoga a un archivo - que puedas
read
,write
yclose
tanto , y que encajaría bien con la idea de Unix de "todo es un archivo".Otras implementaciones de pila de red TCP / IP no necesariamente se integraron con el subsistema de E / S de archivo de su sistema operativo, un ejemplo es MacTCP . Pero debido a que la interfaz de sockets BSD era tan popular, incluso estas otras implementaciones optaron por replicar la API de sockets con sus funciones tipo Unix, por lo que obtuviste "descriptores de archivos", que solo se utilizan para la comunicación TCP / IP, en sistemas que no lo hicieron de otra manera tener descriptores de archivo.
La otra parte de su pregunta es ¿por qué hay un límite? Se debe a que la forma más rápida de implementar una tabla de búsqueda de descriptores de archivo es con una matriz. Históricamente, el límite estaba codificado en el núcleo.
Aquí está el código en Unix versión 7 (1979) con un límite codificado de 20 descriptores de archivo por proceso:
struct file *u_ofile[NOFILE]
#define NOFILE 20
En comparación, Linux asigna dinámicamente espacio para la tabla de descriptores de archivo de un proceso. El límite absoluto predeterminado es 8192, pero puede establecerlo en lo que quiera. Mi sistema enumera 191072 en
/proc/sys/fs/file-max
.alloc_fdtable()
struct fdtable
#define NR_FILE 8192
A pesar de que ya no existe un límite absoluto en Linux, no queremos dejar que los programas se vuelvan locos, por lo que el administrador (o el empaquetador de distribución) generalmente establece límites de recursos. Echa un vistazo
/etc/security/limits.conf
o correulimit -n
.fuente
Los archivos no son solo archivos en el disco o en la memoria; son flujos de datos, de los cuales esos son solo dos ejemplos.
Los puntos finales remotos son un tercer ejemplo, e interactúa con aquellos que usan sockets.
fuente