2010-04-19 44 views
24

¿Cuál es la diferencia entre una llamada al sistema y una llamada a una función? ¿Es fopen() una llamada al sistema o una llamada a función?Llamada al sistema vs Llamada a la función

+9

policía Stackoverflow está aquí! Esta pregunta en particular parece válida. ¿Has considerado el caso de alguien que no toma un curso y aún tiene esta duda? – Tom

+6

E incluso si era una pregunta de tarea, la investigación se trata de hacer las preguntas correctas, él tendrá que convertir todas las respuestas en esta página en una respuesta correcta. Si él no entiende el contenido, lo arruinará de todos modos.No hay nada malo con eso imo. –

Respuesta

1

fopen es una llamada a función, pero a veces se la puede denominar una llamada al sistema porque, en última instancia, es manejada por el "sistema" (el SO). fopen está integrado en el C runtime library.

9

fopen es una llamada a función.

Una llamada al sistema interactúa con el sistema operativo subyacente, que gestiona los recursos. Sus órdenes de magnitud son más caros que una llamada a función, porque se deben tomar muchos pasos para preservar el estado del proceso que realizó el llamado al sistema.

En sistemas * nix, fopen wraps abierto, lo que hace que la llamada al sistema (abierto es el C-wrapper para el syscall). Lo mismo ocurre con fread/read, fwrite/write, etc.

Here hay una buena descripción de las tareas ejecutadas por unix syscall.

+1

Se envuelve 'abierto' en sistemas * nix, pero envuelve llamadas de sistema diferentes en otros sistemas operativos (como' CreateFile' en Windows). –

+0

Sí, tengo algo en contra de C o C++ ejecutándose en Windows, por lo que siempre no lo considero. (completamente dogmático, lo sé) – Tom

+0

Eso es ridículo teniendo en cuenta que Windows tiene tanto C/C++ (teniendo en cuenta el software profesional de CAD/Office y los videojuegos), si no más, software. Visual Studio tampoco es tan malo para C/C++. –

26

Una llamada al sistema es una llamada al código del kernel, que normalmente se realiza al ejecutar una interrupción. La interrupción hace que el núcleo tome el control y realice la acción solicitada, luego devuelve el control a la aplicación. Esta conmutación de modo es la razón por la que las llamadas al sistema son más lentas de ejecutar que una función de nivel de aplicación equivalente.

fopen es una función de la biblioteca C que, internamente, realiza una o más llamadas al sistema. En general, como programador en C, rara vez necesita usar llamadas al sistema porque la biblioteca en C las ajusta para usted.

+1

'Esta conmutación de modo es la razón por la que las llamadas al sistema son más lentas de ejecutar que una función de nivel de aplicación equivalente. Esto no significa que' fopen() 'sea más rápido que realizar la misma operación usando la llamada de sistema relavante ¿no? Porque si 'fopen()' ya está realizando llamadas al sistema para hacer su trabajo, entonces el uso de la llamada del sistema relavant debe ser, en el peor de los casos, a la misma velocidad con 'fopen()' ¿correcto? – Utku

+2

Derecha. 'fopen()' puede ser tan levemente más lento que hacer que el sistema se llame a usted mismo, pero al usar 'fopen()' se gana portabilidad, legibilidad y facilidad de mantenimiento. – Thomas

+0

El almacenamiento en memoria caché y el almacenamiento en memoria intermedia no son la razón principal por la cual una llamada a función es más rápida. Soy realmente un principiante con conocimiento limitado. ¿Cuáles son sus pensamientos sobre esto? – adityah

2

System call realmente llama a una API ejecutada por el espacio del kernel. Con todos los costos asociados, esto supone (vea Wiki, o este enlace para más detalles)

Una llamada a función es una llamada a un fragmento de código en el espacio del usuario.

Sin embargo, tenga en cuenta que una llamada de función PUEDE ser para una función que en el proceso de su ejecución realiza llamadas al sistema - "fopen" es uno de esos ejemplos. Entonces, si bien la llamada a fopen es una llamada a una función, eso no significa que la llamada al sistema no será capaz de manejar el IO real.

2

Un punto de vista para agregar a esta discusión es que una llamada de función generalmente en el caso más optimista tiene una sobrecarga de unas pocas instrucciones de 8 bits (4-10 en promedio) en x86.

Una llamada al sistema tiene las siguientes propiedades.

  1. Ejecuta muchas más instrucciones, tiene que congelar un proceso en lugar de simplemente el estado de pila.
  2. El tiempo involucrado es principalmente no determinista.
  3. A menudo es un lugar de programación, y el planificador puede optar por reprogramar.

Por estas tres razones primitivas (hay probablemente más), se debe reducir la cantidad de llamadas al sistema siempre que sea posible - por ejemplo, el software de sistema en red mantiene los identificadores de socket (y las estructuras internas de datos específicos de la aplicación utilizada por una conexión) alrededor para asignar a una nueva conexión, ¿por qué molestar al kernel?

Recuerde que el software está construido como una pirámide al revés. Las llamadas al sistema están en la base.

+0

Además, ¿no es la asignación de llamadas del sistema memoria virtual a la memoria física? – qub1n

1

Solo para completar la imagen presentada por los otros, fopen es commonly implemented como un contenedor alrededor del open, que también es una función accesible para el usuario. fopen es, en cierto sentido, a nivel más alto que open ya que la estructura FILE* vuelve encapsula cosas para el usuario. Algunos usuarios usan open directamente para necesidades especiales. Por lo tanto, no sería correcto llamar al fopen como una "llamada al sistema" de ninguna manera. Tampoco ejecutar llamadas de sistema directamente, ya que open es también una función exigible por el usuario.

3

Si estás usando Linux puede controlar llamadas del sistema realizadas por una aplicación:

nombreaplic strace ...

Su salida podría darle una buena idea sobre lo que está pasando dentro de libc, y el cual las funciones son en realidad llamadas al sistema.

6

En realidad, la llamada al sistema no está relacionada con la llamada a la función. El único común de estos dos mecanismos es que ambos proporcionan servicios a la persona que llama.

  • En la vista de la ejecución del hilo para ver la llamada al sistema:

    llamada

    Un sistema es la función para el programa de modo de aplicación para solicitar los servicios proporcionados por el sistema operativo subrayado. La llamada al sistema traerá el hilo que se está ejecutando desde el modo de usuario al modo kernel, ejecutará la función del controlador de llamadas del sistema y luego regresará al modo de usuario.

  • Parámetros: syscall

    El parámetro de una llamada al sistema es (número de llamada al sistema params ...). El significado y el formato de params depende del número de syscall.

  • En la vista de biblioteca syscall proporcionado al programa de espacio de usuario:

    El programa de modo de usuario por lo general llama a la biblioteca de glibc para llamar llamada al sistema. Por ejemplo, la función open() en glibc:

    1. put número de llamadas al sistema sys_open de registro EAX
    2. solicitud de llamada al sistema llamando a una interrupción de software o instrucción sys_enter
0

llamada Sistema se ejecuta a nivel de kernet y no en spce de usuario porque requiere algún prievilege para acceder al hardware.

Therfore al programar en el espacio de usuario y hacer algo de llamada a la función ordinaria como fopen en lenguaje C libc generalmente envuelven esta función al código código específico en el que se genera una interrupción para cambiar de espacio de usuario al espacio del núcleo, a continuación, en el espacio del núcleo del la llamada al sistema requerida para realizar la funcionalidad de la llamada a la función a nivel de hardware se ejecutará en el espacio del kernel.

Cuestiones relacionadas