Rappels sur le multiplexage des entrées-sorties
Le plus simple pour expliquer le problème simplement est de prendre comme exemple un serveur web. En effet un serveur web est un processus qui gère la communication avec très souvent plusieurs clients en simultané.
Dans ce cas, on s'apperçoit que le processus du serveur
web passe son temps à scruter les arrivées des requètes
client afin de pouvoir y répondre.
D'ou le nom de POLLING (scrutation en anglais) qui a donné le nom à
la primitive poll( ) et à /dev/poll et /dev/epoll.
Il existe plusieurs méthodes afin de scruter au mieux les entrées-sorties sans pour autant utiliser toutes les ressourses de la machine voici les principales primitives qui ont longtemps vécu dans le monde Linux : Select( ) et Poll( ).
Select( ) - page man -
En résumé, Select attend des changements d'état
sur plusieurs descripteurs de fichiers. C'est la méthode la plus fiable
et la moins cher en ressources avant l'arrivée de la primitive poll(
).
Linux se sépare rapidement de Select car cette fonction est limitée
en nombre de descripteurs de fichier. Par défaut la constante FD_SETSIZE
qui fixait cette limite valait : 8 * 8 * sizeof(unsigned long) = 512
!!! Ce qui veut dire qu'il était impossible d'avoir plus 512 descripteurs
de fichiers ouverts en simultanés...
Poll( ) - page man - :
Primitive qui a remplacé Select( ) à partir du noyau 2.1.23 en
Décembre 1997.
La grande différence avec son prédécesseur est le changement
d'interface utilisé. En effet, Poll( ) utilise une table de structure
du type :
Struct pollfd {
int fd; /* Descripteur de fichiers */
short events; /* Evénements attendus */
short revents; /* Evénements détectés */
};
Cette différence permet une utilisation plus simple de la primitive.
Mais comme nous pouvons le constater dans les tests, ces méthodes souffrent cruellement d'optimisations dès que nous surchageons le mécanisme de requètes.