Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Omniprésence de l'x86 est-il une bonne chose pour Linux ?

176 réponses
Avatar
PP
Bonsoir à tous,

en lisant un peu partout sur internet des news, notamment les dernières
sur www.blogarm.net, je m'attriste de l'omniprésence de l'architecture
x86 partout.

Cette dernière semble être de plus en plus compétitive face aux
spécialistes du secteur comme ARM par exemple dans l'embarqué et les
SoC. Peut-être pas du point de vue technique mais au moins marketing !

Ma peur de voir encore une fois le couple WIntel envahir le marché de
nous imposer une vision uniforme est effrayante.

Le seul point positif peut-être de cette histoire, c'est que Linux
pourrait être choisi encore plus facilement pour tous les matériels
équipés en x86. Ce qui ouvrirait une perspective de personnalisation de
nos équipement encore plus grande !?

Qu'en pensez-vous ?

10 réponses

Avatar
Hugolino
Le 02-10-2010, PP a écrit :
Tout est question de liberté du code pour certaines distributions



Tu pourrais arrêter de truffer tes messages de phrases aussi creuses que
plates, steupl'...


--
Naibed> J'aime beaucoup cette analyse multifactorielle de la question, car,
Naibed> sans être rédhibitoire, elle n'en laisse pas moins la porte ouverte
Naibed> aux subtiles nuances de la dialectique transgénérationnelle.
Et toi, le "transgénérationnel" ça te connait... (une fois)
Avatar
Nicolas George
JKB , dans le message , a
écrit :
Ce qui je le répète peut être idiot lorsque le signal s'adresse à un
thread spécifique, ou lorsque le signal doit récupérer une clef au
sens de la pthread.



Ceci n'arrive pas dans un programme qui a été conçu correctement au départ,
et en particulier qui ne prend pas l'initiative d'utiliser des signaux.

Il y a des tas d'applications où tu ne peux pas
faire comme ça et qui n'ont pas été codées par des pieds.



J'attends encore de les voir.

Ça a été conçu pour les utilisations historiques des threads, qui n'ont rien
à voir avec les signaux.





J'ai formulé ma phrase à l'envers, donc je reformule :

Les signaux sont une feature très ancienne dans Unix, et c'est une feature
qui était très mal conçue à la base, en particulier par l'extrême limitation
de ce qui est autorisé dans un signal handler, mais aussi à cause du manque
de gestion cohérente des ressources (quand tu as un /var/run/foo.pid, tu
n'as aucun moyen de savoir s'il correspond bien au démon foo en train de
tourner ; a contrario, une socket ne te laissera envoyer un message qu'au
processus visé).

Des interfaces bien mieux conçues existaient à l'époque, et elles ont été
étendues. C'est essentiellement l'API des file descriptors, qui peuvent être
agrégés, surveillés, transmis, partagés, etc.

Cependant, il existe encore quelques applications dont le monde de
communication normal est le signal : SIGCHLD, SIGWINCH et peut-être quelques
autres qu'on oublie, plus quelques drivers conçus avec les pieds.

Dans ces conditions, la seule méthode saine quand on doit gérer ces
éléments dans un programme un tant soit peu complexe, c'est de se
débrouiller pour les insérer dans le flot normal du programme. Regarde
n'importe quelle bibliothèque qui implémente une boucle d'événement, tu
retrouveras toujours la même chose : les signaux sont attrapés par un
handler trivial qui se contente de notifier le coeur ; la vraie gestion est
faite de la même manière que pour tout le reste.

signalfd fournit le support natif pour ce schéma : plus besoin d'attraper le
signal pour réveiller la boucle, le noyau s'en charge. Le vieux code qui
envoyait un signal croit toujours envoyer un signal, mais le code moderne
reçoit un message dans un fd.

Tu remplaces la gestion
des signaux asynchrones par un truc synchrone pour ne pas être
obligé de rendre tes gestionnaires de signaux thread safe (parce que
le fond du problème est là).



Précisément : on remplace un truc ultra casse-gueule, où les neuf dixièmes
des constructions sont interdites, et où il faut se creuser la tête pour
savoir si le dixième restant ne va pas introduire une race condition subtile
et impossible à débugger, par une structure simple et qui s'intègre
parfaitement au reste du système (devices, sockets, pipes, etc.).

Au passage, tu remplaces le système d'interruptions par
un système de polling. Ce n'est plus du tout équivalent. Par
ailleurs, tu es aussi obligé d'utiliser des attentes actives. En
terme d'efficacité, c'est une catastrophe.



Si tu ne sais pas programmer avec les fd, le problème est chez toi, hein. Ce
n'est pas parce qu'on a un fd qu'il faut faire de l'attente active, bien au
contraire, c'est le gros avantage des fd de permettre d'agréger et
multiplexer tout ce qu'on veut.

En rajoutant un truc qui n'est supporté que par Linux ? Je rigole.



C'est une autre histoire, et on s'en fout : l'API est bonne, elle simplifie
le code et rends les choses plus efficaces. Les autres Unix l'adopteront ou
crèveront.

Ce n'est pas le débat. Réponds à la question. Tu prétends qu'il faut
faire des opérations complexes sources de bugs. Je te réponds que
c'est faux. Que vient faire dans le débat l'efficacité des calculs ?



Personne ne voudra d'un compilateur ou d'un OS qui impose un code ralenti à
ce point.
Avatar
Miod Vallat
Sur alpha, j'avais un doute. Le reste, c'est le l'abus de langage
parce que pour moi, une opération de chargement immédiat tient sur
deux fois 32 bits.



C'est pourtant trivialement faux.
Avatar
JKB
Le 02 Oct 2010 12:42:15 GMT,
Nicolas George <nicolas$ écrivait :
JKB , dans le message , a
écrit :
Ce qui je le répète peut être idiot lorsque le signal s'adresse à un
thread spécifique, ou lorsque le signal doit récupérer une clef au
sens de la pthread.



Ceci n'arrive pas dans un programme qui a été conçu correctement au départ,
et en particulier qui ne prend pas l'initiative d'utiliser des signaux.



Ça n'engage que toi.

Il y a des tas d'applications où tu ne peux pas
faire comme ça et qui n'ont pas été codées par des pieds.



J'attends encore de les voir.



Tu n'as pas cherché bien loin. Je ne vais pas m'abaisser à te
fournir des URL.

Ça a été conçu pour les utilisations historiques des threads, qui n'ont rien
à voir avec les signaux.





J'ai formulé ma phrase à l'envers, donc je reformule :

Les signaux sont une feature très ancienne dans Unix, et c'est une feature
qui était très mal conçue à la base, en particulier par l'extrême limitation
de ce qui est autorisé dans un signal handler,



Qu'est-ce qu'il ne faut pas lire. C'est au contraire très bien fichu
dès qu'on utilise siginfo_t et sigaction() à la place des
semantiques anciennes. Et ce n'est pas parce que certains systèmes
ne sont pas fichus de les implanter que ce sont de mauvaises chose.

mais aussi à cause du manque
de gestion cohérente des ressources (quand tu as un /var/run/foo.pid, tu
n'as aucun moyen de savoir s'il correspond bien au démon foo en train de
tourner ; a contrario, une socket ne te laissera envoyer un message qu'au
processus visé).



Et paf, je l'attendais, celle-là ! On parle, je te le rappelle parce
que tu biaises encore, de programmation multithreadée et tu peux
avoir besoin des signaux au sein d'un même processus, ne serait-ce
que pour signaler les départs de threads. Histoire de ne pas
utiliser dans le thread A une ressource allouée par B, il peut être
de bon ton d'arrêter A puis de lui envoyer un signal dès que la
ressource est allouée. Et ne me dis pas que c'est un problème de
design, il y a peut-être des tas de raisons qui font que la ressource en
question n'a pas a être allouée dans A.

Les signaux peuvent donc tout à fait être utilisés à l'intérieur
d'un même processus entre les différents threads.

Des interfaces bien mieux conçues existaient à l'époque, et elles ont été
étendues. C'est essentiellement l'API des file descriptors, qui peuvent être
agrégés, surveillés, transmis, partagés, etc.



Non, parce que ces API sont _synchrones_ alors que les signaux sont
_asynchrones_. Le fait d'utiliser des API _synchrones_ te contraint
à utiliser des attentes actives ou du polling. Dans quelle langue
faut-il que je te le dise ?

Cependant, il existe encore quelques applications dont le monde de
communication normal est le signal : SIGCHLD, SIGWINCH et peut-être quelques
autres qu'on oublie, plus quelques drivers conçus avec les pieds.

Dans ces conditions, la seule méthode saine quand on doit gérer ces
éléments dans un programme un tant soit peu complexe, c'est de se
débrouiller pour les insérer dans le flot normal du programme.



Mouarf.

Regarde
n'importe quelle bibliothèque qui implémente une boucle d'événement, tu
retrouveras toujours la même chose : les signaux sont attrapés par un
handler trivial qui se contente de notifier le coeur ; la vraie gestion est
faite de la même manière que pour tout le reste.



Notification qui devient synchrone vis à vis du thread normalement
signalé. Et on retombe dans le polling. On ne va même pas parler ici
de programmation temps-réel parce que pour le coup, on en est
vraiment loin...

signalfd fournit le support natif pour ce schéma : plus besoin d'attraper le
signal pour réveiller la boucle, le noyau s'en charge. Le vieux code qui
envoyait un signal croit toujours envoyer un signal, mais le code moderne
reçoit un message dans un fd.



Tu es bouché à l'émeri parce que tu pars du principe que les deux
approches sont équivalentes, ce qui est faux. Les signaux ne servent
pas qu'à cela et ne peuvent être remplacés par un système synchrone.
Tous les appels systèmes dits lents peuvent échouer sur un EINTR, et
ton approche revient à faire du polling _dans_ ces appels systèmes
si tu veux que les deux approches soient équivalentes.

Je ne sais pas si tu vois bien les conséquences. Vu ton discours,
j'ai comme un doute.

Tu remplaces la gestion
des signaux asynchrones par un truc synchrone pour ne pas être
obligé de rendre tes gestionnaires de signaux thread safe (parce que
le fond du problème est là).



Précisément : on remplace un truc ultra casse-gueule, où les neuf dixièmes
des constructions sont interdites, et où il faut se creuser la tête pour
savoir si le dixième restant ne va pas introduire une race condition subtile
et impossible à débugger, par une structure simple et qui s'intègre
parfaitement au reste du système (devices, sockets, pipes, etc.).



Sans commentaire. Est-ce que tu crois que les concepteurs d'Unix (je
ne parle même pas des specs POSIX, BSD ou SyV) aient imposé un truc
inutile ?

D'autre part, lorsque tu commences à utiliser les signaux, la
moindre des choses est de savoir ce que tu fais.

Au passage, tu remplaces le système d'interruptions par
un système de polling. Ce n'est plus du tout équivalent. Par
ailleurs, tu es aussi obligé d'utiliser des attentes actives. En
terme d'efficacité, c'est une catastrophe.



Si tu ne sais pas programmer avec les fd, le problème est chez toi, hein. Ce
n'est pas parce qu'on a un fd qu'il faut faire de l'attente active, bien au
contraire, c'est le gros avantage des fd de permettre d'agréger et
multiplexer tout ce qu'on veut.



Qu'est-ce qu'on rigole avec toi.

Exemple :

sem_wait(&sem);
polling(&mysignalfd);

Le truc reste bloqué une dizaine de seconde par un traitement. Que
crois-tu qu'il va se passer ? Rien, le seul moyen de s'en tirer est
de remplacer le truc par :

while(sem_trywait(&sem))
{
// Vérification que l'erreur est du type sémaphore bloqué
// sinon on sort.
..

polling(&mysignalfd);
}

Si ça, ce n'est pas une attente active, j'aimerais bien que tu me
définisses ce qu'est pour toi une attente active !

En rajoutant un truc qui n'est supporté que par Linux ? Je rigole.



C'est une autre histoire, et on s'en fout : l'API est bonne, elle simplifie
le code et rends les choses plus efficaces. Les autres Unix l'adopteront ou
crèveront.



Qu'ils crèvent. Ce genre de merde est typique du monde Linux. Sous
prétexte que les programmeurs ne savent pas programmer, on remplace
un truc qui fonctionne par un truc qui remplit 95% des fonctions du
premier. Tant pis pour les gens qui ont besoin des 5% restant. Mon
discours n'est pas de dire que signalfd() est bon ou n'est pas bon,
simplement d'essayer de te faire comprendre que les deux approches
ne sont pas équivalentes et que signalfd() ne peut remplacer un
gestionnaire de signal.

Ce n'est pas le débat. Réponds à la question. Tu prétends qu'il faut
faire des opérations complexes sources de bugs. Je te réponds que
c'est faux. Que vient faire dans le débat l'efficacité des calculs ?



Personne ne voudra d'un compilateur ou d'un OS qui impose un code ralenti à
ce point.



Mais qu'est-ce qu'il ne faut pas lire. L'overhead introduit est
_négligeable_ vis à vis de toutes les autres opérations faites par
l'OS. Si ce n'est pas le cas, c'est juste que ton OS a été écrit pas
un pied.

Bon, j'ai du boulot, continue à raconter tes conneries tout seul.

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
JKB
Le Sat, 2 Oct 2010 13:03:14 +0000 (UTC),
Miod Vallat écrivait :
Sur alpha, j'avais un doute. Le reste, c'est le l'abus de langage
parce que pour moi, une opération de chargement immédiat tient sur
deux fois 32 bits.



C'est pourtant trivialement faux.



Euh, là, je ne comprends pas. Je te dis ça de mémoire, mais il me
semblait jusqu'à présent que si je cherche à mettre $FFFFFFFF dans
le registre L2, il me faut écrire :

sethi %hi(0xFFFFFFFF),%L2
or %L2,%lo(0xFFFFFFFF),%L2

qui sont toutes deux des instructions de 32 bits, non ?

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Miod Vallat
Sur alpha, j'avais un doute. Le reste, c'est le l'abus de langage
parce que pour moi, une opération de chargement immédiat tient sur
deux fois 32 bits.



C'est pourtant trivialement faux.



Euh, là, je ne comprends pas. Je te dis ça de mémoire, mais il me
semblait jusqu'à présent que si je cherche à mettre $FFFFFFFF dans
le registre L2, il me faut écrire :

sethi %hi(0xFFFFFFFF),%L2
or %L2,%lo(0xFFFFFFFF),%L2

qui sont toutes deux des instructions de 32 bits, non ?



Oui, mais là tu ne charges qu'une valeur de 32 bits. Comme la
conversation parlait entre autres d'alpha, il était implicite pour moi
qu'il était question de charger des valeurs immédiates de 64 bits.
Avatar
Nicolas George
JKB , dans le message , a
écrit :
Tu n'as pas cherché bien loin. Je ne vais pas m'abaisser à te
fournir des URL.



Non, surtout pas, ça risquerait de rendre ton discours vaguement crédible.

Qu'est-ce qu'il ne faut pas lire. C'est au contraire très bien fichu
dès qu'on utilise siginfo_t et sigaction() à la place des
semantiques anciennes.



Ce n'est pas utiliser sigaction qui te permettra de faire un malloc dans un
signal handler.

Et ne me dis pas que c'est un problème de
design



Ben si, je le dis.

Les signaux peuvent donc tout à fait être utilisés à l'intérieur
d'un même processus entre les différents threads.



Oui, ils peuvent. Et ceux qui utilisent cette possibilité sont des tarés.

C'est un des principes d'Unix : on te donne toujours assez de corde pour te
pendre.

Non, parce que ces API sont _synchrones_ alors que les signaux sont
_asynchrones_. Le fait d'utiliser des API _synchrones_ te contraint
à utiliser des attentes actives ou du polling. Dans quelle langue
faut-il que je te le dise ?



Tu peux le traduire dans la langue que tu veux, ça ne le rendra pas vrai.

Notification qui devient synchrone vis à vis du thread normalement
signalé.



Oui. C'est le but : synchrone => plus simple, donc moins de bugs.

Et on retombe dans le polling.



Non.

Tu es bouché à l'émeri parce que tu pars du principe que les deux
approches sont équivalentes, ce qui est faux. Les signaux ne servent
pas qu'à cela et ne peuvent être remplacés par un système synchrone.
Tous les appels systèmes dits lents peuvent échouer sur un EINTR, et
ton approche revient à faire du polling _dans_ ces appels systèmes
si tu veux que les deux approches soient équivalentes.



man poll

Sans commentaire. Est-ce que tu crois que les concepteurs d'Unix (je
ne parle même pas des specs POSIX, BSD ou SyV) aient imposé un truc
inutile ?



Il y a plein de trucs inutiles dans Unix.

D'autre part, lorsque tu commences à utiliser les signaux, la
moindre des choses est de savoir ce que tu fais.



Je sais ce que je fais, et c'est pour ça que j'évite d'utiliser des signaux.

sem_wait(&sem);



Ben déjà, les sémaphores, c'est aussi une API de merde, alors bon...

polling(&mysignalfd);



Tu veux prouver quoi ? Que tu sais faire des programmes grotesques qui ne
marchent pas ? Je le savais déjà.

Si ça, ce n'est pas une attente active, j'aimerais bien que tu me
définisses ce qu'est pour toi une attente active !



Oh, quand on veut faire une attente active, on peut toujours. Même avec des
signaux, d'ailleurs.

Que tu sois manifestement une tanche pour programmer avec autre chose que
des signaux, ça dit des choses sur toi, pas sur les signaux.

Qu'ils crèvent. Ce genre de merde est typique du monde Linux. Sous
prétexte que les programmeurs ne savent pas programmer,



Ouais. D'ailleurs, Linux ne marche pas.

Mais qu'est-ce qu'il ne faut pas lire. L'overhead introduit est
_négligeable_ vis à vis de toutes les autres opérations faites par
l'OS. Si ce n'est pas le cas, c'est juste que ton OS a été écrit pas
un pied.



L'overhead dont il est question, c'est diviser par trois la vitesse de
toutes les opérations arithmétiques entières. Mais à part ça, c'est
négligeable. Ben voyons.
Avatar
Hugolino
Le 02-10-2010, Tonton Th a écrit :
On 10/02/2010 09:08 AM, Richard wrote:

> J'ai même ouï dire que, les instructions CISC étant plus courtes que
> les RISC, leur lecture en mémoire est plus efficace que sur un
> processeur RISC.

Oui, et non. Il me semble que les instructions à longueur
variable complexifient grandement le séquenceur d'accès et la
gestion du cache.



Oui, mais seulement si tu négliges le vortex spatio-temporel
d'improbabilité autour du vexin qui sur-courbe le scalaire
gravitationnel et donc emprisonne le temps.


--
il coupe les poils de cul en quatre,


Oui et stp évite les courants d'air; c'est que c'est très méticuleux
comme job :)
Hugo (né il y a 1 465 484 393 secondes)
Avatar
Miod Vallat
Oui, et non. Il me semble que les instructions à longueur
variable complexifient grandement le séquenceur d'accès et la
gestion du cache.



Oui, mais seulement si tu négliges le vortex spatio-temporel
d'improbabilité autour du vexin qui sur-courbe le scalaire
gravitationnel et donc emprisonne le temps.



Le Vexin français ou le Vexin normand ?
Avatar
JKB
Le Sat, 2 Oct 2010 13:25:22 +0000 (UTC),
Miod Vallat écrivait :
Sur alpha, j'avais un doute. Le reste, c'est le l'abus de langage
parce que pour moi, une opération de chargement immédiat tient sur
deux fois 32 bits.



C'est pourtant trivialement faux.



Euh, là, je ne comprends pas. Je te dis ça de mémoire, mais il me
semblait jusqu'à présent que si je cherche à mettre $FFFFFFFF dans
le registre L2, il me faut écrire :

sethi %hi(0xFFFFFFFF),%L2
or %L2,%lo(0xFFFFFFFF),%L2

qui sont toutes deux des instructions de 32 bits, non ?



Oui, mais là tu ne charges qu'une valeur de 32 bits. Comme la
conversation parlait entre autres d'alpha, il était implicite pour moi
qu'il était question de charger des valeurs immédiates de 64 bits.



Au temps pour moi. Je serais plus clair la prochaine fois.

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr