Les logiciels informatiques sont développés pour automatiser certaines tâches ou résoudre certains problèmes. Dans tous les cas, un logiciel atteint son objectif à l'aide de la logique écrite par le développeur de ce logiciel. Chaque logique nécessite certains services comme le calcul de la longueur d'une chaîne, l'ouverture d'un fichier, etc. Les services standard sont pris en charge par certaines fonctions ou appels qui ne sont fournis qu'à cette fin.
Comme pour calculer la longueur d'une chaîne, il existe une fonction standard comme strlen(), pour ouvrir un fichier, il existe des fonctions comme open() et fopen(). Nous appelons ces fonctions des fonctions standard car n'importe quelle application peut les utiliser.
Ces fonctions standards peuvent être classées en deux grandes catégories :
- Appels de fonction de bibliothèque.
- Appels de fonction système.
Dans cet article, nous essaierons de discuter du concept derrière les appels système et de bibliothèque sous la forme de divers points et, si nécessaire, je fournirai la différence entre les deux.
1. Fonctions de la bibliothèque contre appels système
Les fonctions qui font partie de la bibliothèque C standard sont appelées fonctions de bibliothèque. Par exemple, les fonctions standard de manipulation de chaînes telles que strcmp(), strlen(), etc. sont toutes des fonctions de bibliothèque.
Les fonctions qui changent le mode d'exécution du programme du mode utilisateur au mode noyau sont appelées appels système. Ces appels sont requis dans le cas où certains services sont requis par le programme du noyau. Par exemple, si nous voulons changer la date et l'heure du système ou si nous voulons créer un socket réseau, ces services ne peuvent être fournis que par le noyau et, par conséquent, ces cas nécessitent des appels système. Par exemple, socket() est un appel système.
2. Pourquoi avons-nous besoin d'appels système ?
Les appels système servent de point d'entrée au noyau du système d'exploitation. Certaines tâches ne peuvent être effectuées que si un processus s'exécute en mode noyau. Des exemples de ces tâches peuvent être l'interaction avec le matériel, etc. Donc, si un processus souhaite effectuer ce type de tâche, il devra alors s'exécuter en mode noyau, ce qui est rendu possible par les appels système.
3. Types de fonctions de bibliothèque
Les fonctions de la bibliothèque peuvent être de deux types :
- Fonctions qui n'appellent aucun appel système.
- Fonctions qui effectuent un appel système.
Il existe des fonctions de bibliothèque qui n'effectuent aucun appel système. Par exemple, les fonctions de manipulation de chaînes comme strlen() etc entrent dans cette catégorie. En outre, il existe des fonctions de bibliothèque qui effectuent des appels système supplémentaires, par exemple la fonction fopen() qui est une fonction de bibliothèque standard mais utilise en interne l'appel système open().
4. Interaction entre les composants
Le diagramme suivant pour illustrer comment les fonctions de la bibliothèque, les appels système et le code d'application interagissent les uns avec les autres.
Le diagramme ci-dessus montre clairement que le code de l'application peut interagir avec les fonctions de la bibliothèque ou les appels système. En outre, une fonction de bibliothèque peut également appeler une fonction système de l'intérieur. Mais seuls les appels système ont accès au noyau qui peut en outre accéder au matériel informatique.
5. fopen() contre open()
Certains d'entre nous diront peut-être que pourquoi avons-nous deux fonctions pour la même opération, c'est-à-dire l'ouverture d'un fichier ?
Eh bien, la réponse à cela est le fait que fopen() est une fonction de bibliothèque qui fournit des services d'E/S tamponnés pour ouvrir un fichier tandis que open() est un appel système qui fournit des services d'E/S non tamponnés. Bien que la fonction open() soit également disponible pour les applications, l'application doit éviter de l'utiliser directement.
En général, si une fonction de bibliothèque correspondant à un appel système existe, alors les applications doivent utiliser la fonction de bibliothèque car :
- Les fonctions de bibliothèque sont portables, ce qui signifie qu'une application utilisant des fonctions de bibliothèque standard s'exécutera sur tous les systèmes. D'autre part, une application reposant sur l'appel système correspondant peut ne pas s'exécuter sur tous les systèmes, car l'interface d'appel système peut varier d'un système à l'autre.
- Parfois, la fonction de bibliothèque correspondante réduit la charge de l'appel système, ce qui entraîne des passages non fréquents du mode utilisateur au mode noyau. Par exemple, s'il existe une application qui lit très fréquemment des données à partir d'un fichier, l'utilisation de fread() au lieu de read() fournirait des E/S tamponnées, ce qui signifie que tous les appels à fread() n'entraîneraient pas un appel à l'appel système read (). Le fread () peut lire un plus grand morceau de données (que requis par l'utilisateur) en une seule fois et, par conséquent, le fread () suivant ne nécessitera pas d'appel à la fonction système read ().
6. Est-ce que malloc() est un appel système ?
C'est l'une des idées fausses très populaires que les gens ont. Précisons que malloc() n'est pas un appel système. L'appel de fonction malloc() est un appel de fonction de bibliothèque qui utilise en outre l'appel système brk() ou sbrk() pour l'allocation de mémoire.
7. Appels système :changer de mode d'exécution
Traditionnellement, le mécanisme de déclenchement d'une interruption de 'int $0x80' au noyau était utilisé. Après avoir intercepté l'interruption, le noyau la traite et change le mode d'exécution du mode utilisateur au mode noyau. Aujourd'hui, les instructions systenter/sysexit sont utilisées pour changer de mode d'exécution.
8. Quelques autres différences
En plus de tout ce qui précède, voici quelques différences supplémentaires entre un appel système et un appel de bibliothèque :
- Une fonction de bibliothèque est liée au programme utilisateur et s'exécute dans l'espace utilisateur tandis qu'un appel système n'est pas lié à un programme utilisateur et s'exécute dans l'espace noyau.
- Le temps d'exécution d'une fonction de bibliothèque est compté en temps de niveau utilisateur tandis qu'un temps d'exécution d'appel système est compté comme une partie du temps système.
- Les fonctions de la bibliothèque peuvent être déboguées facilement à l'aide d'un débogueur, tandis que les appels système ne peuvent pas être débogués car ils sont exécutés par le noyau.