L'appel système vs appel de Fonction
Quelle est la différence entre un système d'appel et un appel de fonction? Est fopen() est un appel système ou un appel de fonction?
- Stackoverflow police est ici ! Cette question semble valide. Avez-vous considéré le cas de quelqu'un qui ne prend pas un cours, mais d'avoir ce doute?
- Et même si elle a des devoirs à faire à la question, de la recherche, c'est poser les bonnes questions, il aura à distiller toutes les réponses sur cette page, dans une réponse correcte. S'il ne comprend pas la il va, vis d'elle de toute façon. Rien de mal avec l'omi.
Vous devez vous connecter pour publier un commentaire.
Un système d'appel est un appel dans le code du noyau, généralement effectuée par l'exécution d'une interruption. L'interruption provoque le noyau pour prendre en charge et effectuer l'action demandée, puis les mains de contrôle de revenir à l'application. Ce mode de commutation est la raison pour laquelle les appels système sont plus lents à exécuter qu'un système équivalent au niveau de l'application de la fonction.
fopen
est une fonction de la bibliothèque C qui, en interne, effectue un ou plusieurs appels système. Généralement, en tant que programmeur C, vous aurez rarement besoin d'utiliser les appels système, parce que la bibliothèque C enveloppe pour vous.This mode switching is the reason that system calls are slower to execute than an equivalent application-level function.
Cela ne signifie pas quefopen()
est plus rapide que d'effectuer la même opération à l'aide de la relavant du système d'appel? Parce que sifopen()
est déjà effectuer des appels système pour faire son travail, puis à l'aide de la relavant de l'appel système doit être, dans le pire des cas, à la même vitesse avecfopen()
droit?fopen()
peut-être un peu plus lent que de faire l'appel système vous-même, mais en utilisantfopen()
vous gagnez la portabilité, la lisibilité et la maintenabilité.fwrite
, mise en mémoire tampon peut faire de la bibliothèque C les appels plus rapidement qu'en utilisant le système des appels directement. En cas defopen
ce n'est pas applicable si.fopen est un appel de fonction.
Un appel système interagit avec l'OS sous-jacent, qui gère les ressources. Ses commandes de magnitud plus cher qu'un appel de fonction, parce que beaucoup de précautions doivent être prises pour préserver l'état de la procédure le syscall.
Sur les systèmes *nix, fopen enveloppements ouvert, ce qui rend le système d'appel (ouvrez le C - wrapper pour le syscall). La même chose arrive avec fread /lire, fwrite /écriture , etc..
Ici il y a une belle description des tâches exécutées par un unix syscall.
open
sur les systèmes *nix, mais il embrasse différents appels système sur d'autres systèmes d'exploitation (tels queCreateFile
sur Windows).En fait, l'appel système n'est pas liée à la fonction d'appel. La seule commune de ces deux mécanisme est qu'il fournit des services à l'appelant.
De vue de l'exécution du thread pour voir l'appel système:
Un appel système est fonction de l'application d'un programme en mode à la demande de services fournis par souligner OS. L'appel système apportera le thread en cours d'exécution depuis le mode utilisateur en mode noyau, exécuter le système d'appel en fonction de gestionnaire, puis retour au mode utilisateur.
Syscall Paramètres:
Le paramètre d'un appel système est (syscall nombre, params...). Le sens et le format des paramètres dépend de syscall nombre.
De vue de syscall bibliothèque fournie à l'utilisateur du programme:
L'utilisateur d'un programme en mode appelle généralement glibc bibliothèque de système d'appel d'appel. Par exemple, la fonction open() de la glibc:
Si vous utilisez Linux, vous pouvez surveiller les appels système effectués par une application:
strace appname ...
Sa sortie pourrait vous donner un bon aperçu de ce qui se passe à l'intérieur de la libc, et les fonctions qui sont en fait des appels système.
L'appel système fait appel à une API exécuté par le noyau de l'espace. Avec tous les coûts associés, ce qui suppose (voir Wiki, ou sur ce lien pour plus de détails)
Un appel de fonction est un appel à un morceau de code dans l'espace utilisateur.
Cependant, veuillez noter qu'un appel de fonction PEUT être une fonction qui, dans le processus de son exécution n'appels système - "fopen" être l'un de ces exemples. Ainsi, alors que l'appel à fopen lui-même est un appel à une fonction, ne signifie pas que le système d'appel n'arrivera pas à manipuler la réelle IO.
Un point de vue à ajouter à cette discussion, c'est que l'appel de la fonction en général dans la plupart des cas optimiste a surcharge de quelques 8 bits instructions (de 4 à 10 en moyenne)dans des x86.
Un appel système a les propriétés suivantes.
Pour ces trois primitives raisons (il y en a probablement plus), il faut réduire la quantité d'appels système si possible, par exemple, de réseau, logiciel de système conserve les poignées de socket (et d'autres spécifiques à l'application interne des structures de données utilisées par une connexion) autour d'affecter à une nouvelle connexion, pourquoi la peine de le kernel ?
Rappelez-vous que le logiciel est construit comme une pyramide renversée. Les appels système sont à la base.
La question a d'excellentes réponses déjà, mais je pense que je peux ajouter quelque chose (un segment à partir de poafpqui n'est pas déjà dans d'autres réponses
Parfois, système d'appel et d'appel de fonction ont la même signature, par exemple,
open()
:open()
-système d'appelopen()
-appel de fonctionFormulaire de candidature POAFP
fopen
est un appel de fonction, mais il peut parfois être considéré comme un appel système, car il est en fin de compte géré par le "système" (sur l'OS).fopen
est intégré dans le C runtime library.Juste à compléter le tableau présenté par les autres,
fopen
est couramment mis en œuvre comme un wrapper autour deopen
, qui est également accessible par l'utilisateur de la fonction.fopen
est, en un sens, de plus haut niveau queopen
depuis leFILE*
structure elle renvoie encapsule les choses pour l'utilisateur. Certains utilisateurs se servent deopen
directement pour les besoins spéciaux. Par conséquent, il ne serait pas juste d'appelerfopen
un "appel système" en quelque sorte. Ni exécuter des appels système directement, depuisopen
est également une fonction remboursable par l'utilisateur.Système d'appel est exécuté à kernet niveau et non pas à l'utilisateur spce, car il nécessite une certaine prievilege pour accéder au matériel.
Donc lors de la programmation dans l'espace utilisateur et en faisant certaines ordinaire de l'appel de fonction comme
fopen
en langage C, et la libc généralement envelopper cette fonction spécifique de code de code où une interruption est générée pour passer de l'espace utilisateur espace noyau vers l'espace , puis dans l'espace du noyau du système d'appel pour exécuter la fonctionnalité de l'appel de la fonction au niveau matériel sera exécuté dans l'espace du noyau .