Red de conocimiento informático - Aprendizaje de código fuente - ¿Qué es un descriptor de archivo?

¿Qué es un descriptor de archivo?

Pregunta 1: La diferencia entre descriptores de archivos y punteros de archivos Descriptor de archivo: en un sistema Linux, cuando abre un archivo, obtendrá un descriptor de archivo, que es un pequeño entero positivo. Cada proceso mantiene una tabla de descriptores de archivos en la PCB (Bloque de control de procesos), el descriptor de archivos es un índice de la tabla y cada entrada de la tabla tiene un puntero a un archivo abierto.

Puntero de archivo: C utiliza punteros de archivo como identificadores de E/S. El puntero del archivo apunta a una estructura de datos llamada estructura ARCHIVO en el área de usuario del proceso. Un descriptor de archivo es un índice en la tabla de descriptores de archivo, por lo que, en cierto sentido, un puntero de archivo es un identificador de un identificador (en Windows, un descriptor de archivo se denomina identificador de archivo).

Pregunta 2: ¿Alguien puede explicar las banderas del descriptor de archivos? El descriptor de archivo es un entero no negativo que llega a un archivo existente o a un archivo nuevo. Al leer y escribir archivos, debe utilizar el descriptor de archivo para especificar el archivo que se leerá y escribirá. 0 salida estándar 1 error estándar 2 Aunque la personalización no es una característica del kernel Unix, algunas aplicaciones de shell la utilizan. El núcleo sigue tales convenciones. Las aplicaciones pueden utilizar las definiciones POSIX STDIN_FILENO, STDOUT_FILENO y STDERR_FILENO en lugar de 0, 1 y 2. Se definen tres cantidades simbólicas en el archivo unistd.h. El rango de validez del descriptor de archivo 0 OPEN_MAX significa 64 archivos por tipo de proceso (0). - 63) En FreeBSD 5.2.1, Mac OS Cómo se define el número de descriptores de archivos en diferentes plataformas El límite de descriptores de archivos y el tamaño máximo que se puede asignar a un proceso se definen por el límite de recursos. Los límites de los descriptores de archivos y el tamaño máximo que se puede asignar a un proceso están definidos por los límites de recursos. Estos valores deben configurarse de acuerdo con los valores de descriptor de archivos específicos del sistema operativo recomendados en la documentación de WebLogicServer: Para WLS8.1: Ajuste de hardware, sistema operativo y rendimiento de red Para WLS7.0: Ajuste de hardware, sistema operativo, y Rendimiento de red para WLS6 1: Ajuste el hardware, el sistema operativo y el rendimiento de la red. Tanto Unix como Linux tienen descriptores de archivos. Sin embargo, la principal diferencia entre los dos es cómo se establecen los límites estrictos del descriptor de archivos, los valores predeterminados y el proceso de configuración. La utilidad Solaris/usr/bin/ulimit define la cantidad de descriptores de archivos que un solo proceso puede usar. Sólo el usuario root puede modificar estos valores del kernel. Los usuarios administrativos de Linux pueden establecer límites de descriptores de archivos en el archivo de configuración etc/security/limits.conf, como se muestra en el siguiente ejemplo. softnofile1024hardnofile4096 También puede establecer el límite de descriptores de archivos para todo el sistema agregando las siguientes tres líneas al script de inicio /etc/rc.d/rc.local: #Increasesystem-widefiledescriptorlimit.echo4096gt /proc/sys/fs/file-maxecho16384gt; ; /proc/sys/fs/inode-maxWindows En los sistemas operativos Windows, los descriptores de archivos se denominan identificadores de archivos. En servidores Windows 2000, el límite de manejo de archivos abiertos se establece en 16.384, lo que se puede monitorear en el Resumen de rendimiento en el Administrador de tareas. Este valor suele estar determinado por la siguiente fórmula: ((NPROC*2) 1000), donde NPROC suele ser: ((MAXUSERS*5) 64).

maxfiles es el límite de archivos suaves por proceso y maxfiles_lim es el límite de archivos duros por proceso. Los límites del descriptor de archivos AIX se establecen en el archivo /etc/security/limits, con un valor predeterminado de 2000. 2000. Este límite se puede cambiar mediante el comando ulimit o la subrutina setrlimit. El tamaño máximo está definido por la constante OPEN_MAX.

Pregunta 4: ¿Puede un descriptor de archivo ser 0? Un descriptor de archivo es simplemente un número entero que identifica cada archivo y socket abierto por un proceso.

El primer archivo abierto es 0, el segundo es 1, y así sucesivamente. Los sistemas operativos Unix normalmente limitan la cantidad de archivos que cada proceso puede abrir. os.chinauni

Pregunta 5: Cómo determinar el descriptor del archivo cuando fd abre el archivo El archivo devolverá un descriptor de archivo. 0: el descriptor de archivo devuelto es un descriptor de archivo abierto. /proc/pid/fd Los siguientes son los descriptores de archivos abiertos por el proceso. Si mi respuesta no le resulta útil, continúe preguntando. El contenido del enlace apunta al archivo real correspondiente al descriptor de archivo, y el número de descriptores de archivo representa el número de archivos abiertos por el proceso.

Además, Linux

tiene un límite predeterminado de 1024 archivos abiertos, que se pueden ver usando ulimit

-n. Muchos límites superiores del sistema se pueden cambiar modificando el archivo /etc/security/limits.conf, que contiene comentarios detallados sobre cómo hacerlo. Si desea

cambiar el límite superior de archivos abiertos para todos los procesos de los usuarios a 65536, puede agregar las siguientes dos líneas

* soft nofile 65535

*hard nofile 65535

También puede realizar cambios solo para un usuario o grupo, como se describe en los comentarios del archivo. Debe reiniciar su sistema para que los cambios surtan efecto.

Pregunta 7: ¿Qué es el descriptor de archivo 3 de Linux? Por ejemplo, 0 1 2 representa la entrada y el error de salida estándar, entonces, ¿qué son 3 y 4? Otros archivos abiertos

Pregunta 8: ¿Qué significa que el descriptor de archivo se bloquea? Para hacer esto, necesita modificar dos cosas y reiniciar el servidor Linux. Primero, ingrese SSH al servidor y ejecute ulimit -a para ver los límites actuales. Este paso es opcional, principalmente para ver las limitaciones. El primer cambio: Agregar: *softnofile65535*hardno al final del archivo vim/etc/security/limits.conf

Pregunta 9: ¿Alguien entiende la relación entre los descriptores de archivos de Java y Linux? Puede considerarse como una tabla de índice de archivos abiertos en la gestión de tareas en Linux, utilizada en el sistema. . . . . . . Java es una plataforma y un lenguaje de programación. . . . . . No sé comparar.

Pregunta 10: ¿Cuál es la relación entre el descriptor de archivo fb y el número de conexiones tcp? La pregunta C10K se planteó en la década de 1990. La opinión general es que cuando el número de usuarios supera los 10.000, el rendimiento de muchos programas de servicios de red mal diseñados caerá drásticamente o incluso se paralizará. Además, este problema no se puede resolver actualizando el hardware, es un problema inherente del sistema operativo, es decir, si su servidor puede admitir hasta 1000 concurrencias, incluso si actualiza la CPU al doble de potencia informática y al doble de memoria Incluso con el doble de velocidad del disco duro, no puede admitir 2000 simultaneidades.

Existen cuatro modelos clásicos de programación de redes:

1. Servir a un cliente por subproceso/proceso y utilizar E/S de bloqueo. Esta es una estrategia comúnmente utilizada en applets y java.

La estrategia comúnmente utilizada en Java también es una opción común para aplicaciones interactivas. Esta estrategia es difícil de satisfacer las necesidades de programas de alto rendimiento. La ventaja es que es extremadamente simple de implementar y fácil de implementar una lógica interactiva compleja. Nuestros Apache, ftpd, etc. de uso común son todos esos trabajos.

2. Utilice un único subproceso para atender a varios clientes y utilice E/S sin bloqueo y notificaciones de preparación. Es decir, utilizar un único hilo o proceso para atender a todos los clientes, utilizando una estrategia de IO asíncrona. Este es un modo clásico. Sus ventajas son que es fácil de implementar, fácil de portar y puede proporcionar un rendimiento suficiente. Su desventaja es que no puede utilizar completamente los recursos de múltiples CPU.

3. Cada subproceso sirve a varios clientes y utiliza E/S sin bloqueo y notificación de preparación. Esta es una mejora simple con respecto al modo clásico 2. Todavía utiliza una estrategia de E/S asincrónica, pero utiliza múltiples subprocesos A o. El proceso sirve a todos los clientes. La desventaja es que es probable que se produzcan errores de concurrencia de subprocesos múltiples y algunos sistemas operativos ni siquiera admiten la notificación de preparación de subprocesos múltiples

4. En los sistemas operativos que admiten AI/O, cada subproceso proporciona servicios para múltiples clientes y utiliza E/S asincrónicas, lo que puede proporcionar un rendimiento considerable en sistemas operativos que admiten AI/O. Sin embargo, el modelo de programación AI/O es muy diferente del modelo clásico, y es básicamente difícil escribir un marco que admita tanto AI/O como el modelo clásico. Este modo se utiliza principalmente en plataformas de ventana.