¿Cómo se hace exactamente fopen(), fclose ()?

Me estaba preguntando acerca de las funciones fopen, fclose, zócalo y closesocket. Cuando la llamada a fopen o la apertura de un socket, qué es exactamente lo que está sucediendo (en especial la memoria sabia)?

Puede abrir archivos/sockets sin cerrar les causa pérdidas de memoria?

Y tercero, ¿cómo se sockets creados y ¿qué aspecto tienen memoria sabio?

También estoy interrested en el papel de el sistema operativo (Windows) en la lectura de las tomas de corriente y envío de los datos.

Estas funciones tienden a entrar en las interrupciones de las cuales son capturadas por el kernel.
Quiere usted decir con “llamadas al sistema”, ¿verdad? Invocando el sistema operativo ya no es tan caro como el manejo de la interrupción. Por supuesto que hay física interrupciones de hardware cuando la NIC recibe los datos, pero eso está muy lejos de las funciones enumeradas.

OriginalEl autor Fabian | 2011-02-26

1 respuesta

  1. 18

    Descargo de responsabilidad: yo soy todo no está calificado para hablar de esto. Sería genial si alguien más sabio publicado.

    Archivos

    Los detalles de cómo las cosas como fopen() se implementa dependerá en gran medida el sistema operativo (UNIX ha fopen (), por ejemplo). Incluso las versiones de Windows pueden variar mucho de unos a otros.

    Te voy a dar mi idea de cómo funciona, pero es básicamente la especulación.

    • Cuando se le llama, fopen asigna un ARCHIVO objeto en el heap. Tenga en cuenta que los datos en un ARCHIVO de objeto de indocumentados, es un ARCHIVO opaco struct, sólo puede utilizar los punteros-a-ARCHIVO de su código.
    • El ARCHIVO objeto se inicializa. Por ejemplo, algo como fillLevel = 0 donde fillLevel es la cantidad de datos almacenados en búfer que no ha sido eliminado todavía.
    • Una llamada al controlador del sistema de ficheros (FS conductor) abre el archivo y proporciona un identificador, que es poner en algún lugar en el ARCHIVO de estructura.
      • Para ello, el FS cifras conductor fuera el disco duro de la dirección correspondiente a la ruta solicitada, e internamente, recuerda este HDD dirección, de manera que posteriormente pueda cumplir con llamadas a fread etc.
        • El FS controlador utiliza una especie de tabla de indización (almacenados en el disco duro) para averiguar el disco duro de la dirección correspondiente a la ruta solicitada. Esto va a variar mucho dependiendo del tipo de sistema de archivos FAT32, NTFS y así sucesivamente.
        • El FS del controlador se basa en el disco duro del controlador para realizar la lee y se escribe en el disco duro.
    • Un caché podría ser asignado en la memoria RAM para el archivo. De esta manera, si el usuario solicita 1 byte para ser leído, C++ puede leer un KB sólo en caso de que, por lo que más adelante se lee será instantáneo.
    • Un puntero a la asignada ARCHIVO se devuelve desde fopen.

    Si abre un archivo y nunca cerrar, algunas cosas se fuga, sí. El ARCHIVO struct se fuga, el FS de datos internas del controlador se fuga, la caché (si cualquiera) se fuga.

    Pero la memoria no es la única cosa que se escape. El propio archivo se fuga, debido a que el sistema operativo va a pensar que es abierto cuando no lo es. Esto puede convertirse en un problema, por ejemplo, en Windows, donde se abre un archivo en la escritura de modo que no se abren en la escritura de modo nuevamente hasta que se haya cerrado.

    Si la aplicación se cierra sin el cierre de algunas de archivos, la mayoría de los sistemas operativos de la limpieza después de ella. Pero eso no es de mucho uso, porque la aplicación ejecutará probablemente por un largo tiempo antes de salir, y durante ese tiempo, todavía tendrá que cerrar correctamente todos los archivos. También, usted no puede confiar plenamente en el sistema operativo para limpiar después de usted – no está garantizado en el Estándar de C.

    Sockets

    Un socket de la aplicación dependerá del tipo de conexión de red socket de escucha, de la red de socket de cliente, inter-proceso de socket, etc.

    Una discusión completa de todos los tipos de sockets y sus posibles implementaciones no cabrían aquí.

    En resumen:

    • como un archivo, un socket mantiene algo de información en la memoria RAM, describiendo cosas relevantes para su operación, tales como la dirección IP del host remoto.
    • también puede tener almacena en caché en RAM por razones de rendimiento
    • puede aferrarse a finito de recursos del sistema operativo, tales como abrir los puertos, haciéndolos disponibles para su uso por otras aplicaciones

    Todas estas cosas se escapará si no se cierra el socket.

    El papel del sistema operativo en sockets

    El sistema operativo implementa el estándar TCP/IP, Ethernet y otros protocolos necesarios para programar/expedición/aceptar conexiones y hacerlos disponibles para el código de usuario a través de una API como Berkeley Sockets.

    El sistema operativo delegado de la red I/O (la comunicación con la tarjeta de red) para el controlador de red.

    Buena respuesta. Sólo quiero agregar que en la mayoría de los modern OS, la biblioteca no llamar al controlador directamente, sino a través de una syscall.
    También me gustaría añadir que a pesar de no cerrar descriptores de archivo es un tipo de pérdida de memoria, también se fuga de un recurso de probabilidades de ser más escaso de memoria, que es el número de posibles simultánea abierto descriptores de archivo. Así que es de esperar un fallo con EMFILE o lo que sea, mucho antes que usted en realidad para gestionar los residuos de una terrible cantidad de memoria.

    OriginalEl autor Stefan Monov

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *