Llamada al sistema vs llamada a la función

8 minutos de lectura

Llamada al sistema vs llamada a la funcion
Ankur

¿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 una función?

  • ¡La policía de Stackoverflow está aquí! Esta pregunta en particular parece válida. ¿Has considerado el caso de alguien que no está tomando un curso, pero tiene esta duda?

    – Tomás

    19 de abril de 2010 a las 15:59

  • E incluso si fuera una pregunta de tarea, la investigación se trata de hacer las preguntas correctas, tendrá que destilar todas las respuestas en esta página en una respuesta correcta. Si no entiende el contenido, lo arruinará de todos modos. No tiene nada de malo, en mi opinión.

    – Hassan Sied

    19 de abril de 2010 a las 16:10

Llamada al sistema vs llamada a la funcion
Tomás

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

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

  • This mode switching is the reason that system calls are slower to execute than an equivalent application-level function. Esto no significa que fopen() es más rápido que realizar la misma operación usando la llamada al sistema correspondiente, ¿verdad? Porque si fopen() ya está realizando llamadas al sistema para hacer su trabajo, entonces el uso de la llamada al sistema pertinente debe ser, en el peor de los casos, a la misma velocidad que fopen() ¿Correcto?

    – Utku

    11 mayo 2016 a las 15:50


  • Derecha. fopen() puede ser muy ligeramente más lento que llamar al sistema usted mismo, pero al usar fopen() usted gana portabilidad, legibilidad y mantenibilidad.

    – Tomás

    12 de mayo de 2016 a las 8:53

  • ¿No es el almacenamiento en caché y el almacenamiento en búfer la razón principal por la que una llamada de función es más rápida? Soy realmente un principiante con conocimientos limitados. ¿Cuáles son tus pensamientos sobre esto?

    – adityah

    19 de agosto de 2017 a las 2:38

  • @adityah Sí, en caso de llamadas como fwrite, el almacenamiento en búfer puede hacer que las llamadas a la biblioteca C sean más rápidas que usar llamadas al sistema directamente. En caso de fopen aunque esto no es aplicable.

    – Tomás

    20 de agosto de 2017 a las 11:05

1647560718 411 Llamada al sistema vs llamada a la funcion
Tomás

fopen es una llamada de función.

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

En los sistemas *nix, fopen envuelve open, lo que hace que la llamada al sistema (open es el envoltorio C – para la llamada al sistema). Lo mismo sucede con fread/read, fwrite/write, etc.

Aquí hay una buena descripción de las tareas ejecutadas por un syscall de unix.

  • se envuelve open en sistemas *nix, pero envuelve diferentes llamadas al sistema en otros sistemas operativos (como CreateFile en Windows).

    – Adam Rosenfield

    19 de abril de 2010 a las 15:56

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

    – Tomás

    19 de abril de 2010 a las 15:58

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

    – Hassan Sied

    19 de abril de 2010 a las 16:02


  • @Hassan Lo sé, no pretendo justificarlo, solo digo que no me gusta.

    – Tomás

    19 de abril de 2010 a las 16:07

  • Vale la pena señalar que en UNIX open() es una llamada al sistema, mientras que en Windows open() es una función de biblioteca que envuelve una interfaz nativa del núcleo, muy parecida a fopen().

    – el.pescado – нет войне

    19 de abril de 2010 a las 16:09

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 brindan servicios a la persona que llama.

  • Desde la vista de la ejecución del subproceso para ver la llamada al sistema:

    Una llamada al sistema es una función para el programa de modo de aplicación para solicitar los servicios proporcionados por el sistema operativo subrayado. La llamada del sistema traerá el subproceso en ejecución del 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 de llamada al sistema:

    El parámetro de una llamada al sistema es (syscall number, params…). El significado y formato de los parámetros depende del número de llamada al sistema.

  • Desde la vista de la biblioteca syscall proporcionada al programa de usuario:

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

    1. poner el número de llamada del sistema SYS_OPEN en el registro eax
    2. solicitar una llamada al sistema mediante una interrupción de software o una instrucción sys_enter

1647560719 85 Llamada al sistema vs llamada a la funcion
chen li

La pregunta ya tiene excelentes respuestas, pero creo que puedo agregar algo (un segmento de opasoeso no está ya en otras respuestas

A veces, la llamada al sistema y la llamada a la función tienen la misma firma, por ejemplo, open():

open()-llamada al sistema

--- ~/Documents » man open(2)

OPEN(2)                 Linux Programmer's Manual           OPEN(2)

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
...

open()-Llamada de función

$ man open(3)

--- ~/Documents » 
OPEN(3P)                        POSIX Programmer's Manual          OPEN(3P)
...

int open(const char *path, int oflag, ...);

...

Formulario de cotización PASO A PASO

Tal vez se pregunte por qué una llamada a un llamada al sistematal como open() o read()se ve exactamente como un típico llamada de procedimiento C ª; es decir, si se parece a un llamada de procedimiento¿cómo sabe el sistema que es un llamada al sistema, y hacer todo lo correcto? La razón simple: es un llamada de procedimientopero escondido dentro de eso llamada de procedimiento es el famoso instrucción de trampa. Más específicamente, cuando llamas open() (por ejemplo), está ejecutando un llamada de procedimiento en la biblioteca C. En ella, ya sea por open() o cualquiera de los otros llamadas al sistema proporcionado, la biblioteca utiliza una convención de llamada acordada con el núcleo para abrir los argumentos en ubicaciones conocidas (por ejemplo, en el apilaro en específico registros), pone el llamada al sistema número en una ubicación conocida también (nuevamente, en el apilar o un Registrarse), y luego ejecuta lo mencionado anteriormente instrucción de trampa. El código en la biblioteca después de la trampa desempaqueta los valores devueltos y devuelve el control al programa que emitió el llamada al sistema. Por lo tanto, las partes de la biblioteca C que hacen llamadas al sistema están codificados a mano en ensamblaje, ya que deben seguir cuidadosamente la convención para procesar argumentos y devolver valores correctamente, así como ejecutar el hardware específico instrucción de trampa. Y ahora sabe por qué personalmente no tiene que escribir código ensamblador para trampa en un sistema operativo; alguien ya ha escrito esa asamblea para usted.

1647560719 829 Llamada al sistema vs llamada a la funcion
SK-lógica

Si está usando Linux, puede monitorear las llamadas al sistema realizadas por una aplicación a través de rastro:

strace /path/to/app

Su salida puede brindarle una buena idea de lo que sucede dentro de libc y qué funciones son en realidad llamadas al sistema.

1647560720 880 Llamada al sistema vs llamada a la funcion
DVK

Llamada al sistema en realidad llama a una API ejecutada por el espacio del kernel. Con todos los costos asociados que esto supone (ver Wiki, o este enlace para más detalles)

Una llamada de 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 PODRÍA ser a 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 en sí misma es una llamada a una función, no significa que la llamada al sistema no manejará el IO real.

1647560720 299 Llamada al sistema vs llamada a la funcion
hassan syed

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 la pila.
  2. El tiempo involucrado es en su mayoría no determinista.
  3. A menudo es un lugar de programación, y el programador puede optar por reprogramar.

Por estas tres razones primitivas (probablemente haya más), se debe reducir la cantidad de llamadas al sistema donde sea posible, por ejemplo, el software del sistema en red mantiene identificadores de socket (y otras estructuras de datos internas específicas de la aplicación utilizadas por una conexión) para asignar a nuevos conexión, ¿por qué molestar al núcleo?

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

  • Además, ¿la llamada al sistema no está asignando memoria virtual a memoria física?

    – Tomás Kubes

    14/10/2015 a las 20:42

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad