Wikilivres frwikibooks https://fr.wikibooks.org/wiki/Accueil MediaWiki 1.39.0-wmf.22 first-letter Média Spécial Discussion Utilisateur Discussion utilisateur Wikilivres Discussion Wikilivres Fichier Discussion fichier MediaWiki Discussion MediaWiki Modèle Discussion modèle Aide Discussion aide Catégorie Discussion catégorie Transwiki Discussion Transwiki Wikijunior Discussion Wikijunior TimedText TimedText talk Module Discussion module Gadget Discussion gadget Définition de gadget Discussion définition de gadget Physique subatomique 0 4928 682825 649964 2022-07-28T16:33:07Z Slzbg 108600 ortho, conj wikitext text/x-wiki {{Ébauche}} == Introduction == La description de la matière a depuis toujours intrigué l'humanité. Vu l'immense diversité des formes que prend celle-ci à l'échelle humaine, il est tentant de penser qu'à une échelle plus petite, elle existe sous une forme plus fondamentale, voire plus simple. À tort ou à raison, l'approche scientifique s'est laissée guider par ce concept en espérant qu'une fois les briques fondamentales obtenues, il serait possible de reconstruire l'édifice jusqu'à notre échelle et même au-delà. Dans les faits, une telle reconstruction nous échappe encore… La première notion d'éléments fondamentaux nous vient des Grecs. Ils pensaient que la Nature était composée de quatre éléments : l'air, le feu, l'eau et la terre. Ces éléments (toujours chez les Grecs) furent ultérieurement remplacés par une notion simplificatrice, celle de l'[[w:atome|atome]]. Il faut toutefois mentionner que cette approche n'a pas toujours fait l'unanimité. La civilisation arabe, par ses contributions tant dans le domaine des mathématiques (Algèbre, Algorithmique, chiffres arabes (012345679)) que de la physique (surtout optique et mécanique), a permis de franchir un grand pas dans le progrès scientifique. Surtout grâce aux possibilités offertes dans le domaine des formulations mathématiques des phénomènes physiques. Le dernier siècle a vu la physique, et notamment la [[w:physique des particules|physique des particules]], faire un bond phénoménal. Une version plus moderne de l'atome a vu le jour dans laquelle celui-ci est formé de constituants plus fondamentaux. Notre perception de la matière est en constante évolution mais, pour le moment, elle révèle une structure passablement riche dont voici une description sommaire. On peut dès lors identifier certaines des particules fondamentales comme l'électron et le quark. Mais il existe d'autres particules, certaines sont toutes aussi fondamentales d'autres sont composites. == Notions de Base == === La matière === ==== Les leptons ==== Les leptons (ainsi nommés parce que leurs masses étaient relativement faibles) sont caractérisés par les propriétés suivantes : # Ce sont des particules qui n'interagissent pas fortement (aucune interaction forte) ; # Ils portent des charges électriques entières (soit e soit -e) ; # Ils possèdent une charge “faible” et peuvent être regroupés en paires appelées doublets d'interaction faible : une particule électriquement chargée et un neutrino de charge électrique nulle ; # Ils obéissent à la statistique de Fermi-Dirac, ce sont des fermions ; # Ils sont régis par le principe d'exclusion de Pauli (spin demi-entier) ; # Tous les leptons possèdent une masse non nulle . Les trois familles ou générations de leptons connues sont : # <math>\nu_e</math> (neutrino électronique) / e (électron) ; # <math>\nu_\mu</math> (neutrino muonique) / μ (muon) ; # <math>\nu_\tau</math> (neutrino tauonique) / τ (tauon) . <br /> On observe dans la nature seulement les leptons de première génération (électron et neutrino électronique). En effet, ceux des seconde et troisième génération ont une durée de vie bien trop brève : 10<sup>-6</sup> secondes pour le muon (dans un cadre non relativiste) et environ 2.8×10<sup>-13</sup> seconde pour le tauon (dans un cadre non relativiste). ==== Les hadrons ==== Les hadrons sont caractérisés par les propriétés suivantes : # Ce sont des particules qui interagissent fortement (soumises à l'interaction forte “résiduelle”) . Les interactions forte, faible, électromagnétique et gravitationnelle sont décrites dans la section suivante. # Ils portent des charges électriques entières (multiples de la charge de l'électron) . # Ils ont des interactions faibles . # Ils sont formés de quarks (et/ou antiquarks) . On compte six types ou saveur de quarks : le quark up, le quark down, le quark étrange, le quark charmé, le quark bottom et le quark top (encore appelés beauty et truth pour des raisons historiques). Dans les faits, les hadrons ne sont pas des particules fondamentales, mais plutôt des états liés de quarks. On en observe plus de deux cents. Les hadrons peuvent eux-mêmes être classés en deux groupes : les baryons, auxquels on associe un nombre quantique (le nombre baryonique), sont composés de trois quarks et les mésons, responsables des interactions fortes entre hadrons, formés d'un quark et d'un antiquark. Voici les hadrons les plus fréquemment observés : * p : proton (baryon) ; * n : neutron (baryon) ; * Λ<sup>0</sup>, Λ<sup>+</sup> : lambda (baryon) ; * π<sup>+</sup>, π<sup>0</sup>, π<sup>-</sup> : pions (méson) ; * ρ<sup>+</sup>, ρ<sup>0</sup>, ρ<sup>-</sup> : rho (méson) ; * K<sup>+</sup>, K<sup>0</sup>, K<sup>-</sup> : kaon (méson) ; * ... <br /> En plus de tous ces hadrons baryoniques et mésoniques, certains théoriciens ont prévu d'autres formes de hadrons : les hadrons exotiques. Ces derniers pourraient posséder des caractéristiques encore jamais observées comme le fait d'être constitué de cinq quarks, ont bien de voir leur constitution ajouté d'un gluon réel (cf interaction nucléaire forte) . ==== Les quarks ==== Les quarks sont les particules fondamentales qui forment la matière nucléaire. # Ils interagissent fortement (soumis à l'interaction forte) ; # Ils portent des charges électriques fractionnaires de e(-1/3e et 2/3e) ; # Ils possèdent une charge faible et forment des doublets d'interaction faible ; # On leur associe aussi une charge colorée (couleur) et forment des triplets d'interaction forte ; # Ils possèdent tous des spin demi entier (1/2) et appartiennent ainsi à la catégorie des fermions. Les quarks apparaissent au moins en six saveurs (l'existence du quark top a été confirmé en 1995) : les quarks up, down, étrange, charmé, bottom et le quark top (encore appelés beauty et truth pour des raisons historiques). Comme les leptons, ils peuvent être regroupés en doublets de charge électrique 2/3 ; -1/3. Les trois générations de quarks sont les suivantes : # u (up) et d (down) ; # c (charme) et s (étrange) ; # t (top) et b (bottom) . </br> De façon générale, on soupçonne que les familles de quarks et leptons sont reliées ; il en existe trois de chaque. Ces trois générations sont présentées par le modèle standard des particules qui constituent une des théorie les plus établies aujourd'hui. La charge de couleur précédemment abordée peut être, de manière imagée, considérée comme les trois couleurs primaires de la synthèse additive : bleu,rouge et vert. Les antiquark porterait alors des charges "d'anti-couleur" à savoir "l'anti-bleu", "l'anti-rouge" et "l'anti-vert", que l'on peut aussi voir comme le magenta, le jaune et le cyan (couleurs complémentaires). Dans les baryons (neutron, protons, ...) ces couleurs peuvent changer à l'aide du médiateur de l'interaction forte : le gluon. Ce boson possède lui-même une charge de couleur et "d'anti-couleur". Une des règles principales pour ces mêmes baryons est que la somme des couleurs doit toujours donner du blanc, être neutre. === Les différents types d'interaction === L'interaction entre particules de matière se fait via l'échange de particules (ex. bosons de jauge) qui portent les quanta d'énergie-impulsion de quatre types d'interaction (gravitationnelle, faible, électromagnétique et forte). Le graviton a pour le moment éludé toute tentative d'observation. Le graviton n'existe que dans le cadre de théories quantiques de la gravitation. Cependant aucune de ces théories n'est entièrement satisfaisante même si certaines sont prometteuses (supergravité, cordes, supercordes, gravité quantique à boucle, …). Par ailleurs, on recherche le boson de Higgs activement (peut être découvert au CERN en 2012). Le boson de Higgs serait responsable de la masse des particules à travers un phénomène de brisure spontanée de symétrie. Ce boson n'est pourtant pas considéré comme l'un des bosons d'interactions fondamentales . Ces particules sont toutes de spin 1 sauf le Higgs et le graviton qui sont de spin 0 et 2 respectivement. Toutes les interactions sont donc la conséquence d'échange de bosons (particules de spin entier). === Les unités === Le système d'unités SI (système international) est basé sur trois unités fondamentales et requiert donc trois étalons de mesure : [longueur]<sub>SI</sub> = 1 m. [temps]<sub>SI</sub> = 1 s. [masse ou énergie]<sub>SI</sub> = 1 kg ou 1 Joule. Ces unités sont bien adaptées à la vie de tous les jours mais sont peu pratiques tant aux échelles microscopiques abordées en physique subatomique qu'à des échelles macroscopiques requises en astrophysique. Pour simplifier le langage et malgré un souci d'uniformisation des systèmes d'unités, les physiciens se sont dotés au besoin de systèmes d'unités plus pratiques. En physique des particules, les systèmes étudiés mettent en jeu des particules dont les vitesses sont relativistes et dont les propriétés quantiques ne peuvent être négligées. Par ailleurs, la nature fournit deux constantes fondamentales qui sont particulièrement pertinentes pour de tels systèmes : la vitesse de la lumière c et le quanta de moment cinétique h. Rappelons que dans le système SI, ces constantes sont numériquement très grande ou très petite. c = 3× 10<sup>8</sup> m · s<sup>−1</sup> <math>\hbar</math>=h/2<math>\pi</math> = 1.054 × 10<sup>−34</sup> J · s = 6.58 × 10<sup>−22</sup> MeV · s où 1 MeV = 10<sup>6</sup> eV, eV désignant l’électron-Volt. Pour des systèmes quantiques relativistes, il est par contre plus naturel d'exprimer une vitesse comme une fraction de c, et un moment cinétique en termes d'unités de<math>\hbar</math> : Vitesse = fraction de c Spin = multiple de <math>\hbar </math> Le système d’unités naturelles (SUN) consiste à prendre comme étalons de mesure : [vitesse]<sub>SUN</sub> = 1 c [moment cinétique]<sub>SUN</sub> = 1 <math>\hbar</math> [énergie]<sub>SUN</sub> = 1 eV où dans le dernier cas, on choisit l'électron-Volt et ses dérivés tels le MeV = 10<sup>6</sup>eV et le GeV = 10<sup>9</sup>eV comme l'étalon de mesure de l'énergie puisqu'il est beaucoup plus près des échelles d'énergie considérées en physique des particules. Dans système d'unités naturelles,<math>\hbar</math> = c = 1 et la masse de l’électron est de 0.511 MeV == Mécanique quantique relativiste == Historiquement, le passage de la mécanique quantique à la mécanique quantique relativiste s'est effectué à partir d'une généralisation de l'équation de Schrödinger à un système relativiste. * L'équation d'onde de Schrödinger. * L'équation de Klein Gordon. * L'équation de Dirac. Dans une tentative visant à linéariser l'équation de Klein-Gordon (et à régler certains autres problèmes conceptuels comme des densités de probabilité négatives), Dirac introduit un système linéaire de quatre équations couplées, l'équation de Dirac. Voici sa version la plus courante que nous écrivons sans beaucoup plus d'informations : (iγ<sub>μ<:sub>∂<sub>μ</sub> − m)ψ = 0. Le bi-spineur ψ possède quatre composantes et les γ<sub>μ</sub> (μ = 0, 1, 2, 3) sont les quatre matrices 4 × 4 de Dirac. Les matrices γ<sub>μ</sub> intègrent la notion de spin puisque qu'elles correspondent à une version généralisée des matrices de spin de Pauli. Pour cette raison, l'équation de Dirac convient à la description des fermions (spin demi-entier). La théorie quantique des champs est depuis quelques années considérée comme un outil plus fondamental et plus puissant que la mécanique quantique relativiste. Sans trop aller dans les détails, mentionnons qu'elle est basée sur la seconde quantification des champs, c'est-à-dire sur les relations de commutation ou d'anticommutation des opérateurs de création et de destruction (appelés champs quantiques). En bref, mentionnons que si la mécanique quantique promeut les coordonnées d'espace-temps et d'énergie-impulsion au rang d'opérateurs, la théorie des champs, de son côté procède à une étape subséquente en élevant les fonctions d'onde au niveau d'opérateurs qui servent à créer ou détruire des états associés à des particules. Ces opérateurs sont appelés champs quantiques. La théorie permet d'interpréter chaque phénomène comme une série d'opérateurs agissant sur le vide, ex. création/destruction de particules (opérateur de création/destruction), interaction entre particules (opérateur de sommet) et échange ou propagation de particules (propagateur). === Bosons et fermions === ==== Bosons ==== Avec la mécanique quantique, on introduit la notion de moment cinétique intrinsèque d'une particule, c'est-à-dire le spin. Le spin prend des valeurs qui sont des multiples de 2, mais il détermine aussi le type de statistique auquel la particule est soumise. Les bosons sont des particules de spin entier<math>(0 ,\hbar , 2\hbar , 3\hbar , ...)</math> qui obéissent à la statistique de Bose-Einstein c'est-à-dire, un système de deux bosons identiques, désignés par les indices 1 et 2, est décrit par une fonction d'onde qui est symétrique sous l'échange des particules : <math>\psi 12 \rightarrow \psi 21</math> ==== Fermions ==== Les fermions sont des particules de spin demi-entier<math>(0 ,\hbar/2 , 3\hbar/2 , 5\hbar/2 , ...)</math> qui obéissent à la statistique de Fermi-Dirac c'est-à-dire, un système de deux fermions identiques, désignés par les indices 1 et 2, est décrit par une fonction d'onde qui est antisymétrique sous l'échange des particules : <math>\psi 12 \rightarrow -\psi 21</math> === Particules et antiparticules === La notion d'antiparticule fut proposée par Dirac en 1928. Ce dernier interpréta certaines solutions de l'équation qui porte son nom, comme des antiparticules. Les solutions associées aux antiparticules donnent lieu à différentes interprétations, ex. une particule qui se propage à rebours dans le temps ou encore des trous dans une mer de particules. L'antiparticule est caractérisée par : * des charges opposées à celle de la particule (charges électrique, faible, et autres nombres quantiques…), ; * une masse et une vie moyenne identiques à celles des particules. L'existence d'antiparticules fut confirmée par Anderson en 1933 à la suite de la découverte du positron (aussi appelé le positron) (antiélectron). Certaines particules (ex. le photon γ et le boson faible Z<sup>0</sup>) sont leur propre antiparticule, toutes leurs charges étant nulles. Par convention, nous désignerons l'antiparticule par une barre supérieure. === Interactions et champs === === L'interaction électromagnétique === === L'interaction faible === === L'interaction forte === L'interaction forte est une des quatre interactions fondamentales. Son vecteur est le gluon dont les caractéristiques sont une masse nulle (bien qu'un certains doute reste permis), une charge électrique nulle et comme tous bosons, un spin entier de 1. Elle est la plus puissante de toutes les interactions fondamentales mais son rayon d'action ne dépasse pas les 2,5·10{{exp|−15}} Comme dis précédemment, tous les gluons portent une charge de couleur et une d'anti-couleur. Il existe ainsi 8 types de gluons différents (nous verrons pourquoi seulement 8 au lieu de 9). ==== Échange de gluons virtuels ==== Dans le cadre de la chromodynamique quantique (QCD), les quarks sont liés via l'échange de gluons. Il faut ensuite se rappeler que tout hadron doit avoir une charge de couleur nulle. Or les gluons possèdent eux-mêmes des charges de couleur. Détaillons ainsi ce mécanisme d'échange/ Prenons un proton (deux quarks up pour un down). Chaque quark possède une des charges de couleur (rouge, vert, bleu). Lors d'une interaction (à l'aide donc d'un gluon), un quark (disons celui de couleur bleue) va émettre un gluon (virtuel) [anti-bleu ; rouge]. Ce quark va ainsi devenir rouge (puisque la charge bleue va s'annuler avec l'anti-bleu). Le quark récepteur va alors devenir bleu et émettre à son tour un autre gluon, et ainsi de suite. Cette propriété apparemment assez simple à comprendre entraîne en fait beaucoup de conséquences, comme l'impossibilité d'observer un quark seul ou encore la liberté asymptotique (nous y reviendrons plus tard). De plus, chaque gluon possède des charges de couleur et peut donc interagir avec les autres. ==== Pourquoi 8 gluons ? ==== Revenons sur le nombre de gluons. Pourquoi 8 au lieu de 9 ? Énonçons en premier lieu les 9 types de gluons que l'on pourrait rencontrer si l'on se fit à notre intuition première : <math>r\bar{r}, r\bar{v}, r\bar{b}, v\bar{r}, v\bar{v}, v\bar{b}, b\bar{r}, b\bar{v}, b\bar{b}</math>. Cependant, la chromodynamique quantique impose une limite à cette formulation des neufs états fondamentaux listés précédemment : <math>r\bar{r} + v\bar{v} + b\bar{b}</math> = 0 Ainsi les neufs états précédents ne sont plus totalement indépendant et la QCD nous dit alors qu'il ne peut exister que 8 types de gluons différents. ==== Liberté asymptotique ==== Comme nous l'avons vu précédemment, l'échange de gluons virtuels permet aux quarks d'être liés entre eux. Cependant, au contraire de la force gravitationnelle, la force nucléaire forte n'agit pas en raison inverse du carré de la distance, mais devient au contraire de plus en plus forte lorsque les quarks s'éloigne. Cette propriété est appelée liberté asymptotique, elle est en partie due au nuage de quarks et de gluon virtuels entourant le quark puisqu'au contraire de l'électron qui va être entouré de paire électron-positron (d'après le principe d'incertitude d'Heisenberg), un quark de couleur x va être entouré de quarks virtuels seulement rouge et non rouge et anti-rouge. Ceci est du au fait que les gluons font changer la couleur des quarks anti-rouge et les font devenir rouge. Du même coup, lorsqu'un gluon est "envoyé" par un quarks x', le quarks x est d'autant plus attiré qu'il n'est éloigné. Cette propriété a de plus d'autres conséquences sur les quarks eux-mêmes : on ne peut trouver de quarks isolé. ==== Les quarks, une affaire de famille ==== Imaginons ce qui se passerait si l'on éloignait de plus en plus deux quarks : il faudrait de plus en plus d'énergie pour les éloigner et donc ces deux quarks gagneraient eux aussi de plus en plus d'énergie. Au bout d'un moment, ils auront assez d'énergie pour pouvoir se désintégrer et former une paire quark/antiquark. Ce phénomène est appelé confinement. Ainsi il nous est impossible de voir un quark isolé. Cependant, il semblerai logique de penser qu'à des températures extrêmement élevé (comme celle régnant au big bang jusqu'au temps de Planck) les quarks pourraient être isolés. ==== L'interaction forte résiduelle ==== Nous avons que l'interaction forte agit au niveau de quarks, c'est à dire dans les fermions, elle permet leur stabilité. Cependant, elle n'agit pas seulement à ce niveau de quarks, mais aussi au niveau de la stabilité des noyaux atomiques. ==== Méson pi ==== Le noyau atomique est composé de fermions (protons et neutrons), ces derniers sont donc soumis à l'interaction forte. Voyons comment un physicien japonais est arrivé à prévoir la masse de la particule qui permit les cohésion du noyau atomique. En 1933, le japonais Hideki Yukawa propose que la force nucléaire découverte il y a peu, pourrait être une nouvelle force fondamentale. Il découvrit que cette force nucléaire n'était effective qu'à de très faible distance (10 <sup>-15</sup>). Il pensa alors que la masse de la particule médiatrice et la distance de cette force devait être inversement proportionnelle. Ce fut le coup de génie qui le mis sur la bonne voie. Une particule virtuelle de masse m ne peut exister que pendant un temps Δt que détermine notre principe d'incertitude. De plus, si cette particule se déplace à une vitesse inférieure ou égale à c, on trouve facilement que la particule peut parcourir une distance R=cΔt maximale pendant son temps d'existence. On peut encore écrire que l'incertitude sur l'énergie est au moins égale à l'énergie intrinsèque de la particule soit ΔE=mc². On complète ensuite avec le principe d'incertitude pour l'énergie et le temps : ΔE Δt ≥ h/2π <=> Δt = h/2π ΔE <=> Δt = 2π mc² Il a ainsi obtenu la distance maximale que peut atteindre une particule virtuelle de masse nulle : R = 2π mc². On remarque ici plusieurs choses : si la masse est nulle, la portée est infinie, une particule massive à donc une portée finie. Le photon ayant une masse nulle, il est normal que la force électromagnétique ait une portée infinie. Donc plus une particule est massive, plus la portée est courte (puisque les vecteurs de forces sont des particules virtuelles). Il en conclue donc que la force nucléaire doit être véhiculée par une particule assez massive. Il en déduisit une masse d'environ 140 MeV/c² qu'il appela méson. La particule porte aujourd'hui le nom de pion, elle est responsable de l’interaction forte résiduelle. Il existe quatre type de pions : </br> π<sup>0</sup> : <math>u\bar{u}</math> ou <math>d\bar{d}</math> </br> π<sup>+</sup> : <math>u\bar{d}</math> </br> π<sup>-</sup> : <math>d\bar{u}</math> </br> </br> ...à finir... === L'interaction gravitationnelle === == Les sources de particules et les détecteurs == Avant d'aborder les modèles sur lesquels est basée notre vision de la physique des particules, il est essentiel de comprendre comment on arrive à percevoir ces particules, à mesurer leur propriétés physiques et quels sont les défis techniques qu'il faut relever pour y parvenir. Le but de ce chapitre est donc de donner un aperçu des méthodes expérimentales utilisées en physique des particules. On peut les regrouper sous deux grandes fonctions : # '''les méthodes''' qui visent à fournir des sources de particules ayant des énergies de plus en plus grandes et ; # '''les détecteurs''' qui servent à mettre en évidence les différentes manifestations physiques des particules et à mesurer leurs propriétés physiques. === La radioactivité === La radioactivité provient de la désintégration spontanée (relevant de l'interaction faible) de noyaux lourds. Elle est caractérisée par l'émission d'une ou plusieurs des particules légères suivantes : e−, e+, p, n et α(He++) dont les énergies sont de l'ordre de grandeur des énergies de liaison nucléaire (environ 10 MeV). === Le rayonnement cosmique === Les rayons cosmiques sont des particules très stables (principalement des protons, des neutrons et des photons) qui se propagent à des distances astronomiques avant d'entrer dans l'atmosphère terrestre. Dès lors, ils interagissent avec les particules qui s'y trouvent et peuvent générer une multitude de sous-produits. Cette source a le désavantage d'être incontrôlable. En effet, on ne connaît a priori ni la nature, ni l'énergie, ni la trajectoire de la particule. De plus, les rayons cosmiques sont absorbés par l'atmosphère de sorte que seulement une fraction de ceux-ci arrive jusqu'à la surface de la Terre. Par ailleurs, l'énergie des rayons cosmiques est beaucoup plus grande que celle associée à la radioactivité. On leur identifie deux sources principales : une source stellaire associée aux basses énergies et une source galactique caractérisée par des énergies pouvant aller jusqu'à 10<sup>3</sup> TeV. === Les accélérateurs de particules === === La physique des détecteurs de particules === === Instruments et détecteurs === == Interactions entre particules == === Cinématique d’une réaction === === Repère du centre de masse (4 corps) === === Repère de la cible (4 corps) === === La rapidité === === Les interactions en mécanique quantique === === La matrice de diffusion S === === Espace de phase === === Section efficace === === La Diffusion (4 corps) === === Largeur de désintégration et vie moyenne === == Symétries de l'espace-temps == === Symétries en mécanique quantique === === Invariance par translation === === Rotation en trois dimensions === === Parité === === Renversement du temps === === Invariance de jauge === == Symétries internes == === Symétries globales et règles de sélection === ==== Charge électrique Q ==== ==== Nombre leptonique total L ==== ==== Nombre électronique, muonique, tauonique... ==== ==== Nombre baryonique B ==== === Isospin et hypercharge === ==== Symétrie SU(2) ==== ==== Générateurs de SU(2) ==== ==== Relation de Gell-Mann-Nishijima ==== ==== Conservation d’isospin ==== === Étrangeté === === Autres saveurs === ==== Charme ==== ==== Bottom ==== ==== Top ==== ==== La relation de Gell-Mann-Nishijima généralisée ==== === Conjugaison de la charge === ==== Parité de charge totale ==== ==== Invariance par C ==== ==== Les pions et les photons ==== ==== Systèmes particule-antiparticule ==== ==== Violation de CP ou T et Théorème CPT ==== === Résonances === == Le Modèle des Quarks == === Introduction === === Théorie des groupes === === Quarks et représentations SU (N) === === Lien entre représentation SU(N) et modèle des quarks === ==== Représentations irréductibles et tableaux de Young ==== ==== Construction des fonctions d’onde ==== === Couleur === ==== Groupe SU(3) de couleur ==== ==== Fonctions d’onde de couleur ==== ==== Évidence expérimentale de la couleur ==== === Masses et moments magnétiques === ==== Masses ==== ==== Moments magnétiques ==== === Diagrammes de flot de quarks === === Charme et SU(4) === ==== Mésons ==== ==== Baryons ==== == Interactions Électromagnétiques == === Diffusion (non-polarisée) e−Noyau === === Processus avec spin === ==== Notions de spin ==== ==== Diffusion polarisée e−Noyau ==== === Diffusion e − N === === Processus purement leptoniques en QED === ==== Processus e+e− → μ+μ− ==== ==== Diffusion de Bhabha: e+e− → e+e− ==== === Corrections radiatives === === Symétries de jauge === ==== Formalisme lagrangien ==== ==== Théorème de Noether et invariance de jauge globale ==== ==== L’invariance de jauge locale en QED ==== == Interactions Faibles == === Classification des interactions faibles === === Théorie de Fermi et interaction V − A === === Courants neutres === === Non conservation de la parité === === Théorie électrofaible === ==== Charge faible ==== ==== Modèle de Weinberg-Salam ==== ==== Mécanisme de Higgs ==== === Angle de Cabbibo et matrice de Kobayashi-Maskawa === === Mécanismes de GIM (Glashow-Illiopoulos-Maiani) et le charme === === Physique du K0 et ¯K 0 === === Violation de CP === == Interactions Fortes (QCD) == === Diffusion e − N === === Invariance d’échelle === === Modèle des partons === ==== Le modèle ==== ==== Nature ponctuelle des partons ==== ==== Spin des partons ==== === Liberté asymptotique et confinement === === Annihilation e+e− === === Diffusion ν − N === === Modèle des quarks-partons et fonctions de structure === === Collisions hadron-hadron === === Violation d’échelle === === Existence des quarks === == Unification des Forces == === Divergences et renormalisabilité === === Au-delà du modèle standard === === Le modèle standard === ==== Lacunes du modèle standard ==== ==== Vers une théorie au-delà du modèle standard ==== === Grande unification === ==== Modèle SU(5) ==== === Modèle SO(10) === === Autres modèles d’unification === ==== Supersymétrie (SUSY) ==== === Modèles supersymétriques === ==== Gravité quantique ==== ==== La supergravité ==== ==== Supercordes ==== [[Catégorie:Physique]] qrvvw4ug07ln6l0ibif0acw17h7bmxq Enseignement du berbère 0 7534 682848 417510 2022-07-28T21:27:02Z Slzbg 108600 pluriel wikitext text/x-wiki {{ébauche}} Le berbère est noté, depuis le milieu du premier millénaire avant l'ère chrétienne, au moyen d'un alphabet, le [[w:Tifinagh|tifinagh]] ou libyco-berbère. Il comporte des voyelles et des consonnes, dont il existe plusieurs variantes. Cet alphabet est utilisé uniquement par le peuple Touareg. Depuis le début du XXe siècle, le berbère a surtout été écrit au moyen de l'alphabet latin ou de l'alphabet arabe. Cependant, des propositions de tifinagh standard ont vu le jour à partir de la fin du XXe siècle. L'Académie berbère, travailla sur une version, révisée ensuite par le professeur Salem Chaker de l'INALCO. L'IRCAM officialisa un alphabet tifinagh en 2003. Les caractères de l'alphabet Tifinagh sont présents dans Unicode (caractères U+2D30 à U+2D7F). [[Catégorie:Langues régionales]] ak3lpy0wovwl4tfy8jdvqrnfazmilk8 Apache/Installation Linux 0 8615 682853 663909 2022-07-29T07:22:50Z JackPotte 5426 /* Bibliothèques */ wikitext text/x-wiki <noinclude>{{Apache}}</noinclude> === LAMP === Logiciel tout-en-un pour Linux (Apache + MySQL + PHP), comme WAMP pour Windows. {{Cadre code|commande nécessitant les privilèges root|<code><!-- --># apt-get install tasksel<br /># tasksel install lamp-server </code>}} === Installation manuelle === ==== Apache sur Debian / Ubuntu ==== {{Cadre code|commande nécessitant les privilèges root|<code># apt-get install apache2</code>}} Le service peut ne pas être lancé par défaut, mais même s'il l'est on peut quand-même essayer de l'activer avec : {{Cadre code|commande nécessitant les privilèges root|<code># /etc/init.d/apache2 start</code>}} On peut ensuite tester le serveur, pour voir si une page s'affiche ou s'il refuse la connexion : {{Cadre code|commande|<code>$ lynx http://localhost/</code>}} Cette adresse est le rebouclage, elle peut aussi être rentrée directement dans tout navigateur web. Si Apache était déjà installé vérifier le fichier pour indiquer le démarrage automatique d'Apache 2 '''/etc/default/apache2''' : # vi /etc/default/apache2 ... NO_START=0 ===== Installer PHP ===== On distingue principalement deux versions de PHP : celle dont le binaire est appelé par le serveur Web, et php-fpm qui possède son propre service daemon (aussi appelé par le serveur Web) testable ainsi : <syntaxhighlight lang=bash> telnet localhost 9000 CTRL + ALT + ] quit </syntaxhighlight> PHP peut-être installé avec toutes les déclinaisons de la distribution Debian (stable, testing, unstable). Il suffit pour cela d'insérer vos lignes préférées dans le fichier ''/etc/apt/sources.list'' : <syntaxhighlight lang=bash> deb http://ftp.fr.debian.org/debian/ stable main non-free contrib deb-src http://ftp.fr.debian.org/debian/ stable main non-free contrib </syntaxhighlight> Ce qui suit suppose que le serveur Web a bien été installé : exécuter les commandes suivantes : <syntaxhighlight lang=bash> sudo apt-get update && apt-get install php7.4 && apt-get install libapache2-mod-php7.4 </syntaxhighlight> Une fois ces commandes exécutées, redémarrer le serveur Web. Dans le cas d'Apache cela s'effectue avec la commande suivante : <syntaxhighlight lang=bash> /etc/init.d/apache2 restart </syntaxhighlight> Si tout s'est bien passé, vous disposez maintenant d'un serveur Web qui a la capacité d'exécuter des scripts PHP dans votre navigateur. Testons : {{Cadre code|commande|<code>$ lynx http://localhost/test.php</code>}} Pour débugger : {{Cadre code|commande|<code>$ tail /var/log/apache2/error.log</code>}} ====== Mise à jour ====== Pour la v7.4 sur Ubuntu : <syntaxhighlight lang=php> sudo add-apt-repository ppa:ondrej/php </syntaxhighlight> Sur Debian : <syntaxhighlight lang=php> sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' </syntaxhighlight> Puis : <syntaxhighlight lang=php> sudo apt update sudo apt install php7.4 php7.4-common php7.4-cli php7.4-fpm sudo a2enmod php7.4 sudo a2dismod php7.3 </syntaxhighlight> {{attention|Une fois les serveurs Web installés, ils se lancent automatiquement à chaque démarrage de la machine, ce qui est souhaitable pour un serveur, mais pas toujours pour un PC. Pour éviter cela, il suffit d'y désactiver les daemons : <syntaxhighlight lang=bash> sudo update-rc.d apache2 disable sudo update-rc.d mysql disable </syntaxhighlight> }} ====== Bibliothèques ====== Voici une liste de bibliothèques fréquemment utilisées dans les applications : <syntaxhighlight lang=php> # apt-get install -y \ php7.4-mysql \ php7.4-cli \ php7.4-gd \ php7.4-curl \ php7.4-mbstring \ php7.4-xml </syntaxhighlight> D'autres s'installent avec [[Programmation_PHP/PEAR|pecl]] au lieu de apt. Pour les activer après installation, on peut éditer le php.ini ou lancer : phpenmod nom_du_module_php. Ex : <code>sudo phpenmod gd</code>. Pour les désactiver : phpdismod nom_du_module_php ===== Désinstaller PHP ===== Pour éviter de désinstaller tous les paquets PHP un par un (par exemple après une bascule de PHP7.0 vers PHP7.1), il existe "ppa-purge" : <syntaxhighlight lang=bash> sudo apt-get install ppa-purge sudo ppa-purge ppa:ondrej/php-7.0 </syntaxhighlight> ==== Apache sur Gentoo ==== Premièrement il faut installer Apache : emerge apache Ensuite, il faut installer PHP : emerge dev-lang/php Puis il faut qu'apache utilise PHP dans sa configuration. {{Box Code|Configuration de apache |<pre><nowiki># nano -w /etc/conf.d/apache2 APACHE2_OPTS="-D PHP5"</nowiki></pre> }} ==== MySQL seul ==== [[MySQL]] est disponible sur http://dev.mysql.com/downloads/gui-tools/5.0.html au format : # .msi (Windows) # .dmg (Mac) # .rpm (Linux) # .tar En l'absence de {{w|gestionnaire de paquets}}, utiliser le .tar ainsi : <syntaxhighlight lang=bash> shell> groupadd mysql shell> useradd -r -g mysql mysql shell> cd /usr/local shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz shell> ln -s full-path-to-mysql-VERSION-OS mysql shell> cd mysql shell> chown -R mysql . shell> chgrp -R mysql . shell> scripts/mysql_install_db --user=mysql shell> chown -R root . shell> chown -R mysql data shell> bin/mysqld_safe --user=mysql & </syntaxhighlight> ==== APT ==== <syntaxhighlight lang=bash> $ sudo apt-get install mysql-server mysql_secure_installation </syntaxhighlight> Puis, modifier PHP pour qu'il supporte MySQL : <syntaxhighlight lang=bash> $ sudo apt-get install php4-mysql </syntaxhighlight> ===== Variante ===== La dénomination des paquets mentionnés peut varier légèrement selon la version. Dans un terminal, entrez : $ sudo apt-get install mysql-server et confirmez. ''(Remarque : il semblerait qu'en installant le paquet "mysql-server-5.0", au lieu du paquet mentionné plus haut, certaines personnes rencontrent des problèmes. Il est donc préférable d'installer ce paquet, ou d'installer la dernière version 4 stable avec : $ sudo apt-get install mysql-server-4.1. Consultez le forum pour plus d'informations : [http://forum.ubuntu-fr.org/viewtopic.php?id=15352])'' Lancez ensuite la commande : cd && sudo mysql_secure_installation Appuyez sur Entrée lorsqu'il vous demande le mot de passe root MySQL : pour le moment il n'y en a pas. ''**NB :** MySQL a ses propres utilisateurs, avec leurs propres privilèges. Le root MySQL n'est donc pas le root système. Il est conseillé de ne pas mettre les mêmes mots de passes pour les utilisateurs MySQL et les utilisateur du système.'' Le script vous demande alors si vous voulez mettre un mot de passe pour l'utilisateur root. Répondez Y, et entrez (2 fois le nouveau mot de passe du root MySQL). Il vous pose ensuite une série de questions. Si vous ne savez pas quoi répondre, acceptez les choix par défaut en appuyant simplement sur Enter. Votre serveur MySQL est prêt. Par défaut il se lance à chaque démarrage du système, si vous ne le souhaitez pas, il vous suffit de lancer : $ sudo dpkg-reconfigure mysql-server et de répondre "Non" à la question du démarrage systématique de MySQL. ==== Sur Gentoo ==== <syntaxhighlight lang=bash> emerge mysql </syntaxhighlight> === Modules === De nombreux modules complémentaires peuvent être installés sur Apache. Pour les lister, on utilise <code>apachectl</code> (parfois <code>apache2ctl</code>) : <syntaxhighlight lang=bash> apachectl -t -D DUMP_MODULES </syntaxhighlight> Pour activer un module : <syntaxhighlight lang=bash> a2enmod Nom_du_module </syntaxhighlight> Un fichier est alors créé dans /etc/apache2/mods-enabled/. Exemple pour la réécriture d'URL : <syntaxhighlight lang=bash> a2enmod rewrite </syntaxhighlight> Pour le désactiver : <syntaxhighlight lang=bash> a2dismod Nom_du_module </syntaxhighlight> La configuration du module reste toutefois disponible dans /etc/apache2/mods-available/. {{remarque|Les extensions PHP nécessitent une autre commande. Ex : <syntaxhighlight lang=bash> phpenmod mbstring </syntaxhighlight> }} === Sites === Pour lister les sites du serveur : <syntaxhighlight lang=bash> apachectl -S </syntaxhighlight> Pour activer un site : <syntaxhighlight lang=bash> a2ensite Nom_du_site </syntaxhighlight> Le fichier du site est alors visible dans /etc/apache2/sites-enabled/. Pour le désactiver : <syntaxhighlight lang=bash> a2dissite Nom_du_site </syntaxhighlight> Le site est dans /etc/apache2/sites-available/. == Problème d'encodage d'Apache2 == Si vous rencontrez un problème d'encodage des caractères de vos pages, par exemple les caractères accentués apparaissant sous la forme "�" (<?>), c'est probablement parce qu'Apache2 déclare dans les en-têtes HTTP qui accompagnent les pages visionnées un encodage par défaut en Unicode (UTF-8) : Content-Type: text/html; charset=UTF-8 Tandis que les pages visionnées utilisent un autre encodage des caractères, comme par exemple Latin1 (ISO-8859-1). Même si vos documents indiquent le jeu de caractères utilisé, le paramètre donné par le serveur dans les en-têtes HTTP est prioritaire ! Pour corriger ce problème, il faudra éditer /etc/apache2/apache2.conf : $ sudo gedit /etc/apache2/apache2.conf ==== Encodage par défaut en Latin1 (ISO-8859-1) ==== Cherchez la ligne suivante : #AddDefaultCharset ISO-8859-1 Décommentez-la en enlevant le # : AddDefaultCharset ISO-8859-1 Pour ceux qui ont la locale iso-8859-15 (sinon vous pouvez faire "sudo dpkg-reconfigure locales" pour l'ajouter) et qui désirent l'utiliser par défaut, ajoutez un 5 en fin de ligne : AddDefaultCharset ISO-8859-15 ainsi que la ligne suivante dans le paragraphe en-dessous : AddCharset ISO-8859-15 .iso8859-15 .latin15 .fr Il ne vous reste plus qu'à mettre "fr" en première position dans la ligne LanguagePriority (juste au-dessus), et à demander à apache de relire sa configuration : $ sudo /etc/init.d/apache2 reload ==== Aucun encodage par défaut ==== Il est également possible de s'affranchir de tout encodage par défaut, de la manière suivante : Cherchez la directive ''AddDefaultCharset'' : AddDefaultCharset ISO-8859-1 Remplacez l'attribut par la valeur ''Off'' : AddDefaultCharset Off Là encore, on demandera à Apache de relire sa configuration : $ sudo /etc/init.d/apache2 reload Maintenant, les en-têtes HTTP ne contiendront plus d'indication d'encodage des caractères. Attention : il faudra alors que chaque page indique l'encodage utilisé, car s'en remettre à la détection automatique par les navigateurs peut s'avérer assez aléatoire ! <noinclude> [[Catégorie:Modèles imprimables spécifiques à plusieurs livres]] </noinclude> 6l9iqmrss32pbn8uz0s54cyisuzyxvy 682855 682853 2022-07-29T07:28:06Z JackPotte 5426 /* Bibliothèques */ wikitext text/x-wiki <noinclude>{{Apache}}</noinclude> === LAMP === Logiciel tout-en-un pour Linux (Apache + MySQL + PHP), comme WAMP pour Windows. {{Cadre code|commande nécessitant les privilèges root|<code><!-- --># apt-get install tasksel<br /># tasksel install lamp-server </code>}} === Installation manuelle === ==== Apache sur Debian / Ubuntu ==== {{Cadre code|commande nécessitant les privilèges root|<code># apt-get install apache2</code>}} Le service peut ne pas être lancé par défaut, mais même s'il l'est on peut quand-même essayer de l'activer avec : {{Cadre code|commande nécessitant les privilèges root|<code># /etc/init.d/apache2 start</code>}} On peut ensuite tester le serveur, pour voir si une page s'affiche ou s'il refuse la connexion : {{Cadre code|commande|<code>$ lynx http://localhost/</code>}} Cette adresse est le rebouclage, elle peut aussi être rentrée directement dans tout navigateur web. Si Apache était déjà installé vérifier le fichier pour indiquer le démarrage automatique d'Apache 2 '''/etc/default/apache2''' : # vi /etc/default/apache2 ... NO_START=0 ===== Installer PHP ===== On distingue principalement deux versions de PHP : celle dont le binaire est appelé par le serveur Web, et php-fpm qui possède son propre service daemon (aussi appelé par le serveur Web) testable ainsi : <syntaxhighlight lang=bash> telnet localhost 9000 CTRL + ALT + ] quit </syntaxhighlight> PHP peut-être installé avec toutes les déclinaisons de la distribution Debian (stable, testing, unstable). Il suffit pour cela d'insérer vos lignes préférées dans le fichier ''/etc/apt/sources.list'' : <syntaxhighlight lang=bash> deb http://ftp.fr.debian.org/debian/ stable main non-free contrib deb-src http://ftp.fr.debian.org/debian/ stable main non-free contrib </syntaxhighlight> Ce qui suit suppose que le serveur Web a bien été installé : exécuter les commandes suivantes : <syntaxhighlight lang=bash> sudo apt-get update && apt-get install php7.4 && apt-get install libapache2-mod-php7.4 </syntaxhighlight> Une fois ces commandes exécutées, redémarrer le serveur Web. Dans le cas d'Apache cela s'effectue avec la commande suivante : <syntaxhighlight lang=bash> /etc/init.d/apache2 restart </syntaxhighlight> Si tout s'est bien passé, vous disposez maintenant d'un serveur Web qui a la capacité d'exécuter des scripts PHP dans votre navigateur. Testons : {{Cadre code|commande|<code>$ lynx http://localhost/test.php</code>}} Pour débugger : {{Cadre code|commande|<code>$ tail /var/log/apache2/error.log</code>}} ====== Mise à jour ====== Pour la v7.4 sur Ubuntu : <syntaxhighlight lang=php> sudo add-apt-repository ppa:ondrej/php </syntaxhighlight> Sur Debian : <syntaxhighlight lang=php> sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' </syntaxhighlight> Puis : <syntaxhighlight lang=php> sudo apt update sudo apt install php7.4 php7.4-common php7.4-cli php7.4-fpm sudo a2enmod php7.4 sudo a2dismod php7.3 </syntaxhighlight> {{attention|Une fois les serveurs Web installés, ils se lancent automatiquement à chaque démarrage de la machine, ce qui est souhaitable pour un serveur, mais pas toujours pour un PC. Pour éviter cela, il suffit d'y désactiver les daemons : <syntaxhighlight lang=bash> sudo update-rc.d apache2 disable sudo update-rc.d mysql disable </syntaxhighlight> }} ====== Bibliothèques ====== Voici une liste de bibliothèques fréquemment utilisées dans les applications : <syntaxhighlight lang=php> # apt-get install -y \ php7.4-mysql \ php7.4-cli \ php7.4-gd \ php7.4-curl \ php7.4-mbstring \ php7.4-xml </syntaxhighlight> D'autres s'installent avec [[Programmation_PHP/PEAR|pecl]] au lieu de apt. Pour les activer après installation, on peut éditer le php.ini ou lancer : phpenmod nom_du_module_php. Ex : <code>sudo phpenmod gd</code>. Pour les désactiver : phpdismod nom_du_module_php Pour détecter l'emplacement du php.ini de la version de PHP par défaut : <code>php --ini</code>. ===== Désinstaller PHP ===== Pour éviter de désinstaller tous les paquets PHP un par un (par exemple après une bascule de PHP7.0 vers PHP7.1), il existe "ppa-purge" : <syntaxhighlight lang=bash> sudo apt-get install ppa-purge sudo ppa-purge ppa:ondrej/php-7.0 </syntaxhighlight> ==== Apache sur Gentoo ==== Premièrement il faut installer Apache : emerge apache Ensuite, il faut installer PHP : emerge dev-lang/php Puis il faut qu'apache utilise PHP dans sa configuration. {{Box Code|Configuration de apache |<pre><nowiki># nano -w /etc/conf.d/apache2 APACHE2_OPTS="-D PHP5"</nowiki></pre> }} ==== MySQL seul ==== [[MySQL]] est disponible sur http://dev.mysql.com/downloads/gui-tools/5.0.html au format : # .msi (Windows) # .dmg (Mac) # .rpm (Linux) # .tar En l'absence de {{w|gestionnaire de paquets}}, utiliser le .tar ainsi : <syntaxhighlight lang=bash> shell> groupadd mysql shell> useradd -r -g mysql mysql shell> cd /usr/local shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz shell> ln -s full-path-to-mysql-VERSION-OS mysql shell> cd mysql shell> chown -R mysql . shell> chgrp -R mysql . shell> scripts/mysql_install_db --user=mysql shell> chown -R root . shell> chown -R mysql data shell> bin/mysqld_safe --user=mysql & </syntaxhighlight> ==== APT ==== <syntaxhighlight lang=bash> $ sudo apt-get install mysql-server mysql_secure_installation </syntaxhighlight> Puis, modifier PHP pour qu'il supporte MySQL : <syntaxhighlight lang=bash> $ sudo apt-get install php4-mysql </syntaxhighlight> ===== Variante ===== La dénomination des paquets mentionnés peut varier légèrement selon la version. Dans un terminal, entrez : $ sudo apt-get install mysql-server et confirmez. ''(Remarque : il semblerait qu'en installant le paquet "mysql-server-5.0", au lieu du paquet mentionné plus haut, certaines personnes rencontrent des problèmes. Il est donc préférable d'installer ce paquet, ou d'installer la dernière version 4 stable avec : $ sudo apt-get install mysql-server-4.1. Consultez le forum pour plus d'informations : [http://forum.ubuntu-fr.org/viewtopic.php?id=15352])'' Lancez ensuite la commande : cd && sudo mysql_secure_installation Appuyez sur Entrée lorsqu'il vous demande le mot de passe root MySQL : pour le moment il n'y en a pas. ''**NB :** MySQL a ses propres utilisateurs, avec leurs propres privilèges. Le root MySQL n'est donc pas le root système. Il est conseillé de ne pas mettre les mêmes mots de passes pour les utilisateurs MySQL et les utilisateur du système.'' Le script vous demande alors si vous voulez mettre un mot de passe pour l'utilisateur root. Répondez Y, et entrez (2 fois le nouveau mot de passe du root MySQL). Il vous pose ensuite une série de questions. Si vous ne savez pas quoi répondre, acceptez les choix par défaut en appuyant simplement sur Enter. Votre serveur MySQL est prêt. Par défaut il se lance à chaque démarrage du système, si vous ne le souhaitez pas, il vous suffit de lancer : $ sudo dpkg-reconfigure mysql-server et de répondre "Non" à la question du démarrage systématique de MySQL. ==== Sur Gentoo ==== <syntaxhighlight lang=bash> emerge mysql </syntaxhighlight> === Modules === De nombreux modules complémentaires peuvent être installés sur Apache. Pour les lister, on utilise <code>apachectl</code> (parfois <code>apache2ctl</code>) : <syntaxhighlight lang=bash> apachectl -t -D DUMP_MODULES </syntaxhighlight> Pour activer un module : <syntaxhighlight lang=bash> a2enmod Nom_du_module </syntaxhighlight> Un fichier est alors créé dans /etc/apache2/mods-enabled/. Exemple pour la réécriture d'URL : <syntaxhighlight lang=bash> a2enmod rewrite </syntaxhighlight> Pour le désactiver : <syntaxhighlight lang=bash> a2dismod Nom_du_module </syntaxhighlight> La configuration du module reste toutefois disponible dans /etc/apache2/mods-available/. {{remarque|Les extensions PHP nécessitent une autre commande. Ex : <syntaxhighlight lang=bash> phpenmod mbstring </syntaxhighlight> }} === Sites === Pour lister les sites du serveur : <syntaxhighlight lang=bash> apachectl -S </syntaxhighlight> Pour activer un site : <syntaxhighlight lang=bash> a2ensite Nom_du_site </syntaxhighlight> Le fichier du site est alors visible dans /etc/apache2/sites-enabled/. Pour le désactiver : <syntaxhighlight lang=bash> a2dissite Nom_du_site </syntaxhighlight> Le site est dans /etc/apache2/sites-available/. == Problème d'encodage d'Apache2 == Si vous rencontrez un problème d'encodage des caractères de vos pages, par exemple les caractères accentués apparaissant sous la forme "�" (<?>), c'est probablement parce qu'Apache2 déclare dans les en-têtes HTTP qui accompagnent les pages visionnées un encodage par défaut en Unicode (UTF-8) : Content-Type: text/html; charset=UTF-8 Tandis que les pages visionnées utilisent un autre encodage des caractères, comme par exemple Latin1 (ISO-8859-1). Même si vos documents indiquent le jeu de caractères utilisé, le paramètre donné par le serveur dans les en-têtes HTTP est prioritaire ! Pour corriger ce problème, il faudra éditer /etc/apache2/apache2.conf : $ sudo gedit /etc/apache2/apache2.conf ==== Encodage par défaut en Latin1 (ISO-8859-1) ==== Cherchez la ligne suivante : #AddDefaultCharset ISO-8859-1 Décommentez-la en enlevant le # : AddDefaultCharset ISO-8859-1 Pour ceux qui ont la locale iso-8859-15 (sinon vous pouvez faire "sudo dpkg-reconfigure locales" pour l'ajouter) et qui désirent l'utiliser par défaut, ajoutez un 5 en fin de ligne : AddDefaultCharset ISO-8859-15 ainsi que la ligne suivante dans le paragraphe en-dessous : AddCharset ISO-8859-15 .iso8859-15 .latin15 .fr Il ne vous reste plus qu'à mettre "fr" en première position dans la ligne LanguagePriority (juste au-dessus), et à demander à apache de relire sa configuration : $ sudo /etc/init.d/apache2 reload ==== Aucun encodage par défaut ==== Il est également possible de s'affranchir de tout encodage par défaut, de la manière suivante : Cherchez la directive ''AddDefaultCharset'' : AddDefaultCharset ISO-8859-1 Remplacez l'attribut par la valeur ''Off'' : AddDefaultCharset Off Là encore, on demandera à Apache de relire sa configuration : $ sudo /etc/init.d/apache2 reload Maintenant, les en-têtes HTTP ne contiendront plus d'indication d'encodage des caractères. Attention : il faudra alors que chaque page indique l'encodage utilisé, car s'en remettre à la détection automatique par les navigateurs peut s'avérer assez aléatoire ! <noinclude> [[Catégorie:Modèles imprimables spécifiques à plusieurs livres]] </noinclude> 7c1497jz8wmtut6qcf3rwfhxdsxoi2r Livre de cuisine/Pâtes à la carbonara 0 10899 682810 682809 2022-07-28T11:59:13Z Alexandrejoe 110697 /* Ingrédients */ wikitext text/x-wiki {{Livre de cuisine}} {{Photo cuisine|photo=[[Image:Spaghetti carbonara.jpg|200px]]|titre='''Pâtes à la carbonara'''}} Les '''pâtes à la carbonara''' sont l'un des plats emblématiques de la cuisine italienne. == Ingrédients == * 360 g de {{i|pâte}}s, * 200 g de {{i|guanciale}}, * 120 g de {{i|pecorino}}, * 4 {{i|'=oui|œuf|œufs}}, * {{i|poivre|Poivre}}, {{i|sel|Sel}} == Préparation == # Faire chauffer une grande casserole d'eau légèrement salée ; # Émincer la guanciale et la faire revenir à feu doux dans une grande poêle sans matière grasse ; # Lorsque l'eau boue, cuire les pâtes ''al dente'' ; # Battre les œufs avec le fromage râpé et du poivre ; # Égoutter les pâtes mais conserver un peu d'eau de cuisson des pâtes ; # Verser les pâtes dans la poêle avec la guanciale et un peu d'eau de cuisson des pâtes (l'amidon permet de lier la sauce); # Remuer pendant une minute ; # Loin de la chaleur du feu, ajouter la pancetta et le mélange d'œufs, remuer et servir. == Note == * Les pâtes à la ''carbonara'' sont une préparation de dernier moment et ne supportent pas le réchauffage. == Variantes == * L'œuf entier, ou seulement les jaunes, ce qui influe sur la richesse de la sauce et sa facilité d'exécution. * La présence d'ail, cuit avec la pancetta puis retirée de la poêle. * Sans oignon, ail ni vin blanc ; juste du pecorino (en morceaux pas trop petits en non râpé), de la pancetta (ou du guanciale, salaison de joue de porc), œuf et poivre. * Ajout de crème et/ou de [[w:Champignon|champignon]]s. * Égoutter les pâtes sans l'aide d'une passoire afin de les maintenir imprégnées avec un peu de leur eau de cuisson. * Égoutter en saisissant les pâtes avec une pince, pour qu'elles refroidissent ; mélanger avec la sauce sans chauffer, pour que l'œuf ne cuise pas. [[Catégorie:Cuisine italienne|Pate Carbonara]] [[Catégorie:Pâtes alimentaires]] [[Catégorie:Recettes de tous les jours|Pate Carbonara]] 8c171evndm99u99ioflb2xf3rblh7xt 682811 682810 2022-07-28T11:59:55Z Alexandrejoe 110697 /* Préparation */ wikitext text/x-wiki {{Livre de cuisine}} {{Photo cuisine|photo=[[Image:Spaghetti carbonara.jpg|200px]]|titre='''Pâtes à la carbonara'''}} Les '''pâtes à la carbonara''' sont l'un des plats emblématiques de la cuisine italienne. == Ingrédients == * 360 g de {{i|pâte}}s, * 200 g de {{i|guanciale}}, * 120 g de {{i|pecorino}}, * 4 {{i|'=oui|œuf|œufs}}, * {{i|poivre|Poivre}}, {{i|sel|Sel}} == Préparation == # Faire chauffer une grande casserole d'eau légèrement salée ; # Émincer la guanciale et la faire revenir à feu doux dans une grande poêle sans matière grasse ; # Lorsque l'eau boue, cuire les pâtes un peu en dessous la cuisson ''al dente'' ; # Battre les œufs avec le fromage râpé et du poivre ; # Égoutter les pâtes mais conserver un peu d'eau de cuisson des pâtes ; # Verser les pâtes dans la poêle avec la guanciale et un peu d'eau de cuisson des pâtes (l'amidon permet de lier la sauce); # Remuer pendant une minute ; # Loin de la chaleur du feu, ajouter la pancetta et le mélange d'œufs, remuer et servir. == Note == * Les pâtes à la ''carbonara'' sont une préparation de dernier moment et ne supportent pas le réchauffage. == Variantes == * L'œuf entier, ou seulement les jaunes, ce qui influe sur la richesse de la sauce et sa facilité d'exécution. * La présence d'ail, cuit avec la pancetta puis retirée de la poêle. * Sans oignon, ail ni vin blanc ; juste du pecorino (en morceaux pas trop petits en non râpé), de la pancetta (ou du guanciale, salaison de joue de porc), œuf et poivre. * Ajout de crème et/ou de [[w:Champignon|champignon]]s. * Égoutter les pâtes sans l'aide d'une passoire afin de les maintenir imprégnées avec un peu de leur eau de cuisson. * Égoutter en saisissant les pâtes avec une pince, pour qu'elles refroidissent ; mélanger avec la sauce sans chauffer, pour que l'œuf ne cuise pas. [[Catégorie:Cuisine italienne|Pate Carbonara]] [[Catégorie:Pâtes alimentaires]] [[Catégorie:Recettes de tous les jours|Pate Carbonara]] gint57a7j1l852tp9q2tl015v29s1px 682812 682811 2022-07-28T12:00:43Z Alexandrejoe 110697 /* Préparation */ wikitext text/x-wiki {{Livre de cuisine}} {{Photo cuisine|photo=[[Image:Spaghetti carbonara.jpg|200px]]|titre='''Pâtes à la carbonara'''}} Les '''pâtes à la carbonara''' sont l'un des plats emblématiques de la cuisine italienne. == Ingrédients == * 360 g de {{i|pâte}}s, * 200 g de {{i|guanciale}}, * 120 g de {{i|pecorino}}, * 4 {{i|'=oui|œuf|œufs}}, * {{i|poivre|Poivre}}, {{i|sel|Sel}} == Préparation == # Faire chauffer une grande casserole d'eau légèrement salée ; # Émincer la guanciale et la faire revenir à feu doux dans une grande poêle sans matière grasse ; # Lorsque l'eau boue, cuire les pâtes un peu en dessous la cuisson ''al dente'' ; # Battre les œufs avec le pecorino râpé et du poivre ; # Égoutter les pâtes mais conserver un peu d'eau de cuisson des pâtes ; # Verser les pâtes dans la poêle avec la guanciale et un peu d'eau de cuisson des pâtes (l'amidon permet de lier la sauce); # Remuer pendant une minute ; # Loin de la chaleur du feu, ajouter le mélange d'œufs, pecorino et poivre , remuer et servir. == Note == * Les pâtes à la ''carbonara'' sont une préparation de dernier moment et ne supportent pas le réchauffage. == Variantes == * L'œuf entier, ou seulement les jaunes, ce qui influe sur la richesse de la sauce et sa facilité d'exécution. * La présence d'ail, cuit avec la pancetta puis retirée de la poêle. * Sans oignon, ail ni vin blanc ; juste du pecorino (en morceaux pas trop petits en non râpé), de la pancetta (ou du guanciale, salaison de joue de porc), œuf et poivre. * Ajout de crème et/ou de [[w:Champignon|champignon]]s. * Égoutter les pâtes sans l'aide d'une passoire afin de les maintenir imprégnées avec un peu de leur eau de cuisson. * Égoutter en saisissant les pâtes avec une pince, pour qu'elles refroidissent ; mélanger avec la sauce sans chauffer, pour que l'œuf ne cuise pas. [[Catégorie:Cuisine italienne|Pate Carbonara]] [[Catégorie:Pâtes alimentaires]] [[Catégorie:Recettes de tous les jours|Pate Carbonara]] ti3udrlumai7f1pps9tyva3faehwz37 682813 682812 2022-07-28T12:03:43Z Alexandrejoe 110697 /* Préparation */ wikitext text/x-wiki {{Livre de cuisine}} {{Photo cuisine|photo=[[Image:Spaghetti carbonara.jpg|200px]]|titre='''Pâtes à la carbonara'''}} Les '''pâtes à la carbonara''' sont l'un des plats emblématiques de la cuisine italienne. == Ingrédients == * 360 g de {{i|pâte}}s, * 200 g de {{i|guanciale}}, * 120 g de {{i|pecorino}}, * 4 {{i|'=oui|œuf|œufs}}, * {{i|poivre|Poivre}}, {{i|sel|Sel}} == Préparation == # Faire chauffer une grande casserole d'eau légèrement salée ; # Émincer la guanciale et la faire revenir à feu doux dans une grande poêle sans matière grasse ; # Lorsque l'eau boue, cuire les pâtes un peu en dessous la cuisson ''al dente'' ; # Battre les œufs avec le pecorino râpé et du poivre ; # Égoutter les pâtes mais conserver un peu d'eau de cuisson ; # Verser les pâtes dans la poêle avec la guanciale et un peu d'eau de cuisson des pâtes (l'amidon permet de lier la sauce); # Remuer pendant une à deux minute pour terminer de cuire les pâtes ''al dente'' (ajouter de l'eau de cuisson des pâtes si nécessaire) ; # Hors du feu, ajouter le mélange d'œufs, pecorino et poivre, remuer et servir. == Note == * Les pâtes à la ''carbonara'' sont une préparation de dernier moment et ne supportent pas le réchauffage. == Variantes == * L'œuf entier, ou seulement les jaunes, ce qui influe sur la richesse de la sauce et sa facilité d'exécution. * La présence d'ail, cuit avec la pancetta puis retirée de la poêle. * Sans oignon, ail ni vin blanc ; juste du pecorino (en morceaux pas trop petits en non râpé), de la pancetta (ou du guanciale, salaison de joue de porc), œuf et poivre. * Ajout de crème et/ou de [[w:Champignon|champignon]]s. * Égoutter les pâtes sans l'aide d'une passoire afin de les maintenir imprégnées avec un peu de leur eau de cuisson. * Égoutter en saisissant les pâtes avec une pince, pour qu'elles refroidissent ; mélanger avec la sauce sans chauffer, pour que l'œuf ne cuise pas. [[Catégorie:Cuisine italienne|Pate Carbonara]] [[Catégorie:Pâtes alimentaires]] [[Catégorie:Recettes de tous les jours|Pate Carbonara]] 43jnq93jl35q2z99ihane9av6ck0ncy 682814 682813 2022-07-28T12:04:40Z Alexandrejoe 110697 /* Variantes */ wikitext text/x-wiki {{Livre de cuisine}} {{Photo cuisine|photo=[[Image:Spaghetti carbonara.jpg|200px]]|titre='''Pâtes à la carbonara'''}} Les '''pâtes à la carbonara''' sont l'un des plats emblématiques de la cuisine italienne. == Ingrédients == * 360 g de {{i|pâte}}s, * 200 g de {{i|guanciale}}, * 120 g de {{i|pecorino}}, * 4 {{i|'=oui|œuf|œufs}}, * {{i|poivre|Poivre}}, {{i|sel|Sel}} == Préparation == # Faire chauffer une grande casserole d'eau légèrement salée ; # Émincer la guanciale et la faire revenir à feu doux dans une grande poêle sans matière grasse ; # Lorsque l'eau boue, cuire les pâtes un peu en dessous la cuisson ''al dente'' ; # Battre les œufs avec le pecorino râpé et du poivre ; # Égoutter les pâtes mais conserver un peu d'eau de cuisson ; # Verser les pâtes dans la poêle avec la guanciale et un peu d'eau de cuisson des pâtes (l'amidon permet de lier la sauce); # Remuer pendant une à deux minute pour terminer de cuire les pâtes ''al dente'' (ajouter de l'eau de cuisson des pâtes si nécessaire) ; # Hors du feu, ajouter le mélange d'œufs, pecorino et poivre, remuer et servir. == Note == * Les pâtes à la ''carbonara'' sont une préparation de dernier moment et ne supportent pas le réchauffage. == Variantes == * La guanciale peut être remplacée par de la pancetta ou des lardons * L'œuf entier, ou seulement les jaunes, ce qui influe sur la richesse de la sauce et sa facilité d'exécution. * La présence d'ail, cuit avec la pancetta puis retirée de la poêle. * Sans oignon, ail ni vin blanc ; juste du pecorino (en morceaux pas trop petits en non râpé), de la pancetta (ou du guanciale, salaison de joue de porc), œuf et poivre. * Ajout de crème et/ou de [[w:Champignon|champignon]]s. * Égoutter les pâtes sans l'aide d'une passoire afin de les maintenir imprégnées avec un peu de leur eau de cuisson. * Égoutter en saisissant les pâtes avec une pince, pour qu'elles refroidissent ; mélanger avec la sauce sans chauffer, pour que l'œuf ne cuise pas. [[Catégorie:Cuisine italienne|Pate Carbonara]] [[Catégorie:Pâtes alimentaires]] [[Catégorie:Recettes de tous les jours|Pate Carbonara]] pcnqs4c70m9l822ko5wwa9apxw3p0uk Photographie/Fabricants/Fujifilm/Fujifilm MX-1500 0 13703 682846 278344 2022-07-28T20:42:16Z Slzbg 108600 Il manquait une voyelle. wikitext text/x-wiki {{Ph s Fabricants}} == Fujifilm MX-1500 = Fujifilm Finepix 1500 == <br/> {| border="1" cellpadding="10" align="center" |- |[[Image:IMG.svg|240px|center]] |- |} <br/> == Caractéristiques == {{APNNR <!-- Général --> | type d'appareil = compact | disponibilité = annoncé le 18 mai 1999 ► arrêté | prix = 550 $ | mégapixels = 1,3 | construction du boîtier = <!-- Capteur --> | type de capteur = CCD | taille de capteur = 1/2" (6,40 x 4,80 mm) | nombre total de Mpixels = 1,5 | nombre de Mpixels utiles = 1,3 | filtrage = RVB | fabricant = <!-- Fichiers et stockage --> | définition maxi (pixels) = 1.280 x 1.024 | autres définitions (pixels) = 640 x 480 | formats non comprimés = non | formats comprimés = JPEG 3 niveaux de qualité, EXIF | tailles de fichiers (Mo) = | mémoire interne (Mo) = | cartes-mémoires = SmartMedia | autres données = <!-- Optique --> | objectif = focale fixe f/2,6 | marque ou fabricant = | équivalent 24x36 (mm) = 38 | gamme d'ouvertures = f/2,6 - f/7,2 | champ en position macro (cm) = | filetage pour filtres (mm) = non | zoom numérique = x2 <!-- Visée --> | viseur = optique | écran de visualisation = LCD 1,8" 110.000 pixels <!-- Mise au point --> | manuelle = non | autofocus = oui | stabilisation = |distance minimale en mode normal (cm) = 50 | distance minimale en mode macro (cm) = 10 <!-- Obturateur --> | vitesse minimale (s) = 1/4 | vitesse maximale (s) = 1/2.000 | pose B ou T = | prise de vue en rafales = | retardement (s) = 10 <!-- Exposition --> | modes A S P M = | modes scènes et autres = | modes de mesure = matricielle à 64 segments | sensibilité du capteur (ISO) = 125 | correction d'exposition = de -0,9 à+1,5 IL par pas de 1/3 IL | mémorisation de la mesure = | balance des blancs = 7 positions <!-- Vidéo --> | mode vidéo = non | formats de fichiers vidéo = | durée totale d'enregistrement = | enregistrement sonore = <!-- Flash --> | flash intégré = oui | modes = automatique, forcé, éteint, réduction d'yeux rouges | nombre-guide et portée = | prise pour flash externe = <!-- Autres caractéristiques --> | écrou de pied = | alimentation = 2 batteries AA NiMH | connexions = sortie vidéo | compatibilité DPOF = | compatibilité PictBridge = | dimensions L x h x p (mm) = 104 x 70 x 31 | poids (g) = 250 avec batteries | accessoires fournis = carte SmartMedia 4 Mo, chargeur de batteries | plateformes = | logiciels = | accessoires en option = | divers = }} == Commentaires == == Bibliographie == == Liens == [[Catégorie:Photographie]] [[Catégorie:Appareil numérique non reflex]] 3ljv264o8ym08ba387wiewzckg937nx Monter un PC/Installation 0 19160 682847 653369 2022-07-28T21:26:48Z Slzbg 108600 pluriel wikitext text/x-wiki <noinclude>{{Icône version compilée}}{{NavTitre|book={{BASEPAGENAME}}|prev=Assemblage|prevText=Assembler le PC|next=Optimisation|nextText=Test de performance et optimisation}}</noinclude> Dans cette section nous allons voir ce qu'est un système d'exploitation (SE ou OS), les différents SE existants, comment choisir celui qui convient le mieux et comment les installer. Le système d'exploitation est ce qui fait le lien entre le matériel et le logiciel. Il en existe principalement deux sur PC : Microsoft Windows et Linux qui sont très différents comme nous allons le voir. == Qu'est ce que le système d'exploitation ? == Le système d'exploitation est le logiciel central et don principal de l'ordinateur, le premier à être lancé et le dernier à être quitté. Son rôle est de fournir les services essentiels et nécessaires au bon fonctionnement des applications courantes (navigateur web, jeu vidéo, traitement de texte etc.). Par exemple, il permet au jeu vidéo d'accéder à la carte graphique pour faire des calculs graphiques plus rapides qu'avec le processeur. Il permet au traitement de texte d'imprimer car c'est le système d'exploitation qui sait où l'imprimante est branchée et comment elle fonctionne. Il sait aussi où est branché le réseau et connaît sa configuration, ce qui permet au navigateur d'accéder à internet. Tous les matériels ne fonctionnent pas à l'identique, par exemple une imprimante dialogue avec l'ordinateur en utilisant un langage/protocole différent en fonction de divers éléments tels que la gamme, le constructeur, la carte réseau. Le rôle du système d'exploitation est donc de faire l'interface pour piloter ce matériel. Le système d'exploitation doit donc disposer de l'information pour faire fonctionner ce matériel. Pour les matériels les plus standards, cette information est généralement fournie avec le système d'exploitation qui connaît une vaste gamme de matériel, mais tous les matériels ne sont pas nécessairement reconnus. En l'absence du pilote adéquat, il est impossible de faire fonctionner un périphérique. La plupart du temps, lors de l'achat du matériel, un pilote pour certains systèmes d'exploitations est soit fournit soit sur cédérom, soit téléchargeable sur le site du constructeur. Le système d'exploitation est donc de fait le mortier qui lie logiciel et matériel. Le système d'exploitation décide quelle application peut accéder à la mémoire vive et comment elle y accède. Une application ne sait pas comment utiliser la mémoire vive, elle demande au système d'exploitation, et c'est lui qui, à sa manière, utilise la mémoire vive. Cette façon de faire est différente entre les systèmes d'exploitation. Cette différence est importante pour nous, parce que cela implique qu'une application ne fonctionne que sur un seul système d'exploitation. De même, les pilotes sont spécifiques. Un système d'exploitation doit donc avoir des pilotes et des applications prévus spécifiquement pour lui. Rassurez vous, il existe des logiciels qui fonctionnent sur plusieurs systèmes d'exploitations : c'est simplement qu'ils existent en autant de versions différentes, il faudra faire attention d'ailleurs, à l'achat ou au téléchargement d'un logiciel, de bien prendre la version qui correspond au système d'exploitation voulu. === Microsoft Windows versus Linux === {{À faire|Sans que ça vire au troll si possible. S'inspirer de [[w:en:Comparison of Windows and Linux]]}} [[Image:UbuntuBeryl.png|thumb|right|300px|Ubuntu, une distribution Linux populaire]] Avant d'aller plus loin, nous devons préciser qu'un tel comparatif est à lire avec précautions. En effet, les fidèles de l'un et l'autre de ces systèmes débattent longuement de la supériorité supposée de l'un ou l'autre et c'est un sujet sensible qui cause de nombreuses querelles de clocher. Nous n'allons pas ici mener ce débat mais poser les principaux éléments de réflexions afin de permettre au lecteur de se faire une idée par lui-même. Enfin, la seule véritable façon de faire son choix est d'utiliser les deux pendant une période sérieuse afin de vraiment savoir de quoi il retourne. La première différence est : Windows xxx ainsi que ses logiciels de base sont la propriété de Microsoft, avec un accès au code source et fonctionnalités strictement contrôlé par le propriétaire; GNU-Linux est un système d'exploitation avec une vaste bibliothèque de logiciel [[w:fr:Open Source]], ce qui implique un accès libre aux codes sources et fonctionnalités. Deuxième différence : MS-Windows est un produit commercial sous copyright d'un coût non négligeable, tout comme un certain nombre de logiciels qui lui sont dédié; GNU-Linux est dans la majorité des versions ou distributions ainsi que la plus part des logiciels totalement libre d'accès. Troisième différence : MS-Windows pour sa maintenance et la mise en œuvre du respect des copyrights entre autres, intègre des algorithmes induisant de possibles failles de sécurité théoriquement secrètes, mais les pirates sont inventif et les motivations puissantes, ce qui oblige à une surveillance permanente accrus; GNU-Linux est par conception beaucoup plus rigoureux avec la sécurité, avec un comportement pas toujours très fun pour les utilisateurs. <!-- D'autres images : <gallery> Image:Mandriva2007fr.png Image:Bureau GNOME Fedora 8.png Image:Fedora-Core-6-AIGLX.png </gallery> --> === Compatibilité Windows et Linux === Bien que fondamentalement différents sur bien des aspects, ces deux systèmes d'exploitation sont tout de même capable d'échanger un peu. Nous allons voir que la frontière entre les deux n'est pas tout à fait étanche : vous n'êtes donc pas obligé de faire un choix et de devoir l'assumer à 100%. Tout d'abord, il est possible d'installer les deux systèmes sur une même machine. Bien sûr on ne peut en lancer qu'un à la fois, en le choisissant au démarrage. Il est également possible de passer par la virtualisation, cela permet de faire fonctionner les deux systèmes en même temps. En fait, un logiciel simule le fonctionnement d'une machine avec ses périphériques, ses données et son système d'exploitation. Cette solution est toutefois gourmande en ressources matérielles (notamment en processeur et mémoire vive), de plus Microsoft n'autorise à installer Windows 7 sur une machine virtuelle qu'à partir de l'édition professionnelle. [[Image:DOSBox.png|thumb|right|DOSBox, un émulateur DOS pour Windows et Linux]] [[w:DOSBox|DOSBox]] est un émulateur DOS qui peut permettre de faire fonctionner, tant sous Linux que sous des versions trop récentes de Windows, de vieux programmes prévus pour [[w:DOS|DOS]] ou les premières versions de Windows. [[w:WINE|WINE]] permet de lancer des exécutables Windows sous Linux. [[w:Cedega|Cedega]] a le même but mais s'oriente vers le support des jeux vidéos Windows sous Linux. Au niveau de l'accessibilité des fichiers, le système de fichiers [[w:FAT32|FAT32]] est supporté nativement par les deux systèmes. Une partition ainsi formatée pourra être lue depuis Linux et Windows. [[w:NTFS-3G|NTFS-3G]] apporte le support partiel de [[w:New Technology File System|NTFS]] pour Linux. [http://winext2fsd.sourceforge.net/ Winext2fsd], [http://uranus.it.swin.edu.au/~jn/linux/ext2ifs.htm EXT2 IFS], [http://ext2fsd.sourceforge.net/ Ext2fsd] sont des pilotes pour Windows qui lui permettent de lire les partitions [[w:ext2|ext2]]/[[w:ext3|ext3]]. [[w:Cygwin|Cygwin]] est une application Windows qui permet de simuler un environnement UNIX. === Les autres systèmes d'exploitation === <!-- [[Image:ReactOS_0.3.1.png|thumb|right|ReactOS, un exemple d'OS alternatif]] --> [[Image:Syllable054 screenshot.png|thumb|right|Syllable, un OS alternatif]] Il existe d'autres systèmes d'exploitation pouvant faire fonctionner un PC. En voici une liste qui ne devrait pas vous servir sauf à satisfaire votre curiosité ou votre goût de l'aventure. Il existe par exemple les [[w:Berkeley Software Distribution|BSD]] : [[w:FreeBSD|FreeBSD]], [[w:NetBSD|NetBSD]], [[w:OpenBSD|OpenBSD]] ainsi que des versions pour le bureau : [[w:PC-BSD|PC-BSD]] et [[w:DesktopBSD|DesktopBSD]]. Néanmoins, l'usage de ces systèmes est trop marginal et nous ne l'aborderons pas. [[w:Haïku (système d'exploitation)|Haïku]], [[w:Syllable|Syllable]] et [[w:OpenSolaris|OpenSolaris]] sont des systèmes d'exploitations marginaux également. [[w:ReactOS|ReactOS]] est un [[w:Clone (informatique)|clone]] libre de Microsoft Windows qui vise à être compatible. Bien que tout à fait intéressant pour nous, il est déconseillé de l'utiliser car il est encore en développement. [[w:FreeDOS|FreeDOS]] est un [[w:Clone (informatique)|clone]] libre de [[w:MS-DOS|MS-DOS]] qui est majoritairement compatible avec ce dernier. [[w:Mac OS X|Mac OS X]] est le système initialement prévu pour fonctionner sur [[w:Macintosh|Macintosh]] d'Apple, mais depuis que Apple a passé ses Macintosh sur l'architecture PC, des passionnés ont essayé d'utiliser Mac OS X sur des PC autres que des Macintosh. Ces machines sont appelées Hackintosh et utilisent du matériel PC spécifique (des pièces PC qui ont des pilotes pour Mac OS X). Vous pouvez lire l'article [[w:en:OSx86|« OSx86 » sur wikipedia]] ainsi que [http://lifehacker.com/software/hack-attack/build-a-hackintosh-mac-for-under-800-321913.php l'article « Build a Hackintosh Mac for Under $800 » publié sur lifehacker le 13 Novembre 2007]. == Choisir un système d'exploitation == <!-- Vous êtes probablement déjà habitué à un de ces systèmes d'exploitation et vous voudrez surement prolonger votre utilisation ou au contraire profiter de l'occasion pour en changer. Voici comment choisir le système qui vous convient. Il est possible d'avoir ces deux systèmes d'exploitation sur une même machine. --> === Bureautique === Une machine bureautique peut se satisfaire aussi bien de Windows que de Linux, la suite bureautique OpenOffice fonctionnant sur les deux systèmes (notez que Microsoft Office ne fonctionne que sur Windows). Attention toutefois, sous Linux il n'existe pas encore de solutions de retranscription automatique d'un texte dicté à la voix et les solutions de reconnaissance optique de caractères sont d'une qualité moindre. Cela est négligeable si, comme la plupart des gens, vous n'utilisez ni l'un ni l'autre. === Internet === Ici aussi, vous avez le choix entre Microsoft Windows et Linux. Tous deux peuvent faire fonctionner des navigateurs récents tels que Mozilla Firefox. Le logiciel de courriel Mozilla Thunderbird fonctionne également sur les deux systèmes. Les logiciels de poste à poste et de messagerie instantanée sont également présents. === Sécurité === Virus, chevaux de trois, vers, ''spyware'' et autres menaces s'attaquent en général davantage à Windows qu'à Linux, car il s'agit du système d'exploitation le plus utilisé (donc plus de victimes potentielles). Cependant, les mises à jour de Windows par Microsoft permettent de parer ces problèmes. Pour cela, il vaut mieux posséder la dernière version de Windows et avoir activer les mises à jour automatiques. En complément, il est recommandé d'installer un logiciel antivirus et un firewall logiciel. Microsoft fournit un antivirus gratuit : [http://windows.microsoft.com/fr-FR/windows/products/security-essentials Microsoft Security Essentials]. Malgré le moindre nombre d'attaques concernant Linux, il est également recommandé d'installer un antivirus. === Multimédia === === Création === Remarque hors-sujet : Bien que ce livre traite du PC, le lecteur créatif doit savoir que les [[w:Macintosh|Macintosh]] (qui ne sont pas des PC tels que présentés ici) sont très reconnus dans le domaine des arts et de la création. ==== Photographie ==== [[w:Adobe_Photoshop|Adobe Photoshop]] et [[w:Adobe_Lightroom_Classic_CC|Adobe Lightroom]] ne sont disponibles que sous Windows. Il existe des alternatives libres sous Linux comme [[w:GIMP|GIMP]]. Il est possible que la lecture des fichiers RAW spécifiques à votre appareil soit difficile. Renseignez-vous pour savoir si le format RAW de votre appareil (selon sa marque) sont supportés. Attention aussi aux pilotes qui doivent être fourni pour pouvoir lire les données sur votre appareil. Ce problème ne se pose pas si l'appareil et reconnu comme disque dur externe ou si les photos sont stockées sur une carte (SD ou autre …). ==== Vidéo ==== [[w:Adobe_Premiere_Pro|Adobe Premiere Pro]] n'est disponible que sur Windows. Il existe des alternatives libres sous Linux comme [[w:Kdenlive|Kdenlive]]. ==== 3D ==== [[w:Blender|Blender]] est un logiciel libre disponible sous Windows, Linux et macOS. ==== Web design ==== Dreamweaver et Flash ne sont disponibles que sous Windows. Il existe des alternatives libres sous Linux comme [http://bluegriffon.org/ BlueGriffon]. ==== Musique (MAO) ==== Cubase n'est disponible que sous Windows. Du côté de Linux : [[w:Ubuntu Studio|Ubuntu-Studio]] est une distribution spécialisée création qui propose trois environnements différents à l'installation : audio, graphisme et vidéo. [[w:Demudi Linux|Demudi]] est une distribution Linux qui vise à proposer un environnement professionnel et stable de production audio mais elle n'est plus maintenue. C'est la distribution [http://www.64studio.com/ 64 Studio] qui a pris le relai. ==== Publication (PAO) ==== QuarkXPress, Adobe FrameMaker, Adobe Acrobat ne sont disponibles que sous Windows. [[w:Scribus|Scribus]] est disponible sous Linux et Windows. === Machine de jeu === La plupart des gros titres nécessitent Windows dans ces versions les plus récentes pour fonctionner. Cette contrainte est due au fait que c'est la seule plate-forme pour laquelle Microsoft propose la technologie [[w:DirectX|DirectX]] très utilisée dans les jeux vidéos. La technologie [[w:Vulkan_(API)|Vulkan]], compatible Windows et Linux, semble être de plus en plus utilisé de nos jours dans la conception de jeux-vidéo. Un certain nombre de ces [[w:Catégorie:Jeu sous Linux|jeux populaires sont disponibles nativement pour Linux]]. D'autres jeux ont été développés pour Linux par la communauté<ref>Ils sont référencés sur [http://jeuxlibres.net JeuxLibres.net] qui n'est plus maintenu.</ref>. Remarquons que certains jeux populaires conçus pour Windows fonctionnent aussi sous Linux à l'aide de [[w:WINE|WINE]]. Vous pourrez voir la [http://appdb.winehq.org/ base de données des jeux supportés par Wine]. La plupart des distributions Linux intègrent WINE, et les jeux libres natifs pour Linux. Toutefois, WINE n'est pas simple a utiliser tel quel. Il est fortement recommandé d'utiliser une interface simple telle que [http://www.playonlinux.com/fr/ PlayOnLinux]. À noter que Linux n'est pas en reste pour ce qui est de l'émulation console, l'offre disponible est largement suffisante pour émuler la plupart des consoles du marché. Bien qu'ici aussi l'offre logicielle soit plus importante pour Windows. === Centre multimédia (Media Center) === Ici vous avez le choix entre Microsoft et le libre, le prix devrait vous aider à faire le choix... : * [[w:Microsoft Windows 7|Microsoft Windows 7]] * [[w:Microsoft Windows Vista|Microsoft Windows Vista]] * [[w:Windows XP Édition Media Center|Windows XP Édition Media Center]] ou [http://www.team-mediaportal.com/ MediaPortal] * [http://linuxmce.com/ LinuxMCE] * [[w:MythTV|MythTV]] est les distributions basées dessus comme [http://www.mythbuntu.org/ mythbuntu] * [http://elisa.fluendo.com Elisa] * [http://www.geexbox.org GeeXboX] ''à compléter'' === Serveur === Incontestablement, c'est ici Linux qui est à favoriser pour ce type d'installation. L'intégralité des outils logiciels nécessaires pour faire fonctionner un serveur est disponible nativement dans la plupart des distributions Linux. Ceci est vrai qu'il s'agisse de faire tourner un [[w:Serveur HTTP|serveur web http]], [[w:File Transfer Protocol|FTP]], [[w:Serveur mandataire|proxy]], de [[w:courrier électronique|courrier électronique]], de [[w:Liste de diffusion|liste de diffusions]], de [[w:Network News Transfer Protocol|newsgroups]], [[w:Serveur IRC|IRC]], [[w:Jabber|Jabber]], [[w:VoIP|VoIP]], de [[w:Lecture en continu|streaming]], de [[w:Gestion de version|gestion de version]], de partage de fichier [[w:Network File System|UNIX]] ou [[w:Server Message Block|Windows]], de [[w:Common Unix Printing System|partage d'imprimante]], d'[[w:Dynamic Host Configuration Protocol|assignation d'IP]] etc. Pour un serveur de fichier sur un réseau local [http://www.freenas.org/ FreeNAS] est l'idéal. Windows n'est pas en reste puisqu'il peut faire fonctionner quelques logiciels serveurs, notamment http/web et FTP. == Installer Microsoft Windows == Nous aborderons les procédures d'installation pour plusieurs versions de Windows différentes. === Windows 98 SE === Sur une machine de l'époque, il n'est pas dit que vous puissiez démarrer sur le CD. Il faut pour ça une disquette de démarrage. Elle est généralement fournie avec le CD. Si vous ne l'avez pas vous pouvez en créer une à partir d'un poste sous Windows98 ou en télécharger une sur internet. === Windows XP === Pour installer [[w:Microsoft Windows XP|Windows XP]], il "suffit" de démarrer avec le CD d'installation dans le lecteur. En suivant les indications de l'installeur, vous devriez pouvoir vous en sortir. Voici néanmoins quelques informations supplémentaires. Il va arriver une étape de l'installation où l'on vous demandera de partitionner le disque dur. Il s'agit de découper le disque dur en plusieurs lecteurs. L'installeur Windows propose par défaut de partitionner le disque dur en une seule partition (qui prendra donc 100% du disque dur). Ce n'est pas la meilleure façon de faire. Il est fortement conseillé de créer deux partitions. La première pour y mettre le système d'exploitation et les programmes et la seconde pour y mettre vos fichiers. À vous de calculer quel espace vous consacrez à l'une ou l'autre en fonction du nombre de logiciels que vous comptez utiliser. Attention : si l'installation d'un logiciel occupe de quelques méga-octets à quelques centaines de méga-octets, l'installation d'un jeu peu prendre plusieurs giga-octets. L'installation de Windows XP prend également 3 Go (tout compris). Compter également la place qu'occupe le système de récupération (''à préciser, quantifier''). Pour ce qui est du système de fichier, on vous proposera FAT32 et [[w:New Technology File System|NTFS]]. FAT32 est plus vieux mais est plus lisible, il est donc plus simple à récupérer en cas de problème ou pour le lire depuis Linux, il fragmente c'est à dire qu'on observe une perte de performance quand le disques est très utilisé et il faut défragmenter pour retrouver les performances initiales. NTFS est plus sécurisé, de plus il fragmente moins et peut compresser légèrement des fichiers qui ne servent pas souvent. Sachez que ce choix n'affecte strictement en rien l'utilisation du PC, le PC s'utilise de la même façon qu'on utilise l'un ou l'autre de façon transparente, impossible de voir la différence pour l'utilisateur. Pour installer Windows XP sur un disque dur S-ATA il vous faudra peut-être utiliser le pilote sur la disquette fournie avec le disque dur. Essayez quand même l'installation sans utiliser la disquette, la réussite de l'installation dépend alors de la qualité du support du S-ATA de la carte mère. Si l'installation donne un message d'erreur ou ne détecte pas le disque S-ATA, essayez d'utiliser la disquette. Il faudra l'indiquer pendant l'installation qui vous sollicitera le moment venu (« Appuyez sur F6 pour installer un pilote SCSI ou RAID tierce partie... »). Si vous n'avez pas de lecteur disquette, l'installation devient impossible. Il est également fortement recommandé de faire l'installation physiquement déconnecté d'internet et de ne pas activer la connexion avant d'avoir installer et configurer un pare-feu et un antivirus. Voir ci-après comment faire. ==== Post-installation ==== Installez le Service Pack 2 (SP2) (voir maintenant le SP3), il intègre notamment un pare-feu et le support du bluetooth. (NB: Des versions récentes de Windows Xp intègre directement le SP2). Installez un pare-feu et au moins un antivirus. Le centre de sécurité Windows peut vous y aider. L'idéal étant d'avoir mis de côté un antivirus et un pare-feu sur une clé USB ou un CD. Vous pouvez par exemple les téléchargez depuis une autre machine. Si vous n'avez rien prévu, connectez-vous et allez télécharger au plus vite ces logiciels avant de faire quoi que ce soit d'autre. Vous pouvez vous contentez du pare-feu Windows (fourni avec le SP2) Pour ce qui est de trouvez de tels logiciels. On peut parfaitement s'en sortir sans avoir recours à un logiciel commercial très coûteux à l'achat et à chaque mise à jour. On pourra se contenter de logiciels gratuits, ne pas hésiter par contre à en installer plusieurs. N'oubliez pas qu'un tel logiciel perd de son efficacité s'il n'est pas mis à jour, mettez-le donc à jour régulièrement. Il est trop probable que le logiciel dispose d'une option permettant de mettre à jour automatiquement (périodiquement ou à chaque démarrage). Voici quelques logiciels gratuits reconnus : * [[w:ClamWin|ClamWin]] : antivirus passif, logiciel libre sous licence GPL, gratuit, http://fr.clamwin.com/ * [[w:Moon Secure AV|Moon Secure AV]] : idem ClamWin mais actif, http://moonsecure.com/ * [[w:AntiVir PersonalEdition Classic|AntiVir]] : antivirus, gratuit dans le cadre d'une utilisation personnelle, http://www.free-av.com/ * [[w:Avast!|Avast!]] : antivirus, gratuit dans le cadre d'une utilisation personnelle http://www.avast.com/ * [[w:Antivirus AVG|AVG Antivirus]] : antivirus, gratuit dans le cadre d'une utilisation personnelle * [[w:Spybot - Search & Destroy|Spybot]] : anti-espiogiciel, gratuit, http://www.safer-networking.org/fr/index.html * [[w:Winpooch|Winpooch]], anti-espiogiciel, logiciel libre (GPL), gratuit, http://www.winpooch.com/ * [[w:Ad-Aware|Ad-aware SE]] anti-publiciel, gratuit * Réservés aux connaisseurs : [[w:HijackThis|HijackThis]] et RegCleaner. Installez les mises à jour de sécurité que Windows Update n'hésitera pas à vous signaler si vous vous connectez à Internet. Installez les pilotes de vos différents matériels. Inutile de surcharger la machine en installant tous les logiciels fournis sur le CD du constructeurs. Vous devrez enfin activer Windows, soit en vous connectant à Internet, soit en téléphonant à un numéro vert (gratuit) qui vous sera indiqué. Remarquez qu'au bout de plusieurs activations par internet avec un même numéro de série (ou ''clé produit'') il faudra téléphoner. Vous pouvez utiliser l'ordinateur 30 jours sans l'activer : au bout des trente jours il sera impossible d'ouvrir une session. Il faut activer Windows et tout redevient normal. Si la machine doit faire fonctionner des jeux vidéos, installez [[w:DirectX|DirectX]] 9.0c (le 10 est réservé à Windows Vista). DirectX peut être [http://www.microsoft.com/windows/directx/ gratuitement téléchargé depuis le site de Microsoft] (entre autres). Il sera peut-être aussi sur le CD fourni avec la carte graphique. Il est également fourni avec les jeux vidéos qui en ont besoin. === Windows Vista et Windows 7 === {{todo|S'inspirer de ce qui a été fait pour Windows XP. [[w:en:Windows Vista editions and pricing|Les différentes éditions de Vista]]. Mettre à niveau depuis XP}} ==== Prolonger la période d'essai ==== Tout comme Windows XP, la période d'évaluation est limitée à trente jour. Il est toutefois possible de l'étendre en réinitialisant cette durée. Il suffit pour cela de lancer en '''mode administrateur''' la commande <code>slmgr -rearm</code> dans une console (Bouton ''Démarrer'' → menu ''Tous les programmes'' → menu ''Accessoires'' → clic droit sur ''Invite de commande'' → choix ''Exécuter en tant qu'administrateur''). Cette commande ve remettre la période d'essai à trente jour. On ne peut le faire que trois fois donc en utilisant à chaque fois tous les 30 jours on peut avoir une période d'essai totale de 120 jours (30 jour pour la période originale + 3 × 30 jours de renouvellement). Le commande <code>slmgr -xpr</code> vous indiquera la date de la fin de la période d'essai actuelle. == Installer Linux == Vous pouvez être aidé dans cette tâche par les membres des diverses communautés francophones et leurs sites ([http://www.ubuntu-fr.org/ Ubuntu], [http://www.fedora-fr.org/ Fedora], [http://fr.opensuse.org/ OpenSUSE], [http://www.mandriva.com/fr/community/ Mandriva]) qui proposent de la documentation, un wiki, un forum ou un salon de discussion. Si vous habitez dans une région assez peuplée, il est même possible qu'un [[w:Groupe d'utilisateurs Linux|Groupe d'Utilisateurs Linux]] (GUL ou LUG) soit prêt à vous accueillir et à vous aider dans cette tâche. Pour trouver un GUL prêt de chez vous, vous pouvez consulter la [http://www.aful.org/gul/ liste des Groupe d'Utilisateurs Linux] maintenue par l'[[w:Association francophone des utilisateurs de Linux et des logiciels libres|AFUL]]. == Avoir plusieurs systèmes d'exploitation sur un même PC == === Le multi-boot : choisir son système d'exploitation à chaque démarrage === [[Image:GParted 0.3.5 -- 2008, 06.png|thumb|300px|Des logiciels comme GParted (Linux) permettent de créer et de modifier les partitions d'un disque dur. Windows intègre également un tel outil.]] Il est tout à fait possible d'avoir plusieurs systèmes d'exploitation sur un même PC. Il suffit d'avoir assez d'espace disque dur. À l'aide d'un logiciel spécifique, il faut partitionner le disque dur pour que chaque système d'exploitation soit sur une partition différente. On pourra tout à fait utiliser un disque dur pour chaque système mais c'est inutile. Lorsque le PC démarre sur le disque dur, il va chercher une petite région de celui-ci pour savoir quoi faire et où se trouve le système d'exploitation sur le disque : il s'agit du MBR (Master Boot Record). Il suffit d'installer sur ce MBR un petit programme appelé '''[[w:Chargeur d'amorçage|chargeur d'amorçage]]''' (ou ''Boot-loader'') qui proposera un menu avec les différents systèmes d'exploitation. On pourra choisir à l'aide du clavier et le logiciel indiquera à la machine sur quel disque et quelle partition il va trouver le système d'exploitation qu'il va démarrer. En pratique, la plupart des distributions linux font ça très bien. À l'installation elles détectent que d'autres systèmes d'exploitation sont présents et vont installer dans le MBR un petit programme tel [[w:GRUB|GRUB]] ou [[w:LILO|LILO]] qui proposera un menu. Windows, par contre, est très problématique puisque lorsqu'il s'installe, il efface tout simplement le MBR pour que Windows soit lancé à chaque démarrage. C'est pourquoi lorsque ses deux systèmes cohabitent, il faut toujours installer en premier Windows et ensuite la distribution linux. ==== Avoir Windows XP et un Linux sur un seul disque dur ==== # Démarrez avec le CD de Windows XP # Lorsqu'il demande de formater le disque, ne créer qu'une partition : celle où vous installerez Windows. Prévoyez assez d'espace pour les logiciels que vous installerez par la suite. NTFS est dorénavant supporté par linux, préférez donc ce système de fichiers à FAT32. Le pilote NTFS pour Linux ne gère pas encore l'écriture des fichiers cryptés, cependant. # Procédez à l'installation de Windows normalement # Redémarrez avec le CD de la distribution # Lorsqu'il demande de formater le disque, l'installeur devrait détecter qu'une partition FAT32 est déjà là. Vous pouvez lui donner un point de montage (par exemple ''/windows/C''). Formatez le reste du disque pour une installation normale de Linux (c'est à dire au moins une partition ''/'', une partition ''/home'' et une partition swap). Vous pouvez éventuellement créer une autre partition Windows en FAT32 et la rendre accessible par linux en lui donnant un point de montage (par exemple ''/windows/D'') # Poursuivez l'installation de Linux normalement, il devrait installer le gestionnaire de démarrage # Quand vous redémarrerez sous Windows, si vous avez créé une partition FAT32 à l'installation de Linux, Windows devrait la détecter automatiquement et donc lui affecter une lettre de lecteur (par exemple ''D:''.) === La virtualisation : lancer un système d'exploitation à partir d'un autre === La [[w:Virtualisation (informatique)|virtualisation]] permet de faire fonctionner plusieurs systèmes en même temps. Il y a pour cela un système hôte, il s'agit de celui qui est lancer normalement au démarrage de l'ordinateur. On se retrouve alors dans un environnement habituel, dans lequel on va pourvoir lancer un logiciel de virtualisation qui va simuler le fonctionnement d'une machine entière pour le système d'exploitation virtuel. Cette solution a pour inconvénient les performances du système invité qui sont faible. La virtualisation est très consommatrice de ressources (notamment processeur). Par exemple, sous linux, pour émuler windows : on pourra utiliser [[w:VirtualBox|Virtualbox]] (en graphique) ou [[w:QEMU|QEMU]] (en ligne de commande). [[c:File:QEMU-Mdk-Knpx.png#/media/File:QEMU-Mdk-Knpx.png|voir cette capture d'écran]]. == Choisir et installer ses logiciels == Pour Linux, votre distribution installera sûrement de base tous les logiciels nécessaires. Néanmoins, vous désirez peut-être ajouter quelques logiciels. Ces derniers seront sûrement disponibles dans les dépôts et seront donc installés en un clic : un outil de recherche et d'installation automatique devrait être installé de base dans votre distribution. === Logiciels couramment utilisés === Il existe une pléthore de logiciels disponibles sur internet et il est inenvisageable de les essayer tous. Voici un tableau où se regrouper les logiciels les plus populaires. Ils ont été sélectionné selon ces critères : * Les logiciels libres/open-source ont été préférés aux logiciels propriétaires * Les logiciels gratuit ont été préférés aux logiciels payant * Les logiciels multi-plateforme ont été préférés aux logiciel ne fonctionnant que sur une seule * Les formats ouverts et répandus ou été privilégié aux formats fermés ou trop spécifiques * Les logiciels présentés ici sont populaires (mesuré par le nombre de fois où ils ont été téléchargés) Ces règles décrivent seulement une préférence dans notre sélection, ce qui n'empêche pas d'avoir placé, faute de mieux, des logiciels propriétaires, payants, mono-plateforme et utilisant des formats fermés. {| class="wikitable" style="text-align:center" |+ Logiciels suggéré par fonctionnalité et système d'exploitation |- ! colspan="2" |Usage ! width="33%"| Windows ! width="33%"| Linux |- !rowspan="3" | Bureautique !Traitement de texte |colspan="2" | AbiWord, OpenOffice Writer |- !Tableur |colspan="2" | Gnumeric, OpenOffice Calc |- !Présentation |colspan="2" | OpenOffice Impress |- !rowspan="5" | Communication !Messagerie instantanée |Pidgin, Miranda, Trillian |Pidgin, Kopete |- !IRC |mIRC |X-Chat |- !Courriel |colspan="2" | Mozilla Thunderbird |- !Groupes | | |- !Téléphonie IP |Skype |Ekiga |- !rowspan="2" | Web !Navigateur web |colspan="2" | Mozilla Firefox, Opera |- !Agrégateur | RSSOwl | Liferea |- !rowspan="3" | Multimédia !Lecteur audio |Foobar, Winamp |XMMS, AmaroK |- !Lecteur vidéo |Media Player Classic, VLC |VLC, Xine, mplayer |- !Lecteur multimédia |iTunes | |- !rowspan="2" | Transfert de fichiers !FTP | colspan="2" | FileZilla |- !Téléchargeur | colspan="2" | wxDownload Fast |- !rowspan="3" | Poste à poste !BitTorrent | colspan="2" | BitTorrent, Azureus |- !eDonkey |eMule |aMule, xMule, MLDonkey |- !Direct Connect |DC++ |linuxDC++ |- !rowspan="2" | Utilitaires !Archivage et compression |7-Zip, TUGZip, WinRAR |7-Zip |- !Gravure CD / DVD |InfraRecorder, CD Burner XP, Alcohol 120%, Nero Burning ROM |k3b, Brasero |} * [[w:Alternatives libres aux logiciels propriétaires]] * [[w:Liste de logiciels libres]] * Il existe des [[w:Catégorie:Compilation de logiciels pour Microsoft Windows|Compilation de logiciels pour Windows]], regroupant un ensemble cohérent de logiciels sélectionnés sur un CD ou un DVD. === Trouver d'autres logiciels === L'installation de Windows intègre déjà plusieurs logiciels, faites en le tour. S'il vous manque toutefois quelque chose, allez sur le web qui regorge d'application. Sous linux, l'essentiel de ce dont vous aurez besoin se trouvera surement dans les dépôt officiels voire dans des dépôts officiels optionnels voire encore dans des dépôts officieux. Pensez aussi à rechercher des paquets dans les ressources de votre communauté ou sur les sites traitant de votre distribution. Toutes ces ressources devraient suffire. Néanmoins, vous pouvez trouver d'autres logiciels sur des sites les répertoriant. Voici donc un petit annuaire: {| !url !langue !contenu |- |http://www.sourceforge.net/ |{{en}} |Du libre/open source uniquement. stable mais aussi en développement (inutilisable donc). Windows et Linux. |- |http://www.framasoft.net/ |{{fr}} |Logiciel libre uniquement, pour windows et linux |- |http://www.linuxappfinder.com/ |{{en}} |Trouver des applications pour linux classés dans différentes catégories. Il est également possible de rechercher une alternative à un logiciel Windows ou Mac OS X |- |http://www.download.com/ |{{en}} |? |- |http://www.tucows.com/ |{{en}} |? |} ==Références== <references> [[en:How To Assemble A Desktop PC/Software]] [[Catégorie:Monter un PC (livre)]] dcjth75s7wujimrxpwu319zxlfepe0c Électricité/Le transformateur monophasé 0 24191 682837 677741 2022-07-28T20:31:05Z Slzbg 108600 singulier wikitext text/x-wiki {{Navbar| [[Électricité/Les filtres électriques]] |[[Électricité]]| [[Électricité/Les redresseurs]] }} = Généralités sur le transformateur = == Qu'est-ce qu'un transformateur ? == Un transformateur a pour but de modifier les amplitudes des grandeurs électriques alternatives : il transforme des signaux de tension et de courant de fréquence donnée en signaux de même fréquence mais de valeurs efficaces différentes. L'une des particularités du transformateur est qu'il a un rendement très élevé, souvent proche de 100 % : dans les gros transformateurs, on a moins de 1 % de pertes. Pour simplifier, nous ne considérerons ici que le cas du '''transformateur monophasé''', mais les principes physiques abordés s'appliquent aussi au cas du transformateur triphasé. == Pourquoi utiliser un transformateur ? == Le transformateur joue un rôle important dans le transport et la distribution de l'énergie électrique. En effet, si l'on s'intéresse aux pertes en ligne lors d'un transport de puissance électrique, et plus particulièrement aux pertes par effet Joule, ces-dernières sont, quel que soit le conducteur, d'autant plus '''importantes''' que le '''courant électrique est élevé'''. Or, à puissance transportée constante, l'utilisation d'une tension plus élevée implique un courant électrique plus faible puisque, d'une manière générale et quel que soit le nombre de phases utilisées, la puissance électrique <math>P_{elec}</math> est proportionnelle au produit de la tension <math>V</math> par le courant <math>I</math> : <div style="text-align: center;"> <math> P_{elec} \propto V \times I \qquad (6) </math> </div> De fait, afin de limiter au maximum les pertes en ligne, il faut transporter un courant aussi faible que possible : quand les distances deviennent importantes, le '''transport de l'énergie électrique ne peut se faire qu'à très haute tension'''. Il est donc nécessaire d'élever la tension fournie par les générateurs avant de la transporter, et pour cela d'utiliser des transformateurs. D'un autre côté, les tensions élevées demandent une maîtrise plus importante. Pour des raisons de sécurité, tournant notamment autour de problèmes d'isolation des conducteurs, ou lorsqu'il n'est pas nécessaire de transporter l'énergie sur de longues distances, on n'a pas toujours recours à l'utilisation des hautes tensions. En particulier, il n'est pas envisageable de câbler les bâtiments avec des tensions très élevées : une fois le transport effectué, l'énergie électrique doit être distribuée sous la forme de basses tensions et l'on doit par conséquent avoir là aussi recours à un transformateur. En résumé, le transformateur permet à l'énergie électrique d'être transportée à longue distance de façon économique et distribuée dans les industries et les habitations. == Constitution d'un transformateur monophasé == Comme nous pouvons le voir sur la Fig. 2, un transformateur monophasé est constitué : * d'un circuit magnétique fermé ; * de deux circuits électriques '''sans liaison entre eux''', enroulés autour du circuit magnétique. [[Image:Sch princ transfo.png|frame|center|Fig. 2 : Schéma de principe d'un transformateur monophasé]] Le circuit électrique lié au générateur est appelé le circuit primaire, celui qui est lié au récepteur est appelé le circuit secondaire. Appelons <math>V_1</math> la valeur efficace de <math>\underline{V_1}</math> au primaire et <math>V_2</math> la valeur efficace de <math>\underline{V_2}</math> au secondaire alors : * Si <math>V_1 < V_2</math>, le transformateur est dit '''élévateur de tension''' ; * Si <math>V_1 > V_2</math>, le transformateur est dit '''abaisseur de tension''' ; * Si <math>V_1 = V_2</math>, le transformateur est un '''transformateur d'isolement''' ; '''Remarque :''' ''Il existe une isolation galvanique entre le primaire et le secondaire : un défaut électrique au niveau du secondaire n'est pas détectable par un dispositif différentiel présent au primaire. Pour'' '''protéger l'utilisateur''' ''d'un transformateur, il faut placer une'' '''protection différentielle''' ''au'' '''secondaire'''. == Principe de fonctionnement == L'enroulement primaire est soumis à une tension sinusoïdale. Il est donc traversé par un courant sinusoïdal et donne naissance à travers le circuit magnétique à un flux sinusoïdal. Ce flux engendre alors une force électromotrice induite <math>\underline {E_1}</math> dans l'enroulement primaire et <math>\underline{E_2}</math> dans l'enroulement secondaire. Au niveau des bornes du secondaire apparaît alors une tension sinusoïdale dont la fréquence est la même que celle de la tension appliquée au primaire, mais dont l'amplitude est différente. [[Image:Princ fct trans.png|frame|center|Fig. 3 : Principe de fonctionnement du transformateur. On utilise la convention récepteur pour le primaire (le sens positif de <math>\underline {V_1}</math> est pris en opposition avec celui de <math>\underline {I_1}</math>) et générateur pour le secondaire (le sens positif de <math>\underline {V_2}</math> est pris dans le même sens que celui de <math>\underline {I_2}</math>)]] Le comportement du transformateur peut alors être appréhendé par le schéma reporté sur la Fig. 3. === Convention de signe === Les conventions de signe que nous utiliserons dans le cas du transformateur monophasé sont celles reportées sur la Fig. 3 : * en ce qui concerne les forces électromotrices (f.é.m) <math>\underline {E_1}</math> et <math>\underline {E_2}</math>, nous prenons comme convention le fait que des f.é.m positives tendent à faire circuler des courants positifs ; * en ce qui concerne la tension d'entrée du primaire <math>\underline {V_1}</math> et le courant <math>\underline {I_1}</math>, puisque l'enroulement primaire absorbe l'énergie du générateur, il se comporte comme un récepteur : <math>\underline {V_1}</math> et <math>\underline {I_1}</math> sont donc liés par la convention des récepteurs et leurs sens positifs sont pris en opposition ; * en ce qui concerne la tension de sortie du secondaire <math>\underline {V_2}</math> et le courant <math>\underline {I_2}</math>, puisque l'enroulement secondaire se comporte comme un générateur et fournit de l'énergie au récepteur, ils sont reliés par la convention des générateurs et le sens positif de <math>\underline {V_2}</math> est pris dans le même sens que celui de <math>\underline {I_2}</math>. == Formule de Boucherot pour le transformateur == L'une des propriétés du transformateur est d'être une machine statique à '''flux forcé'''. En effet, au primaire, le générateur impose la tension <math>\underline{V_1}</math> ainsi que la fréquence <math>f</math>. Le nombre de spires <math>N_1</math> est quant à lui fixé. Par conséquent, le flux <math>\underline{\phi}</math> voit sa valeur imposée en module et phase par le générateur. Les différentes grandeurs que nous venons de citer sont reliées par la formule de Boucherot : <div style="text-align: center;"> <math> V_1 = 4,44\ N_1\ f \ {\phi_{max}} \qquad (7) </math> </div> où <math>V_1</math> est la valeur efficace de la tension au primaire, <math>N_1</math> le nombre de spires de l'enroulement primaire, <math>f</math> la fréquence du flux et <math>\Phi_{max}</math> la '''valeur maximale''' du flux magnétique. '''Remarque :''' ''Le transformateur est une'' '''machine à flux forcé''' '': alimenté par une tension efficace constante, il fournit au secondaire une tension sinusoïdale de valeur efficace constante.'' == Symboles électriques du transformateur == Dans un schéma électrique, le transformateur peut être représenté par l'un des deux symboles reportés dans les volets (a) et (b) de la Fig. 4. [[Image:Symb-transfo.png|frame|center|Fig. 4 : Symboles électriques du transformateur monophasé.]] Dans ce wikilivre, nous utiliserons le symbole reporté dans le volet (a) de la Fig. 4. = Le transformateur parfait (ou idéal) = == Définition du transformateur parfait (ou idéal) == On appelle transformateur parfait, ou idéal, un transformateur vérifiant les conditions suivantes : * Les pertes dans le fer, c'est-à-dire les pertes par hystérésis et les courants de Foucault sont nulles. Le noyau est infiniment perméable au champ magnétique et sa réluctance <math>\mathcal{R}</math>, grandeur décrivant la résistance d'un circuit magnétique à sa pénétration par un champ magnétique, est nulle. * La résistance des enroulements primaires et secondaires est nulle. * Il n'y a pas de pertes de flux magnétique : tout le flux présent dans le noyau sert à magnétiser l'enroulement secondaire. Du point de vue des grandeurs électriques, cela veut dire que : * Si le secondaire est à vide, et donc si <math>\underline {I_2}= 0</math>, alors le courant qui traverse le primaire est nul, c'est-à-dire que <math>\underline {I_1} = 0</math> ; * Le secondaire se comporte comme un générateur parfait, de résistance interne nulle, de sorte que la valeur efficace de la tension au secondaire <math>V_2</math> est constante quand le courant au secondaire <math>I_2</math> varie, en valeur efficace, de 0 à sa valeur nominale <math>I_{2n}</math> ; * Le rendement du transformateur est de <math>\eta = 1 = 100 \%</math>. == Expression des f.é.m dans le transformateur parfait == D'après la loi de Faraday, les forces électromotrices <math>\underline {E_1}</math> et <math>\underline {E_2}</math> dépendent de la variation du flux magnétique <math>\underline{\phi}</math> selon la relation : <div style="text-align: center;"><math> \underline {E_1} = - N_1 \frac{d\underline {\phi}}{dt} \qquad (8) </math></div> et <div style="text-align: center;"><math> \underline {E_2} = - N_2 \frac{d\underline {\phi}}{dt} \qquad (9) </math></div> où <math>N_1</math> et <math>N_2</math> sont respectivement le nombre de spires des enroulements primaire et secondaire. == Equation de la tension dans le cas idéal == Dans le cas idéal, la tension au primaire vérifie la relation : <div style="text-align: center;"> <math> \underline {V_1} = -\underline{E_1} = N_1 \frac{d\underline {\phi}}{dt} \qquad (10) </math> </div> et celle au secondaire vérifie : <div style="text-align: center;"> <math> \underline {V_2} = \underline{E_2} = -N_2 \frac{d\underline {\phi}}{dt} \qquad (11) </math> </div> De fait, à condition que <math>d\underline {\phi}/dt \neq 0</math>, on peut ramener ces deux expressions à : <div style="text-align: center;"><math> \frac{\underline {V_2}}{\underline {V_1}} = -\frac{N_2}{N_1} = -m \qquad (12) </math></div> où <math>m</math> est appelé le rapport de transformation. Si l'on remplace les valeurs temporelles de la tension par des valeurs efficaces, la précédente équation se ramène, '''dans le cas idéal''', à : <div style="text-align: center;"><math> \frac{V_2}{V_1} = m \qquad (13) </math></div> '''Remarque : ''' ''le fait que l'on doive avoir'' <math>d\underline {\phi}/dt \neq 0</math> ''implique que le transformateur ne peut fonctionner qu'en'' '''régime alternatif.''' == Equation d'intensité == Dans le cas général, le courant au primaire et celui au secondaire sont reliés à tout instant par la relation d'Hopkinson : <div style="text-align: center;"><math> N_1 \underline {I_1} + N_2 \underline {I_2} = \mathcal{R} \underline {\phi_m} \qquad (14) </math></div> où <math>\underline{\phi_m}</math> est le flux mutuel (dans le cas idéal <math>\underline{\phi_m} = \underline{\phi}</math>) et où <math>\mathcal{R}</math> est la réluctance du circuit magnétique. Cette grandeur décrit l'opposition du noyau au passage du champ magnétique : elle est par conséquent liée à la notion de pertes dans le fer. Or, nous sommes dans le cas d'un transformateur idéal et, de fait, la réluctance du circuit noyau est nulle et la précédente équation s'écrit sous la forme : <div style="text-align: center;"><math> N_1 \underline {I_1} + N_2 \underline {I_2} = 0 \qquad (15) </math></div> Ceci implique que : <div style="text-align: center;"><math> \frac{\underline {I_2}}{\underline {I_1}} = - \frac{N_1}{N_2} = - \frac{1}{m} \qquad (16) </math></div> Si, à présent, on remplace les grandeurs temporelles par des grandeurs efficaces, on aboutit à la relation, '''valable dans le cas idéal''' : <div style="text-align: center;"><math> \frac{I_2}{I_1} = - \frac{1}{m} \qquad (17) </math></div> '''Remarque :''' ''Le rapport de transformation des intensités est l'inverse de celui des tensions en valeur absolue.'' == Propriétés du transformateur parfait == === Déphasages : diagramme de Fresnel === Nous reportons sur la Fig. 5 le diagramme vectoriel associé aux équations (12) et (16) en prenant comme grandeur de référence le flux magnétique. Ce diagramme de Fresnel représente donc les différentes grandeurs électriques dans le cas du transformateur idéal à travers leurs valeurs efficaces et leurs déphasages. D'après les équations sus-citées, les grandeurs <math>\underline{V_1}</math> et <math>\underline{V_2}</math> sont alignées, et il en va de même pour les grandeurs <math>\underline{I_1}</math> et <math>\underline{I_2}</math>. [[Image:Fresn transfo ideal.png|frame|center|Fig. 5 : Diagramme de Fresnel dans le cas d'un transformateur idéal.]] Par conséquent, les déphasages <math>\varphi_1</math> et <math>\varphi_2</math> sont nécessairement les mêmes. === Lois de conservation === À partir des équations (13) et (17), nous pouvons écrire que : <div style="text-align: center;"><math> V_2 \times I_2 = m V_1 \times \frac{1}{m} I_1 = V_1 \times I_1 \qquad (18) </math></div> et, de fait, si l'on appelle <math>S_1</math> la puissance apparente absorbée au primaire et <math>S_2</math> celle fournie au secondaire, alors : <div style="text-align: center;"><math> S_1 = S_2 \qquad (19) </math></div> De plus, nous avons vu que le transformateur conserve le déphasage <math>\varphi</math>. Or, la puissance active <math>P</math> s'exprime comme <div style="text-align: center;"><math> P = S \cos\varphi \qquad (20) </math></div> tandis que la puissance réactive <math>Q</math> vérifie : <div style="text-align: center;"><math> Q = S \sin\varphi \qquad (21) </math></div> On remarque au passage que <math>P</math>, <math>Q</math> et <math>S</math> sont reliées par la relation : <div style="text-align: center;"><math> S = \sqrt{P^2 + Q^2 } \qquad (22) </math></div> Comme <math>S</math> et <math>\varphi</math> sont conservés, il en va de même pour <math>P</math> et <math>Q</math>. Par conséquent, dans le cas du transformateur idéal : <div style="text-align: center;"><math> P_1 = P_2 \qquad (23) </math></div> et <div style="text-align: center;"><math> Q_1 = Q_2 \qquad (24) </math></div> Le transformateur '''idéal''' conserve les puissances active, réactive et apparente. Il conserve aussi le déphasage. <noinclude> {{NavChapitre | book=Électricité | prev=L'étude des signaux quelconques | next=Les redresseurs }} </noinclude> {{autocat}} [[Catégorie:Électricité (livre)|!]] qb0fql81cjdwhupq15eoiocr3mwzwvp Utilisateur:Jean-Jacques MILAN/Jacobs 2 26005 682856 181116 2022-07-29T09:16:46Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs02.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Jacobs03.jpg| Image:Jacobs04.jpg| Image:Jacobs05.jpg| Image:Jacobs06.jpg| Image:Jacobs07.jpg| Image:Jacobs08.jpg| Image:Jacobs09.jpg| Image:Jacobs10.jpg| Image:Jacobs11.jpg| Image:Jacobs12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Jacobs15.jpg| Image:Jacobs16.jpg| Image:Jacobs17.jpg| Image:Jacobs18.jpg| Image:Jacobs19.jpg| Image:Jacobs20.jpg| Image:Jacobs21.jpg| Image:Jacobs22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> pn68pzkp1kfj12vn94gu6u84b1ocehs 682857 682856 2022-07-29T09:17:57Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs03.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Jacobs04.jpg| Image:Jacobs05.jpg| Image:Jacobs06.jpg| Image:Jacobs07.jpg| Image:Jacobs08.jpg| Image:Jacobs09.jpg| Image:Jacobs10.jpg| Image:Jacobs11.jpg| Image:Jacobs12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Jacobs15.jpg| Image:Jacobs16.jpg| Image:Jacobs17.jpg| Image:Jacobs18.jpg| Image:Jacobs19.jpg| Image:Jacobs20.jpg| Image:Jacobs21.jpg| Image:Jacobs22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> qh0k2taj6fhggki8u6x2608k4vrsp2i 682858 682857 2022-07-29T09:18:21Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs04.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Jacobs05.jpg| Image:Jacobs06.jpg| Image:Jacobs07.jpg| Image:Jacobs08.jpg| Image:Jacobs09.jpg| Image:Jacobs10.jpg| Image:Jacobs11.jpg| Image:Jacobs12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Jacobs15.jpg| Image:Jacobs16.jpg| Image:Jacobs17.jpg| Image:Jacobs18.jpg| Image:Jacobs19.jpg| Image:Jacobs20.jpg| Image:Jacobs21.jpg| Image:Jacobs22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> qqp8xsy2sc05xdxzx2yvwfb5v7b3tgn 682859 682858 2022-07-29T09:18:54Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs05.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Jacobs06.jpg| Image:Jacobs07.jpg| Image:Jacobs08.jpg| Image:Jacobs09.jpg| Image:Jacobs10.jpg| Image:Jacobs11.jpg| Image:Jacobs12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Jacobs15.jpg| Image:Jacobs16.jpg| Image:Jacobs17.jpg| Image:Jacobs18.jpg| Image:Jacobs19.jpg| Image:Jacobs20.jpg| Image:Jacobs21.jpg| Image:Jacobs22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 3k5r0npa8iehjjmge2gecdu0tvw1t33 682860 682859 2022-07-29T09:19:22Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs06.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Jacobs07.jpg| Image:Jacobs08.jpg| Image:Jacobs09.jpg| Image:Jacobs10.jpg| Image:Jacobs11.jpg| Image:Jacobs12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Jacobs15.jpg| Image:Jacobs16.jpg| Image:Jacobs17.jpg| Image:Jacobs18.jpg| Image:Jacobs19.jpg| Image:Jacobs20.jpg| Image:Jacobs21.jpg| Image:Jacobs22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> iotlvolqc960iioin7ey0fnwh3waa41 682861 682860 2022-07-29T09:19:59Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs07.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Jacobs08.jpg| Image:Jacobs09.jpg| Image:Jacobs10.jpg| Image:Jacobs11.jpg| Image:Jacobs12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Jacobs15.jpg| Image:Jacobs16.jpg| Image:Jacobs17.jpg| Image:Jacobs18.jpg| Image:Jacobs19.jpg| Image:Jacobs20.jpg| Image:Jacobs21.jpg| Image:Jacobs22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> berr4wxaxsv3mtihi8auyduhzdg8z5o 682862 682861 2022-07-29T09:20:31Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs08.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Jacobs09.jpg| Image:Jacobs10.jpg| Image:Jacobs11.jpg| Image:Jacobs12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Jacobs15.jpg| Image:Jacobs16.jpg| Image:Jacobs17.jpg| Image:Jacobs18.jpg| Image:Jacobs19.jpg| Image:Jacobs20.jpg| Image:Jacobs21.jpg| Image:Jacobs22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> ezsv2hc2ty6ril6aluduzyvhpr9pp3f 682863 682862 2022-07-29T09:21:01Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs09.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Jacobs11.jpg| Image:Jacobs12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Jacobs15.jpg| Image:Jacobs16.jpg| Image:Jacobs17.jpg| Image:Jacobs18.jpg| Image:Jacobs19.jpg| Image:Jacobs20.jpg| Image:Jacobs21.jpg| Image:Jacobs22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> b53gzjixopivlclm85p98l8yie2oqkj 682864 682863 2022-07-29T09:22:00Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs11.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Jacobs12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Jacobs15.jpg| Image:Jacobs16.jpg| Image:Jacobs17.jpg| Image:Jacobs18.jpg| Image:Jacobs19.jpg| Image:Jacobs20.jpg| Image:Jacobs21.jpg| Image:Jacobs22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 7feqzmdrywecq0jn781so7cvyjba7lq 682865 682864 2022-07-29T09:22:31Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs12.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Jacobs15.jpg| Image:Jacobs16.jpg| Image:Jacobs17.jpg| Image:Jacobs18.jpg| Image:Jacobs19.jpg| Image:Jacobs20.jpg| Image:Jacobs21.jpg| Image:Jacobs22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 7aj8xa4ibwq5lkj4y1vmjkzk6i1n6dh 682866 682865 2022-07-29T09:24:01Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs15.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Jacobs16.jpg| Image:Jacobs17.jpg| Image:Jacobs18.jpg| Image:Jacobs19.jpg| Image:Jacobs20.jpg| Image:Jacobs21.jpg| Image:Jacobs22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> mg9j0wczf8f5q8mmc19h2t1cnkik81v 682867 682866 2022-07-29T09:24:35Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs16.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Jacobs17.jpg| Image:Jacobs18.jpg| Image:Jacobs19.jpg| Image:Jacobs20.jpg| Image:Jacobs21.jpg| Image:Jacobs22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> fknxdzlitcor6ut6109jqafqsaw1trp 682868 682867 2022-07-29T09:25:08Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs17.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Jacobs18.jpg| Image:Jacobs19.jpg| Image:Jacobs20.jpg| Image:Jacobs21.jpg| Image:Jacobs22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> gliyunhwxvmk19jyq8a287j5enw5811 682869 682868 2022-07-29T09:25:33Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs18.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Jacobs19.jpg| Image:Jacobs20.jpg| Image:Jacobs21.jpg| Image:Jacobs22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> grpkpglue87eirb4jr9d5nia41k6izh 682870 682869 2022-07-29T09:26:03Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs19.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Jacobs20.jpg| Image:Jacobs21.jpg| Image:Jacobs22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> cd3ogle4c45kodjrn7064i4zotwj35v 682871 682870 2022-07-29T09:26:33Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs20.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Jacobs21.jpg| Image:Jacobs22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 72whrinb37oj1a08mzc06cio0jodxg3 682872 682871 2022-07-29T09:26:58Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs21.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Jacobs22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> jw46nl7q9rpiqt8iiwx6qew9bmxv261 682873 682872 2022-07-29T09:27:21Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs22.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Jacobs23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 0xk2kn3twfk0bor426y3u98bvmvyk8b 682874 682873 2022-07-29T09:27:52Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs23.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Jacobs24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 4j0j7mv9qeox2tfo1ut1z2o4qwcyrju 682875 682874 2022-07-29T09:28:32Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs24.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Jacobs25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 19gq2slehx4nv4gxcze6y4ktxvouxrl 682876 682875 2022-07-29T09:29:02Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs25.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Jacobs26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> lcp957bgdo3lp3epx47lpqyqdl4ll2g 682877 682876 2022-07-29T09:29:34Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs26.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Jacobs27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 4etxcndzuhu8gs5fk6t2dy3hizgqoro 682878 682877 2022-07-29T09:29:57Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs27.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Jacobs28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> is6t7pgzt1rka4faud82lj80nngtr6c 682879 682878 2022-07-29T09:30:21Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs28.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Jacobs29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> st0qfn08q8bi4tnb7gauf2ne33jbqni 682880 682879 2022-07-29T09:30:49Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs29.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Jacobs30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> kl1s9aq02akw79ysf3a3qnsi7l6e1yz 682881 682880 2022-07-29T09:30:57Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs30.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Jacobs31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 9k7ckvqy8g1wkml5s6k62kk2mcyteme 682882 682881 2022-07-29T09:31:04Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs31.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Jacobs32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> smt5wo0uj7tob3bhxpfwhpyi9i20bcc 682883 682882 2022-07-29T09:31:14Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs32.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Jacobs33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> bnjfsnf8kp6pa30bspj3xbyj4tsgnqy 682884 682883 2022-07-29T09:31:24Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs33.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Jacobs34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 28h4v37e999j54riiwnofgp2dfe838k 682885 682884 2022-07-29T09:31:37Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs34.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Jacobs35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 0hrjahpmg7v5zkh201ux0a09apxs3qi 682886 682885 2022-07-29T09:31:45Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs35.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Jacobs36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> ohj0cv968ncasoise55li0zqxqimyh2 682887 682886 2022-07-29T09:31:58Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs36.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Jacobs38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> k6j12ebcuklm4aoat8vo6sk1xcw734d 682888 682887 2022-07-29T09:32:38Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs38.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Jacobs39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> il24k6s54m88yfbxlixec9ne5qjre1f 682889 682888 2022-07-29T09:33:04Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs39.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Jacobs41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> gu0dybsgw0ejx8x91uu3u7v0frp1b3f 682890 682889 2022-07-29T09:33:46Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs41.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Jacobs42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> rgpoxnww7ja0fk8r0nwmwk4loq8aw0w 682891 682890 2022-07-29T09:33:53Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs42.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Jacobs43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 08kc2y4jsoyx0thja3fom236zwxxx8h 682892 682891 2022-07-29T09:33:59Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs43.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Jacobs44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> lcxj3okyv5ukvzzo3d27oxa50svo33d 682893 682892 2022-07-29T09:34:07Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs44.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Jacobs45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> t0uxjkymtdl6aq53ym6feml7njsx851 682894 682893 2022-07-29T09:34:15Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs45.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Jacobs46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> cbic17aklaf028n3v87h765as2ugqh9 682895 682894 2022-07-29T09:34:21Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs46.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Jacobs47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 8zqofifar9j20ygi0ywa6ctnwr5cbaq 682896 682895 2022-07-29T09:34:28Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs47.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Jacobs48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 2d5a5bb6arvf1n5yike483nkicf0kiy 682897 682896 2022-07-29T09:34:35Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs48.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Jacobs49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> dibtae37kjcf2rd31ypotgdy6av9pkc 682898 682897 2022-07-29T09:34:42Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs49.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Jacobs50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 4kil3gm2wrqm0tst3xyushux9p0t19m 682899 682898 2022-07-29T09:34:49Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs50.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Jacobs51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> iwl7zvcvfasqce0n1x9xpcvfexx77dc 682900 682899 2022-07-29T09:34:56Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs51.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Jacobs52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> e2m61io87ts6qwkl9io9jm4wi4dillt 682901 682900 2022-07-29T09:35:03Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs52.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Jacobs53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 055ras2m58n9o5m10v98bkf5vm1qa7q 682902 682901 2022-07-29T09:35:11Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs53.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Jacobs54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> fvmme639ju444rejircz52c31atpjmi 682903 682902 2022-07-29T09:35:21Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs54.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Jacobs55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 2nqnsxq4vfl5vy2gmann9avxz8pugh1 682904 682903 2022-07-29T09:35:28Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs55.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Jacobs56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 4dvjs3kqr8r3hq7xxlts29759tyabio 682905 682904 2022-07-29T09:35:36Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs56.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Jacobs57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> brsdubnlhsq65zsnw47pnv67vbsvllf 682906 682905 2022-07-29T09:35:42Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs57.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Jacobs58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 763h3mljne0044ul0sfxol18gk8r0n0 682907 682906 2022-07-29T09:35:48Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs58.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Jacobs59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> ljngn1bnn199zrz0af06bzcqrnp1gp5 682908 682907 2022-07-29T09:35:55Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs59.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Jacobs60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 9sx1kf9ofhs0ji8v0ol8j4swewiox3k 682909 682908 2022-07-29T09:36:02Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs60.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Jacobs61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> e4ab8f7jn0f4moxlrijyix07xqmbweb 682910 682909 2022-07-29T09:36:08Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs61.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Jacobs62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 0nj2nvjqstevg5wk7417new06t2a2ec 682911 682910 2022-07-29T09:36:17Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs62.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Jacobs63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> cnh74pq8bwuaps2gdo4dto4eewvglog 682912 682911 2022-07-29T09:36:25Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs63.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Jacobs64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 590mzhwf45d9dzf73om60yv105trnly 682913 682912 2022-07-29T09:36:38Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs64.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Jacobs65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> sl5qpkvluossq7a9w2jymlgcci6uzh4 682914 682913 2022-07-29T09:36:57Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs65.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Jacobs66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 3u70ezythjcx8uxfsoow2duafzblt7e 682915 682914 2022-07-29T09:37:11Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs66.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg| Image:Jacobs67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> faf4xpt8ivn00fwml6h0dgddza6ts5o 682916 682915 2022-07-29T09:37:24Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs67.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 67.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 67.jpg| Image:Jacobs68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 0m2kzmbsux03aif183wo3112wolbdhl 682917 682916 2022-07-29T09:37:45Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs68.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 68.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 67.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 68.jpg| Image:Jacobs69.jpg| Image:Jacobs70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 3gkksmh02kevhbjkaksydhpnuh1p9z0 682918 682917 2022-07-29T09:38:25Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs70.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 70.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 67.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 68.jpg| Image:Jacobs69.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 70.jpg| Image:Jacobs71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> k1lh9pbdjid0vv2gb711dpdnc9lioqo 682919 682918 2022-07-29T09:38:41Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs71.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 71.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 67.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 68.jpg| Image:Jacobs69.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 70.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 71.jpg| Image:Jacobs72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> cc7fsgl2k2jopsjcb06eh8hdgjahn7s 682920 682919 2022-07-29T09:38:48Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs72.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 72.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 67.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 68.jpg| Image:Jacobs69.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 70.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 71.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 72.jpg| Image:Jacobs73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 16jw54kfeyj8byni6nswz5c5t1pheuu 682921 682920 2022-07-29T09:38:59Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs73.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 73.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 67.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 68.jpg| Image:Jacobs69.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 70.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 71.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 72.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 73.jpg| Image:Jacobs74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> tsmlts3qvg1qlst9blm7h6p006ftku2 682922 682921 2022-07-29T09:39:07Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs74.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 74.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 67.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 68.jpg| Image:Jacobs69.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 70.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 71.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 72.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 73.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 74.jpg| Image:Jacobs75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 1nwiix2t05ip29q03o7y3sywy3hikpi 682923 682922 2022-07-29T09:39:31Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs75.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 75.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 67.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 68.jpg| Image:Jacobs69.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 70.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 71.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 72.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 73.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 74.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 75.jpg| Image:Jacobs76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> 93ppuut61smq5s1n0cvk796j2ikx1xm 682924 682923 2022-07-29T09:39:38Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs76.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 76.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 67.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 68.jpg| Image:Jacobs69.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 70.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 71.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 72.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 73.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 74.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 75.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 76.jpg| Image:Jacobs77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> iz29qnrzhv11huib59p7ipqd3skt1a0 682925 682924 2022-07-29T09:39:45Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs77.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 77.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 67.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 68.jpg| Image:Jacobs69.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 70.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 71.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 72.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 73.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 74.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 75.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 76.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 77.jpg| Image:Jacobs78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> jhtvh83sg7itwlbcxmggpshjsy3c5sp 682926 682925 2022-07-29T09:39:55Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs78.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 78.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 67.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 68.jpg| Image:Jacobs69.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 70.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 71.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 72.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 73.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 74.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 75.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 76.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 77.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 78.jpg| Image:Jacobs79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> qtgz3ec1etvd6pj51jppiyxrq4ajq6o 682927 682926 2022-07-29T09:40:03Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs79.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 79.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 67.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 68.jpg| Image:Jacobs69.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 70.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 71.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 72.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 73.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 74.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 75.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 76.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 77.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 78.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 79.jpg| Image:Jacobs80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> o786cper77k86sqvxxmpmgsf2vj9s01 682928 682927 2022-07-29T09:40:11Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs80.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 80.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 67.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 68.jpg| Image:Jacobs69.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 70.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 71.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 72.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 73.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 74.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 75.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 76.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 77.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 78.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 79.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 80.jpg| Image:Jacobs81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> ieew5el5e8a8u27eu29izhqbgk39zdy 682929 682928 2022-07-29T09:40:18Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs81.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 81.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 67.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 68.jpg| Image:Jacobs69.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 70.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 71.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 72.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 73.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 74.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 75.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 76.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 77.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 78.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 79.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 80.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 81.jpg| Image:Jacobs82.jpg| Image:Jacobs83.jpg| </gallery> jsgwoa11y1zatmhwoiez37wcowpvotb 682930 682929 2022-07-29T09:40:26Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs82.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 82.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 67.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 68.jpg| Image:Jacobs69.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 70.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 71.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 72.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 73.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 74.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 75.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 76.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 77.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 78.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 79.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 80.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 81.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 82.jpg| Image:Jacobs83.jpg| </gallery> l3knfd33ak7h85xuw8844qso7zx4dj4 682931 682930 2022-07-29T09:40:33Z Jeff G. 13443 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Jacobs83.jpg]] → [[File:Georgiy Jacobson - Beetles Russia and Western Europe - plate 83.jpg]] [[c:COM:FR#FR3|File renaming criterion #3]]: To correct obvious errors in file names, including misspelled proper nouns, incorrect dates, and misidentified objects or organisms, per [[c:COM:BR#bulk renaming]]. wikitext text/x-wiki <gallery> Image:Jacob_xi.jpg| Image:Jacobs01.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 02.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 03.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 04.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 05.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 06.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 07.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 08.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 09.jpg| Image:Jacobs10.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 11.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 12.jpg| Image:Jacobs13.jpg| Image:Jacobs14.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 15.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 16.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 17.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 18.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 19.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 20.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 21.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 22.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 23.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 24.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 25.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 26.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 27.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 28.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 29.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 30.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 31.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 32.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 33.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 34.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 35.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 36.jpg| Image:Jacobs37.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 38.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 39.jpg| Image:Jacobs40.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 41.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 42.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 43.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 44.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 45.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 46.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 47.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 48.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 49.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 50.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 51.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 52.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 53.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 54.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 55.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 56.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 57.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 58.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 59.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 60.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 61.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 62.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 63.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 64.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 65.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 66.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 67.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 68.jpg| Image:Jacobs69.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 70.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 71.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 72.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 73.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 74.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 75.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 76.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 77.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 78.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 79.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 80.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 81.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 82.jpg| Image:Georgiy Jacobson - Beetles Russia and Western Europe - plate 83.jpg| </gallery> i8j8iqi12x4haoysz4vn4j5xgn6lzgp Mécanique vélo/Évaluation de la puissance exercée 0 58050 682826 646983 2022-07-28T17:21:10Z 84.205.43.30 /* Puissance musculaire nécessaire à la pratique du cyclisme */ wikitext text/x-wiki L’évaluation des consommations d’énergie lors de randonnées cyclistes remonte, en France, aux années 1980 et suivantes et a été faite * par des universitaires qui ont publié leurs travaux dans des journaux scientifiques * par des amateurs cyclotouristes qui ont publié ou non des ouvrages pratiques * par des professionnels du vélo de course – qui avec et grâce à leurs sponsors - ont étudié ces paramètres en vue d’améliorer les performances du sportif cycliste et/ou de sa machine : ces études relèvent quasiment du secret industriel, ce qui fait que peu de ces études sont rendues publiques. == Mesure de la [[:w:Puissance (physique)|puissance]] [[:w:muscle humain|musculaire humaine]] == Cette mesure se fait généralement sur des machines statiques singeant la bicyclette et sur lesquelles la force musculaire met en mouvement une roue magnétique plus ou moins freinée par un aimant. Cette roue est en effet située dans l’entrefer d’un aimant qui peut être plus ou moins rapproché de la roue ce qui entraîne une résistance variable au pédalage. On calcule ou on mesure la puissance développée en fonction des conditions d’aimantation et de la fréquence de pédalage. Les constructeurs de ces appareils les dotent d’un cadran renseignant différents paramètres : vitesse de pédalage, puissance développée en watts, « kilomètres parcourus », calories consommées et plus récemment pour les appareils grand public les fréquences des pulsations cardiaques. Dans un premier temps ces appareils étaient essentiellement médicaux (pratique des tests d’effort en cardiologie) mais l’engouement pour un exercice physique plus fréquent a permis la diffusion d’appareils de plus en plus sophistiqués vers le grand public. Les mesures des puissances obtenues sur ces appareils, même quand ils sont de qualité, ne représentent pas vraiment l’effort réel lors d’une randonnée à vélo en extérieur : l’absence de ventilation qui conduit à une sudation excessive en est l’importante différence. Il est malgré tout utile de comparer les résultats obtenus sur ces machines à ceux auxquels les calculs suivants vont conduire. == Puissance musculaire nécessaire à la pratique du cyclisme== [[File:Puissance_cycliste.png|thumb|Diagrammes représentant la puissance que le cycliste doit fournir pour mouvoir sa machine sur une route plate en fonction de la vitesse.]] Ils montrent que la puissance que le cycliste doit fournir pour mouvoir sa machine sur une route plate peut se décomposer en deux termes. 1er Terme : Si V est la vitesse en mètre par seconde, ρ la masse volumique de l’air en kg/m<sup>3</sup>, S.Cx un facteur combiné entre S la surface frontale (cycliste plus sa machine) frappée par l’air et Cx le facteur qui représente la facilité avec laquelle le mobile « cycliste+machine» pénètre dans l’air (on parle d’aérodynamisme), la puissance consommée par la résistance de l’air régit le premier terme selon l’expression suivante <math>P_{air} = {1 \over 2} \cdot \rho \cdot S \cdot Cx \cdot V^3</math> Pour un amateur cycliste, cette expression peut s’écrire plus simplement en remplaçant les paramètres par leurs valeurs probables <math>P_{air} = 0,26\cdot V^3 </math> En effet ρ à 21 °C et à 1 bar est égal à 1,205 kg.m<sup>-3</sup> et S.Cx pour la plupart des amateurs qui circulent les mains en haut du guidon et le torse frappant l’air est au moins de 0,43 m² Dans le cas d'un vélo couché non caréné, <math>S</math> et <math>Cx</math> sont plus faibles et cette puissance devient: <math>P_{air} = 0,09\cdot V^3 </math> Si l'on ajoute une pointe arrière aérodynamique à ce vélo couché, la trainée diminue encore : <math>P_{air} = 0,06\cdot V^3 </math> 2e Terme : Les frottements mécaniques (organes de transmission du vélo et frottements des pneus sur la route) représentent le second terme et on peut écrire : <math>P_{frottement} = m \cdot g \cdot V \cdot K</math> Pour les amateurs cyclistes disposant de vélos moyenne gamme, la combinaison de g et K conduit à une valeur de 0,1 et l’équation se simplifie en : <math>P_{frottement} = 0,1 \cdot m \cdot V</math> Où m représente le poids total du cycliste et de sa machine en kg et V sa vitesse en m.s<sup>-1</sup> L'équation générale permettant le calcul de la puissance nécessaire pour rouler sur une route plate (P (sur plat) sera donc la suivante <math>P_{sur plat} = {1 \over 2} \cdot \rho \cdot S \cdot Cx \cdot V^3</math><math>+m \cdot g \cdot V \cdot K</math> L'équation pour un cycliste amateur s'écrira donc <math>P_{sur plat} = 0,26 \cdot V^3 </math><math> + 0,1 \cdot m \cdot V</math> On voit que le deuxième terme est d’ordre 1 par rapport à la vitesse de déplacement contrairement au premier terme qui est d’ordre 3 par rapport à cette vitesse : plus on roule vite sur une route plate et plus la résistance de l’air prend relativement d’importance vis-à-vis des frottements mécaniques. Les paramètres évalués pour les amateurs sont nettement plus faibles pour les coureurs professionnels qui se positionnent de façon plus aérodynamique (S.Cx descendant à 0,36 m²) et dont les machines ont un rendement bien meilleur et des pneus étudiés qui les amènent à un facteur 0,08 voire moins dans la puissance dépensée par frottement. L’évolution des profils des vélos professionnels permet encore d’améliorer la pénétration dans l’air. Ainsi, avec un vélo couché non caréné et des roues de grands diamètre de bon rendement la puissance devient : <math>P_{sur plat} = 0,09 \cdot V^3 </math><math> + 0,08 \cdot m \cdot V</math> Ces réflexions d’un amateur cyclotouriste sont fondées sur les travaux cités précédemment : ils ont utilisés pour prévoir la capacité d’ascension de cols variés et connaître les durées approximatives de ces ascensions ainsi que les braquets à prévoir pour ne pas mettre pied à terre durant l’ascension. Cette démarche a été conduit à proposer des abaques et des tableaux pour éviter les calculs par itérations qu’impliquent les équations définies dans le paragraphe précédent. Ces travaux avaient également abordé l’influence de la gravité mais avec une approche pratique compte tenu que l’ascension de grands cols – dont les pentes tournent autour de 8 à 10 % voire plus – implique des vitesses d’ascension faibles qui minimisent les deux termes de calculs des puissances consommées pour résister à l’air et s’opposer aux frottements. La puissance qu’il faut développer pour s’élever est fonction du poids, de la pente (p en %) et de la vitesse d’ascension. Le travail effectué (W) lors de l’ascension de h mètres (dénivelé) sera : <math> W_{asc}=m \cdot g \cdot h </math> La puissance « ascensionnelle » sera <math> P_{asc} = {W_{asc} \over temps} </math> et comme h = déplacement linéaire *p (%) on pourra écrire : <math> P_{asc}=m \cdot g \cdot V \cdot p </math> Plus précisément: <math> P_{asc}=m \cdot g \cdot V \cdot sin(angle de la pente)</math> <math> P_{asc}=m \cdot g \cdot V \cdot sin(Arctan(p))</math> L'approximation <math>(m \cdot g \cdot V \cdot p)</math> surestime de moins de 1 % <math>P_{asc}</math> tant que la pente est inférieure à 14 %. Avec 10 % de pente, l'approximation surestime <math>P_{asc}</math> de 0,5 %. Une partie de la mesure de la puissance du cycliste sur un parcours le plus plat possible et relativement long. En fait il faut distinguer implicitement une « puissance efficace moyenne » de la puissance que l’on pourrait par exemple mesurer lors d’un test d’effort où après quelques minutes on atteint la fréquence cardiaque maximale théorique et donc la puissance maximale. Cette puissance maximale n’est disponible pour l’individu qu’en de courts instants. Il est hors de question de tabler sur une telle puissance maximale pour grimper un col durant une à plusieurs heures. C’est la raison pour laquelle le parcours de plat testé doit comporter suffisamment de kilomètres d’une part pour conduire à des chiffres assez précis et d’autre part pour être représentatif d’un effort équivalent en montagne. Mais il faut avoir observé que « puissance efficace moyenne » qui est à peine les deux tiers de la puissance maximale. Cela s’améliore avec l’entraînement et avec la condition physique. Exemple : Si la vitesse moyenne mesurée sur plat est de 27 km/h soit 7,5 m/s, la puissance développée sur plat selon les travaux de Mariot est de : <math> P_{observ\acute{e}e \,sur \,plat}= 0,26 \times 7,5^3 + 85 \times 7,5 \times 0,1 </math> <math> P_{observ\acute{e}e \,sur \,plat} = 173,5\,\rm{watts}</math>. Cette puissance pourra servir durant l’ascension d’un col dont la pente moyenne est de 8 % et conduira à une vitesse V exprimée en m/s en négligeant les facteurs de résistance de l’air et des frottements puisque la vitesse sera faible : <math> 173,5 = 85 \times 9,81 \times 0,08\times V </math> D’où V = 2,6 m/s soit 9,3 km/h. Si la longueur du col est de 10 km il faudra prévoir 1 heure et 5 minutes pour le gravir. Cette valeur est par excès car les forces de résistance à l'air et aux frottements n'ont pas été intégrées au calcul : si on veut en tenir compte, il faudra résoudre l'équation du 3e degré ci-dessous qu'on ne peut résoudre que par itérations ou grâce aux tableaux. La différence n'est quand même pas négligeable. <math>P_{tout \,parcours} = 0,26 \cdot V^3 </math><math> + 0,1 \cdot m \cdot V</math><math> + m \cdot g \cdot V \cdot p </math> Avec un vélo couché non caréné qui a des roues d'un bon rendement, cette puissance devient : <math>P_{tout \,parcours} = 0,09 \cdot V^3 </math><math> + 0,08 \cdot m \cdot V</math><math> + m \cdot g \cdot V \cdot p </math> En ce qui concerne l'application de ces notions aux calculs pratiques on se reportera à l'évaluation de la puissance exercée à vélo. === Évaluations des dépenses caloriques=== Si on dispose d'un cardio-fréquencemètre avec les fonctions de bornage de la fréquence cardiaque (avertissement par bip si on sort de l'intervalle choisi) et que le temps passé dans cet intervalle est comptabilisé on peut évaluer la dépense calorique durant une randonnée par la méthode décrite ci-dessous. '''Relation entre puissance et consommation calorique :''' Le travail et la quantité de chaleur sont reliés par la relation de Joule : W = J * Q ( W étant le travail, Q la quantité de chaleur et J = 4,18) La puissance et le travail sont reliés par la relation P = W / t (P étant la puissance, W le travail et t le temps) On peut donc écrire que P = ( J * Q )/t soit P en watts = ( 4,18* Q )/(3600) Q étant exprimée en "petite calorie" (On calcule ici la dépense calorique consécutive au maintien pendant une heure de la puissance P) On peut écrire Q en kilocalories par heure = ( 3600 * P ) /(4,18*1000) soit '''Q KCal/heure = 0,86 * P en watts''' Cette relation n'est valable que pour un rendement de 100 %. En fait le rendement de la « machine humaine » se situe plutôt entre 20 et 25 % et dépend des capacités intrinsèques de l'individu et de son entraînement. On peut écrire, si le rendement est de 20 % '''Q Kcal/heure = 4,3 * P en watts''' Si le rendement est de 25 % (champions en bonnes conditions) '''Q Kcal/heure = 3,5 * P en watts''' Pour les cyclistes amateurs sur lesquels l'article a été orienté on dira que son rendement est de l'ordre de 22 à 23 % '''Q en Kcal/heure = 4 * P en watts ''' Cela signifie que le cycliste qui a été retenu ci-dessus et qui peut développer une puissance de 173 watts aura une consommation calorique voisine de: 173 * 4 soit 692 Kcal par heure (ou 2900 kilojoules par heure si on observe la réglementation actuelle des unités) '''Puissance développée sur plat dans une zone précise de fréquence cardiaque :''' L'épreuve de mesure de la vitesse moyenne sur plat, effectuée dans des conditions proches de celles que l'on trouvera dans l'ascension d'un col implique plutôt d'être au maximum de sa puissance moyenne effective. On peut très bien faire cette épreuve sur plat en se calant dans une zone de fréquence cardiaque donnée et bien en dessous de sa fréquence élevée supportable : la vitesse moyenne sera alors évidemment moindre. On pourra alors dire qu'entre les deux fréquences choisies on développe la puissance calculée à partir de la vitesse observée. En étudiant précisément plusieurs intervalles on pourra établir une relation entre zone de fréquence cardiaque et puissance développée pour un individu donné. '''Consommation calorique lors d'un circuit fermé:''' Si on s'impose de faire cette randonnée dans une zone de fréquence cardiaque choisie (FCC) , on pourra calculer la dépense calorique en partant du temps comptabilisé dans la zone FCC et de la puissance développée à cette FCC. On peut avoir recours au calcul par itérations : * soit à partir d'un tableur disposant d'une fonction de résolution d'équations par itérations (Fonction SOLVE chez Excel Microsoft) * soit à partir d'une calculatrice programmable capable de résoudre des équations par itérations Nous expliquerons ci-dessous les deux démarches === Calcul par tableur === nous avons reproduit ci-dessous une feuille de tableur muni de la fonction SOLVE : il suffit de reproduire strictement cette feuille dans un tableur disposant aussi de cette fonction (la plupart des tableurs actuels) et de suivre les indications qui figurent sous ce tableau {| class="wikitable" |+Calculcs cols ! ! colonne A ! colonne B ! colonne C ! colonne D |----- | 1 |Poids total cycliste + vélo | 96 | | |----- | 2 | Calcul puissance sur plat | | puissance évaluée | |-----| | 3 | Vitesse sur plat -> | 24000 | | |-----| | 4 | Caractéristiques du col à grimper | longueur en mètres | % moyen | % maxi |-----| | 5 | |20000 | 0,07 |0,10 |-----| | 6 | |Puissance |à 60 coups/min. |denture pour |-----| | 7 | Vitesse moyenne(% moyen) |évaluée en C3 |Braquet moyen |Plateau 36 dents |-----| | 8 | 9088,430737 |173 |2,52 |30 |-----| | 9 | |Puissance |à 45 coups/min. |denture pour |-----| |10 | Vitesse mini (plus fort %) |évaluée en C3 |Braquet mini |plateau 28 dents |-----| |11 | 6728,758697 |173 |2,49 |24 |-----| |12 |Durée ascension en min. (environ!) |132 | | |-----| |} 1/ Reproduire les cellules comportant du texte telles qu'elles sont présentes ci-dessus :A1 A2 A3 A4 A7 A10 A12 B4 B6 B7 B9 B10 C2 C4 C6 C7 C9 C10 D4 D6 D7 D9 D10 2/Les cellules B1 B3 B5 B8 B11 C5 et D5 doivent être renseignées sur les paramètres demandés ou issus des calculs (par exemple après avoir entré la vitesse en B3 la puissance déduite apparaît en C3 et doit être reportée en B8 et B11. Les données du tableau peuvent et doivent être changées par l'utilisateur en fonction de ses données personnelles 3/ mettre les formules suivantes dans les cellules suivantes en C3 mettre =(PUISSANCE((B3/3600);3)*0,26)+B1*0,1*(B3/3600) en B8 mettre =A8*C5*B1*9,81/3600+A8/3600*B1*0,1+0,26*PUISSANCE(A8/3600;3) en B11 mettre =A11*D5*B1*9,81/3600+A11/3600*B1*0,1+0,26*PUISSANCE(A11/3600;3) en C8 mettre =A8/(60*60) en D8 mettre =36/(C8/2,1) en C11 mettre =A11/(60*45) en D11 mettre =28/(C11/2,1) en B12 mettre =(B5/A8)*60 en A8 et en A11 il est préférable d'introduire une donnée positive quelconque (1 par exemple) Il est recommandé de formater correctement les cellules de calcul pour éviter de traîner des décimales. Quand ce travail est terminé il peut servir pour tout profil de col : après avoir documenté les cellules de données on se positionne sur B8, on appelle la fonction SOLVE et on exécute la recette prévue par le tableur. Idem pour B11 On trouve alors tous les renseignements attendus, il suffit de s'équiper et de grimper le col. === Calcul par calculatrice programmable === En se conformant à la documentation de la calculatrice programmable on entre l'équation générale pour un cycliste amateur qu'on rappelle ci-dessous <math>P_{toutparcours} = 0,26 \cdot V^3 </math><math> + 0,1 \cdot m \cdot V</math><math> + m \cdot g \cdot V \cdot p </math> soit pour la machine programmable (pour éviter les minuscules) <math>P_{toutparcours} = 0,26 \cdot V^3 </math><math> + 0,1 \cdot M\cdot V</math><math> + M \cdot 9,81 \cdot V \cdot A </math> Les variables seront stockées dans les touches P (puissance) V (vitesse) M (poids total du cycliste et de son vélo), A (le pente du col sous forme décimale par exemple 0.08). On fait agir la fonction SOLVE en demandant le calcul de la vitesse V et en attribuant aux trois autres variables les valeurs voulues. [[Catégorie:Mécanique vélo (livre)]] pt98165c4qp9agaxsieihlp4gag2brd Fonctionnement d'un ordinateur/Le préchargement 0 65804 682827 682071 2022-07-28T17:57:16Z Mewtow 31375 /* L'usage d'un cache spécialisé pour le préchargement */ wikitext text/x-wiki En raison de la localité spatiale, il est avantageux de précharger des données proches de celles chargées il y a peu. Ce '''préchargement''' (en anglais, ''prefetching''), peut être effectué par le programmeur, à la condition que le processeur possède une instruction de préchargement. Mais celui-ci peut aussi être pris en charge directement par le processeur, sans implication du programmeur, ce qui a de nombreux avantages. Pour ce faire, le processeur doit contenir un circuit nommé ''prefetcher''. Qui plus est, on peut utiliser à la fois des instructions de préchargement et un ''prefetcher'' intégré au processeur : les deux solutions ne sont pas incompatibles. ==Le préchargement des données== Les ''prefetchers'' pour les données sont surtout adaptés à l'utilisation de tableaux (des ensembles de données consécutives de même taille et de même type). Ils profitent du fait que ces tableaux sont souvent accédés case par case. ===Les ''Prefetchers'' séquentiels=== Les ''prefetchers'' séquentiels préchargent les données immédiatement consécutives de la donnée venant tout juste d'être lue ou écrite. Ils fonctionnent bien lorsqu'on accède à des données consécutives en mémoire, ce qui arrive souvent lors de parcours de tableaux. Dans le cas le plus simple, on précharge le bloc de mémoire qui suit immédiatement la dernière ligne chargée. L'adresse de ce bloc se calcule en additionnant la longueur d'une ligne de cache à la dernière adresse lue ou écrite. Ce qui peut être fait avec un seul bloc de mémoire peut aussi l'être avec plusieurs. Rien n’empêche de charger non pas un, mais deux ou trois blocs consécutifs dans notre mémoire cache. Mais attention : le nombre de blocs de mémoire chargés dans le cache est fixe. [[File:Préchargement séquentiel.png|centre|vignette|upright=2|Préchargement séquentiel.]] Le préchargement séquentiel ne fonctionne que pour des accès à des adresses consécutives, pour des données avec une bonne localité spatiale. Pour les autres types d'accès, l'utilisation d'un ''prefetcher'' séquentiel est généralement contreproductive. Pour limiter la casse, les ''prefetchers'' sont capables de distinguer les accès séquentiels et les accès problématiques. Cette détection peut se faire de deux façons. Avec la première, le ''prefetcher'' va calculer une moyenne du nombre de blocs préchargés qui ont été utiles, à partir des n derniers blocs préchargés. En clair, il va calculer le rapport entre le nombre de blocs qu'il a préchargés dans le cache et le nombre de ces blocs qui ont été accédés. Si jamais ce rapport diminue trop, cela signifie que l'on n’a pas affaire à des accès séquentiels : le ''prefetcher'' arrêtera temporairement de précharger. Autre solution : garder un historique des derniers accès mémoires pour vérifier s'ils accèdent à des adresses consécutives. Le processeur peut décider de désactiver temporairement le préchargement si jamais le nombre de blocs préchargés utilement tombe trop près de zéro. ===Les accès par enjambées=== Les '''accès par enjambées''' (ou ''stride access'') se font sur des données séparées par une distance constante k. Ils ont comme origine les parcours de tableaux multidimensionnels et de tableaux de structures/objets. Avec ce genre d'accès, un ''prefetcher'' séquentiel charge des données inutiles, ce qui est synonyme de baisse de performances. Mais certains ''prefetchers'' gèrent de tels accès à la perfection. Cela ne rend pas ces accès aussi rapides que des accès à des blocs de mémoire consécutifs, vu qu'on gâche une ligne de cache pour n'en utiliser qu'une petite portion, mais cela aide tout de même beaucoup. [[File:Accès par enjambées.png|centre|vignette|upright=2|Accès par enjambées.]] Ces prefetchers conservent un historique des accès mémoires effectués récemment dans un cache : la '''table de prédiction de références''' (''reference prediction table''). Chaque ligne de cache associe à une instruction toutes les informations nécessaires pour prédire quelle sera la prochaine adresse utilisée par celle-ci. Elle stocke notamment la dernière adresse lue/écrite par l'instruction, l’enjambée, ainsi que des bits qui indiquent la validité de ces informations. L'adresse de l'instruction est dans le tag de la ligne de cache. Pour prédire la prochaine adresse, il suffit d'ajouter la longueur d’enjambée à l'adresse à lire ou écrire. Cette technique peut être adaptée pour précharger non seulement la prochaine adresse, mais aussi les n adresses suivantes, la énième adresse ayant pour valeur : adresse + n × enjambée. Évidemment, ces adresses à précharger ne peuvent pas être lues ou écrites simultanément depuis la mémoire. On doit donc les mettre en attente, le temps que la mémoire soit libre. Pour cela, on utilise un tampon de préchargement, qui stocke des requêtes de lecture ou d'écriture fournies par l'unité de préchargement. L'algorithme de gestion des enjambées doit détecter les enjambées, déterminer leur taille de l’enjambée et précharger un ou plusieurs blocs. Détecter les enjambées et déterminer leur taille peut se faire simultanément de différentes manières. La première considère que si une instruction effectue deux défauts de cache à la suite, elle effectue un accès par enjambées. Il s'agit là d'une approximation grossière, mais qui ne fonctionne pas trop mal. Avec cette méthode, une ligne de cache de la table de prédiction de référence peut avoir deux états : un état où l'instruction n'effectue pas d'accès par enjambées, ainsi qu'un second état pour les instructions qui effectuent des accès par enjambées. La première fois qu'une instruction effectue un défaut de cache, une entrée lui est allouée dans la table de prédiction de références. La ligne est initialisée avec une enjambée inconnue en état "préchargement désactivé". Lors du second accès, la ligne de cache est mise à jour en état "préchargement activé". Le ''prefetcher'' considère que la distance entre les deux adresses (celle du premier accès et celle du second) est l'enjambée, cette distance se calculant avec une simple soustraction. [[File:Calcul de l’enjambée.png|centre|vignette|upright=2|Calcul de l’enjambée.]] Néanmoins, cet algorithme voit souvent des accès par enjambées là où il n'y en a pas. Une solution à cela consiste à attendre un troisième accès avant de commencer le préchargement, afin de vérifier si l'enjambée calculée est la bonne. Lorsque l'instruction effectue son premier défaut de cache, l'entrée est initialisée dans l'état ''no prefetch''. Lors du défaut de cache suivant, l’enjambée est calculée, mais le préchargement ne commence pas : l'entrée est placée dans l'état ''init''. C'est lors d'un troisième défaut de cache que l’enjambée est recalculée, et comparée avec l’enjambée calculée lors des deux précédents défauts. Si les deux correspondent, un accès par enjambées est détecté, et le préchargement commence. Sinon, l'instruction n'effectue pas d'accès par enjambées : on place l'entrée en état ''no prefetch''. [[File:Calcul amélioré de l’enjambée, partie 2.png|centre|vignette|upright=2|Calcul amélioré de l’enjambée, partie 2.]] On peut améliorer l'algorithme précédent pour recalculer l’enjambée à chaque accès mémoire de l'instruction, et vérifier si celui-ci a changé. Si un changement est détecté, la prédiction avec enjambée est certainement fausse et on ne précharge rien. Pour que cet algorithme fonctionne, on doit ajouter un quatrième état aux entrées : « transitoire » (''transient''), qui stoppe le préchargement et recalcule l’enjambée. [[File:Recalcul du préchargement à chaque défaut de cache.png|centre|vignette|upright=2|Recalcul du préchargement à chaque défaut de cache.]] ===Le préchargement selon les dépendances=== Certaines applications ont besoin de structures de données qui permettent de supprimer ou d'ajouter un élément rapidement. On peut notamment citer les listes, les arbres et les graphes. Dans ces structures de données alternatives aux tableaux, les données sont souvent dispersées dans la mémoire. Pour faire le lien entre les données, chacune d'entre elles sera stockée avec les adresses des données suivantes ou précédentes. Les ''prefetechers'' précédents fonctionnent mal avec ces structures de données, où les données ne sont pas placées à intervalle régulier en mémoire. Cela dit, il n'existe des techniques de préchargement adaptées pour ce genre de structures de données. La première de ces techniques a reçu le nom de '''préchargement selon les dépendances''' (''dependence based prefetching''). Elle ne donne de bons résultats que sur des listes. Prenons un exemple : une liste simplement chainée, une structure où chaque donnée indique l'adresse de la suivante. Pour lire la donnée suivante, le processeur doit récupérer son adresse, qui est placée à côté de la donnée actuelle. Puis, il doit charger tout ou partie de la donnée suivante dans un registre. Pour résumer, on se retrouve avec deux lectures : la première récupère l'adresse et l'autre l'utilise. Dans ce qui va suivre, je vais identifier ces deux instructions en parlant d'instruction productrice (celle qui charge l'adresse) et consommatrice (celle qui utilise l'adresse chargée). {| |[[File:Instruction productrice.jpg|vignette|Instruction productrice.]] |[[File:Instruction comsommatrice.jpg|vignette|Instruction consommatrice.]] |} Avec le préchargement selon les dépendances, le processeur mémorise si deux instructions ont une dépendance producteur-consommateur dans un cache : la '''table de corrélations'''. Chaque ligne de celle-ci stocke les adresses du producteur et du consommateur. Reste que ces corrélations ne sortent pas de la cuisse de Jupiter. Elles sont détectées lors de l’exécution d'une instruction consommatrice. Pour toute lecture, le processeur vérifie si la donnée à lire a été chargée par une autre instruction : si c'est le cas, l'instruction est consommatrice. Pour cela, le processeur contient une table de correspondances entre la donnée lue et l'adresse de l'instruction (le ''program counter'') : la '''fenêtre de producteurs potentiels'''. Lors de l’exécution d'une instruction, il vérifie si l'adresse à lire est dans la fenêtre de producteurs potentiels : si c'est le cas, c'est qu'une instruction productrice a chargé l'adresse, et que l'instruction en cours est consommatrice. L'adresse des instructions productrice et consommatrice sont alors stockées dans la table de corrélations. A chaque lecture, le processeur vérifie si l'instruction est productrice en regardant le contenu de la table de corrélations. Dès qu'une instruction détectée comme productrice a chargé son adresse, le processeur précharge les données de l'instruction consommatrice associée. Lorsqu'elle s’exécutera quelques cycles plus tard, la donnée aura déjà été lue depuis la mémoire. ===Le préchargement de Markov=== Pour les structures de données plus évoluées, comme des arbres ou des graphes, la technique précédente ne marche pas très bien. Avec ces types de données, chaque donnée a plusieurs successeurs, ce qui fait qu'une instruction consommatrice ne va pas toujours consommer la même adresse. Pour gérer cette situation, on doit utiliser des ''prefetchers'' plus évolués, comme des '''''prefetchers'' de Markov'''. Ils fonctionnent comme les précédents, sauf que la table de corrélations permet de mémoriser plusieurs correspondances, plusieurs adresses de successeurs. Dans certains ''prefetchers'', toutes les adresses des successeurs sont préchargées. Mais sur d'autres, le ''prefetcher'' se débrouille pour prédire quelle sera la bonne adresse du successeurs. Pour cela, le ''prefetcher'' calcule, pour chaque adresse, la probabilité qu'elle soit accédée. À chaque lecture ou écriture, les probabilités sont mises à jour. Seule l'adresse de plus forte probabilité est préchargée. Vu que la mémoire ne peut précharger qu'une seule donnée à la fois, certaines adresses sont mises en attente dans une mémoire tampon de préchargement. Lors du préchargement, le ''program counter'' de l'instruction qui initiera le préchargement sera envoyé à la table de correspondance. Cette table fournira plusieurs adresses, qui seront mises en attente dans le tampon de préchargement avant leur préchargement. L'ordre d'envoi des requêtes de préchargement (le passage de la mémoire tampon au sous-système mémoire) est déterminé par les probabilités des différentes adresses : on précharge d'abord les adresses les plus probables. ===Le préchargement par distance=== Le gain apporté par les ''prefetchers'' vus auparavant est appréciable, mais ceux-ci fonctionnent mal sur des accès cycliques ou répétitifs, certes rares dans le cas général, mais présents à foison dans certaines applications. Ils apparaissent surtout quand on parcourt plusieurs tableaux à la fois. Pour gérer au mieux ces accès, on a inventé des ''prefetchers'' plus évolués, capables de ce genre de prouesses. [[File:Accès mémoire cyclique sans enjambée.jpg|centre|vignette|upright=2|Accès mémoire cyclique sans enjambée.]] Le '''préchargement par distance''' (''distance prefetching''), une adaptation du ''prefetcher'' du Markov, est un de ces ''prefetchers''. Celui-ci n'utilise pas les adresses, mais les différences entre adresses accédées de manière consécutive, qui sont appelées des deltas. Ces deltas se calculent tout simplement en soustrayant les deux adresses. Ainsi, si j'accède à une adresse A, suivie par une adresse B, le préchargement par distance calculera le delta B - A, et l'utilisera pour sélectionner une entrée dans la table de correspondances. La table de correspondances est toujours structurée autour d'entrées, qui stockent chacune plusieurs correspondances, sauf qu'elle stocke les deltas. Cette table permet de faire des prédictions du style : si le delta entre B et A est de 3, alors le delta entre la prochaine adresse sera soit 5, soit 6, soit 7. L'utilité du ''prefetcher'' de Markov, c'est que la même entrée peut servir pour des adresses différentes. ===Le Tampon d’historique global=== Les techniques vues plus haut utilisent toutes une sorte de table de correspondances. L'accès à la table s'effectue soit en envoyant le ''program counter'' de l'instruction en entrée (préchargement par enjambées), soit l'adresse lue, soit les différences entre adresses. Ce qui est envoyé en entrée sera appelé l''''index''' de la table, dans la suite de cette partie. Cette table stocke une quantité limitée de données, tirées de l'historique des défauts de cache précédents. En somme, la table stocke, pour chaque index, un historique des défauts de cache associés à l'index. Dans les techniques vues précédemment, chaque table stocke un nombre fixe de défauts de cache par index : le ''one block lookahead'' stocke une adresse par instruction, le ''stride'' stocke une enjambée et une adresse pour chaque instruction, le préchargement de Markov stocke une ou plusieurs adresses par instruction, etc. Dit autrement, l'historique a une taille fixe. Vu que cette quantité est fixe, elle est souvent sous-utilisée. Par exemple, le préchargement de Markov limite le nombre d'adresses pour chaque instruction à 4, 5, 6 suivant le ''prefetcher''. Certaines instructions n'utiliseront jamais plus de deux entrées, tandis que le nombre de ces entrées n'est pas suffisant pour d'autres instructions plus rares. La quantité d'informations mémorisée pour chaque instruction est toujours la même, alors que les instructions n'ont pas les mêmes besoins : c'est loin d'être optimal. De plus, le nombre de défauts de cache par index limite le nombre d'instructions ou d'adresses qui peuvent être prédites. De plus, il se peut que des données assez anciennes restent dans la table de prédiction, et mènent à de mauvaises prédictions : pour prédire l'avenir, il faut des données à jour. Pour éviter ce genre de défauts, les chercheurs ont inventé des ''prefetchers'' qui utilisent un tampon d’historique global (''global history buffer''). Celui-ci permet d’implémenter plusieurs techniques de préchargement. Les techniques précédentes peuvent s'implémenter facilement sur ces ''prefetchers'', mais sans les défauts cités au-dessus. Ces ''prefetchers'' sont composés de deux sous-composants. Premièrement, on trouve une mémoire tampon de type FIFO (''First In, First Out'') qui mémorise les défauts de cache les plus récents : l''''historique global'''. Pour chaque défaut de cache, la mémoire FIFO mémorise l'adresse lue ou écrite dans une entrée. Pour effectuer des prédictions crédibles, ces défauts de cache sont regroupés suivant divers critères : l'instruction à l'origine du défaut, par exemple. Pour cela, les entrées sont organisées en liste chainée : chaque entrée pointe sur l'entrée suivante qui appartient au même groupe. On peut voir chacune de ces listes comme un historique dédié à un index : cela peut être l'ensemble des défauts de cache associés à une instruction, l'ensemble des défauts de cache qui suivront l'accès à une adresse donnée, etc. Généralement, les instructions sont triées à l'intérieur de chaque groupe dans l'ordre d'arrivée : l'entrée la plus récente contient le défaut de cache le plus récent du groupe. Ainsi, la taille de l'historique s'adapte dynamiquement suivant les besoins, contrairement aux ''prefetchers'' précédents où celui-ci tait de taille fixe. [[File:Tampon d’historique global.jpg|centre|vignette|upright=2|Tampon d’historique global.]] Reste que le processeur doit savoir où est l'entrée qui correspond au début de chaque liste. Pour cela, on doit rajouter une '''table de correspondances d'historiques''', qui permet de dire où se trouve l'historique associé à chaque index. Cette table de correspondances (index → historique par index) a bien sûr une taille finie. En somme, le nombre d'entrées de cette table limite le nombre d'index (souvent des instructions) gérées en même temps. Mais par contre, pour chaque instruction, la taille de l'historique des défauts de cache est variable. [[File:Tampon d’historique global avec sa table d’index.jpg|centre|vignette|upright=2|Tampon d’historique global avec sa table d’index.]] La table de correspondances et l'historique global sont couplés avec un '''circuit de prédiction''', qui peut utiliser chaque historique pour faire ces prédictions. Celui-ci peut aussi bien utiliser la totalité de l'historique global, que les historiques dédiés à un index. Faire une prédiction est simple demande d’accéder à la table de correspondances avec l'index adéquat : l'adresse lue ou écrite, le ''program counter'' de l'instruction d'accès mémoire, la distance entre cette adresse et la précédente, etc. Cela va alors sélectionner une liste dans l'historique global, qui sera parcourue de proche en proche par le circuit de prédiction, qui déterminera l'adresse à précharger en fonction de l'historique stocké dans la liste. Dans certains cas, l'historique global est aussi parcouru par le circuit de prédiction, mais c'est plus rare. Ce tampon d’historique global permet d’implémenter un algorithme de Markov assez simplement : il suffit que la table d'index mémorise une correspondance adresse → début de liste. Ainsi, pour chaque adresse, on associera la liste d'adresses suivantes possibles, classées suivant leur probabilité. L'adresse au début de la liste sera la plus probable, tandis que celle de la fin sera la moins probable. Même chose pour le préchargement par distance : il suffit que l'index soit la distance entre adresse précédemment accédée et adresse couramment accédée. Dans ce cas, la liste des entrées mémorisera la suite de distances qui correspond. L'implémentation d'un préchargement par enjambées est aussi possible, mais assez complexe. Mais de nouveaux algorithmes sont aussi possibles. ===Les variantes du tampon d’historique global=== Des variantes du tampon d'historique global ont été inventées. On pourrait citer celle qui ajoute, en plus de l'historique global, des historiques locaux sous la forme de mémoires FIFO qui mémorisent les derniers accès effectués par une instruction. Plus précisément, si on dispose de n historiques locaux, chacun de ces n historiques mémorise l'historique des n dernières instructions d'accès mémoire les plus récentes. D'autres variantes, et notamment celle du '''cache d'accès aux données''', ont ajouté une seconde table d'index : * la première table d'index prend en entrée le ''program counter'' de l'instruction à l'origine du défaut de cache ou de l'accès mémoire ; * la seconde prend en entrée l'adresse à lire ou écrire. [[File:Data access cache.png|centre|vignette|upright=2|Cache d'accès aux données.]] ==Le préchargement des instructions== Certains processeurs utilisent un ''prefetcher'' séparé pour les instructions, chose qui fonctionne à la perfection si le cache d'instruction est séparé des caches de données. Les techniques utilisés par les ''préfetchers'' d'instructions sont multiples et nombreux sont ceux qui réutilisent les techniques vues précédemment. Le préchargement séquentiel est notamment utilisé sur certains ''prefetchers'' relativement simples, de même que les ''prefetchers'' de Markov. Mais certaines techniques sont spécifiques au préchargement des instructions. Il faut dire que les branchements sont une spécificité du flux d'instruction, qui doit être prise en compte par le ''prefetcher'' pour obtenir un résultat optimal. ===Le préchargement séquentiel, le retour !=== Le préchargement séquentiel est adapté au préchargement des instructions d'un programme, vu que ses instructions sont placées les unes après les autres en mémoire. Mais un ''prefetcher'' purement séquentiel gère mal les branchements. [[File:Branchements et préchargement séquentiel.png|centre|vignette|upright=2|Branchements et préchargement séquentiel.]] Sur certains processeurs, cette technique est utilisée non seulement pour charger des instructions dans le cache, mais aussi pour charger à l'avance certaines instructions dans le séquenceur. Sur ces processeurs, l'unité de chargement et de décodage sont séparées par une petite mémoire tapon de type FIFO : le '''tampon d’instructions''' (''instruction buffer''). En utilisant du préchargement séquentiel, on peut précharger des instructions dans le tampon d’instructions à l'avance, permettant ainsi de masquer certains accès au cache ou à la mémoire assez longs. Lorsqu'un branchement est décodé, ce tampon d’instructions est totalement vidé de son contenu. ===Le ''Target line prefetching''=== Pour gérer au mieux les branchements, il faudrait trouver un moyen de connaître l'adresse de destination. Néanmoins, le processeur peut supposer que l'adresse de destination est fixe : il suffit de s'en souvenir pour la prochaine fois. C'est ce qu'on appelle le '''''target line prefetching'''''. [[File:Target line prefetching.png|centre|vignette|upright=2|Target line prefetching.]] Pour implémenter cette technique, le ''prefetcher'' incorpore un cache pour stocker les adresses de destination des branchements déjà rencontrés. Plus précisément, ce cache contient les correspondances entre une ligne de cache, et la ligne de cache à charger à la suite de celle-ci. Pour plus d'efficacité, certains processeurs ne stockent pas les correspondances entre lignes de cache consécutives. Si deux lignes de cache sont consécutives, on fait face à un défaut de cache dans la mémoire qui stocke nos correspondances. Le ''prefetcher'' utilise alors automatiquement un préchargement séquentiel. Ainsi, la table de correspondances est remplie uniquement avec des correspondances utiles. ===Le préchargement du mauvais chemin=== On peut améliorer la technique précédente pour s'adapter aux branchements conditionnels. En plus de charger les instructions correspondant à un branchement pris, on peut aussi charger les instructions situées juste après le branchement. Comme ça, si le branchement n'est pas pris, les instructions suivantes seront disponibles quand même. On appelle cette technique le '''préchargement du mauvais chemin''' (''wrong path prefetching''). [[File:Préchargement du mauvais chemin.png|centre|vignette|upright=2|Préchargement du mauvais chemin.]] ==La pollution du cache== Le ''prefetcher'' peut se tromper et précharger des données inutilement dans le cache. Et outre l'inutilité de charger des données qui ne servent à rien, cela éjecte aussi des données potentiellement utiles du cache. C'est le phénomène de '''pollution de cache'''. Il va de soi que limiter au maximum cette pollution du cache permet de tirer parti au maximum de la mémoire cache, reste à savoir comment. Diverses solutions existent. ===L'usage d'un ''Dirty bit''=== Avec la première solution, la donnée chargée inutilement sera sélectionnée pour remplacement lors du prochain défaut de cache. Si le cache utilise un algorithme de sélection des lignes de cache de type LRU (''Least Recently Used''), on peut la mettre directement dans l'état « utilisée la moins récemment », ou « très peu utilisée ». ===Le duel d’ensembles=== Des chercheurs ont inventé des techniques plus complexes, dont la plus connue est le duel d'ensembles (''set dueling''). Dans leurs travaux, ils utilisent un cache associatif à plusieurs voies. Les voies sont réparties en deux groupes : statiques ou dynamiques. Les voies statiques ont une politique de remplacement fixée une fois pour toutes : * dans certaines voies statiques, toute ligne chargée depuis la mémoire est considérée comme la plus récemment utilisée ; * dans les autres voies statiques, toute ligne chargée depuis la mémoire est considérée comme la moins récemment utilisée. Les voies restantes choisissent dynamiquement si la ligne chargée est considérée comme la moins récemment utilisée ou la plus récemment utilisée. La décision se fait selon les voies statiques qui ont le plus de défauts de cache : si les voies "moins récemment utilisée" ont plus de défauts de cache que les autres, on ne l'utilise pas et inversement. Il suffit d'utiliser un simple compteur incrémenté ou décrémenté lors d'un défaut de cache dans une voie utilisant ou non l’optimisation. ===L'usage d'un cache spécialisé pour le préchargement=== L'autre solution est de précharger les données non pas dans le cache, mais dans une mémoire dédiée au préchargement : un '''tampon de flux''', appelé ''stream buffer'' ou ''prefetch buffer'' en anglais. Si un défaut de cache a lieu, on vérifie si le tampon de flux contient la donnée demandée. On la rapatrie dans le cache si c'est le cas, avant de relancer l'accès dans le cache. Si ce n'est pas le cas, c'est que le tampon de flux contient des données préchargées à tort : le tampon de flux est totalement vidé, et on va chercher la donnée en mémoire. Dans le cas où le préchargement utilisé est un simple préchargement séquentiel, le tampon de flux est une simple mémoire FIFO. ===Le filtrage de cache=== Une autre solution consiste à détecter les requêtes de préchargement inutiles en sortie du ''prefetcher''. Entre les circuits d'adressage de la mémoire (ou les niveaux de cache inférieurs) et le ''prefetcher'', on ajoute un circuit de filtrage qui détecte les requêtes de préchargement visiblement inutiles et contreproductives. Les algorithmes utilisés par ce circuit de filtrage de cache varient considérablement suivant le processeur et les travaux de recherche sur le sujet sont légion. ==Quand précharger ?== Une problématique importante est de savoir quand précharger des données. Si on précharge des données trop tard ou trop tôt, le résultat n'est pas optimal. Pour résoudre au mieux ce problème, il existe diverses solutions : * le préchargement sur événement ; * le préchargement par anticipation du ''program counter'' ; * le préchargement par prédiction. ===Le préchargement sur événement=== Le '''préchargement sur événement''' consiste à précharger quand certains événements spéciaux ont lieu. Par exemple, on peut précharger à chaque défaut de cache, à chaque accès mémoire, lors de l’exécution d'un branchement (pour le préchargement des instructions), etc. De nos jours, le préchargement est initié par les accès mémoire, de diverses manières. * Première solution : précharger le bloc suivant de manière systématique, lors de chaque accès mémoire. * Seconde solution : ne précharger que lors d'un défaut de cache. Ainsi, si j'ai un défaut de cache qui me force à charger le bloc B dans le cache, le ''prefetcher'' chargera le bloc immédiatement suivant avec. * Troisième solution : à chaque accès à un bloc de mémoire dans le cache, on charge le bloc de mémoire immédiatement suivant. Pour cela, on mémorise quelle est la dernière ligne de cache qui a été accédée. Cela se fait en marquant chaque ligne de cache avec un bit spécial, qui indique si cette ligne a été accédée lors du dernier cycle d'horloge. Ce dernier est automatiquement mis à zéro au bout d'un certain temps (typiquement au cycle d'horloge suivant). Le ''prefetcher'' se contente de charger le bloc qui suit la ligne de cache dont le bit vaut 1. [[File:Préchargement anticipé.png|centre|vignette|upright=2|Préchargement anticipé.]] ===Le préchargement par anticipation du ''program counter''=== Une seconde technique détermine les adresses à précharger en prenant de l'avance sur les instructions en cours d’exécution. Quand le processeur est bloqué par un accès mémoire, l'unité de préchargement anticipe les prochaines instructions chargées. Le processeur détermine les adresses lues ou écrites par ces instructions anticipées. Les processeurs qui utilisent ce genre de techniques sont redoutablement rares. On trouve quelques articles de recherche sur le sujet, et quelques universitaires travaillent dessus. Mais aucun processeur commercial ne précharge ses données ainsi. Le processeur Rock de la compagnie Sun aurait pu faire l'affaire, mais celui-ci a été annulé au dernier moment. La première technique se base sur un '''''lookahead program counter''''' initialisé avec le ''program counter'' lors d'un défaut de cache. Il est incrémenté à chaque cycle et les branchements sont prédits. Ce ''lookahead program counter'' est mis à jour comme si l’exécution du programme se poursuivait, mais le reste du processeur est mis en attente. Les adresses fournies à chaque cycle par le ''lookahead program counter'' sont alors envoyées aux unités de préchargement pour qu'elles fassent leur travail. On peut aussi adapter cette technique pour que le ''lookahead program counter'' passe non d'une instruction à la prochaine à chaque cycle, mais d'un branchement au suivant. On peut aussi citer le '''préchargement anticipé''' (''runahead prefetching''). Cette technique est utile si un défaut de cache a eu lieu et que le processeur n'est pas conçu pour pouvoir continuer ses calculs dans de telles conditions (pas de caches non bloquants, pas d’exécution dans le désordre, etc.). Dans un cas pareil, le processeur est censé stopper l’exécution de son programme. Mais avec le préchargement anticipé, il continue l’exécution des instructions de façon spéculative. Les lectures s’exécutent, mais pas les écritures (pour éviter de modifier des données alors qu'on n'aurait pas dû). Les lectures font des accès en avance, ce qui précharge les données accédées. On continue ainsi jusqu’à ce que l'instruction qui a stoppé tout le processeur ait enfin reçu sa donnée. Tout doit se passer comme si ces instructions exécutées en avance n'avaient jamais eu lieu. Dans le cas contraire, on a peut-être exécuté des instructions qu'on n’aurait peut-être pas dû, et cela peut avoir modifié des registres un peu trop tôt, ou mis à jour des bits du registre d'état qui n'auraient pas dû être modifiés ainsi. Il faut donc trouver un moyen de remettre le processeur tel qu'il était quand le défaut de cache a eu lieu. Pour cela, le processeur doit sauvegarder les registres du processeur avant d’exécuter spéculativement les instructions suivantes, et les restaurer une fois le tout terminé. Qui plus est, il faut éviter que les instructions exécutées en avance puissent modifier l’état de la mémoire. Imaginez qu'une instruction modifie une ligne de cache alors qu'elle n'aurait pas dû le faire ! Pour cela, on interdit les écritures dans la mémoire. ===Le préchargement par prédiction=== Certains ''prefetchers'' avancés essaient de déduire le moment adéquat pour précharger en se basant sur l'historique des accès précédents : ils en déduisent des statistiques qui permettent de savoir quand précharger. Par exemple, ils peuvent calculer le temps d'accès moyen entre un accès mémoire et un préchargement, et armer des chronomètres pour initialiser le préchargement en temps voulu. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les mémoires cache | prevText=Les mémoires cache | next=Le Translation Lookaside Buffer | nextText=Le Translation Lookaside Buffer }} </noinclude> ptzcxyetabke2hmu48he62g5ro07zcd Fonctionnement d'un ordinateur/La mémoire virtuelle 0 65813 682816 682802 2022-07-28T13:09:37Z Mewtow 31375 /* La traduction d'adresse avec la pagination */ wikitext text/x-wiki Un programme peut être exécuté sur des ordinateurs ayant des capacités mémoires diverses et variées et dans des conditions très différentes. Et il faut faire en sorte qu'un programme fonctionne sur des ordinateur ayant peu de mémoire sans poser problème. Après tout, quand on conçoit un programme, on ne sait pas toujours quelle sera la quantité mémoire que notre ordinateur contiendra, et encore moins comment celle-ci sera partagée entre nos différentes programmes en cours d’exécution : s'affranchir de limitations sur la quantité de mémoire disponible est un plus vraiment appréciable. Ce besoin est appelé l''''abstraction matérielle de la mémoire'''. Enfin, plusieurs programmes sont présents en même temps dans notre ordinateur, et doivent se partager la mémoire physique. Si un programme pouvait modifier les données d'un autre programme, on se retrouverait rapidement avec une situation non prévue par le programmeur. Cela a des conséquences qui vont de comiques à catastrophiques, et cela fini très souvent par un joli plantage. Il faut donc introduire des mécanismes de '''protection mémoire'''. Pour éviter cela, chaque programme a accès à des portions de la mémoire dans laquelle lui seul peut écrire ou lire. Le reste de la mémoire est inaccessible en lecture et en écriture, à part pour la mémoire partagée entre différents programmes. Toute tentative d'accès à une partie de la mémoire non autorisée déclenchera une exception matérielle (rappelez-vous le chapitre sur les interruptions) qui devra être traitée par une routine du système d'exploitation. Généralement, le programme fautif est sauvagement arrêté et un message d'erreur est affiché à l'écran. Ces détails concernant l'organisation et la gestion de la mémoire sont assez compliqués à gérer, et faire en sorte que les programmes applicatifs n'aient pas à s'en soucier est un plus vraiment appréciable. Ce genre de problèmes a eu des solutions purement logicielles, mais quelques techniques règlent ces problèmes directement au niveau du matériel : on parle de '''mémoire virtuelle'''. Avec la mémoire virtuelle, tout se passe comme si notre programme était seul au monde et pouvait lire et écrire à toutes les adresses disponibles à partir de l'adresse zéro. Chaque programme a accès à autant d'adresses que ce que le processeur peut adresser : on se moque du fait que des adresses soient réservées aux périphériques, de la quantité de mémoire réellement installée sur l'ordinateur, ou de la mémoire prise par d'autres programmes en cours d’exécution. Pour éviter que ce surplus de fausse mémoire pose problème, on utilise une partie des mémoires de masse (disques durs) d'un ordinateur en remplacement de la mémoire physique manquante. [[File:Memoire virtuelle.svg|centre|vignette|Mémoire virtuelle]] [[File:MMU and IOMMU.svg|droite|vignette|Les périphériques peuvent eux aussi utiliser la mémoire virtuelle. Dans ce cas, ceux-ci intègrent une MMU dans leurs circuits. Ces MMU, aussi appelées IOMMU, sont séparées de la MMU du processeur.]] Bien sûr, les adresses de la fausse mémoire vue par le programme sont des adresses fictives, qui devront être traduites en adresses mémoires réelles pour être utilisées. Les fausses adresses sont ce qu'on appelle des adresses logiques, alors que les adresses réelles sont appelées adresses physiques. Pour implémenter cette technique, il faut rajouter un circuit qui traduit les adresses logiques en adresses physiques : ce circuit est appelé la '''memory management unit'''. Il faut préciser qu'il existe différentes méthodes pour gérer ces adresses logiques et les transformer en adresses physiques : les principales sont la segmentation et la pagination. La suite du chapitre va détailler ces deux techniques. ==Le ''bank switching''== [[File:Bankswitch memory map.svg|vignette|Exemple de Bank switching.]] Le '''''bank switching''''', aussi appelé '''commutation de banque''', permet d'utiliser un bus d'adresse plus grand que les adresses du processeur. L'adresse réelle est plus grande que l'adresse utilisée par le processeur, les bits manquants étant fournit par un registre configurable du processeur : le '''registre de banque'''. L'espace mémoire du processeur est présent en plusieurs exemplaires, sélectionnés par la valeur du registre de banque. Chaque exemplaire de l'ensemble des adresses du processeur s'appelle une banque. On peut changer de banque en changeant le contenu de ce registre : le processeur dispose souvent d'instructions spécialisées qui en sont capables. En répartissant les données utiles dans différentes banques, le processeur peut donc adresser beaucoup plus de mémoire. De plus, cette technique se marie assez bien avec les entrées-sorties mappées en mémoire. Par exemple, supposons que j'ai besoin d'adresser une mémoire ROM de 4 kibioctets, une RAM de 8 kibioctets, et divers périphériques. Le processeur a un bus d'adresse de 12 bits, ce qui limite à 4kibioctets. Dans ce cas, je peux réserver 4 banques : une pour la ROM, une pour les périphériques, et deux banques qui contiennent chacune la moitié de la RAM. La simplicité et l'efficacité de cette technique font qu'elle est beaucoup utilisée dans l'informatique embarquée. {| class="wikitable flexible" |[[File:Banque mémoire.png|Banque mémoire.]] |[[File:Registre de banque.png|Registre de banque.]] |} ==La segmentation== [[File:Typical computer data memory arrangement.png|vignette|upright=0.5|Segments typiques des programmes sur OS modernes.]] Sur les vieux systèmes d'exploitation, chaque programme recevait un bloc de RAM pour lui tout seul, une '''partition mémoire'''. La segmentation est une amélioration de cette technique, qui affecte une ou plusieurs partitions par programme. Cela permet à un seul processus d'avoir plusieurs espaces d'adressages, plusieurs mémoires virtuelles à lui tout seul. L'utilité est qu'un programme est rarement un tout unique, mais peut souvent être décomposé en plusieurs ensembles de données/instructions séparés, qui peuvent grossir ou se réduire suivant les circonstances. Par exemple, la pile a une taille qui varie beaucoup, tandis que le code du programme ne change pas. La segmentation permet de découper la mémoire virtuelle d'un processus en sous-partitions de taille variable qu'on appelle improprement des '''segments'''. Ainsi, un programme peut utiliser des segments différents pour la pile, le tas, le programme lui-même, et les variables globales. Chaque segment pourra grandir ou diminuer à sa guise, suivant les besoins, ce qui serait beaucoup plus difficile avec une seule partition mémoire. ===La relocation avec la segmentation=== Chaque segment peut être placé n'importe où en mémoire physique par l'OS, ce qui fait qu'il n'a pas d'adresse fixée en mémoire physique et peut être déplacé comme bon nous semble. C'est le système d'exploitation qui gère le placement des partitions/segments dans la mémoire physique. Ainsi, les adresses de destination des branchements et les adresses des données ne sont jamais les mêmes. Il faut donc trouver un moyen pour que les programmes fonctionnent avec des adresses qui changent d'une exécution à l'autre. Ce besoin est appelé la '''relocalisation'''. Pour résoudre ce problème, le compilateur considère que le programme commence à l'adresse zéro et laisse l'OS corriger les adresses du programme. Cette correction d'adresse demande simplement d'ajouter un décalage, égal à la première adresse de la partition mémoire. Cette correction peut se faire de deux manières : soit l'OS corrige chaque adresse lors du lancement du programme, soit le processeur s'en charge à chaque accès mémoire. Dans le second cas, cette première adresse est mémorisée dans un '''registre de base''', mis à jour automatiquement lors de chaque changement de programme. [[File:Segmentation et relocation.png|centre|vignette|upright=2|Segmentation et relocation.]] Sur les processeurs x86, la mémoire virtuelle est découpée en 2^16 segments de 2^32 bits, ce qui donne des adresses de 48 bits. Pour identifier un segment, seuls les 16 bits de poids fort de l'adresse 48 bits sont utiles : ils forment ce qu'on appelle un sélecteur de segment. Les 32 bits servent à identifier la position de la donnée dans un segment : ils sont appelés le décalage (offset). La relocalisation se fait de la même manière pour un segment que pour une partition mémoire. Pour cela, l'OS associe chaque segment à son adresse de base dans une table de correspondance, appelée la '''table des segments'''. Elle est unique pour chaque programme : la même adresse logique ne donnera pas la même adresse physique selon le programme. [[File:Table des segments.png|centre|vignette|upright=2|Traduction d'adresse.]] Dans le cas le plus simple, la table des segments est stockée en mémoire RAM, le processeur ne contenant qu'un registre de base mis à jour à chaque changement de segment. [[File:Registre de base de segment.png|centre|vignette|upright=2|Registre de base de segment.]] Une autre solution consiste à charger la table de correspondance complète dans un banc de registre dédié. [[File:Table des segments dans un banc de registres.png|centre|vignette|upright=2|Table des segments dans un banc de registres.]] ===La protection mémoire avec la segmentation=== Un programme ne doit avoir accès qu'à la partition qui lui est dédiée et pas aux autres, sauf dans quelques rares exceptions. Toute tentative d'accès à une autre partition doit déclencher une exception matérielle, qui entraîne souvent l'apparition d'un message d'erreur. Tout cela est pris en charge par le système d'exploitation, par l'intermédiaire de mécanismes de '''protection mémoire''', que nous allons maintenant aborder. Pour commencer, le processeur (ou l'OS) doivent détecter les accès hors-partition, à savoir un programme qui lit/écrit de la mémoire au-delà de la partition qui lui réservée. La solution est de mémoriser les limites du segment dans la page des segments et de vérifier que les accès mémoire ne se font pas au-delà de cette limite. L'adresse de fin de segment est mémorisée dans la table des segments et est récupérée lors de chaque accès. Le processeur vérifie si l'accès se fait dans les clou, en comparant l'adresse accédée avec l'adresse limite. Une autre solution consiste à mémoriser non pas l'adresse, mais l'offset maximal possible dans le segment en cours. Cela économise quelques bits par entrée dans la table des tables. Voici comment se passe la traduction d'une adresse avec la segmentation, en tenant compte de la vérification des accès hors-segment. [[File:Vm7.svg|centre|vignette|upright=2|Traduction d'adresse avec vérification des accès hors-segment.]] Vient ensuite la '''gestion des droits d'accès''' : chaque partition/segment se voit attribuer un certain nombre d'autorisations d'accès qui indiquent si l'on peut lire ou écrire dedans, si celui-ci contient un programme exécutable, etc. Par exemple, il est possible d'interdire d'exécuter quoique ce soit de localisé dans certains segments, ce qui fournit une protection contre certaines failles de sécurité ou certains virus. Lorsqu'on exécute une opération interdite, le processeur lève une exception matérielle, à charge du système d'exploitation de gérer la situation. L'OS ou la MMU mémorisent les autorisations pour chaque segment, qui sont rassemblées avec d'autres informations (registre de base et limite) dans un '''descripteur de segment'''. Pour se simplifier la tache, les concepteurs de processeurs et de systèmes d'exploitation ont décidé de regrouper ces descripteurs dans une portion de la mémoire, spécialement réservée pour l'occasion : la '''table des descripteurs de segment'''. Pour des raisons de performance, le processeur utilise un registre pour mémoriser le descripteur de segment du segment en cours d'utilisation. Quand on accède à un segment, son descripteur est chargé dans des registres du processeur, l'ancien est effacé. [[File:SegmentDescriptor.svg|centre|vignette|upright=2|Schéma d'un descripteur de segment sur une architecture x86.]] ===Le partage de segments=== Il faut préciser qu'il est possible de partager des segments entre applications. Il suffit de configurer les tables de segment convenablement. Cela peut servir quand plusieurs instances d'une même applications sont lancés simultanément : le code n'ayant pas de raison de changer, celui-ci est partagé entre toutes les instance. [[File:Vm9.png|centre|vignette|upright=2|Illustration du partage d'un segment entre deux applications.]] Il est aussi possible de faire en sorte que deux segments se recouvrent l'un autre, à savoir que les deux segments partagent la même mémoire physique. Cela peut servir à partager de la mémoire entre plusieurs applications qui doivent communiquer entre elles. [[File:Overlapping realmode segments.svg|centre|vignette|upright=1.5|Recouvrement de segments.]] ==La pagination== De nos jours, la segmentation est obsolète et n'est plus utilisée : à la place, les OS et processeurs utilisent la pagination. Avec la pagination, la mémoire virtuelle et la mémoire physique sont découpées en blocs de taille fixe, appelés des '''pages mémoires'''. La différence avec les segments est que les segments sont de taille variable, alors que les pages sont de taille fixe. La taille des pages varie suivant le processeur et le système d'exploitation et tourne souvent autour de 4 kibioctets. Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages de 4 kibioctets sont les pages par défaut, les autres tailles de page sont appelées des ''pages larges''. Le contenu d'une page en mémoire fictive est rigoureusement le même que le contenu de la page correspondante en mémoire physique. Cependant, le nombre total de pages en mémoire virtuelle dépasse celui de la mémoire physique. [[File:Principe de la pagination.png|centre|vignette|upright=2|Principe de la pagination.]] Le surnombre est simplement placé sur le disque dur, dans un fichier appelé le '''fichier d'échange'''. Les pages virtuelles vont ainsi faire référence soit à une page en mémoire physique, soit à une page sur le disque dur. Tout accès à une page sur le disque dur va charger celle-ci dans la mémoire RAM, dans une page vide. Les pages font ainsi une sorte de va et vient entre le fichier d'échange et la RAM, suivant les besoins. [[File:Lazy Swapper.jpg|centre|vignette|upright=2|Mémoire virtuelle paginée et fichier d'échange.]] ===La traduction d'adresse avec la pagination=== Une adresse (logique ou physique) se décompose donc en deux parties : un numéro de page qui identifie la page et un numéro permettant de localiser la donnée dans la page. Traduire l'adresse logique en adresse physique demande de remplacer le numéro de la page logique en un numéro de page physique. Pour faire cette traduction, il faut se souvenir des correspondances entre numéro de page et adresse de la page en mémoire fictive. Elles sont stockées dans une sorte de table, nommée la '''table des pages'''. Celle-ci contient aussi, pour chaque page, des bits qui encodent des informations sur la dite page. Ce peut être des bits pour gérer la protection mémoire, pour savoir si une page est swappée sur le disque dur ou si elle est présente en RAM, ou bien d'autres. La table des pages est généralement organisée en une suite consécutives d'''entrées de la table des pages'', chaque entrée mémorisant toute information/correspondance liée à une page (correspondances numéro de page - adresse et bits d'information annexes). [[File:Paging.svg|centre|vignette|upright=2|Table des pages.]] Chaque programme lancé sur l'ordinateur dispose de son propre espace d'adressage, ce qui fait qu'il a sa propre table des page dédiée. Il y a une table des page par processus/programme lancé sur l'ordinateur, une table des pages unique par espace d'adressage. Bien sûr, il est possible que de la mémoire soit partagée entre plusieurs processus, ce qui implique des interactions entre tables des pages, mais pas de partage des tables en elles-mêmes. [[File:Vm5.png|centre|vignette|upright=2|Tables des pages de plusieurs processus.]] ====Les tables des pages simples==== Dans le cas le plus simple, il n'y a qu'une seule table des pages, qui est adressée par les numéros de page logique. Ainsi, pour chaque numéro (ou chaque adresse) de page logique, on stocke l'adresse de base de la page correspondante en mémoire physique. La table des pages est unique pour chaque programme, vu que les correspondances entre adresses physiques et logiques ne sont pas les mêmes. Cette table des pages est souvent stockée dans la mémoire RAM, à un endroit bien précis, connu du processeur. Accéder à la mémoire nécessite donc d’accéder d'abord à la table des pages en mémoire, puis de calculer l'adresse de notre donnée, et enfin d’accéder à la donnée voulue. Avec cette méthode, la table des pages a autant d'entrée qu'il y a de pages logiques en mémoire virtuelle. [[File:Table des pages.png|centre|vignette|upright=2|Table des pages.]] ====Les tables des pages inversées==== Sur certains systèmes, la taille d'une table des pages serait beaucoup trop grande en utilisant les techniques vues au-dessus. C'est notamment le cas sur les architectures 64 bits ou plus, pour lesquelles le nombre de pages total est très important. Sur les ordinateurs x86 récents, les adresses sont en pratique de 48 bits, les bits de poids fort étant ignorés en pratique, ce qui fait en tout 68 719 476 736 pages. Chaque entrée de la table des pages fait au minimum 48 bits, mais fait plus en pratique : partons sur 64 bits par entrée, soit 8 octets. Cela fait 549 755 813 888 octets pour la table des pages, soit plusieurs centaines de gibioctets ! Une table des pages normale serait tout simplement impraticable. Pour résoudre ce problème, on a inventé les '''tables des pages inversées'''. L'idée derrière celles-ci est l'inverse de la méthode précédente. La méthode précédente stocke, pour chaque page logique, son numéro de page physique. Les tables des pages inversées font l'inverse : elles stockent, pour chaque numéro de page physique, la page logique qui correspond. Avec cette méthode table des pages contient ainsi autant d'entrées qu'il y a de pages physiques. Elle est donc plus petite qu'avant, vu que la mémoire physique est plus petite que la mémoire virtuelle. Quand le processeur veut convertir une adresse virtuelle en adresse physique, la MMU recherche le numéro de page de l'adresse virtuelle dans la table des pages. Le numéro de l'entrée à laquelle se trouve ce morceau d'adresse virtuelle est le morceau de l'adresse physique. Pour faciliter le processus de recherche dans la page, les concepteurs de systèmes d'exploitation peuvent stocker celle-ci avec ce que l'on appelle une table de hachage. [[File:Table des pages inversée.jpg|centre|vignette|upright=2|Table des pages inversée.]] ====Les tables des pages multiples par espace d'adressage==== Dans les deux cas précédents, il y a une table des page par processus/programme lancé sur l'ordinateur, une table des pages unique par espace d'adressage. Cependant, les concepteurs de processeurs et de systèmes d'exploitation ont remarqué que les adresses les plus hautes et/ou les plus basses sont les plus utilisées, alors que les adresses situées au milieu de l'espace d'adressage sont peu utilisées en raison du fonctionnement de la pile et du tas. Il y a donc une partie de la table des pages qui ne sert à rien et est utilisé pour des adresses inutilisées. C'est une source d'économie d'autant plus importante que les tables des pages sont de plus en plus grosses. Pour profiter de cette observation, les concepteurs d'OS ont décidé de découper l'espace d'adressage en plusieurs sous-espaces d'adressage de taille identique : certains localisés dans les adresses basses, d'autres au milieu, d'autres tout en haut, etc. Et vu que l'espace d'adressage est scindé en plusieurs parties, la table des pages l'est aussi, ele est découpée en plusieurs sous-tables. Si un sous-espace d'adressage n'est pas utilisé, il n'y a pas besoin d'utiliser de la mémoire pour stocker la table des pages associée. On ne stocke que les tables des pages pour les espaces d'adressage utilisés, ceux qui contiennent au moins une donnée. L'utilisation de plusieurs tables des page ne fonctionne que si le système d'exploitation connaît l'adresse de chaque table des pages (celle de la première entrée). Pour cela, le système d'exploitation utilise une super-table des pages, qui stocke les adresses de début des sous-tables de chaque sous-espace. En clair, la table des page est organisé en deux niveaux, la super-table étant le premier niveau et les sous-tables étant le second niveau. L'adresse est structurée de manière à tirer profit de cette organisation. Les bits de poids fort de l'adresse sélectionnent quelle table de second niveau utiliser, les bits du milieu de l'adresse sélectionne la page dans la table de second niveau et le reste est interprété comme un ''offset''. Un accès à la table des pages se fait comme suit. Les bits de poids fort de l'adresse sont envoyé à la table de premier niveau, et sont utilisés pour récupérer l'adresse de la table de second niveau adéquate. Les bits au milieu de l'adresse sont envoyés à la table de second niveau, pour récupérer le numéro de page physique. Le tout est combiné avec l'''offset'' pour obtenir l'adresse physique finale. [[File:Table des pages hiérarchique.png|centre|vignette|upright=2|Table des pages hiérarchique.]] On peut aussi aller plus loin et découper la table des pages de manière hiérarchique, chaque sous-espace d'adressage étant lui aussi découpé en sous-espaces d'adressages. On a alors une table de premier niveau, plusieurs tables de second niveau, encore plus de tables de troisième niveau, et ainsi de suite. Cela peut aller jusqu'à 5 niveaux sur les processeurs x86 64 bits modernes. Dans ce cours, la table des page désigne l'ensemble des différents niveaux de cette organisation, toute les tables inclues. Seules les tables du dernier niveau mémorisent des numéros de page physiques, les autres tables mémorisant des pointeurs, des adresses vers le début des tables de niveau inférieur. Un exemple sera donné plus bas, dans la section suivante. ====L'exemple des processeurs x86==== Pour rendre les explications précédentes plus concrètes, nous allons prendre l'exemple des processeur x86 anciens, de type 32 bits. Les processeurs de ce type utilisaient deux types de tables des pages : une table des page unique et une table des page hiérarchique. Les deux étaient utilisées dans cas séparés. La table des page unique était utilisée pour les pages larges et encore seulement en l'absence de la technologie '''''physical adress extension''''', dont on parlera plus bas. Les autres cas utilisaient une table des page hiérarchique, à deux niveaux, trois niveaux, voire plus. Une table des pages unique était utilisée pour les pages larges (de 2 mébioctets et plus). Pour les pages de 4 mébioctets, il y avait une unique table des pages, adressée par les 10 bits de poids fort de l'adresse, les bits restants servant comme ''offset''. La table des pages contenait 1024 entrées de 4 octets chacune, ce qui fait en tout 4 kibioctet pour la table des pages. La table des page était alignée en mémoire sur un bloc de 4 kibioctet (sa taille). [[File:X86 Paging 4M.svg|centre|vignette|upright=2|X86 Paging 4M]] Pour les pages de 4 kibioctets, les processeurs x86-32 bits utilisaient une table des page hiérarchique à deux niveaux. Les 10 bits de poids fort l'adresse adressaient la table des page maitre, appelée le directoire des pages (''page directory''), les 10 bits précédents servaient de numéro de page logique, et les 12 bits restants servaient à indiquer la position de l'octet dans la table des pages. Les entrées de chaque table des pages, mineure ou majeure, faisaient 32 bits, soit 4 octets. Vous remarquerez que la table des page majeure a la même taille que la table des page unique obtenue avec des pages larges (de 4 mébioctets). [[File:X86 Paging 4K.svg|centre|vignette|upright=2|X86 Paging 4K]] La technique du ''physical adress extension'' (PAE), utilisée depuis le Pentium Pro, permettait aux processeurs x86 32 bits d'adresser plus de 4 gibioctets de mémoire, en utilisant des adresses physiques de 64 bits. Les adresses virtuelles de 32 bits étaient traduites en adresses physiques de 64 bits grâce à une table des pages adaptée. Cette technologie permettait d'adresser plus de 4 gibioctets de mémoire au total, mais avec quelques limitations. Notamment, chaque programme ne pouvait utiliser que 4 gibioctets de mémoire RAM pour lui seul. Mais en lançant plusieurs programmes, on pouvait dépasser les 4 gibioctets au total. Pour cela, les entrées de la table des pages passaient à 64 bits au lieu de 32 auparavant. La table des pages gardait 2 niveaux pour les pages larges en PAE. [[File:X86 Paging PAE 2M.svg|centre|vignette|upright=2|X86 Paging PAE 2M]] Par contre, pour les pages de 4 kibioctets en PAE, elle était modifiée de manière à ajouter un niveau de hiérarchie, passant de deux niveaux à trois. [[File:X86 Paging PAE 4K.svg|centre|vignette|upright=2|X86 Paging PAE 4K]] En 64 bits, la table des pages est une table des page hiérarchique avec 5 niveaux. Seuls les 48 bits de poids faible des adresses sont utilisés, les 16 restants étant ignorés. [[File:X86 Paging 64bit.svg|centre|vignette|upright=2|X86 Paging 64bit]] ===Le remplacement des pages mémoires=== La mémoire physique contient moins de pages que la mémoire virtuelle et il faut trouver un moyen pour que cela ne pose pas de problème. La solution consiste à utiliser des mémoires de stockage comme mémoire d'appoint : si on a besoin de plus de pages mémoires que la mémoire physique n'en contient, certaines pages mémoires vont être déplacées sur le disque dur pour faire de la place. Les pages sur le disque dur doivent être chargées en RAM, avant d'être utilisables. Lorsque l'on veut traduire l'adresse logique d'une page mémoire déplacée sur le disque dur, la MMU ne va pas pouvoir associer l'adresse logique à une adresse en mémoire RAM. Elle va alors lever une exception matérielle dont la routine rapatriera la page en mémoire RAM. Charger une page en RAM ne pose aucun problème tant qu'il existe des pages inoccupée en RAM. Mais si toute la RAM est pleine, il faut déplacer une page mémoire en RAM sur le disque dur pour faire de la place. Tout cela est effectué par le système d'exploitation dont j'ai parlé plus haut. Notons que si on supprime une donnée dont on aura besoin dans le futur, il faudra recharger celle-ci, ce qui prend du temps. Le choix de la page doit être fait avec le plus grand soin et il existe différents algorithmes qui permettent de décider quelle page supprimer de la RAM. Les plus simples sont les suivants. * Aléatoire : on choisit la page au hasard. * FIFO : on supprime la donnée qui a été chargée dans la mémoire avant toutes les autres. * LRU : on supprime la donnée qui été lue ou écrite pour la dernière fois avant toutes les autres. * LFU : on vire la page qui est lue ou écrite le moins souvent comparée aux autres. * etc. Ces algorithmes ont chacun deux variantes : une locale, et une globale. Avec la version locale, la page qui va être rapatriée sur le disque dur est une page réservée au programme qui est la cause du page miss. Avec la version globale, le système d'exploitation va choisir la page à virer parmi toutes les pages présentes en mémoire vive. Sur la majorité des systèmes d'exploitation, il est possible d'interdire le déplacement de certaines pages sur le disque dur. Ces pages restent alors en mémoire RAM durant un temps plus ou moins long, parfois en permanence. Cette possibilité simplifie la vie des programmeurs qui conçoivent des systèmes d'exploitation : essayez d'exécuter une interruption de gestion de page miss alors que la page contenant le code de l'interruption est placée sur le disque dur. ===La protection mémoire avec la pagination=== La protection mémoire est garantie avec des '''clés de protection''', un nombre unique à chaque programme. Le processeur mémorise, pour chaque page, la clé de protection du programme qui a réservé la page. A chaque accès mémoire, le processeur compare la clé de protection du programme en cours d’exécution, et celle de la page adressée. Si les deux clés sont différentes, alors un programme a effectué un accès hors des clous et il se fait sauvagement arrêter. Comme avec la segmentation, chaque page a des droits d'accès précis, qui permettent d'autoriser ou interdire les accès en lecture, écriture, exécution, etc. La table des pages mémorise les autorisations pour chaque page. Ces autorisations/interdictions sont mémorisés sous la forme d'une suite de bits, chaque bit autorisant/interdisant une opération bien précise. Le format exact de la suite de bits a cependant changé dans le temps sur les processeurs x86 modernes. Par exemple, c'est lors du passage au 64 bits que l'interdiction d’exécution a été ajouté au jeu d’instruction. Avant, les CPU et OS ne pouvaient pas marquer une page mémoire comme non-exécutable. C'est seulement avec le passage au 64 bits qu'à été ajouté un bit pour interdire l'exécution de code depuis une page. Ce bit, nommé bit NX, est à 0 si la page n'est pas exécutable et à 1 sinon. De plus, diverses techniques intégrées aux processeur permettent de gérer celui-ci facilement. Notamment, le processeur vérifie à chaque chargement d'instruction si le bit NX de page lue est à 1. Sinon, il lève une exception matérielle et laisse la main à l'OS. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le matériel réseau | prevText=Le matériel réseau | next=Les mémoires cache | nextText=Les mémoires cache }} </noinclude> le457jfw3us5pnus6cfy4a18i6l83sv 682817 682816 2022-07-28T13:12:28Z Mewtow 31375 /* Les tables des pages simples */ wikitext text/x-wiki Un programme peut être exécuté sur des ordinateurs ayant des capacités mémoires diverses et variées et dans des conditions très différentes. Et il faut faire en sorte qu'un programme fonctionne sur des ordinateur ayant peu de mémoire sans poser problème. Après tout, quand on conçoit un programme, on ne sait pas toujours quelle sera la quantité mémoire que notre ordinateur contiendra, et encore moins comment celle-ci sera partagée entre nos différentes programmes en cours d’exécution : s'affranchir de limitations sur la quantité de mémoire disponible est un plus vraiment appréciable. Ce besoin est appelé l''''abstraction matérielle de la mémoire'''. Enfin, plusieurs programmes sont présents en même temps dans notre ordinateur, et doivent se partager la mémoire physique. Si un programme pouvait modifier les données d'un autre programme, on se retrouverait rapidement avec une situation non prévue par le programmeur. Cela a des conséquences qui vont de comiques à catastrophiques, et cela fini très souvent par un joli plantage. Il faut donc introduire des mécanismes de '''protection mémoire'''. Pour éviter cela, chaque programme a accès à des portions de la mémoire dans laquelle lui seul peut écrire ou lire. Le reste de la mémoire est inaccessible en lecture et en écriture, à part pour la mémoire partagée entre différents programmes. Toute tentative d'accès à une partie de la mémoire non autorisée déclenchera une exception matérielle (rappelez-vous le chapitre sur les interruptions) qui devra être traitée par une routine du système d'exploitation. Généralement, le programme fautif est sauvagement arrêté et un message d'erreur est affiché à l'écran. Ces détails concernant l'organisation et la gestion de la mémoire sont assez compliqués à gérer, et faire en sorte que les programmes applicatifs n'aient pas à s'en soucier est un plus vraiment appréciable. Ce genre de problèmes a eu des solutions purement logicielles, mais quelques techniques règlent ces problèmes directement au niveau du matériel : on parle de '''mémoire virtuelle'''. Avec la mémoire virtuelle, tout se passe comme si notre programme était seul au monde et pouvait lire et écrire à toutes les adresses disponibles à partir de l'adresse zéro. Chaque programme a accès à autant d'adresses que ce que le processeur peut adresser : on se moque du fait que des adresses soient réservées aux périphériques, de la quantité de mémoire réellement installée sur l'ordinateur, ou de la mémoire prise par d'autres programmes en cours d’exécution. Pour éviter que ce surplus de fausse mémoire pose problème, on utilise une partie des mémoires de masse (disques durs) d'un ordinateur en remplacement de la mémoire physique manquante. [[File:Memoire virtuelle.svg|centre|vignette|Mémoire virtuelle]] [[File:MMU and IOMMU.svg|droite|vignette|Les périphériques peuvent eux aussi utiliser la mémoire virtuelle. Dans ce cas, ceux-ci intègrent une MMU dans leurs circuits. Ces MMU, aussi appelées IOMMU, sont séparées de la MMU du processeur.]] Bien sûr, les adresses de la fausse mémoire vue par le programme sont des adresses fictives, qui devront être traduites en adresses mémoires réelles pour être utilisées. Les fausses adresses sont ce qu'on appelle des adresses logiques, alors que les adresses réelles sont appelées adresses physiques. Pour implémenter cette technique, il faut rajouter un circuit qui traduit les adresses logiques en adresses physiques : ce circuit est appelé la '''memory management unit'''. Il faut préciser qu'il existe différentes méthodes pour gérer ces adresses logiques et les transformer en adresses physiques : les principales sont la segmentation et la pagination. La suite du chapitre va détailler ces deux techniques. ==Le ''bank switching''== [[File:Bankswitch memory map.svg|vignette|Exemple de Bank switching.]] Le '''''bank switching''''', aussi appelé '''commutation de banque''', permet d'utiliser un bus d'adresse plus grand que les adresses du processeur. L'adresse réelle est plus grande que l'adresse utilisée par le processeur, les bits manquants étant fournit par un registre configurable du processeur : le '''registre de banque'''. L'espace mémoire du processeur est présent en plusieurs exemplaires, sélectionnés par la valeur du registre de banque. Chaque exemplaire de l'ensemble des adresses du processeur s'appelle une banque. On peut changer de banque en changeant le contenu de ce registre : le processeur dispose souvent d'instructions spécialisées qui en sont capables. En répartissant les données utiles dans différentes banques, le processeur peut donc adresser beaucoup plus de mémoire. De plus, cette technique se marie assez bien avec les entrées-sorties mappées en mémoire. Par exemple, supposons que j'ai besoin d'adresser une mémoire ROM de 4 kibioctets, une RAM de 8 kibioctets, et divers périphériques. Le processeur a un bus d'adresse de 12 bits, ce qui limite à 4kibioctets. Dans ce cas, je peux réserver 4 banques : une pour la ROM, une pour les périphériques, et deux banques qui contiennent chacune la moitié de la RAM. La simplicité et l'efficacité de cette technique font qu'elle est beaucoup utilisée dans l'informatique embarquée. {| class="wikitable flexible" |[[File:Banque mémoire.png|Banque mémoire.]] |[[File:Registre de banque.png|Registre de banque.]] |} ==La segmentation== [[File:Typical computer data memory arrangement.png|vignette|upright=0.5|Segments typiques des programmes sur OS modernes.]] Sur les vieux systèmes d'exploitation, chaque programme recevait un bloc de RAM pour lui tout seul, une '''partition mémoire'''. La segmentation est une amélioration de cette technique, qui affecte une ou plusieurs partitions par programme. Cela permet à un seul processus d'avoir plusieurs espaces d'adressages, plusieurs mémoires virtuelles à lui tout seul. L'utilité est qu'un programme est rarement un tout unique, mais peut souvent être décomposé en plusieurs ensembles de données/instructions séparés, qui peuvent grossir ou se réduire suivant les circonstances. Par exemple, la pile a une taille qui varie beaucoup, tandis que le code du programme ne change pas. La segmentation permet de découper la mémoire virtuelle d'un processus en sous-partitions de taille variable qu'on appelle improprement des '''segments'''. Ainsi, un programme peut utiliser des segments différents pour la pile, le tas, le programme lui-même, et les variables globales. Chaque segment pourra grandir ou diminuer à sa guise, suivant les besoins, ce qui serait beaucoup plus difficile avec une seule partition mémoire. ===La relocation avec la segmentation=== Chaque segment peut être placé n'importe où en mémoire physique par l'OS, ce qui fait qu'il n'a pas d'adresse fixée en mémoire physique et peut être déplacé comme bon nous semble. C'est le système d'exploitation qui gère le placement des partitions/segments dans la mémoire physique. Ainsi, les adresses de destination des branchements et les adresses des données ne sont jamais les mêmes. Il faut donc trouver un moyen pour que les programmes fonctionnent avec des adresses qui changent d'une exécution à l'autre. Ce besoin est appelé la '''relocalisation'''. Pour résoudre ce problème, le compilateur considère que le programme commence à l'adresse zéro et laisse l'OS corriger les adresses du programme. Cette correction d'adresse demande simplement d'ajouter un décalage, égal à la première adresse de la partition mémoire. Cette correction peut se faire de deux manières : soit l'OS corrige chaque adresse lors du lancement du programme, soit le processeur s'en charge à chaque accès mémoire. Dans le second cas, cette première adresse est mémorisée dans un '''registre de base''', mis à jour automatiquement lors de chaque changement de programme. [[File:Segmentation et relocation.png|centre|vignette|upright=2|Segmentation et relocation.]] Sur les processeurs x86, la mémoire virtuelle est découpée en 2^16 segments de 2^32 bits, ce qui donne des adresses de 48 bits. Pour identifier un segment, seuls les 16 bits de poids fort de l'adresse 48 bits sont utiles : ils forment ce qu'on appelle un sélecteur de segment. Les 32 bits servent à identifier la position de la donnée dans un segment : ils sont appelés le décalage (offset). La relocalisation se fait de la même manière pour un segment que pour une partition mémoire. Pour cela, l'OS associe chaque segment à son adresse de base dans une table de correspondance, appelée la '''table des segments'''. Elle est unique pour chaque programme : la même adresse logique ne donnera pas la même adresse physique selon le programme. [[File:Table des segments.png|centre|vignette|upright=2|Traduction d'adresse.]] Dans le cas le plus simple, la table des segments est stockée en mémoire RAM, le processeur ne contenant qu'un registre de base mis à jour à chaque changement de segment. [[File:Registre de base de segment.png|centre|vignette|upright=2|Registre de base de segment.]] Une autre solution consiste à charger la table de correspondance complète dans un banc de registre dédié. [[File:Table des segments dans un banc de registres.png|centre|vignette|upright=2|Table des segments dans un banc de registres.]] ===La protection mémoire avec la segmentation=== Un programme ne doit avoir accès qu'à la partition qui lui est dédiée et pas aux autres, sauf dans quelques rares exceptions. Toute tentative d'accès à une autre partition doit déclencher une exception matérielle, qui entraîne souvent l'apparition d'un message d'erreur. Tout cela est pris en charge par le système d'exploitation, par l'intermédiaire de mécanismes de '''protection mémoire''', que nous allons maintenant aborder. Pour commencer, le processeur (ou l'OS) doivent détecter les accès hors-partition, à savoir un programme qui lit/écrit de la mémoire au-delà de la partition qui lui réservée. La solution est de mémoriser les limites du segment dans la page des segments et de vérifier que les accès mémoire ne se font pas au-delà de cette limite. L'adresse de fin de segment est mémorisée dans la table des segments et est récupérée lors de chaque accès. Le processeur vérifie si l'accès se fait dans les clou, en comparant l'adresse accédée avec l'adresse limite. Une autre solution consiste à mémoriser non pas l'adresse, mais l'offset maximal possible dans le segment en cours. Cela économise quelques bits par entrée dans la table des tables. Voici comment se passe la traduction d'une adresse avec la segmentation, en tenant compte de la vérification des accès hors-segment. [[File:Vm7.svg|centre|vignette|upright=2|Traduction d'adresse avec vérification des accès hors-segment.]] Vient ensuite la '''gestion des droits d'accès''' : chaque partition/segment se voit attribuer un certain nombre d'autorisations d'accès qui indiquent si l'on peut lire ou écrire dedans, si celui-ci contient un programme exécutable, etc. Par exemple, il est possible d'interdire d'exécuter quoique ce soit de localisé dans certains segments, ce qui fournit une protection contre certaines failles de sécurité ou certains virus. Lorsqu'on exécute une opération interdite, le processeur lève une exception matérielle, à charge du système d'exploitation de gérer la situation. L'OS ou la MMU mémorisent les autorisations pour chaque segment, qui sont rassemblées avec d'autres informations (registre de base et limite) dans un '''descripteur de segment'''. Pour se simplifier la tache, les concepteurs de processeurs et de systèmes d'exploitation ont décidé de regrouper ces descripteurs dans une portion de la mémoire, spécialement réservée pour l'occasion : la '''table des descripteurs de segment'''. Pour des raisons de performance, le processeur utilise un registre pour mémoriser le descripteur de segment du segment en cours d'utilisation. Quand on accède à un segment, son descripteur est chargé dans des registres du processeur, l'ancien est effacé. [[File:SegmentDescriptor.svg|centre|vignette|upright=2|Schéma d'un descripteur de segment sur une architecture x86.]] ===Le partage de segments=== Il faut préciser qu'il est possible de partager des segments entre applications. Il suffit de configurer les tables de segment convenablement. Cela peut servir quand plusieurs instances d'une même applications sont lancés simultanément : le code n'ayant pas de raison de changer, celui-ci est partagé entre toutes les instance. [[File:Vm9.png|centre|vignette|upright=2|Illustration du partage d'un segment entre deux applications.]] Il est aussi possible de faire en sorte que deux segments se recouvrent l'un autre, à savoir que les deux segments partagent la même mémoire physique. Cela peut servir à partager de la mémoire entre plusieurs applications qui doivent communiquer entre elles. [[File:Overlapping realmode segments.svg|centre|vignette|upright=1.5|Recouvrement de segments.]] ==La pagination== De nos jours, la segmentation est obsolète et n'est plus utilisée : à la place, les OS et processeurs utilisent la pagination. Avec la pagination, la mémoire virtuelle et la mémoire physique sont découpées en blocs de taille fixe, appelés des '''pages mémoires'''. La différence avec les segments est que les segments sont de taille variable, alors que les pages sont de taille fixe. La taille des pages varie suivant le processeur et le système d'exploitation et tourne souvent autour de 4 kibioctets. Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages de 4 kibioctets sont les pages par défaut, les autres tailles de page sont appelées des ''pages larges''. Le contenu d'une page en mémoire fictive est rigoureusement le même que le contenu de la page correspondante en mémoire physique. Cependant, le nombre total de pages en mémoire virtuelle dépasse celui de la mémoire physique. [[File:Principe de la pagination.png|centre|vignette|upright=2|Principe de la pagination.]] Le surnombre est simplement placé sur le disque dur, dans un fichier appelé le '''fichier d'échange'''. Les pages virtuelles vont ainsi faire référence soit à une page en mémoire physique, soit à une page sur le disque dur. Tout accès à une page sur le disque dur va charger celle-ci dans la mémoire RAM, dans une page vide. Les pages font ainsi une sorte de va et vient entre le fichier d'échange et la RAM, suivant les besoins. [[File:Lazy Swapper.jpg|centre|vignette|upright=2|Mémoire virtuelle paginée et fichier d'échange.]] ===La traduction d'adresse avec la pagination=== Une adresse (logique ou physique) se décompose donc en deux parties : un numéro de page qui identifie la page et un numéro permettant de localiser la donnée dans la page. Traduire l'adresse logique en adresse physique demande de remplacer le numéro de la page logique en un numéro de page physique. Pour faire cette traduction, il faut se souvenir des correspondances entre numéro de page et adresse de la page en mémoire fictive. Elles sont stockées dans une sorte de table, nommée la '''table des pages'''. Celle-ci contient aussi, pour chaque page, des bits qui encodent des informations sur la dite page. Ce peut être des bits pour gérer la protection mémoire, pour savoir si une page est swappée sur le disque dur ou si elle est présente en RAM, ou bien d'autres. La table des pages est généralement organisée en une suite consécutives d'''entrées de la table des pages'', chaque entrée mémorisant toute information/correspondance liée à une page (correspondances numéro de page - adresse et bits d'information annexes). [[File:Paging.svg|centre|vignette|upright=2|Table des pages.]] Chaque programme lancé sur l'ordinateur dispose de son propre espace d'adressage, ce qui fait qu'il a sa propre table des page dédiée. Il y a une table des page par processus/programme lancé sur l'ordinateur, une table des pages unique par espace d'adressage. Bien sûr, il est possible que de la mémoire soit partagée entre plusieurs processus, ce qui implique des interactions entre tables des pages, mais pas de partage des tables en elles-mêmes. [[File:Vm5.png|centre|vignette|upright=2|Tables des pages de plusieurs processus.]] ====Les tables des pages simples==== Dans le cas le plus simple, il n'y a qu'une seule table des pages par programme, qui est adressée par les numéros de page logique. La table des pages est un vulgaire tableau d'adresses physiques, placées les unes à la suite des autres. Ainsi, pour chaque numéro (ou chaque adresse) de page logique, on stocke l'adresse de base de la page correspondante en mémoire physique. Accéder à la mémoire nécessite donc d’accéder d'abord à la table des pages en mémoire, de calculer l'adresse de l'entrée voulue, et d’y accéder. Avec cette méthode, la table des pages a autant d'entrée qu'il y a de pages logiques en mémoire virtuelle. [[File:Table des pages.png|centre|vignette|upright=2|Table des pages.]] ====Les tables des pages inversées==== Sur certains systèmes, la taille d'une table des pages serait beaucoup trop grande en utilisant les techniques vues au-dessus. C'est notamment le cas sur les architectures 64 bits ou plus, pour lesquelles le nombre de pages total est très important. Sur les ordinateurs x86 récents, les adresses sont en pratique de 48 bits, les bits de poids fort étant ignorés en pratique, ce qui fait en tout 68 719 476 736 pages. Chaque entrée de la table des pages fait au minimum 48 bits, mais fait plus en pratique : partons sur 64 bits par entrée, soit 8 octets. Cela fait 549 755 813 888 octets pour la table des pages, soit plusieurs centaines de gibioctets ! Une table des pages normale serait tout simplement impraticable. Pour résoudre ce problème, on a inventé les '''tables des pages inversées'''. L'idée derrière celles-ci est l'inverse de la méthode précédente. La méthode précédente stocke, pour chaque page logique, son numéro de page physique. Les tables des pages inversées font l'inverse : elles stockent, pour chaque numéro de page physique, la page logique qui correspond. Avec cette méthode table des pages contient ainsi autant d'entrées qu'il y a de pages physiques. Elle est donc plus petite qu'avant, vu que la mémoire physique est plus petite que la mémoire virtuelle. Quand le processeur veut convertir une adresse virtuelle en adresse physique, la MMU recherche le numéro de page de l'adresse virtuelle dans la table des pages. Le numéro de l'entrée à laquelle se trouve ce morceau d'adresse virtuelle est le morceau de l'adresse physique. Pour faciliter le processus de recherche dans la page, les concepteurs de systèmes d'exploitation peuvent stocker celle-ci avec ce que l'on appelle une table de hachage. [[File:Table des pages inversée.jpg|centre|vignette|upright=2|Table des pages inversée.]] ====Les tables des pages multiples par espace d'adressage==== Dans les deux cas précédents, il y a une table des page par processus/programme lancé sur l'ordinateur, une table des pages unique par espace d'adressage. Cependant, les concepteurs de processeurs et de systèmes d'exploitation ont remarqué que les adresses les plus hautes et/ou les plus basses sont les plus utilisées, alors que les adresses situées au milieu de l'espace d'adressage sont peu utilisées en raison du fonctionnement de la pile et du tas. Il y a donc une partie de la table des pages qui ne sert à rien et est utilisé pour des adresses inutilisées. C'est une source d'économie d'autant plus importante que les tables des pages sont de plus en plus grosses. Pour profiter de cette observation, les concepteurs d'OS ont décidé de découper l'espace d'adressage en plusieurs sous-espaces d'adressage de taille identique : certains localisés dans les adresses basses, d'autres au milieu, d'autres tout en haut, etc. Et vu que l'espace d'adressage est scindé en plusieurs parties, la table des pages l'est aussi, ele est découpée en plusieurs sous-tables. Si un sous-espace d'adressage n'est pas utilisé, il n'y a pas besoin d'utiliser de la mémoire pour stocker la table des pages associée. On ne stocke que les tables des pages pour les espaces d'adressage utilisés, ceux qui contiennent au moins une donnée. L'utilisation de plusieurs tables des page ne fonctionne que si le système d'exploitation connaît l'adresse de chaque table des pages (celle de la première entrée). Pour cela, le système d'exploitation utilise une super-table des pages, qui stocke les adresses de début des sous-tables de chaque sous-espace. En clair, la table des page est organisé en deux niveaux, la super-table étant le premier niveau et les sous-tables étant le second niveau. L'adresse est structurée de manière à tirer profit de cette organisation. Les bits de poids fort de l'adresse sélectionnent quelle table de second niveau utiliser, les bits du milieu de l'adresse sélectionne la page dans la table de second niveau et le reste est interprété comme un ''offset''. Un accès à la table des pages se fait comme suit. Les bits de poids fort de l'adresse sont envoyé à la table de premier niveau, et sont utilisés pour récupérer l'adresse de la table de second niveau adéquate. Les bits au milieu de l'adresse sont envoyés à la table de second niveau, pour récupérer le numéro de page physique. Le tout est combiné avec l'''offset'' pour obtenir l'adresse physique finale. [[File:Table des pages hiérarchique.png|centre|vignette|upright=2|Table des pages hiérarchique.]] On peut aussi aller plus loin et découper la table des pages de manière hiérarchique, chaque sous-espace d'adressage étant lui aussi découpé en sous-espaces d'adressages. On a alors une table de premier niveau, plusieurs tables de second niveau, encore plus de tables de troisième niveau, et ainsi de suite. Cela peut aller jusqu'à 5 niveaux sur les processeurs x86 64 bits modernes. Dans ce cours, la table des page désigne l'ensemble des différents niveaux de cette organisation, toute les tables inclues. Seules les tables du dernier niveau mémorisent des numéros de page physiques, les autres tables mémorisant des pointeurs, des adresses vers le début des tables de niveau inférieur. Un exemple sera donné plus bas, dans la section suivante. ====L'exemple des processeurs x86==== Pour rendre les explications précédentes plus concrètes, nous allons prendre l'exemple des processeur x86 anciens, de type 32 bits. Les processeurs de ce type utilisaient deux types de tables des pages : une table des page unique et une table des page hiérarchique. Les deux étaient utilisées dans cas séparés. La table des page unique était utilisée pour les pages larges et encore seulement en l'absence de la technologie '''''physical adress extension''''', dont on parlera plus bas. Les autres cas utilisaient une table des page hiérarchique, à deux niveaux, trois niveaux, voire plus. Une table des pages unique était utilisée pour les pages larges (de 2 mébioctets et plus). Pour les pages de 4 mébioctets, il y avait une unique table des pages, adressée par les 10 bits de poids fort de l'adresse, les bits restants servant comme ''offset''. La table des pages contenait 1024 entrées de 4 octets chacune, ce qui fait en tout 4 kibioctet pour la table des pages. La table des page était alignée en mémoire sur un bloc de 4 kibioctet (sa taille). [[File:X86 Paging 4M.svg|centre|vignette|upright=2|X86 Paging 4M]] Pour les pages de 4 kibioctets, les processeurs x86-32 bits utilisaient une table des page hiérarchique à deux niveaux. Les 10 bits de poids fort l'adresse adressaient la table des page maitre, appelée le directoire des pages (''page directory''), les 10 bits précédents servaient de numéro de page logique, et les 12 bits restants servaient à indiquer la position de l'octet dans la table des pages. Les entrées de chaque table des pages, mineure ou majeure, faisaient 32 bits, soit 4 octets. Vous remarquerez que la table des page majeure a la même taille que la table des page unique obtenue avec des pages larges (de 4 mébioctets). [[File:X86 Paging 4K.svg|centre|vignette|upright=2|X86 Paging 4K]] La technique du ''physical adress extension'' (PAE), utilisée depuis le Pentium Pro, permettait aux processeurs x86 32 bits d'adresser plus de 4 gibioctets de mémoire, en utilisant des adresses physiques de 64 bits. Les adresses virtuelles de 32 bits étaient traduites en adresses physiques de 64 bits grâce à une table des pages adaptée. Cette technologie permettait d'adresser plus de 4 gibioctets de mémoire au total, mais avec quelques limitations. Notamment, chaque programme ne pouvait utiliser que 4 gibioctets de mémoire RAM pour lui seul. Mais en lançant plusieurs programmes, on pouvait dépasser les 4 gibioctets au total. Pour cela, les entrées de la table des pages passaient à 64 bits au lieu de 32 auparavant. La table des pages gardait 2 niveaux pour les pages larges en PAE. [[File:X86 Paging PAE 2M.svg|centre|vignette|upright=2|X86 Paging PAE 2M]] Par contre, pour les pages de 4 kibioctets en PAE, elle était modifiée de manière à ajouter un niveau de hiérarchie, passant de deux niveaux à trois. [[File:X86 Paging PAE 4K.svg|centre|vignette|upright=2|X86 Paging PAE 4K]] En 64 bits, la table des pages est une table des page hiérarchique avec 5 niveaux. Seuls les 48 bits de poids faible des adresses sont utilisés, les 16 restants étant ignorés. [[File:X86 Paging 64bit.svg|centre|vignette|upright=2|X86 Paging 64bit]] ===Le remplacement des pages mémoires=== La mémoire physique contient moins de pages que la mémoire virtuelle et il faut trouver un moyen pour que cela ne pose pas de problème. La solution consiste à utiliser des mémoires de stockage comme mémoire d'appoint : si on a besoin de plus de pages mémoires que la mémoire physique n'en contient, certaines pages mémoires vont être déplacées sur le disque dur pour faire de la place. Les pages sur le disque dur doivent être chargées en RAM, avant d'être utilisables. Lorsque l'on veut traduire l'adresse logique d'une page mémoire déplacée sur le disque dur, la MMU ne va pas pouvoir associer l'adresse logique à une adresse en mémoire RAM. Elle va alors lever une exception matérielle dont la routine rapatriera la page en mémoire RAM. Charger une page en RAM ne pose aucun problème tant qu'il existe des pages inoccupée en RAM. Mais si toute la RAM est pleine, il faut déplacer une page mémoire en RAM sur le disque dur pour faire de la place. Tout cela est effectué par le système d'exploitation dont j'ai parlé plus haut. Notons que si on supprime une donnée dont on aura besoin dans le futur, il faudra recharger celle-ci, ce qui prend du temps. Le choix de la page doit être fait avec le plus grand soin et il existe différents algorithmes qui permettent de décider quelle page supprimer de la RAM. Les plus simples sont les suivants. * Aléatoire : on choisit la page au hasard. * FIFO : on supprime la donnée qui a été chargée dans la mémoire avant toutes les autres. * LRU : on supprime la donnée qui été lue ou écrite pour la dernière fois avant toutes les autres. * LFU : on vire la page qui est lue ou écrite le moins souvent comparée aux autres. * etc. Ces algorithmes ont chacun deux variantes : une locale, et une globale. Avec la version locale, la page qui va être rapatriée sur le disque dur est une page réservée au programme qui est la cause du page miss. Avec la version globale, le système d'exploitation va choisir la page à virer parmi toutes les pages présentes en mémoire vive. Sur la majorité des systèmes d'exploitation, il est possible d'interdire le déplacement de certaines pages sur le disque dur. Ces pages restent alors en mémoire RAM durant un temps plus ou moins long, parfois en permanence. Cette possibilité simplifie la vie des programmeurs qui conçoivent des systèmes d'exploitation : essayez d'exécuter une interruption de gestion de page miss alors que la page contenant le code de l'interruption est placée sur le disque dur. ===La protection mémoire avec la pagination=== La protection mémoire est garantie avec des '''clés de protection''', un nombre unique à chaque programme. Le processeur mémorise, pour chaque page, la clé de protection du programme qui a réservé la page. A chaque accès mémoire, le processeur compare la clé de protection du programme en cours d’exécution, et celle de la page adressée. Si les deux clés sont différentes, alors un programme a effectué un accès hors des clous et il se fait sauvagement arrêter. Comme avec la segmentation, chaque page a des droits d'accès précis, qui permettent d'autoriser ou interdire les accès en lecture, écriture, exécution, etc. La table des pages mémorise les autorisations pour chaque page. Ces autorisations/interdictions sont mémorisés sous la forme d'une suite de bits, chaque bit autorisant/interdisant une opération bien précise. Le format exact de la suite de bits a cependant changé dans le temps sur les processeurs x86 modernes. Par exemple, c'est lors du passage au 64 bits que l'interdiction d’exécution a été ajouté au jeu d’instruction. Avant, les CPU et OS ne pouvaient pas marquer une page mémoire comme non-exécutable. C'est seulement avec le passage au 64 bits qu'à été ajouté un bit pour interdire l'exécution de code depuis une page. Ce bit, nommé bit NX, est à 0 si la page n'est pas exécutable et à 1 sinon. De plus, diverses techniques intégrées aux processeur permettent de gérer celui-ci facilement. Notamment, le processeur vérifie à chaque chargement d'instruction si le bit NX de page lue est à 1. Sinon, il lève une exception matérielle et laisse la main à l'OS. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le matériel réseau | prevText=Le matériel réseau | next=Les mémoires cache | nextText=Les mémoires cache }} </noinclude> mqzgst56umbv6ovgkst3fe8gfmrdpq9 682818 682817 2022-07-28T13:13:23Z Mewtow 31375 /* La traduction d'adresse avec la pagination */ wikitext text/x-wiki Un programme peut être exécuté sur des ordinateurs ayant des capacités mémoires diverses et variées et dans des conditions très différentes. Et il faut faire en sorte qu'un programme fonctionne sur des ordinateur ayant peu de mémoire sans poser problème. Après tout, quand on conçoit un programme, on ne sait pas toujours quelle sera la quantité mémoire que notre ordinateur contiendra, et encore moins comment celle-ci sera partagée entre nos différentes programmes en cours d’exécution : s'affranchir de limitations sur la quantité de mémoire disponible est un plus vraiment appréciable. Ce besoin est appelé l''''abstraction matérielle de la mémoire'''. Enfin, plusieurs programmes sont présents en même temps dans notre ordinateur, et doivent se partager la mémoire physique. Si un programme pouvait modifier les données d'un autre programme, on se retrouverait rapidement avec une situation non prévue par le programmeur. Cela a des conséquences qui vont de comiques à catastrophiques, et cela fini très souvent par un joli plantage. Il faut donc introduire des mécanismes de '''protection mémoire'''. Pour éviter cela, chaque programme a accès à des portions de la mémoire dans laquelle lui seul peut écrire ou lire. Le reste de la mémoire est inaccessible en lecture et en écriture, à part pour la mémoire partagée entre différents programmes. Toute tentative d'accès à une partie de la mémoire non autorisée déclenchera une exception matérielle (rappelez-vous le chapitre sur les interruptions) qui devra être traitée par une routine du système d'exploitation. Généralement, le programme fautif est sauvagement arrêté et un message d'erreur est affiché à l'écran. Ces détails concernant l'organisation et la gestion de la mémoire sont assez compliqués à gérer, et faire en sorte que les programmes applicatifs n'aient pas à s'en soucier est un plus vraiment appréciable. Ce genre de problèmes a eu des solutions purement logicielles, mais quelques techniques règlent ces problèmes directement au niveau du matériel : on parle de '''mémoire virtuelle'''. Avec la mémoire virtuelle, tout se passe comme si notre programme était seul au monde et pouvait lire et écrire à toutes les adresses disponibles à partir de l'adresse zéro. Chaque programme a accès à autant d'adresses que ce que le processeur peut adresser : on se moque du fait que des adresses soient réservées aux périphériques, de la quantité de mémoire réellement installée sur l'ordinateur, ou de la mémoire prise par d'autres programmes en cours d’exécution. Pour éviter que ce surplus de fausse mémoire pose problème, on utilise une partie des mémoires de masse (disques durs) d'un ordinateur en remplacement de la mémoire physique manquante. [[File:Memoire virtuelle.svg|centre|vignette|Mémoire virtuelle]] [[File:MMU and IOMMU.svg|droite|vignette|Les périphériques peuvent eux aussi utiliser la mémoire virtuelle. Dans ce cas, ceux-ci intègrent une MMU dans leurs circuits. Ces MMU, aussi appelées IOMMU, sont séparées de la MMU du processeur.]] Bien sûr, les adresses de la fausse mémoire vue par le programme sont des adresses fictives, qui devront être traduites en adresses mémoires réelles pour être utilisées. Les fausses adresses sont ce qu'on appelle des adresses logiques, alors que les adresses réelles sont appelées adresses physiques. Pour implémenter cette technique, il faut rajouter un circuit qui traduit les adresses logiques en adresses physiques : ce circuit est appelé la '''memory management unit'''. Il faut préciser qu'il existe différentes méthodes pour gérer ces adresses logiques et les transformer en adresses physiques : les principales sont la segmentation et la pagination. La suite du chapitre va détailler ces deux techniques. ==Le ''bank switching''== [[File:Bankswitch memory map.svg|vignette|Exemple de Bank switching.]] Le '''''bank switching''''', aussi appelé '''commutation de banque''', permet d'utiliser un bus d'adresse plus grand que les adresses du processeur. L'adresse réelle est plus grande que l'adresse utilisée par le processeur, les bits manquants étant fournit par un registre configurable du processeur : le '''registre de banque'''. L'espace mémoire du processeur est présent en plusieurs exemplaires, sélectionnés par la valeur du registre de banque. Chaque exemplaire de l'ensemble des adresses du processeur s'appelle une banque. On peut changer de banque en changeant le contenu de ce registre : le processeur dispose souvent d'instructions spécialisées qui en sont capables. En répartissant les données utiles dans différentes banques, le processeur peut donc adresser beaucoup plus de mémoire. De plus, cette technique se marie assez bien avec les entrées-sorties mappées en mémoire. Par exemple, supposons que j'ai besoin d'adresser une mémoire ROM de 4 kibioctets, une RAM de 8 kibioctets, et divers périphériques. Le processeur a un bus d'adresse de 12 bits, ce qui limite à 4kibioctets. Dans ce cas, je peux réserver 4 banques : une pour la ROM, une pour les périphériques, et deux banques qui contiennent chacune la moitié de la RAM. La simplicité et l'efficacité de cette technique font qu'elle est beaucoup utilisée dans l'informatique embarquée. {| class="wikitable flexible" |[[File:Banque mémoire.png|Banque mémoire.]] |[[File:Registre de banque.png|Registre de banque.]] |} ==La segmentation== [[File:Typical computer data memory arrangement.png|vignette|upright=0.5|Segments typiques des programmes sur OS modernes.]] Sur les vieux systèmes d'exploitation, chaque programme recevait un bloc de RAM pour lui tout seul, une '''partition mémoire'''. La segmentation est une amélioration de cette technique, qui affecte une ou plusieurs partitions par programme. Cela permet à un seul processus d'avoir plusieurs espaces d'adressages, plusieurs mémoires virtuelles à lui tout seul. L'utilité est qu'un programme est rarement un tout unique, mais peut souvent être décomposé en plusieurs ensembles de données/instructions séparés, qui peuvent grossir ou se réduire suivant les circonstances. Par exemple, la pile a une taille qui varie beaucoup, tandis que le code du programme ne change pas. La segmentation permet de découper la mémoire virtuelle d'un processus en sous-partitions de taille variable qu'on appelle improprement des '''segments'''. Ainsi, un programme peut utiliser des segments différents pour la pile, le tas, le programme lui-même, et les variables globales. Chaque segment pourra grandir ou diminuer à sa guise, suivant les besoins, ce qui serait beaucoup plus difficile avec une seule partition mémoire. ===La relocation avec la segmentation=== Chaque segment peut être placé n'importe où en mémoire physique par l'OS, ce qui fait qu'il n'a pas d'adresse fixée en mémoire physique et peut être déplacé comme bon nous semble. C'est le système d'exploitation qui gère le placement des partitions/segments dans la mémoire physique. Ainsi, les adresses de destination des branchements et les adresses des données ne sont jamais les mêmes. Il faut donc trouver un moyen pour que les programmes fonctionnent avec des adresses qui changent d'une exécution à l'autre. Ce besoin est appelé la '''relocalisation'''. Pour résoudre ce problème, le compilateur considère que le programme commence à l'adresse zéro et laisse l'OS corriger les adresses du programme. Cette correction d'adresse demande simplement d'ajouter un décalage, égal à la première adresse de la partition mémoire. Cette correction peut se faire de deux manières : soit l'OS corrige chaque adresse lors du lancement du programme, soit le processeur s'en charge à chaque accès mémoire. Dans le second cas, cette première adresse est mémorisée dans un '''registre de base''', mis à jour automatiquement lors de chaque changement de programme. [[File:Segmentation et relocation.png|centre|vignette|upright=2|Segmentation et relocation.]] Sur les processeurs x86, la mémoire virtuelle est découpée en 2^16 segments de 2^32 bits, ce qui donne des adresses de 48 bits. Pour identifier un segment, seuls les 16 bits de poids fort de l'adresse 48 bits sont utiles : ils forment ce qu'on appelle un sélecteur de segment. Les 32 bits servent à identifier la position de la donnée dans un segment : ils sont appelés le décalage (offset). La relocalisation se fait de la même manière pour un segment que pour une partition mémoire. Pour cela, l'OS associe chaque segment à son adresse de base dans une table de correspondance, appelée la '''table des segments'''. Elle est unique pour chaque programme : la même adresse logique ne donnera pas la même adresse physique selon le programme. [[File:Table des segments.png|centre|vignette|upright=2|Traduction d'adresse.]] Dans le cas le plus simple, la table des segments est stockée en mémoire RAM, le processeur ne contenant qu'un registre de base mis à jour à chaque changement de segment. [[File:Registre de base de segment.png|centre|vignette|upright=2|Registre de base de segment.]] Une autre solution consiste à charger la table de correspondance complète dans un banc de registre dédié. [[File:Table des segments dans un banc de registres.png|centre|vignette|upright=2|Table des segments dans un banc de registres.]] ===La protection mémoire avec la segmentation=== Un programme ne doit avoir accès qu'à la partition qui lui est dédiée et pas aux autres, sauf dans quelques rares exceptions. Toute tentative d'accès à une autre partition doit déclencher une exception matérielle, qui entraîne souvent l'apparition d'un message d'erreur. Tout cela est pris en charge par le système d'exploitation, par l'intermédiaire de mécanismes de '''protection mémoire''', que nous allons maintenant aborder. Pour commencer, le processeur (ou l'OS) doivent détecter les accès hors-partition, à savoir un programme qui lit/écrit de la mémoire au-delà de la partition qui lui réservée. La solution est de mémoriser les limites du segment dans la page des segments et de vérifier que les accès mémoire ne se font pas au-delà de cette limite. L'adresse de fin de segment est mémorisée dans la table des segments et est récupérée lors de chaque accès. Le processeur vérifie si l'accès se fait dans les clou, en comparant l'adresse accédée avec l'adresse limite. Une autre solution consiste à mémoriser non pas l'adresse, mais l'offset maximal possible dans le segment en cours. Cela économise quelques bits par entrée dans la table des tables. Voici comment se passe la traduction d'une adresse avec la segmentation, en tenant compte de la vérification des accès hors-segment. [[File:Vm7.svg|centre|vignette|upright=2|Traduction d'adresse avec vérification des accès hors-segment.]] Vient ensuite la '''gestion des droits d'accès''' : chaque partition/segment se voit attribuer un certain nombre d'autorisations d'accès qui indiquent si l'on peut lire ou écrire dedans, si celui-ci contient un programme exécutable, etc. Par exemple, il est possible d'interdire d'exécuter quoique ce soit de localisé dans certains segments, ce qui fournit une protection contre certaines failles de sécurité ou certains virus. Lorsqu'on exécute une opération interdite, le processeur lève une exception matérielle, à charge du système d'exploitation de gérer la situation. L'OS ou la MMU mémorisent les autorisations pour chaque segment, qui sont rassemblées avec d'autres informations (registre de base et limite) dans un '''descripteur de segment'''. Pour se simplifier la tache, les concepteurs de processeurs et de systèmes d'exploitation ont décidé de regrouper ces descripteurs dans une portion de la mémoire, spécialement réservée pour l'occasion : la '''table des descripteurs de segment'''. Pour des raisons de performance, le processeur utilise un registre pour mémoriser le descripteur de segment du segment en cours d'utilisation. Quand on accède à un segment, son descripteur est chargé dans des registres du processeur, l'ancien est effacé. [[File:SegmentDescriptor.svg|centre|vignette|upright=2|Schéma d'un descripteur de segment sur une architecture x86.]] ===Le partage de segments=== Il faut préciser qu'il est possible de partager des segments entre applications. Il suffit de configurer les tables de segment convenablement. Cela peut servir quand plusieurs instances d'une même applications sont lancés simultanément : le code n'ayant pas de raison de changer, celui-ci est partagé entre toutes les instance. [[File:Vm9.png|centre|vignette|upright=2|Illustration du partage d'un segment entre deux applications.]] Il est aussi possible de faire en sorte que deux segments se recouvrent l'un autre, à savoir que les deux segments partagent la même mémoire physique. Cela peut servir à partager de la mémoire entre plusieurs applications qui doivent communiquer entre elles. [[File:Overlapping realmode segments.svg|centre|vignette|upright=1.5|Recouvrement de segments.]] ==La pagination== De nos jours, la segmentation est obsolète et n'est plus utilisée : à la place, les OS et processeurs utilisent la pagination. Avec la pagination, la mémoire virtuelle et la mémoire physique sont découpées en blocs de taille fixe, appelés des '''pages mémoires'''. La différence avec les segments est que les segments sont de taille variable, alors que les pages sont de taille fixe. La taille des pages varie suivant le processeur et le système d'exploitation et tourne souvent autour de 4 kibioctets. Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages de 4 kibioctets sont les pages par défaut, les autres tailles de page sont appelées des ''pages larges''. Le contenu d'une page en mémoire fictive est rigoureusement le même que le contenu de la page correspondante en mémoire physique. Cependant, le nombre total de pages en mémoire virtuelle dépasse celui de la mémoire physique. [[File:Principe de la pagination.png|centre|vignette|upright=2|Principe de la pagination.]] Le surnombre est simplement placé sur le disque dur, dans un fichier appelé le '''fichier d'échange'''. Les pages virtuelles vont ainsi faire référence soit à une page en mémoire physique, soit à une page sur le disque dur. Tout accès à une page sur le disque dur va charger celle-ci dans la mémoire RAM, dans une page vide. Les pages font ainsi une sorte de va et vient entre le fichier d'échange et la RAM, suivant les besoins. [[File:Lazy Swapper.jpg|centre|vignette|upright=2|Mémoire virtuelle paginée et fichier d'échange.]] ===La traduction d'adresse avec la pagination=== Une adresse (logique ou physique) se décompose donc en deux parties : un numéro de page qui identifie la page et un numéro permettant de localiser la donnée dans la page. Traduire l'adresse logique en adresse physique demande de remplacer le numéro de la page logique en un numéro de page physique. Pour faire cette traduction, il faut se souvenir des correspondances entre numéro de page et adresse de la page en mémoire fictive. Elles sont stockées dans une sorte de table, nommée la '''table des pages'''. Celle-ci contient aussi, pour chaque page, des bits qui encodent des informations sur la dite page. Ce peut être des bits pour gérer la protection mémoire, pour savoir si une page est swappée sur le disque dur ou si elle est présente en RAM, ou bien d'autres. La table des pages est généralement organisée en une suite consécutives d'''entrées de la table des pages'', chaque entrée mémorisant toute information/correspondance liée à une page (correspondances numéro de page - adresse et bits d'information annexes). [[File:Paging.svg|centre|vignette|upright=2|Table des pages.]] La table des pages est unique pour chaque programme, vu que les correspondances entre adresses physiques et logiques ne sont pas les mêmes. Chaque programme lancé sur l'ordinateur dispose de son propre espace d'adressage, ce qui fait qu'il a sa propre table des page dédiée. Il y a une table des page par processus/programme lancé sur l'ordinateur, une table des pages unique par espace d'adressage. Bien sûr, il est possible que de la mémoire soit partagée entre plusieurs processus, ce qui implique des interactions entre tables des pages, mais pas de partage des tables en elles-mêmes. [[File:Vm5.png|centre|vignette|upright=2|Tables des pages de plusieurs processus.]] ====Les tables des pages simples==== Dans le cas le plus simple, il n'y a qu'une seule table des pages par programme, qui est adressée par les numéros de page logique. La table des pages est un vulgaire tableau d'adresses physiques, placées les unes à la suite des autres. Ainsi, pour chaque numéro (ou chaque adresse) de page logique, on stocke l'adresse de base de la page correspondante en mémoire physique. Avec cette méthode, la table des pages a autant d'entrée qu'il y a de pages logiques en mémoire virtuelle. Accéder à la mémoire nécessite donc d’accéder d'abord à la table des pages en mémoire, de calculer l'adresse de l'entrée voulue, et d’y accéder. La table des pages est souvent stockée dans la mémoire RAM, son adresse est connue du processeur, mémorisée dans un registre spécialisé du processeur. [[File:Table des pages.png|centre|vignette|upright=2|Table des pages.]] ====Les tables des pages inversées==== Sur certains systèmes, la taille d'une table des pages serait beaucoup trop grande en utilisant les techniques vues au-dessus. C'est notamment le cas sur les architectures 64 bits ou plus, pour lesquelles le nombre de pages total est très important. Sur les ordinateurs x86 récents, les adresses sont en pratique de 48 bits, les bits de poids fort étant ignorés en pratique, ce qui fait en tout 68 719 476 736 pages. Chaque entrée de la table des pages fait au minimum 48 bits, mais fait plus en pratique : partons sur 64 bits par entrée, soit 8 octets. Cela fait 549 755 813 888 octets pour la table des pages, soit plusieurs centaines de gibioctets ! Une table des pages normale serait tout simplement impraticable. Pour résoudre ce problème, on a inventé les '''tables des pages inversées'''. L'idée derrière celles-ci est l'inverse de la méthode précédente. La méthode précédente stocke, pour chaque page logique, son numéro de page physique. Les tables des pages inversées font l'inverse : elles stockent, pour chaque numéro de page physique, la page logique qui correspond. Avec cette méthode table des pages contient ainsi autant d'entrées qu'il y a de pages physiques. Elle est donc plus petite qu'avant, vu que la mémoire physique est plus petite que la mémoire virtuelle. Quand le processeur veut convertir une adresse virtuelle en adresse physique, la MMU recherche le numéro de page de l'adresse virtuelle dans la table des pages. Le numéro de l'entrée à laquelle se trouve ce morceau d'adresse virtuelle est le morceau de l'adresse physique. Pour faciliter le processus de recherche dans la page, les concepteurs de systèmes d'exploitation peuvent stocker celle-ci avec ce que l'on appelle une table de hachage. [[File:Table des pages inversée.jpg|centre|vignette|upright=2|Table des pages inversée.]] ====Les tables des pages multiples par espace d'adressage==== Dans les deux cas précédents, il y a une table des page par processus/programme lancé sur l'ordinateur, une table des pages unique par espace d'adressage. Cependant, les concepteurs de processeurs et de systèmes d'exploitation ont remarqué que les adresses les plus hautes et/ou les plus basses sont les plus utilisées, alors que les adresses situées au milieu de l'espace d'adressage sont peu utilisées en raison du fonctionnement de la pile et du tas. Il y a donc une partie de la table des pages qui ne sert à rien et est utilisé pour des adresses inutilisées. C'est une source d'économie d'autant plus importante que les tables des pages sont de plus en plus grosses. Pour profiter de cette observation, les concepteurs d'OS ont décidé de découper l'espace d'adressage en plusieurs sous-espaces d'adressage de taille identique : certains localisés dans les adresses basses, d'autres au milieu, d'autres tout en haut, etc. Et vu que l'espace d'adressage est scindé en plusieurs parties, la table des pages l'est aussi, ele est découpée en plusieurs sous-tables. Si un sous-espace d'adressage n'est pas utilisé, il n'y a pas besoin d'utiliser de la mémoire pour stocker la table des pages associée. On ne stocke que les tables des pages pour les espaces d'adressage utilisés, ceux qui contiennent au moins une donnée. L'utilisation de plusieurs tables des page ne fonctionne que si le système d'exploitation connaît l'adresse de chaque table des pages (celle de la première entrée). Pour cela, le système d'exploitation utilise une super-table des pages, qui stocke les adresses de début des sous-tables de chaque sous-espace. En clair, la table des page est organisé en deux niveaux, la super-table étant le premier niveau et les sous-tables étant le second niveau. L'adresse est structurée de manière à tirer profit de cette organisation. Les bits de poids fort de l'adresse sélectionnent quelle table de second niveau utiliser, les bits du milieu de l'adresse sélectionne la page dans la table de second niveau et le reste est interprété comme un ''offset''. Un accès à la table des pages se fait comme suit. Les bits de poids fort de l'adresse sont envoyé à la table de premier niveau, et sont utilisés pour récupérer l'adresse de la table de second niveau adéquate. Les bits au milieu de l'adresse sont envoyés à la table de second niveau, pour récupérer le numéro de page physique. Le tout est combiné avec l'''offset'' pour obtenir l'adresse physique finale. [[File:Table des pages hiérarchique.png|centre|vignette|upright=2|Table des pages hiérarchique.]] On peut aussi aller plus loin et découper la table des pages de manière hiérarchique, chaque sous-espace d'adressage étant lui aussi découpé en sous-espaces d'adressages. On a alors une table de premier niveau, plusieurs tables de second niveau, encore plus de tables de troisième niveau, et ainsi de suite. Cela peut aller jusqu'à 5 niveaux sur les processeurs x86 64 bits modernes. Dans ce cours, la table des page désigne l'ensemble des différents niveaux de cette organisation, toute les tables inclues. Seules les tables du dernier niveau mémorisent des numéros de page physiques, les autres tables mémorisant des pointeurs, des adresses vers le début des tables de niveau inférieur. Un exemple sera donné plus bas, dans la section suivante. ====L'exemple des processeurs x86==== Pour rendre les explications précédentes plus concrètes, nous allons prendre l'exemple des processeur x86 anciens, de type 32 bits. Les processeurs de ce type utilisaient deux types de tables des pages : une table des page unique et une table des page hiérarchique. Les deux étaient utilisées dans cas séparés. La table des page unique était utilisée pour les pages larges et encore seulement en l'absence de la technologie '''''physical adress extension''''', dont on parlera plus bas. Les autres cas utilisaient une table des page hiérarchique, à deux niveaux, trois niveaux, voire plus. Une table des pages unique était utilisée pour les pages larges (de 2 mébioctets et plus). Pour les pages de 4 mébioctets, il y avait une unique table des pages, adressée par les 10 bits de poids fort de l'adresse, les bits restants servant comme ''offset''. La table des pages contenait 1024 entrées de 4 octets chacune, ce qui fait en tout 4 kibioctet pour la table des pages. La table des page était alignée en mémoire sur un bloc de 4 kibioctet (sa taille). [[File:X86 Paging 4M.svg|centre|vignette|upright=2|X86 Paging 4M]] Pour les pages de 4 kibioctets, les processeurs x86-32 bits utilisaient une table des page hiérarchique à deux niveaux. Les 10 bits de poids fort l'adresse adressaient la table des page maitre, appelée le directoire des pages (''page directory''), les 10 bits précédents servaient de numéro de page logique, et les 12 bits restants servaient à indiquer la position de l'octet dans la table des pages. Les entrées de chaque table des pages, mineure ou majeure, faisaient 32 bits, soit 4 octets. Vous remarquerez que la table des page majeure a la même taille que la table des page unique obtenue avec des pages larges (de 4 mébioctets). [[File:X86 Paging 4K.svg|centre|vignette|upright=2|X86 Paging 4K]] La technique du ''physical adress extension'' (PAE), utilisée depuis le Pentium Pro, permettait aux processeurs x86 32 bits d'adresser plus de 4 gibioctets de mémoire, en utilisant des adresses physiques de 64 bits. Les adresses virtuelles de 32 bits étaient traduites en adresses physiques de 64 bits grâce à une table des pages adaptée. Cette technologie permettait d'adresser plus de 4 gibioctets de mémoire au total, mais avec quelques limitations. Notamment, chaque programme ne pouvait utiliser que 4 gibioctets de mémoire RAM pour lui seul. Mais en lançant plusieurs programmes, on pouvait dépasser les 4 gibioctets au total. Pour cela, les entrées de la table des pages passaient à 64 bits au lieu de 32 auparavant. La table des pages gardait 2 niveaux pour les pages larges en PAE. [[File:X86 Paging PAE 2M.svg|centre|vignette|upright=2|X86 Paging PAE 2M]] Par contre, pour les pages de 4 kibioctets en PAE, elle était modifiée de manière à ajouter un niveau de hiérarchie, passant de deux niveaux à trois. [[File:X86 Paging PAE 4K.svg|centre|vignette|upright=2|X86 Paging PAE 4K]] En 64 bits, la table des pages est une table des page hiérarchique avec 5 niveaux. Seuls les 48 bits de poids faible des adresses sont utilisés, les 16 restants étant ignorés. [[File:X86 Paging 64bit.svg|centre|vignette|upright=2|X86 Paging 64bit]] ===Le remplacement des pages mémoires=== La mémoire physique contient moins de pages que la mémoire virtuelle et il faut trouver un moyen pour que cela ne pose pas de problème. La solution consiste à utiliser des mémoires de stockage comme mémoire d'appoint : si on a besoin de plus de pages mémoires que la mémoire physique n'en contient, certaines pages mémoires vont être déplacées sur le disque dur pour faire de la place. Les pages sur le disque dur doivent être chargées en RAM, avant d'être utilisables. Lorsque l'on veut traduire l'adresse logique d'une page mémoire déplacée sur le disque dur, la MMU ne va pas pouvoir associer l'adresse logique à une adresse en mémoire RAM. Elle va alors lever une exception matérielle dont la routine rapatriera la page en mémoire RAM. Charger une page en RAM ne pose aucun problème tant qu'il existe des pages inoccupée en RAM. Mais si toute la RAM est pleine, il faut déplacer une page mémoire en RAM sur le disque dur pour faire de la place. Tout cela est effectué par le système d'exploitation dont j'ai parlé plus haut. Notons que si on supprime une donnée dont on aura besoin dans le futur, il faudra recharger celle-ci, ce qui prend du temps. Le choix de la page doit être fait avec le plus grand soin et il existe différents algorithmes qui permettent de décider quelle page supprimer de la RAM. Les plus simples sont les suivants. * Aléatoire : on choisit la page au hasard. * FIFO : on supprime la donnée qui a été chargée dans la mémoire avant toutes les autres. * LRU : on supprime la donnée qui été lue ou écrite pour la dernière fois avant toutes les autres. * LFU : on vire la page qui est lue ou écrite le moins souvent comparée aux autres. * etc. Ces algorithmes ont chacun deux variantes : une locale, et une globale. Avec la version locale, la page qui va être rapatriée sur le disque dur est une page réservée au programme qui est la cause du page miss. Avec la version globale, le système d'exploitation va choisir la page à virer parmi toutes les pages présentes en mémoire vive. Sur la majorité des systèmes d'exploitation, il est possible d'interdire le déplacement de certaines pages sur le disque dur. Ces pages restent alors en mémoire RAM durant un temps plus ou moins long, parfois en permanence. Cette possibilité simplifie la vie des programmeurs qui conçoivent des systèmes d'exploitation : essayez d'exécuter une interruption de gestion de page miss alors que la page contenant le code de l'interruption est placée sur le disque dur. ===La protection mémoire avec la pagination=== La protection mémoire est garantie avec des '''clés de protection''', un nombre unique à chaque programme. Le processeur mémorise, pour chaque page, la clé de protection du programme qui a réservé la page. A chaque accès mémoire, le processeur compare la clé de protection du programme en cours d’exécution, et celle de la page adressée. Si les deux clés sont différentes, alors un programme a effectué un accès hors des clous et il se fait sauvagement arrêter. Comme avec la segmentation, chaque page a des droits d'accès précis, qui permettent d'autoriser ou interdire les accès en lecture, écriture, exécution, etc. La table des pages mémorise les autorisations pour chaque page. Ces autorisations/interdictions sont mémorisés sous la forme d'une suite de bits, chaque bit autorisant/interdisant une opération bien précise. Le format exact de la suite de bits a cependant changé dans le temps sur les processeurs x86 modernes. Par exemple, c'est lors du passage au 64 bits que l'interdiction d’exécution a été ajouté au jeu d’instruction. Avant, les CPU et OS ne pouvaient pas marquer une page mémoire comme non-exécutable. C'est seulement avec le passage au 64 bits qu'à été ajouté un bit pour interdire l'exécution de code depuis une page. Ce bit, nommé bit NX, est à 0 si la page n'est pas exécutable et à 1 sinon. De plus, diverses techniques intégrées aux processeur permettent de gérer celui-ci facilement. Notamment, le processeur vérifie à chaque chargement d'instruction si le bit NX de page lue est à 1. Sinon, il lève une exception matérielle et laisse la main à l'OS. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le matériel réseau | prevText=Le matériel réseau | next=Les mémoires cache | nextText=Les mémoires cache }} </noinclude> e70rl8kz6ynrq8a7e64t3l72clkmf1g 682819 682818 2022-07-28T13:15:20Z Mewtow 31375 /* Les tables des pages simples */ wikitext text/x-wiki Un programme peut être exécuté sur des ordinateurs ayant des capacités mémoires diverses et variées et dans des conditions très différentes. Et il faut faire en sorte qu'un programme fonctionne sur des ordinateur ayant peu de mémoire sans poser problème. Après tout, quand on conçoit un programme, on ne sait pas toujours quelle sera la quantité mémoire que notre ordinateur contiendra, et encore moins comment celle-ci sera partagée entre nos différentes programmes en cours d’exécution : s'affranchir de limitations sur la quantité de mémoire disponible est un plus vraiment appréciable. Ce besoin est appelé l''''abstraction matérielle de la mémoire'''. Enfin, plusieurs programmes sont présents en même temps dans notre ordinateur, et doivent se partager la mémoire physique. Si un programme pouvait modifier les données d'un autre programme, on se retrouverait rapidement avec une situation non prévue par le programmeur. Cela a des conséquences qui vont de comiques à catastrophiques, et cela fini très souvent par un joli plantage. Il faut donc introduire des mécanismes de '''protection mémoire'''. Pour éviter cela, chaque programme a accès à des portions de la mémoire dans laquelle lui seul peut écrire ou lire. Le reste de la mémoire est inaccessible en lecture et en écriture, à part pour la mémoire partagée entre différents programmes. Toute tentative d'accès à une partie de la mémoire non autorisée déclenchera une exception matérielle (rappelez-vous le chapitre sur les interruptions) qui devra être traitée par une routine du système d'exploitation. Généralement, le programme fautif est sauvagement arrêté et un message d'erreur est affiché à l'écran. Ces détails concernant l'organisation et la gestion de la mémoire sont assez compliqués à gérer, et faire en sorte que les programmes applicatifs n'aient pas à s'en soucier est un plus vraiment appréciable. Ce genre de problèmes a eu des solutions purement logicielles, mais quelques techniques règlent ces problèmes directement au niveau du matériel : on parle de '''mémoire virtuelle'''. Avec la mémoire virtuelle, tout se passe comme si notre programme était seul au monde et pouvait lire et écrire à toutes les adresses disponibles à partir de l'adresse zéro. Chaque programme a accès à autant d'adresses que ce que le processeur peut adresser : on se moque du fait que des adresses soient réservées aux périphériques, de la quantité de mémoire réellement installée sur l'ordinateur, ou de la mémoire prise par d'autres programmes en cours d’exécution. Pour éviter que ce surplus de fausse mémoire pose problème, on utilise une partie des mémoires de masse (disques durs) d'un ordinateur en remplacement de la mémoire physique manquante. [[File:Memoire virtuelle.svg|centre|vignette|Mémoire virtuelle]] [[File:MMU and IOMMU.svg|droite|vignette|Les périphériques peuvent eux aussi utiliser la mémoire virtuelle. Dans ce cas, ceux-ci intègrent une MMU dans leurs circuits. Ces MMU, aussi appelées IOMMU, sont séparées de la MMU du processeur.]] Bien sûr, les adresses de la fausse mémoire vue par le programme sont des adresses fictives, qui devront être traduites en adresses mémoires réelles pour être utilisées. Les fausses adresses sont ce qu'on appelle des adresses logiques, alors que les adresses réelles sont appelées adresses physiques. Pour implémenter cette technique, il faut rajouter un circuit qui traduit les adresses logiques en adresses physiques : ce circuit est appelé la '''memory management unit'''. Il faut préciser qu'il existe différentes méthodes pour gérer ces adresses logiques et les transformer en adresses physiques : les principales sont la segmentation et la pagination. La suite du chapitre va détailler ces deux techniques. ==Le ''bank switching''== [[File:Bankswitch memory map.svg|vignette|Exemple de Bank switching.]] Le '''''bank switching''''', aussi appelé '''commutation de banque''', permet d'utiliser un bus d'adresse plus grand que les adresses du processeur. L'adresse réelle est plus grande que l'adresse utilisée par le processeur, les bits manquants étant fournit par un registre configurable du processeur : le '''registre de banque'''. L'espace mémoire du processeur est présent en plusieurs exemplaires, sélectionnés par la valeur du registre de banque. Chaque exemplaire de l'ensemble des adresses du processeur s'appelle une banque. On peut changer de banque en changeant le contenu de ce registre : le processeur dispose souvent d'instructions spécialisées qui en sont capables. En répartissant les données utiles dans différentes banques, le processeur peut donc adresser beaucoup plus de mémoire. De plus, cette technique se marie assez bien avec les entrées-sorties mappées en mémoire. Par exemple, supposons que j'ai besoin d'adresser une mémoire ROM de 4 kibioctets, une RAM de 8 kibioctets, et divers périphériques. Le processeur a un bus d'adresse de 12 bits, ce qui limite à 4kibioctets. Dans ce cas, je peux réserver 4 banques : une pour la ROM, une pour les périphériques, et deux banques qui contiennent chacune la moitié de la RAM. La simplicité et l'efficacité de cette technique font qu'elle est beaucoup utilisée dans l'informatique embarquée. {| class="wikitable flexible" |[[File:Banque mémoire.png|Banque mémoire.]] |[[File:Registre de banque.png|Registre de banque.]] |} ==La segmentation== [[File:Typical computer data memory arrangement.png|vignette|upright=0.5|Segments typiques des programmes sur OS modernes.]] Sur les vieux systèmes d'exploitation, chaque programme recevait un bloc de RAM pour lui tout seul, une '''partition mémoire'''. La segmentation est une amélioration de cette technique, qui affecte une ou plusieurs partitions par programme. Cela permet à un seul processus d'avoir plusieurs espaces d'adressages, plusieurs mémoires virtuelles à lui tout seul. L'utilité est qu'un programme est rarement un tout unique, mais peut souvent être décomposé en plusieurs ensembles de données/instructions séparés, qui peuvent grossir ou se réduire suivant les circonstances. Par exemple, la pile a une taille qui varie beaucoup, tandis que le code du programme ne change pas. La segmentation permet de découper la mémoire virtuelle d'un processus en sous-partitions de taille variable qu'on appelle improprement des '''segments'''. Ainsi, un programme peut utiliser des segments différents pour la pile, le tas, le programme lui-même, et les variables globales. Chaque segment pourra grandir ou diminuer à sa guise, suivant les besoins, ce qui serait beaucoup plus difficile avec une seule partition mémoire. ===La relocation avec la segmentation=== Chaque segment peut être placé n'importe où en mémoire physique par l'OS, ce qui fait qu'il n'a pas d'adresse fixée en mémoire physique et peut être déplacé comme bon nous semble. C'est le système d'exploitation qui gère le placement des partitions/segments dans la mémoire physique. Ainsi, les adresses de destination des branchements et les adresses des données ne sont jamais les mêmes. Il faut donc trouver un moyen pour que les programmes fonctionnent avec des adresses qui changent d'une exécution à l'autre. Ce besoin est appelé la '''relocalisation'''. Pour résoudre ce problème, le compilateur considère que le programme commence à l'adresse zéro et laisse l'OS corriger les adresses du programme. Cette correction d'adresse demande simplement d'ajouter un décalage, égal à la première adresse de la partition mémoire. Cette correction peut se faire de deux manières : soit l'OS corrige chaque adresse lors du lancement du programme, soit le processeur s'en charge à chaque accès mémoire. Dans le second cas, cette première adresse est mémorisée dans un '''registre de base''', mis à jour automatiquement lors de chaque changement de programme. [[File:Segmentation et relocation.png|centre|vignette|upright=2|Segmentation et relocation.]] Sur les processeurs x86, la mémoire virtuelle est découpée en 2^16 segments de 2^32 bits, ce qui donne des adresses de 48 bits. Pour identifier un segment, seuls les 16 bits de poids fort de l'adresse 48 bits sont utiles : ils forment ce qu'on appelle un sélecteur de segment. Les 32 bits servent à identifier la position de la donnée dans un segment : ils sont appelés le décalage (offset). La relocalisation se fait de la même manière pour un segment que pour une partition mémoire. Pour cela, l'OS associe chaque segment à son adresse de base dans une table de correspondance, appelée la '''table des segments'''. Elle est unique pour chaque programme : la même adresse logique ne donnera pas la même adresse physique selon le programme. [[File:Table des segments.png|centre|vignette|upright=2|Traduction d'adresse.]] Dans le cas le plus simple, la table des segments est stockée en mémoire RAM, le processeur ne contenant qu'un registre de base mis à jour à chaque changement de segment. [[File:Registre de base de segment.png|centre|vignette|upright=2|Registre de base de segment.]] Une autre solution consiste à charger la table de correspondance complète dans un banc de registre dédié. [[File:Table des segments dans un banc de registres.png|centre|vignette|upright=2|Table des segments dans un banc de registres.]] ===La protection mémoire avec la segmentation=== Un programme ne doit avoir accès qu'à la partition qui lui est dédiée et pas aux autres, sauf dans quelques rares exceptions. Toute tentative d'accès à une autre partition doit déclencher une exception matérielle, qui entraîne souvent l'apparition d'un message d'erreur. Tout cela est pris en charge par le système d'exploitation, par l'intermédiaire de mécanismes de '''protection mémoire''', que nous allons maintenant aborder. Pour commencer, le processeur (ou l'OS) doivent détecter les accès hors-partition, à savoir un programme qui lit/écrit de la mémoire au-delà de la partition qui lui réservée. La solution est de mémoriser les limites du segment dans la page des segments et de vérifier que les accès mémoire ne se font pas au-delà de cette limite. L'adresse de fin de segment est mémorisée dans la table des segments et est récupérée lors de chaque accès. Le processeur vérifie si l'accès se fait dans les clou, en comparant l'adresse accédée avec l'adresse limite. Une autre solution consiste à mémoriser non pas l'adresse, mais l'offset maximal possible dans le segment en cours. Cela économise quelques bits par entrée dans la table des tables. Voici comment se passe la traduction d'une adresse avec la segmentation, en tenant compte de la vérification des accès hors-segment. [[File:Vm7.svg|centre|vignette|upright=2|Traduction d'adresse avec vérification des accès hors-segment.]] Vient ensuite la '''gestion des droits d'accès''' : chaque partition/segment se voit attribuer un certain nombre d'autorisations d'accès qui indiquent si l'on peut lire ou écrire dedans, si celui-ci contient un programme exécutable, etc. Par exemple, il est possible d'interdire d'exécuter quoique ce soit de localisé dans certains segments, ce qui fournit une protection contre certaines failles de sécurité ou certains virus. Lorsqu'on exécute une opération interdite, le processeur lève une exception matérielle, à charge du système d'exploitation de gérer la situation. L'OS ou la MMU mémorisent les autorisations pour chaque segment, qui sont rassemblées avec d'autres informations (registre de base et limite) dans un '''descripteur de segment'''. Pour se simplifier la tache, les concepteurs de processeurs et de systèmes d'exploitation ont décidé de regrouper ces descripteurs dans une portion de la mémoire, spécialement réservée pour l'occasion : la '''table des descripteurs de segment'''. Pour des raisons de performance, le processeur utilise un registre pour mémoriser le descripteur de segment du segment en cours d'utilisation. Quand on accède à un segment, son descripteur est chargé dans des registres du processeur, l'ancien est effacé. [[File:SegmentDescriptor.svg|centre|vignette|upright=2|Schéma d'un descripteur de segment sur une architecture x86.]] ===Le partage de segments=== Il faut préciser qu'il est possible de partager des segments entre applications. Il suffit de configurer les tables de segment convenablement. Cela peut servir quand plusieurs instances d'une même applications sont lancés simultanément : le code n'ayant pas de raison de changer, celui-ci est partagé entre toutes les instance. [[File:Vm9.png|centre|vignette|upright=2|Illustration du partage d'un segment entre deux applications.]] Il est aussi possible de faire en sorte que deux segments se recouvrent l'un autre, à savoir que les deux segments partagent la même mémoire physique. Cela peut servir à partager de la mémoire entre plusieurs applications qui doivent communiquer entre elles. [[File:Overlapping realmode segments.svg|centre|vignette|upright=1.5|Recouvrement de segments.]] ==La pagination== De nos jours, la segmentation est obsolète et n'est plus utilisée : à la place, les OS et processeurs utilisent la pagination. Avec la pagination, la mémoire virtuelle et la mémoire physique sont découpées en blocs de taille fixe, appelés des '''pages mémoires'''. La différence avec les segments est que les segments sont de taille variable, alors que les pages sont de taille fixe. La taille des pages varie suivant le processeur et le système d'exploitation et tourne souvent autour de 4 kibioctets. Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages de 4 kibioctets sont les pages par défaut, les autres tailles de page sont appelées des ''pages larges''. Le contenu d'une page en mémoire fictive est rigoureusement le même que le contenu de la page correspondante en mémoire physique. Cependant, le nombre total de pages en mémoire virtuelle dépasse celui de la mémoire physique. [[File:Principe de la pagination.png|centre|vignette|upright=2|Principe de la pagination.]] Le surnombre est simplement placé sur le disque dur, dans un fichier appelé le '''fichier d'échange'''. Les pages virtuelles vont ainsi faire référence soit à une page en mémoire physique, soit à une page sur le disque dur. Tout accès à une page sur le disque dur va charger celle-ci dans la mémoire RAM, dans une page vide. Les pages font ainsi une sorte de va et vient entre le fichier d'échange et la RAM, suivant les besoins. [[File:Lazy Swapper.jpg|centre|vignette|upright=2|Mémoire virtuelle paginée et fichier d'échange.]] ===La traduction d'adresse avec la pagination=== Une adresse (logique ou physique) se décompose donc en deux parties : un numéro de page qui identifie la page et un numéro permettant de localiser la donnée dans la page. Traduire l'adresse logique en adresse physique demande de remplacer le numéro de la page logique en un numéro de page physique. Pour faire cette traduction, il faut se souvenir des correspondances entre numéro de page et adresse de la page en mémoire fictive. Elles sont stockées dans une sorte de table, nommée la '''table des pages'''. Celle-ci contient aussi, pour chaque page, des bits qui encodent des informations sur la dite page. Ce peut être des bits pour gérer la protection mémoire, pour savoir si une page est swappée sur le disque dur ou si elle est présente en RAM, ou bien d'autres. La table des pages est généralement organisée en une suite consécutives d'''entrées de la table des pages'', chaque entrée mémorisant toute information/correspondance liée à une page (correspondances numéro de page - adresse et bits d'information annexes). [[File:Paging.svg|centre|vignette|upright=2|Table des pages.]] La table des pages est unique pour chaque programme, vu que les correspondances entre adresses physiques et logiques ne sont pas les mêmes. Chaque programme lancé sur l'ordinateur dispose de son propre espace d'adressage, ce qui fait qu'il a sa propre table des page dédiée. Il y a une table des page par processus/programme lancé sur l'ordinateur, une table des pages unique par espace d'adressage. Bien sûr, il est possible que de la mémoire soit partagée entre plusieurs processus, ce qui implique des interactions entre tables des pages, mais pas de partage des tables en elles-mêmes. [[File:Vm5.png|centre|vignette|upright=2|Tables des pages de plusieurs processus.]] ====Les tables des pages simples==== Dans le cas le plus simple, il n'y a qu'une seule table des pages par programme, qui est adressée par les numéros de page logique. La table des pages est un vulgaire tableau d'adresses physiques, placées les unes à la suite des autres. Avec cette méthode, la table des pages a autant d'entrée qu'il y a de pages logiques en mémoire virtuelle. Accéder à la mémoire nécessite donc d’accéder d'abord à la table des pages en mémoire, de calculer l'adresse de l'entrée voulue, et d’y accéder. La table des pages est souvent stockée dans la mémoire RAM, son adresse est connue du processeur, mémorisée dans un registre spécialisé du processeur. Le processeur effectue automatiquement le calcul d'adresse à partir de l'adresse de base et du numéro de page logique. [[File:Table des pages.png|centre|vignette|upright=2|Table des pages.]] ====Les tables des pages inversées==== Sur certains systèmes, la taille d'une table des pages serait beaucoup trop grande en utilisant les techniques vues au-dessus. C'est notamment le cas sur les architectures 64 bits ou plus, pour lesquelles le nombre de pages total est très important. Sur les ordinateurs x86 récents, les adresses sont en pratique de 48 bits, les bits de poids fort étant ignorés en pratique, ce qui fait en tout 68 719 476 736 pages. Chaque entrée de la table des pages fait au minimum 48 bits, mais fait plus en pratique : partons sur 64 bits par entrée, soit 8 octets. Cela fait 549 755 813 888 octets pour la table des pages, soit plusieurs centaines de gibioctets ! Une table des pages normale serait tout simplement impraticable. Pour résoudre ce problème, on a inventé les '''tables des pages inversées'''. L'idée derrière celles-ci est l'inverse de la méthode précédente. La méthode précédente stocke, pour chaque page logique, son numéro de page physique. Les tables des pages inversées font l'inverse : elles stockent, pour chaque numéro de page physique, la page logique qui correspond. Avec cette méthode table des pages contient ainsi autant d'entrées qu'il y a de pages physiques. Elle est donc plus petite qu'avant, vu que la mémoire physique est plus petite que la mémoire virtuelle. Quand le processeur veut convertir une adresse virtuelle en adresse physique, la MMU recherche le numéro de page de l'adresse virtuelle dans la table des pages. Le numéro de l'entrée à laquelle se trouve ce morceau d'adresse virtuelle est le morceau de l'adresse physique. Pour faciliter le processus de recherche dans la page, les concepteurs de systèmes d'exploitation peuvent stocker celle-ci avec ce que l'on appelle une table de hachage. [[File:Table des pages inversée.jpg|centre|vignette|upright=2|Table des pages inversée.]] ====Les tables des pages multiples par espace d'adressage==== Dans les deux cas précédents, il y a une table des page par processus/programme lancé sur l'ordinateur, une table des pages unique par espace d'adressage. Cependant, les concepteurs de processeurs et de systèmes d'exploitation ont remarqué que les adresses les plus hautes et/ou les plus basses sont les plus utilisées, alors que les adresses situées au milieu de l'espace d'adressage sont peu utilisées en raison du fonctionnement de la pile et du tas. Il y a donc une partie de la table des pages qui ne sert à rien et est utilisé pour des adresses inutilisées. C'est une source d'économie d'autant plus importante que les tables des pages sont de plus en plus grosses. Pour profiter de cette observation, les concepteurs d'OS ont décidé de découper l'espace d'adressage en plusieurs sous-espaces d'adressage de taille identique : certains localisés dans les adresses basses, d'autres au milieu, d'autres tout en haut, etc. Et vu que l'espace d'adressage est scindé en plusieurs parties, la table des pages l'est aussi, ele est découpée en plusieurs sous-tables. Si un sous-espace d'adressage n'est pas utilisé, il n'y a pas besoin d'utiliser de la mémoire pour stocker la table des pages associée. On ne stocke que les tables des pages pour les espaces d'adressage utilisés, ceux qui contiennent au moins une donnée. L'utilisation de plusieurs tables des page ne fonctionne que si le système d'exploitation connaît l'adresse de chaque table des pages (celle de la première entrée). Pour cela, le système d'exploitation utilise une super-table des pages, qui stocke les adresses de début des sous-tables de chaque sous-espace. En clair, la table des page est organisé en deux niveaux, la super-table étant le premier niveau et les sous-tables étant le second niveau. L'adresse est structurée de manière à tirer profit de cette organisation. Les bits de poids fort de l'adresse sélectionnent quelle table de second niveau utiliser, les bits du milieu de l'adresse sélectionne la page dans la table de second niveau et le reste est interprété comme un ''offset''. Un accès à la table des pages se fait comme suit. Les bits de poids fort de l'adresse sont envoyé à la table de premier niveau, et sont utilisés pour récupérer l'adresse de la table de second niveau adéquate. Les bits au milieu de l'adresse sont envoyés à la table de second niveau, pour récupérer le numéro de page physique. Le tout est combiné avec l'''offset'' pour obtenir l'adresse physique finale. [[File:Table des pages hiérarchique.png|centre|vignette|upright=2|Table des pages hiérarchique.]] On peut aussi aller plus loin et découper la table des pages de manière hiérarchique, chaque sous-espace d'adressage étant lui aussi découpé en sous-espaces d'adressages. On a alors une table de premier niveau, plusieurs tables de second niveau, encore plus de tables de troisième niveau, et ainsi de suite. Cela peut aller jusqu'à 5 niveaux sur les processeurs x86 64 bits modernes. Dans ce cours, la table des page désigne l'ensemble des différents niveaux de cette organisation, toute les tables inclues. Seules les tables du dernier niveau mémorisent des numéros de page physiques, les autres tables mémorisant des pointeurs, des adresses vers le début des tables de niveau inférieur. Un exemple sera donné plus bas, dans la section suivante. ====L'exemple des processeurs x86==== Pour rendre les explications précédentes plus concrètes, nous allons prendre l'exemple des processeur x86 anciens, de type 32 bits. Les processeurs de ce type utilisaient deux types de tables des pages : une table des page unique et une table des page hiérarchique. Les deux étaient utilisées dans cas séparés. La table des page unique était utilisée pour les pages larges et encore seulement en l'absence de la technologie '''''physical adress extension''''', dont on parlera plus bas. Les autres cas utilisaient une table des page hiérarchique, à deux niveaux, trois niveaux, voire plus. Une table des pages unique était utilisée pour les pages larges (de 2 mébioctets et plus). Pour les pages de 4 mébioctets, il y avait une unique table des pages, adressée par les 10 bits de poids fort de l'adresse, les bits restants servant comme ''offset''. La table des pages contenait 1024 entrées de 4 octets chacune, ce qui fait en tout 4 kibioctet pour la table des pages. La table des page était alignée en mémoire sur un bloc de 4 kibioctet (sa taille). [[File:X86 Paging 4M.svg|centre|vignette|upright=2|X86 Paging 4M]] Pour les pages de 4 kibioctets, les processeurs x86-32 bits utilisaient une table des page hiérarchique à deux niveaux. Les 10 bits de poids fort l'adresse adressaient la table des page maitre, appelée le directoire des pages (''page directory''), les 10 bits précédents servaient de numéro de page logique, et les 12 bits restants servaient à indiquer la position de l'octet dans la table des pages. Les entrées de chaque table des pages, mineure ou majeure, faisaient 32 bits, soit 4 octets. Vous remarquerez que la table des page majeure a la même taille que la table des page unique obtenue avec des pages larges (de 4 mébioctets). [[File:X86 Paging 4K.svg|centre|vignette|upright=2|X86 Paging 4K]] La technique du ''physical adress extension'' (PAE), utilisée depuis le Pentium Pro, permettait aux processeurs x86 32 bits d'adresser plus de 4 gibioctets de mémoire, en utilisant des adresses physiques de 64 bits. Les adresses virtuelles de 32 bits étaient traduites en adresses physiques de 64 bits grâce à une table des pages adaptée. Cette technologie permettait d'adresser plus de 4 gibioctets de mémoire au total, mais avec quelques limitations. Notamment, chaque programme ne pouvait utiliser que 4 gibioctets de mémoire RAM pour lui seul. Mais en lançant plusieurs programmes, on pouvait dépasser les 4 gibioctets au total. Pour cela, les entrées de la table des pages passaient à 64 bits au lieu de 32 auparavant. La table des pages gardait 2 niveaux pour les pages larges en PAE. [[File:X86 Paging PAE 2M.svg|centre|vignette|upright=2|X86 Paging PAE 2M]] Par contre, pour les pages de 4 kibioctets en PAE, elle était modifiée de manière à ajouter un niveau de hiérarchie, passant de deux niveaux à trois. [[File:X86 Paging PAE 4K.svg|centre|vignette|upright=2|X86 Paging PAE 4K]] En 64 bits, la table des pages est une table des page hiérarchique avec 5 niveaux. Seuls les 48 bits de poids faible des adresses sont utilisés, les 16 restants étant ignorés. [[File:X86 Paging 64bit.svg|centre|vignette|upright=2|X86 Paging 64bit]] ===Le remplacement des pages mémoires=== La mémoire physique contient moins de pages que la mémoire virtuelle et il faut trouver un moyen pour que cela ne pose pas de problème. La solution consiste à utiliser des mémoires de stockage comme mémoire d'appoint : si on a besoin de plus de pages mémoires que la mémoire physique n'en contient, certaines pages mémoires vont être déplacées sur le disque dur pour faire de la place. Les pages sur le disque dur doivent être chargées en RAM, avant d'être utilisables. Lorsque l'on veut traduire l'adresse logique d'une page mémoire déplacée sur le disque dur, la MMU ne va pas pouvoir associer l'adresse logique à une adresse en mémoire RAM. Elle va alors lever une exception matérielle dont la routine rapatriera la page en mémoire RAM. Charger une page en RAM ne pose aucun problème tant qu'il existe des pages inoccupée en RAM. Mais si toute la RAM est pleine, il faut déplacer une page mémoire en RAM sur le disque dur pour faire de la place. Tout cela est effectué par le système d'exploitation dont j'ai parlé plus haut. Notons que si on supprime une donnée dont on aura besoin dans le futur, il faudra recharger celle-ci, ce qui prend du temps. Le choix de la page doit être fait avec le plus grand soin et il existe différents algorithmes qui permettent de décider quelle page supprimer de la RAM. Les plus simples sont les suivants. * Aléatoire : on choisit la page au hasard. * FIFO : on supprime la donnée qui a été chargée dans la mémoire avant toutes les autres. * LRU : on supprime la donnée qui été lue ou écrite pour la dernière fois avant toutes les autres. * LFU : on vire la page qui est lue ou écrite le moins souvent comparée aux autres. * etc. Ces algorithmes ont chacun deux variantes : une locale, et une globale. Avec la version locale, la page qui va être rapatriée sur le disque dur est une page réservée au programme qui est la cause du page miss. Avec la version globale, le système d'exploitation va choisir la page à virer parmi toutes les pages présentes en mémoire vive. Sur la majorité des systèmes d'exploitation, il est possible d'interdire le déplacement de certaines pages sur le disque dur. Ces pages restent alors en mémoire RAM durant un temps plus ou moins long, parfois en permanence. Cette possibilité simplifie la vie des programmeurs qui conçoivent des systèmes d'exploitation : essayez d'exécuter une interruption de gestion de page miss alors que la page contenant le code de l'interruption est placée sur le disque dur. ===La protection mémoire avec la pagination=== La protection mémoire est garantie avec des '''clés de protection''', un nombre unique à chaque programme. Le processeur mémorise, pour chaque page, la clé de protection du programme qui a réservé la page. A chaque accès mémoire, le processeur compare la clé de protection du programme en cours d’exécution, et celle de la page adressée. Si les deux clés sont différentes, alors un programme a effectué un accès hors des clous et il se fait sauvagement arrêter. Comme avec la segmentation, chaque page a des droits d'accès précis, qui permettent d'autoriser ou interdire les accès en lecture, écriture, exécution, etc. La table des pages mémorise les autorisations pour chaque page. Ces autorisations/interdictions sont mémorisés sous la forme d'une suite de bits, chaque bit autorisant/interdisant une opération bien précise. Le format exact de la suite de bits a cependant changé dans le temps sur les processeurs x86 modernes. Par exemple, c'est lors du passage au 64 bits que l'interdiction d’exécution a été ajouté au jeu d’instruction. Avant, les CPU et OS ne pouvaient pas marquer une page mémoire comme non-exécutable. C'est seulement avec le passage au 64 bits qu'à été ajouté un bit pour interdire l'exécution de code depuis une page. Ce bit, nommé bit NX, est à 0 si la page n'est pas exécutable et à 1 sinon. De plus, diverses techniques intégrées aux processeur permettent de gérer celui-ci facilement. Notamment, le processeur vérifie à chaque chargement d'instruction si le bit NX de page lue est à 1. Sinon, il lève une exception matérielle et laisse la main à l'OS. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le matériel réseau | prevText=Le matériel réseau | next=Les mémoires cache | nextText=Les mémoires cache }} </noinclude> 48dzh322mtm9bo8afzj7r8fr4aqdil6 Programmation PHP/Cache 0 73601 682854 682327 2022-07-29T07:27:00Z JackPotte 5426 /* APCu */ wikitext text/x-wiki <noinclude>{{PHP}}</noinclude> La {{w|mémoire cache}} stocke des données calculées afin de pouvoir y ré-accéder sans les recalculer, donc plus rapidement. == Classification == Il existe plusieurs systèmes de cache en PHP pour accélérer l'exécution du code rappelé<ref>http://www.php-cache.com/en/latest/</ref> : {| class="wikitable sortable" ! Nom !! Données stockées !! Flush |- | Cache d'instance || Objet PHP. Ex :<syntaxhighlight lang=php> if (null === $x) { $x = 1; }</syntaxhighlight> || Relancer le script (ex : rafraichir la page Web). |- | Cache de session || Objet PHP<ref>https://www.php.net/manual/fr/session.security.php</ref> || Vider les cookies du navigateur. |- | {{w|List_of_PHP_accelerators#Zend_Opcache_.28ex._Zend_Optimizer.2B.29|lang=en|OPcache}} || {{wt|opcode|Opcode}}<ref>https://www.php.net/manual/fr/intro.opcache.php</ref> || opcache_reset(); |- | {{w|Alternative PHP Cache|APCu}} || Variables utilisateurs dans la RAM<ref>https://www.php.net/manual/fr/intro.apcu.php</ref> || apcu_clear_cache(); |- | Cache du navigateur || Rendering || CTRL + F5 |- | {{w|Edge Side Includes|ESI}} || Partie de pages Web || Dépend du {{w|Réseau de diffusion de contenu|CDN}} ou {{w|proxy}} utilisé |- | Cache de framework || Configuration, traductions || Exemple de [[Programmation PHP/Symfony|Symfony]] : <code>php bin/console cache:clear</code> vide les fichiers temporaires de var/cache. |- | Proxy || Page web entière || Exemples, voir {{w|Varnish}}, {{w|HAProxy|lang=en}} |- | Base de données {{w|NoSQL}} || Paire clé-valeur || Voir les pages [[Programmation PHP/Memcached|Memcached]] et [[Programmation PHP/Redis|Redis]] ci-après. |- | Cache d'{{wt|ORM}} || Annotations, requêtes SQL ou leurs résultats || Exemple de [[Programmation PHP/Doctrine|Doctrine]] : <syntaxhighlight lang=shell> php bin/console doctrine:cache:clear-metadata php bin/console doctrine:cache:clear-query php bin/console doctrine:cache:clear-result </syntaxhighlight> ou : <syntaxhighlight lang=shell> bin/console cache:pool:clear doctrine.query_cache_pool doctrine.result_cache_pool doctrine.system_cache_pool </syntaxhighlight> ou en PHP : <syntaxhighlight lang=php> $qb = $entityManager->createQuery(); $cacheDriver = $qb->getResultCacheDriver(); $cacheDriver->delete('ma_cle_de_cache'); </syntaxhighlight> |- | Chain cache || Tout || Utiliser les flushs de chaque cache inclus dans la chaine. |} Les dépendances des caches gérés en PHP se doivent de respecter la norme PSR6<ref>https://www.php-fig.org/psr/psr-6/</ref>, c'est-à-dire de fournir les méthodes de manipulation du cache suivantes : * hasItem * getItem * deleteItem * clear * save Normalement chaque item a une durée de rétention (lifetime) avant renouvellement, ce qui évite de chercher à tout invalider régulièrement. Voici les opérations sur les items : * getKey * get (valeur) * isHit (est utilisable) * set (valeur) * expiresAt * expiresAfter == Installation == === OPcache === Dans Docker : <syntaxhighlight lang=bash> RUN docker-php-ext-install opcache </syntaxhighlight> === APCu === ==== Dans Docker ==== <syntaxhighlight lang=bash> RUN pecl install apcu \ && docker-php-ext-enable apcu --ini-name 10-docker-php-ext-apcu.ini \ && docker-php-ext-enable apc --ini-name 20-docker-php-ext-apc.ini \ && docker-php-ext-enable apc --ini-name 20-docker-php-ext-apc.ini </syntaxhighlight> {{remarque|Sur PHP < 8.0, ajouter après la première ligne : <code>&& pecl install apcu_bc \</code>}} ==== Sur machine hôte ==== <syntaxhighlight lang=bash> sudo pecl install apcu echo "extension=apcu.so" >> php.ini </syntaxhighlight> == Références == {{Références}} 89dghz9utd1y0i3hy9d2g2ffakbyetp Mathc initiation/Fichiers h : c74 0 77890 682832 682796 2022-07-28T20:08:53Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] : [[Mathc initiation/a08| Sommaire]] : ----{{Partie{{{type|}}}|Intégrer les fonctions élémentaires (Sympson)|fond={{{fond|}}<nowiki>}</nowiki>}} : En mathématiques, l'intégration est le fait de calculer une intégrale. C'est aussi une des deux branches du calcul infinitésimal, appelée également calcul intégral, l'autre étant le calcul différentiel..[https://fr.wikipedia.org/wiki/Int%C3%A9gration_(math%C3%A9matiques)] : <br> Copier la bibliothèque dans votre répertoire de travail : * [[Mathc initiation/Fichiers h : c74a1|x_hfile.h ............ Déclaration des fichiers h]] * [[Mathc initiation/Fichiers h : c74a2|x_def.h .............. Les utilitaires]] * [[Mathc initiation/Fichiers h : c74a3|x_symp.h ......... L'algorithme pour la méthode sympson]] : <br> {| class="wikitable" |+ Calculer les intégrales élémentaires |+ *** |+ Pour d'autres méthodes voir les applications ci-dessous : |+ *** |+ [[Mathc initiation/Fichiers h : c77be|sin(x)**2]] ..... [[Mathc initiation/Fichiers h : c77da|sin(x)sin(y)]] ..... [[Mathc initiation/Fichiers h : c77bd|cos(x)sin(x)]] |+ [[Mathc initiation/Fichiers h : c78fx|sinh(x)**2]] ..... [[Mathc initiation/Fichiers h : c78gx|sinh(x)sinh(y)]] ..... [[Mathc initiation/Fichiers h : c78dd|cosh(x)sinh(x)]] |- ! Fonctions trigonométriques : !! Fonctions trigonométriques hyperbolique: |- || * . * . * [[Mathc initiation/Fichiers h : c74b01|fa.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c01|c1a.c : ..... "sec(x)";]] * [[Mathc initiation/Fichiers h : c74b02|fb.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c02|c1b.c : ..... "csc(x)";]] * [[Mathc initiation/Fichiers h : c74b03|fc.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c03|c1c.c : ..... "tan(x)";]] * [[Mathc initiation/Fichiers h : c74b04|fd.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c04|c1d.c : ..... "cot(x)";]] * [[Mathc initiation/Fichiers h : c71b03|fc.h ]] : <...............> [[Mathc initiation/Fichiers c : c71c03|c1c.c : ..... "asin(x)";]] * [[Mathc initiation/Fichiers h : c71b04|fd.h ]] : <...............> [[Mathc initiation/Fichiers c : c71c04|c1d.c : ..... "acos(x)";]] * [[Mathc initiation/Fichiers h : c71b02|fb.h ]] : <...............> [[Mathc initiation/Fichiers c : c71c02|c1b.c : ..... "atan(x)";]] * [[Mathc initiation/Fichiers c : c77cd3|Étude de : <........> cos(x)**m sin(x)**n (m)]] * [[Mathc initiation/Fichiers c : c77cd4|Étude de : <........> cos(x)**m sin(x)**n (n)]] * [[Mathc initiation/Fichiers c : c77cd5|Étude de : <........> cos(x)**m sin(x)**n (mn)]] * [[Mathc initiation/Fichiers c : c77cd6|Étude de : <........> tan(x)**m sec(x)**n (n)]] * [[Mathc initiation/Fichiers h : c79a|fa.h ]] : <...............> [[Mathc initiation/Fichiers c : c79a|c1a.c : ..... "sec(x)**2";]] * [[Mathc initiation/Fichiers h : c79b|fb.h ]] : <...............> [[Mathc initiation/Fichiers c : c79b|c1b.c : ..... "csc(x)**2";]] * [[Mathc initiation/Fichiers h : c79c|fc.h ]] : <...............> [[Mathc initiation/Fichiers c : c79c|c1c.c : ..... "sec(x)tan(x)";]] * [[Mathc initiation/Fichiers h : c79d|fd.h ]] : <...............> [[Mathc initiation/Fichiers c : c79d|c1d.c : ..... "csc(x)cot(x)";]] * [[Mathc initiation/Fichiers h : c79i|fi.h ]] : <................> [[Mathc initiation/Fichiers c : c79i|c1i.c : ...... "1/sqrt(1-x**2)";]] * [[Mathc initiation/Fichiers h : c79j|fj.h ]] : <................> [[Mathc initiation/Fichiers c : c79j|c1j.c : ...... "1/(x**2+1)";]] * [[Mathc initiation/Fichiers h : c79k|fk.h ]] : <...............> [[Mathc initiation/Fichiers c : c79k|c1k.c : ..... "1/(x sqrt(x**2-1))";]] || * [[Mathc initiation/Fichiers h : c74b07|fg.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c07|c1g.c : ..... "sinh(x)";]] * [[Mathc initiation/Fichiers h : c74b08|fh.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c08|c1h.c : ..... "cosh(x)";]] * [[Mathc initiation/Fichiers h : c74b09|fi.h ]] : <................> [[Mathc initiation/Fichiers c : c74c09|c1i.c : ...... "sech(x)";]] * [[Mathc initiation/Fichiers h : c74b10|fj.h ]] : <................> [[Mathc initiation/Fichiers c : c74c10|c1j.c : ...... "csch(x)";]] * [[Mathc initiation/Fichiers h : c74b05|fe.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c05|c1e.c : ..... "tanh(x)";]] * [[Mathc initiation/Fichiers h : c74b06|ff.h ]] : <................> [[Mathc initiation/Fichiers c : c74c06|c1f.c : ...... "coth(x)";]] * [[Mathc initiation/Fichiers h : c71b06|fe.h ]] <................> [[Mathc initiation/Fichiers c : c71c06|c1e.c : ...... "asinh(x)";]] * [[Mathc initiation/Fichiers h : c71b07|ff.h ]] <.................> [[Mathc initiation/Fichiers c : c71c07|c1f.c : ....... "acosh(x)";]] * [[Mathc initiation/Fichiers h : c71b08|fg.h ]] <................> [[Mathc initiation/Fichiers c : c71c08|c1g.c : ...... "atanh(x)";]] *. *. *. *. * [[Mathc initiation/Fichiers h : c79e|fe.h ]] : <...............> [[Mathc initiation/Fichiers c : c79e|c1e.c : ..... "sech(x)**2";]] * [[Mathc initiation/Fichiers h : c79f|ff.h ]] : <................> [[Mathc initiation/Fichiers c : c79f|c1f.c : ...... "csch(x)**2";]] * [[Mathc initiation/Fichiers h : c79g|fg.h ]] : <...............> [[Mathc initiation/Fichiers c : c79g|c1g.c : ..... "sech(x)*tanh(x)";]] * [[Mathc initiation/Fichiers h : c79h|fh.h ]] : <...............> [[Mathc initiation/Fichiers c : c79h|c1h.c : ..... "csch(x)*coth(x)";]] * [[Mathc initiation/Fichiers h : c79l|fl.h ]] : <................> [[Mathc initiation/Fichiers c : c79l|c1l.c : ...... "1/sqrt(1+x**2)";]] * [[Mathc initiation/Fichiers h : c79m|fm.h ]] : <..............> [[Mathc initiation/Fichiers c : c79m|c1m.c : .... "1/(1-x**2)";]] * [[Mathc initiation/Fichiers h : c79n|fn.h ]] : <...............> [[Mathc initiation/Fichiers c : c79n|c1n.c : ..... "-1/(x sqrt(1-x**2))";]] |} {| class="wikitable" |+ . |- ! Fonctions exponentielles : !! Fonctions logarithmes : |- || *. *. || * [[Mathc initiation/Fichiers h : c71b01|fa.h ]] <................> [[Mathc initiation/Fichiers c : c71c01|c1a.c : ...... "ln(x)";]] * [[Mathc initiation/Fichiers c : c71c05| Étude de : <......> "ln(x)**n";]] |} <br> ---- {{AutoCat}} mr5kl9ph97qty2trlwjzogh158dwo48 682834 682832 2022-07-28T20:21:25Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] : [[Mathc initiation/a08| Sommaire]] : ----{{Partie{{{type|}}}|Intégrer les fonctions élémentaires (Sympson)|fond={{{fond|}}<nowiki>}</nowiki>}} : En mathématiques, l'intégration est le fait de calculer une intégrale. C'est aussi une des deux branches du calcul infinitésimal, appelée également calcul intégral, l'autre étant le calcul différentiel..[https://fr.wikipedia.org/wiki/Int%C3%A9gration_(math%C3%A9matiques)] : <br> Copier la bibliothèque dans votre répertoire de travail : * [[Mathc initiation/Fichiers h : c74a1|x_hfile.h ............ Déclaration des fichiers h]] * [[Mathc initiation/Fichiers h : c74a2|x_def.h .............. Les utilitaires]] * [[Mathc initiation/Fichiers h : c74a3|x_symp.h ......... L'algorithme pour la méthode sympson]] : <br> {| class="wikitable" |+ Calculer les intégrales élémentaires |+ *** |+ Pour d'autres méthodes voir les applications ci-dessous : |+ *** |+ [[Mathc initiation/Fichiers h : c77be|sin(x)**2]] ..... [[Mathc initiation/Fichiers h : c77da|sin(x)sin(y)]] ..... [[Mathc initiation/Fichiers h : c77bd|cos(x)sin(x)]] |+ [[Mathc initiation/Fichiers h : c78fx|sinh(x)**2]] ..... [[Mathc initiation/Fichiers h : c78gx|sinh(x)sinh(y)]] ..... [[Mathc initiation/Fichiers h : c78dd|cosh(x)sinh(x)]] |- ! Fonctions trigonométriques : !! Fonctions trigonométriques hyperbolique: |- || * . * . * [[Mathc initiation/Fichiers h : c74b01|fa.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c01|c1a.c : ..... "sec(x)";]] * [[Mathc initiation/Fichiers h : c74b02|fb.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c02|c1b.c : ..... "csc(x)";]] * [[Mathc initiation/Fichiers h : c74b03|fc.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c03|c1c.c : ..... "tan(x)";]] * [[Mathc initiation/Fichiers h : c74b04|fd.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c04|c1d.c : ..... "cot(x)";]] * [[Mathc initiation/Fichiers h : c71b03|fc.h ]] : <...............> [[Mathc initiation/Fichiers c : c71c03|c1c.c : ..... "asin(x)";]] * [[Mathc initiation/Fichiers h : c71b04|fd.h ]] : <...............> [[Mathc initiation/Fichiers c : c71c04|c1d.c : ..... "acos(x)";]] * [[Mathc initiation/Fichiers h : c71b02|fb.h ]] : <...............> [[Mathc initiation/Fichiers c : c71c02|c1b.c : ..... "atan(x)";]] * [[Mathc initiation/Fichiers c : c77cd3|Étude de : <........> cos(x)**m sin(x)**n (m)]] * [[Mathc initiation/Fichiers c : c77cd4|Étude de : <........> cos(x)**m sin(x)**n (n)]] * [[Mathc initiation/Fichiers c : c77cd5|Étude de : <........> cos(x)**m sin(x)**n (mn)]] * [[Mathc initiation/Fichiers c : c77cd6|Étude de : <........> tan(x)**m sec(x)**n (n)]] * [[Mathc initiation/Fichiers c : c77cd7|Étude de : <........> tan(x)**m sec(x)**n (m)]] * [[Mathc initiation/Fichiers h : c79a|fa.h ]] : <...............> [[Mathc initiation/Fichiers c : c79a|c1a.c : ..... "sec(x)**2";]] * [[Mathc initiation/Fichiers h : c79b|fb.h ]] : <...............> [[Mathc initiation/Fichiers c : c79b|c1b.c : ..... "csc(x)**2";]] * [[Mathc initiation/Fichiers h : c79c|fc.h ]] : <...............> [[Mathc initiation/Fichiers c : c79c|c1c.c : ..... "sec(x)tan(x)";]] * [[Mathc initiation/Fichiers h : c79d|fd.h ]] : <...............> [[Mathc initiation/Fichiers c : c79d|c1d.c : ..... "csc(x)cot(x)";]] * [[Mathc initiation/Fichiers h : c79i|fi.h ]] : <................> [[Mathc initiation/Fichiers c : c79i|c1i.c : ...... "1/sqrt(1-x**2)";]] * [[Mathc initiation/Fichiers h : c79j|fj.h ]] : <................> [[Mathc initiation/Fichiers c : c79j|c1j.c : ...... "1/(x**2+1)";]] * [[Mathc initiation/Fichiers h : c79k|fk.h ]] : <...............> [[Mathc initiation/Fichiers c : c79k|c1k.c : ..... "1/(x sqrt(x**2-1))";]] || * [[Mathc initiation/Fichiers h : c74b07|fg.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c07|c1g.c : ..... "sinh(x)";]] * [[Mathc initiation/Fichiers h : c74b08|fh.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c08|c1h.c : ..... "cosh(x)";]] * [[Mathc initiation/Fichiers h : c74b09|fi.h ]] : <................> [[Mathc initiation/Fichiers c : c74c09|c1i.c : ...... "sech(x)";]] * [[Mathc initiation/Fichiers h : c74b10|fj.h ]] : <................> [[Mathc initiation/Fichiers c : c74c10|c1j.c : ...... "csch(x)";]] * [[Mathc initiation/Fichiers h : c74b05|fe.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c05|c1e.c : ..... "tanh(x)";]] * [[Mathc initiation/Fichiers h : c74b06|ff.h ]] : <................> [[Mathc initiation/Fichiers c : c74c06|c1f.c : ...... "coth(x)";]] * [[Mathc initiation/Fichiers h : c71b06|fe.h ]] <................> [[Mathc initiation/Fichiers c : c71c06|c1e.c : ...... "asinh(x)";]] * [[Mathc initiation/Fichiers h : c71b07|ff.h ]] <.................> [[Mathc initiation/Fichiers c : c71c07|c1f.c : ....... "acosh(x)";]] * [[Mathc initiation/Fichiers h : c71b08|fg.h ]] <................> [[Mathc initiation/Fichiers c : c71c08|c1g.c : ...... "atanh(x)";]] *. *. *. *. *. * [[Mathc initiation/Fichiers h : c79e|fe.h ]] : <...............> [[Mathc initiation/Fichiers c : c79e|c1e.c : ..... "sech(x)**2";]] * [[Mathc initiation/Fichiers h : c79f|ff.h ]] : <................> [[Mathc initiation/Fichiers c : c79f|c1f.c : ...... "csch(x)**2";]] * [[Mathc initiation/Fichiers h : c79g|fg.h ]] : <...............> [[Mathc initiation/Fichiers c : c79g|c1g.c : ..... "sech(x)*tanh(x)";]] * [[Mathc initiation/Fichiers h : c79h|fh.h ]] : <...............> [[Mathc initiation/Fichiers c : c79h|c1h.c : ..... "csch(x)*coth(x)";]] * [[Mathc initiation/Fichiers h : c79l|fl.h ]] : <................> [[Mathc initiation/Fichiers c : c79l|c1l.c : ...... "1/sqrt(1+x**2)";]] * [[Mathc initiation/Fichiers h : c79m|fm.h ]] : <..............> [[Mathc initiation/Fichiers c : c79m|c1m.c : .... "1/(1-x**2)";]] * [[Mathc initiation/Fichiers h : c79n|fn.h ]] : <...............> [[Mathc initiation/Fichiers c : c79n|c1n.c : ..... "-1/(x sqrt(1-x**2))";]] |} {| class="wikitable" |+ . |- ! Fonctions exponentielles : !! Fonctions logarithmes : |- || *. *. || * [[Mathc initiation/Fichiers h : c71b01|fa.h ]] <................> [[Mathc initiation/Fichiers c : c71c01|c1a.c : ...... "ln(x)";]] * [[Mathc initiation/Fichiers c : c71c05| Étude de : <......> "ln(x)**n";]] |} <br> ---- {{AutoCat}} m5pz6d2errrbaqf0qj8nwkm6ylqsgnj 682845 682834 2022-07-28T20:41:37Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] : [[Mathc initiation/a08| Sommaire]] : ----{{Partie{{{type|}}}|Intégrer les fonctions élémentaires (Sympson)|fond={{{fond|}}<nowiki>}</nowiki>}} : En mathématiques, l'intégration est le fait de calculer une intégrale. C'est aussi une des deux branches du calcul infinitésimal, appelée également calcul intégral, l'autre étant le calcul différentiel..[https://fr.wikipedia.org/wiki/Int%C3%A9gration_(math%C3%A9matiques)] : <br> Copier la bibliothèque dans votre répertoire de travail : * [[Mathc initiation/Fichiers h : c74a1|x_hfile.h ............ Déclaration des fichiers h]] * [[Mathc initiation/Fichiers h : c74a2|x_def.h .............. Les utilitaires]] * [[Mathc initiation/Fichiers h : c74a3|x_symp.h ......... L'algorithme pour la méthode sympson]] : <br> {| class="wikitable" |+ Calculer les intégrales élémentaires |+ *** |+ Pour d'autres méthodes voir les applications ci-dessous : |+ *** |+ [[Mathc initiation/Fichiers h : c77be|sin(x)**2]] ..... [[Mathc initiation/Fichiers h : c77da|sin(x)sin(y)]] ..... [[Mathc initiation/Fichiers h : c77bd|cos(x)sin(x)]] |+ [[Mathc initiation/Fichiers h : c78fx|sinh(x)**2]] ..... [[Mathc initiation/Fichiers h : c78gx|sinh(x)sinh(y)]] ..... [[Mathc initiation/Fichiers h : c78dd|cosh(x)sinh(x)]] |+ [[Mathc initiation/Fichiers h : c77dg|cos**m sin**n]] |- ! Fonctions trigonométriques : !! Fonctions trigonométriques hyperbolique: |- || * . * . * [[Mathc initiation/Fichiers h : c74b01|fa.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c01|c1a.c : ..... "sec(x)";]] * [[Mathc initiation/Fichiers h : c74b02|fb.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c02|c1b.c : ..... "csc(x)";]] * [[Mathc initiation/Fichiers h : c74b03|fc.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c03|c1c.c : ..... "tan(x)";]] * [[Mathc initiation/Fichiers h : c74b04|fd.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c04|c1d.c : ..... "cot(x)";]] * [[Mathc initiation/Fichiers h : c71b03|fc.h ]] : <...............> [[Mathc initiation/Fichiers c : c71c03|c1c.c : ..... "asin(x)";]] * [[Mathc initiation/Fichiers h : c71b04|fd.h ]] : <...............> [[Mathc initiation/Fichiers c : c71c04|c1d.c : ..... "acos(x)";]] * [[Mathc initiation/Fichiers h : c71b02|fb.h ]] : <...............> [[Mathc initiation/Fichiers c : c71c02|c1b.c : ..... "atan(x)";]] * [[Mathc initiation/Fichiers h : c79a|fa.h ]] : <...............> [[Mathc initiation/Fichiers c : c79a|c1a.c : ..... "sec(x)**2";]] * [[Mathc initiation/Fichiers h : c79b|fb.h ]] : <...............> [[Mathc initiation/Fichiers c : c79b|c1b.c : ..... "csc(x)**2";]] * [[Mathc initiation/Fichiers h : c79c|fc.h ]] : <...............> [[Mathc initiation/Fichiers c : c79c|c1c.c : ..... "sec(x)tan(x)";]] * [[Mathc initiation/Fichiers h : c79d|fd.h ]] : <...............> [[Mathc initiation/Fichiers c : c79d|c1d.c : ..... "csc(x)cot(x)";]] * [[Mathc initiation/Fichiers h : c79i|fi.h ]] : <................> [[Mathc initiation/Fichiers c : c79i|c1i.c : ...... "1/sqrt(1-x**2)";]] * [[Mathc initiation/Fichiers h : c79j|fj.h ]] : <................> [[Mathc initiation/Fichiers c : c79j|c1j.c : ...... "1/(x**2+1)";]] * [[Mathc initiation/Fichiers h : c79k|fk.h ]] : <...............> [[Mathc initiation/Fichiers c : c79k|c1k.c : ..... "1/(x sqrt(x**2-1))";]] || * [[Mathc initiation/Fichiers h : c74b07|fg.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c07|c1g.c : ..... "sinh(x)";]] * [[Mathc initiation/Fichiers h : c74b08|fh.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c08|c1h.c : ..... "cosh(x)";]] * [[Mathc initiation/Fichiers h : c74b09|fi.h ]] : <................> [[Mathc initiation/Fichiers c : c74c09|c1i.c : ...... "sech(x)";]] * [[Mathc initiation/Fichiers h : c74b10|fj.h ]] : <................> [[Mathc initiation/Fichiers c : c74c10|c1j.c : ...... "csch(x)";]] * [[Mathc initiation/Fichiers h : c74b05|fe.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c05|c1e.c : ..... "tanh(x)";]] * [[Mathc initiation/Fichiers h : c74b06|ff.h ]] : <................> [[Mathc initiation/Fichiers c : c74c06|c1f.c : ...... "coth(x)";]] * [[Mathc initiation/Fichiers h : c71b06|fe.h ]] <................> [[Mathc initiation/Fichiers c : c71c06|c1e.c : ...... "asinh(x)";]] * [[Mathc initiation/Fichiers h : c71b07|ff.h ]] <.................> [[Mathc initiation/Fichiers c : c71c07|c1f.c : ....... "acosh(x)";]] * [[Mathc initiation/Fichiers h : c71b08|fg.h ]] <................> [[Mathc initiation/Fichiers c : c71c08|c1g.c : ...... "atanh(x)";]] * [[Mathc initiation/Fichiers h : c79e|fe.h ]] : <...............> [[Mathc initiation/Fichiers c : c79e|c1e.c : ..... "sech(x)**2";]] * [[Mathc initiation/Fichiers h : c79f|ff.h ]] : <................> [[Mathc initiation/Fichiers c : c79f|c1f.c : ...... "csch(x)**2";]] * [[Mathc initiation/Fichiers h : c79g|fg.h ]] : <...............> [[Mathc initiation/Fichiers c : c79g|c1g.c : ..... "sech(x)*tanh(x)";]] * [[Mathc initiation/Fichiers h : c79h|fh.h ]] : <...............> [[Mathc initiation/Fichiers c : c79h|c1h.c : ..... "csch(x)*coth(x)";]] * [[Mathc initiation/Fichiers h : c79l|fl.h ]] : <................> [[Mathc initiation/Fichiers c : c79l|c1l.c : ...... "1/sqrt(1+x**2)";]] * [[Mathc initiation/Fichiers h : c79m|fm.h ]] : <..............> [[Mathc initiation/Fichiers c : c79m|c1m.c : .... "1/(1-x**2)";]] * [[Mathc initiation/Fichiers h : c79n|fn.h ]] : <...............> [[Mathc initiation/Fichiers c : c79n|c1n.c : ..... "-1/(x sqrt(1-x**2))";]] |} {| class="wikitable" |+ . |- ! Fonctions exponentielles : !! Fonctions logarithmes : |- || *. *. || * [[Mathc initiation/Fichiers h : c71b01|fa.h ]] <................> [[Mathc initiation/Fichiers c : c71c01|c1a.c : ...... "ln(x)";]] * [[Mathc initiation/Fichiers c : c71c05| Étude de : <......> "ln(x)**n";]] |} <br> ---- {{AutoCat}} nseajx0oqiq9d1tooy93mo5wgq3e6k1 Mathc initiation/a77 0 78317 682836 681035 2022-07-28T20:29:46Z Xhungab 23827 modification mineure wikitext text/x-wiki __NOTOC__ [[Catégorie:Mathc initiation (livre)]] : : [[Mathc initiation/a79| Sommaire]] ----{{Partie{{{type|}}}|La trigonométrie|fond={{{fond|}}<nowiki>}</nowiki>}} : La trigonométrie est une branche des mathématiques qui traite des relations entre distances et angles dans les triangles et des fonctions trigonométriques telles que sinus, cosinus, tangente.. [https://fr.wikipedia.org/wiki/Trigonom%C3%A9trie wikipedia] : <br> Copier la bibliothèque dans votre répertoire de travail : * [[Mathc initiation/Fichiers h : c77a1|x_hfile.h ............. Déclaration des fichiers h]] * [[Mathc initiation/Fichiers h : c77a2|x_def.h .............. Déclaration des utilitaires]] * [[Mathc initiation/Fichiers h : c77a5|Liste des équations trigonométriques étudiées]] ** [[Mathc initiation/Fichiers h : c77a3|Liste des fonctions trigonométriques du c]] ** [[Mathc initiation/Fichiers h : c77a4|Les fonctions trigonométriques de bases dans gnuplot]] * [[Mathc initiation/Fichiers h : c77de|Les formes : ]] ** '''sin(x)**2+cos(x)**2''' = 1 * [[Mathc initiation/Fichiers h : c77bs|Les formes : ]] ** '''sin(x+y)''' = cos(x) sin(y) + sin(x) cos(y) * [[Mathc initiation/Fichiers h : c77bd|Les formes : ]] ** '''sin(2x)''' = 2 cos(x) sin(x) * [[Mathc initiation/Fichiers h : c77be|Les formes : ]] ** '''sin(x)**2''' = 1/2 - 1/2 cos(2x) * [[Mathc initiation/Fichiers h : c77bf|Les formes : ]] ** '''sin(x/2)''' = sqrt((1 - cos(x)) / 2) * [[Mathc initiation/Fichiers h : c77da|Les formes : ]] ** '''sin(x)sin(y)''' = 1/2 [cos(x-y) - cos(x+y)] * [[Mathc initiation/Fichiers h : c77db|Les formes : ]] ** '''sin(x)+sin(y)''' = 2 sin( (x+y)/2 ) cos( (x-y)/2 ) * [[Mathc initiation/Fichiers h : c77dc|Les formes : ]] ** '''sin(acos(x))''' = sqrt(1-x**2) * [[Mathc initiation/Fichiers h : c77dg|Application : ]] ** '''cos(x)**m sin(x)**n''' : ---- {{AutoCat}} hxc4pbxgwgdu8ei03vxusdc1034g28e Mathc initiation/a78 0 78505 682932 682113 2022-07-29T11:11:21Z Xhungab 23827 modification mineure wikitext text/x-wiki __NOTOC__ [[Catégorie:Mathc initiation (livre)]] : : [[Mathc initiation/a79| Sommaire]] ----{{Partie{{{type|}}}|La trigonométrie hyperbolique g|fond={{{fond|}}<nowiki>}</nowiki>}} : En mathématiques, on appelle fonctions hyperboliques les fonctions cosinus hyperbolique, sinus hyperbolique et tangente hyperbolique... [https://fr.wikipedia.org/wiki/Fonction_hyperbolique Wikipédia] : <br> Copier la bibliothèque dans votre répertoire de travail : * [[Mathc initiation/Fichiers h : c78a1|x_hfile.h ............. Déclaration des fichiers h]] * [[Mathc initiation/Fichiers h : c78a2|x_def.h .............. Déclaration des utilitaires]] * [[Mathc initiation/Fichiers h : c78a5|Liste des équations étudiées]] ** [[Mathc initiation/Fichiers h : c78a3|Liste des fonctions trigonométriques hyperbolique du c]] * [[Mathc initiation/Fichiers h : c78de|Les formes : ]] ** '''cosh(x)**2-sinh(x)**2''' = 1 * [[Mathc initiation/Fichiers h : c78bs|Les formes : ]] ** '''sinh(x+y)''' = cosh(x) sinh(y) + sinh(x) cosh(y) * [[Mathc initiation/Fichiers h : c78dd|Les formes : ]] ** '''sinh(2x)''' = 2 cosh(x) sinh(x) * [[Mathc initiation/Fichiers h : c78fx|Les formes :]] ** '''sinh(x)**2''' = 1/2 cosh(2x) + 1/2 * [[Mathc initiation/Fichiers h : c78gx|Les formes :]] ** '''sinh(x)sinh(y)''' = 1/2 [cosh(x+y) - cosh(x-y)] * [[Mathc initiation/Fichiers h : c78hx|Les formes : ]] ** '''sinh(x)+sinh(y)''' = 2 sinh( (x+y)/2 ) cosh( (x-y)/2 ) * [[Mathc initiation/Fichiers h : c78dc|Les formes : ]] ** '''sinh(acosh(x))''' = sqrt(x**2 -1) * [[Mathc initiation/Fichiers h : c78dg|Application : ]] ** '''cosh(x)**m sinh(x)**n''' : ---- {{AutoCat}} k9zef3l24temgrbs8prrlt7xk9waqor Fonctionnement d'un ordinateur/Le Translation Lookaside Buffer 0 78680 682815 682805 2022-07-28T13:06:58Z Mewtow 31375 /* Les Page walk caches */ wikitext text/x-wiki Dans le chapitre sur la mémoire virtuelle, nous avions abordé la pagination. Nous avions vu que la traduction des adresses virtuelles en adresses physiques se fait grâce à une table des pages située en mémoire RAM, qui contient les correspondances entre adresses physiques et virtuelles. Pour éviter d'avoir à lire la table des pages en mémoire RAM à chaque accès mémoire, les concepteurs de processeurs ont décidé d'implanter un cache dédié, le '''''translation lookaside buffer''''', ou TLB. Il stocke les entrées de la page des tables les plus récemment accédées. [[File:MMU principle updated.png|centre|vignette|upright=2.0|MMU avec une TLB.]] Les caches consomment beaucoup d'énergie et la TLB ne fait pas exception. Diverses estimations montrent que les TLB sont très consommatrices en énergie. Près de 5 à 15% de la consommation d'énergie d'un processeur provient de sa TLB et des circuits associés. Pour réduire cette consommation tout en gardant des performances très importantes, la TLB est conçue avec ces contraintes en tête. Notamment, la TLB est généralement un cache associatif par voie ou directement adressé, et non un cache totalement associatif. Les caches totalement associatifs consomment en effet beaucoup plus d'énergie pour fonctionner que les autres types de caches, pour des performances légèrement meilleures. Le cout en énergie ne vaut pas les performances gagnées, pour une LTB. Pour des raisons de performances, la TLB est parfois découpée en plusieurs sous-caches L1, L2, L3, etc. Sur les architectures Harvard et Harvard modifiées, on trouve parfois deux TLB séparés : un pour les accès aux instructions, et un pour les accès aux données. L'architecture standard pour les TLBs actuelles est la suivante : une TLB de niveau 1 pour les instructions, une autre TLB de niveau 1 pour les données, puis une TLB de niveaux 2 partagée entre instructions et données. La séparation en une TLB L1 pour les instructions et une pour les données est nécessaire sur les architectures à hautes performances. Les processeurs modernes peuvent exécuter plusieurs instructions simultanément, ce qui fait qu'ils accèdent souvent à des données en même temps qu'ils chargent une ou plusieurs instructions. Une TLB unique devrait gérer plusieurs dizaines d'accès en même temps pour alimenter le processeur en données/instructions. La TLB doit alors être une mémoire multiports avec beaucoup de ports, beaucoup trop de ports pour être performante. Utiliser deux TLB séparées élimine ce problème, en limitant le nombre de ports sur chaque TLB. Un autre problème est que le programme prend moins de place que les données, ce qui se marie mal avec une TLB unique mais colle assez bien avec une TLB d'instruction plus petite que celle pour les données. [[File:Hiérarchie de TLB.png|centre|vignette|upright=2|Hiérarchie de TLB.]] ==L'accès à la TLB : succès et défauts d'accès== À chaque accès mémoire, le processeur vérifie si le TLB contient l'adresse physique à laquelle accéder. Si c'est le cas, le processeur n'a pas à accéder à la table des pages en mémoire RAM et lit directement l'information nécessaire depuis ce TLB. On dit que l'on a un succès d'accès à la TLB. Si la TLb ne contient pas l'adresse physique demandée, on fait face à un '''défaut d'accès à la TLB'''. L'accès à la table des pages en mémoire RAM est alors inévitable. [[File:Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Translation Lookaside Buffer]] ===La traduction d'adresse avec la TLB=== [[File:Page table actions.svg|vignette|Page table actions]] La traduction d'une adresse avec une TLB a lieu comme suit. Premièrement, le processeur (sa MMU) interroge la TLB : il envoie l'adresse virtuelle et la TLB répond. Si la TLB contient l'adresse physique associée, elle la fournit directement et le processeur au cache ou à la RAM directement. Si ce n'est pas le cas, le processeur accède à la table des pages en mémoire RAM. Si la page est en RAM, alors la table des pages renvoie l'adresse physique voulue et la TLB est mise à jour. Par contre, si la page n'est pas en RAM, mais a été swappée sur le disque dur, la page est recopiée en mémoire RAM, la table des pages est mise à jour, puis la TLB l'est ensuite. [[File:Steps In a Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Steps In a Translation Lookaside Buffer]] ===Les ''page table walkers''=== Les défauts d'accès à la TLB sont gérés de deux façons : soit le processeur gère tout seul la situation, soit il délègue cette tâche au système d’exploitation. Sur les processeurs anciens, le système d'exploitation gère le défaut d'accès à la TLB. En cas de défaut, le processeur lève une exception matérielle spécialisée, qui exécute une routine d'interruption qui accède à la table des pages en RAM et effectue la traduction d'adresse. Mais cette solution logicielle n'a pas de bonnes performances. D'autres processeurs gèrent eux-mêmes le défaut d'accès à la TLB et vont chercher d'eux-mêmes les informations nécessaires dans la table des pages. Ils disposent de circuits, les '''''page table walkers''''' (PTW), qui s'occupent eux-mêmes du défaut. L'avantage en termes de performance est certain : plus besoin de lever une exception matérielle, plus besoin de lever une interruption couteuse à chaque défaut de TLB. Un autre avantage est que la gestion des bits de statut, qui mémorisent des informations sur chaque page, est gérée par le PTW. Sur les processeurs superscalaires à exécution dans le désordre qu'on abordera dans quelques chapitres, les PWT peuvent gérer un défaut de TLB pendant que le processeur fait d'autres opérations en parallèle, ce que ne permet pas la solution logicielle. Mieux : les PWT et TLB modernes sont conçus pour gérer plusieurs défauts simultanés, ce qui permet de grandement gagner en performance par rapport à l'approche logicielle. Le défaut principal des PWT est qu'ils sont conçus pour un format bien précis de table des pages, éventuellement deux ou trois autres, mais guère plus. Il est rare qu'ils gèrent plusieurs types de tables des pages différents. Leur flexibilité est donc assez faible. En comparaison, la solution logicielle n'a pas de limites précises, tant que le système d'exploitation gère le format de table des pages voulu. Les PTW sont généralement implémentés avec des circuits séquentiels spécifiques, nommés machines à état. Ils ont besoin, pour faire leur travail, de mémoriser l'adresse de la table des pages, ou du moins l'adresse de la table des pages de niveau 1 pour des tables des pages hiérarchiques. L'adresse de la table des pages est mémorisée dans un registre spécialisé, manipulé seulement par le système d'exploitation. Les informations nécessaires pour gérer chaque défaut de TLB sont stockées dans des registres spécialisés appelés des tampons de PTW (''PTW buffers''). Sur les architectures à plusieurs processeurs, chaque cœur ou processeur a son propre PTW. Dans le cas le plus simple, la table des pages est une table des pages simple, unique, qui contient des numéros de page physique. Le PTW a juste besoin de calculer une adresse et de faire une lecture pour récupérer le numéro de page physique. Dans le cas où la table des pages est hiérarchique, le processus doit être répété plusieurs fois, autant de fois qu'il faut passer d'une table des pages à la suivante. Dans le cas d'une table des pages inversée, le PTW doit parcourir automatiquement la mémoire pour lire chaque entrée de la table des pages une par une, faire une comparaison pour détecter la bonne entrée, puis déclencher une lecture une fois la bonne entrée détectée. Le processus est donc simple sur une table des pages unique, mais plus complexe dans les autres cas. La difficulté est de parcourir la mémoire. Pour le cas des pages des tables inversées, parcourir la mémoire en lisant des adresses consécutives est simple : un simple compteur d'adresse suffit. Par contre, le processus est plus complexe pour les tables des pages hiérarchiques, et demande généralement une implémentation avec du microcode. Le PWT communique alors avec le séquenceur pour lui demander d’exécuter une suite d’instructions microcodée pour gérer le défaut. ===Les ''Page walk caches''=== Pour accélérer le parcours de ou des tables des pages, l'unité de gestion mémoire (la MMU) des processeurs modernes incorpore des caches spécialisés, qui mémorisent des morceaux de la table des pages. La MMU contient des caches pour accélérer le parcours des tables des pages hiérarchiques, qui sont appelés des ''MMU caches'' ou encore caches de la MMU en français. Ils sont différents des TLB proprement dit sur plusieurs points. Les TLB proprement dites existent sur les ordinateurs avec des tables des pages hiérarchiques, mais elles sont séparées des caches de la MMU. La différence principale entre TLB et cache de la MMU tient dans leur contenu. Les TLB stockent des correspondances adresse logique-physique obtenues une fois qu'on a parcouru l'ensemble des niveaux d'une table des pages à la recherche d'une adresse physique précise, pas le contenu des tables des pages elles-mêmes. Les caches de la MMU, quant à eux, mémorisent les données lues dans les tables de page accédées lors des défauts de TLB les plus récents. Ils stockent les correspondances de la table de niveau 1 ou les autres tables des pages de niveau supérieur. Ils sont très utiles, car les accès mémoires ont une bonne localité spatiale, ce qui fait que des accès consécutifs ont des chances d’accéder aux mêmes entrées de la table de niveau 1 et de niveau 2, voire des niveaux 3 et 4. Il faut dire que sur les ordinateurs x86 64 bits, une entrée de la table des pages de premier niveau correspond à 512 gibioctets de mémoire... Il existe plusieurs manières de concevoir les caches de la MMU. La première est tout simplement d'associer une entrée de la table des pages avec son adresse physique, l'adresse physique servant de tag et l'entrée prenant une ligne de cache. C'est ce qui est fait sur les ''page walk caches'' des processeurs AMD. Ils se marient bien avec le fonctionnement normal du ''page table walker'', qui génère des adresses physiques. Une autre approche associe certains bits de l'adresse virtuelle à lire/écrire avec une entrée, au lieu de l'adresse physique de l'entrée. Par exemple, les bits de poids fort qui sont utilisés pour adresser la table de premier niveau sont utilisés comme tag dans le cache de la MMU. Même chose pour les bits précédents, qui servent à adresser la table de second niveau, et ainsi de suite. C’est ce qui est fait sur les ''paging structure cache'' des processeurs Intel. Une troisième approche est celle du '' translation path cache''. Si on compare les ''page walk caches'' avec les ''paging structure cache'', les ''page walk caches'' sont plus simples à fabriquer mais plus lents, alors que c'est l'inverse pour les ''paging structure caches''. Les ''page walk caches'' sont des caches normaux, sans particularité notable si ce n'est qu'ils sont intégrés à la MMU et qu'ils stockent des entrées des table de haut niveau de la table des pages. Ils sont donc aussi facile à fabriquer/concevoir que n'importe quel autre cache, voire plus facile vu que les entrées sont petites et ont peu de bits à stocker. Par contre, un défaut de TLB entraine plusieurs lectures consécutives dans un ''page walk caches''. Une première lecture pour récupérer l'entrée de la table de premier niveau, une seconde pour l'entrée adéquate de la table de second niveau, et ainsi de suite jusqu'à effectuer la lecture en mémoire. Le parcours de la table des pages s'effectue normalement, dans le même ordre que sans cache de MMU. Les ''paging structure cache'' permettent d'optimiser la recherche en sautant des étapes, ce qui rend le parcours de la table des pages beaucoup plus rapide si les entrées adéquates sont dans le cache. Il est possible d'utiliser un seul cache, qui mémorise les entrées des différents niveaux de la table des pages. Une autre possibilité est d'utiliser un cache pour chaque niveau de la table des pages. On a ainsi un cache pour la table de niveau 1, un autre pour les tables de niveau 2, etc. Faire ainsi facilite l'implémentation du remplacement des lignes de cache et améliore son efficacité. Un autre avantage est qu'il est plus facile de gérer plusieurs défauts simultanés. On peut accéder au cache pour la table de premier niveau en même temps qu'au cache pour les tables de second niveau, et idem pour les autres caches. ==Les pages larges et leur impact sur la TLB== Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages larges ont l'avantage d'utiliser la TLB de manière optimale. Pour une capacité de TLB identique, on peut adresser beaucoup plus de mémoire avec des pages larges, ce qui rend les défauts de TLB plus rares. Par contre, ces différentes tailles se marient mal avec une TLB unique. Un des problèmes est que les numéros de page physique n'ont pas le même nombre de bits suivant la taille des pages, ce qui pose des problèmes avec l'associativité de la TLB. Ce problème fait que l'usage d'une TLB unique est possible, mais pas forcément optimal. ===L'usage de plusieurs TLB, chacune dédiée à une taille de page=== L'usage d'une TLB unique pour toutes les tailles de page est possible et même courant pour la TLB de niveau 2 (L2). Mais les TLB de niveau 1 sont souvent séparées en plusieurs TLB, une par taille de page possible. Les TLB pour les pages larges sont souvent plus petites que la TLB pour les pages de 4 kibioctets, afin de profiter des économies de TLB liées aux pages larges. Un problème est que la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. Pour résoudre ce problème, toutes les TLB L1 sont accédées en parallèle lors d'un accès mémoire et le processeur sélectionne ensuite le résultat de celle qui correspond à la taille de page voulue. [[File:TLB pour plusieurs tailles de page.png|centre|vignette|upright=2|TLB pour plusieurs tailles de page]] ===L'usage d'une TLB unique pour toutes les tailles de page=== Les TLB de niveau 2 gèrent plusieurs tailles de page en même temps. Mais les techniques pour faire cela sont assez couteuses en circuits et en performances. Aussi, les techniques utilisées pour gérer plusieurs tailles de page sont couramment implémentées sur les TLB de niveau 2, mais sont impraticables sur les TLB de niveau 1. Les deux techniques qui permettent cela sont appelées le '''''hash-rehashing''''' et le '''''skewing'''''. Elles répondent à un problème assez simple à 'expliquer : la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. On doit accéder à la TLB en postulant que la page a une certaine taille, donc en précisant un numéro de page d'une certaine taille, pour ensuite avoir un défaut ou un succès de TLB. ====Le ''hash-rehashing''==== La première technique, celle du ''hash-rehashing'', consiste simplement à accéder la TLB en supposant que la page voulue a la taille usuelle, à savoir 4 kibioctets. En cas de succès de TLB, la page avait bien la taille supposée. Dans le cas contraire, on effectue un second accès en supposant que sa taille est de 2 mébioctets, et rebelote pour une page de 1-2 gibioctets en cas de défaut de TLB. Une fois toutes les tailles essayées, on accède à la table des pages en mémoire RAM. C'était la technique utilisée sur les processeurs Intel d’architecture Skylake et Broadwell. L'inconvénient est que les accès aux pages larges subissent une perte de performance notable, leur temps d'accès étant allongé. Cela est contrebalancé par le fait que ces tailles de page ont été inventées pour réduire le nombre de défauts de TLB, mais ces défauts sont assez rares pour l'impact soit seulement mitigé, pas compensé. L'allongement du temps d'accès peut être compensé par diverses méthodes. La première méthode est celle des '''accès simultanés à la TLB'''. Les TLB sont des caches assez performants, qui sont conçus pour être capables d'effectuer plusieurs accès en parallèle. On peut alors profiter de cette particularité pour lancer plusieurs accès au TLB en même temps, un par taille de page. Avec cette technique, les accès se faisant en parallèle et non l'un après l'autre, le temps d'accès est presque le même que si la TLB ne gérait qu'une seule taille de page. Le désavantage est que les multiples accès consomment de l'énergie et du courant, ce qui augmente la consommation énergétique de la TLB, qui est déjà très importante. La seconde solution est la '''prédiction de taille de page'''. L'idée est que le processeur tente de prédire quelle sera la taille de page, afin de tomber directement sur la bonne taille de page. Au lieu de tenter d'abord pour une page de 4 kibioctets, puis 2 mébioctets et enfin 1-2 Gibioctets, le processeur testera la taille de page la plus probable, puis la seconde plus probable, avant de tester la dernière taille de page possible. Le problème est alors de concevoir un circuit capable de réaliser cette prédiction. * Une manière simple mais extrêmement inefficace de faire cela est de mémoriser la taille des pages récemment accédées dans un cache spécialisé, qui mémorise la correspondance entre le numéro de la page et sa taille. La taille de la page est mémorisée dans ce cache, après le premier accès à cette page. Mais le défaut que le temps d'accès à ce cache de prédiction s'ajoute au temps d'accès à la TLBL2, ce qui en ruine totalement l'intérêt. Aussi, il faut trouver une solution alternative. * Une autre solution n'utilise pas le numéro de page, mais l'instruction responsable de l'accès à la TLB. Un accès à la TLB signifie un accès en mémoire RAM, qui est réalisé par une instruction. Instruction qui est identifiée par une adresse, elle-même située dans le ''program counter''. L'idée est que si une instruction est exécutée plusieurs fois, elle a tendance à accéder aux données d'une même page (localité spatiale). Ce n'est pas systématique, mais c'est une bonne supposition. On peut donc associer cette instruction à la taille de la page accédée récemment. Le cache de prédiction mémorise donc l'association entre adresse de cette instruction et taille de la page. Lors de l'accès mémoire, le ''program counter'' est récupéré et envoyé au cache de prédiction. En cas de succès d'accès, on obtient la taille de la page prédite. Cette méthode a le défaut que si plusieurs instructions accèdent à la même page, elles prendront chacune une ligne de cache dans le cache de prédiction et rien ne sera mutualisé. * Une solution alternative est de récupérer lune adresse virtuelle proche de l'adresse lue/écrite avant que l'accès mémoire soit démarré. L'idée est que lors du décodage de l'instruction d'accès mémoire, on récupère les registres utilisés, et on y accède pour lire en avance l'adresse virtuelle. Une dernière méthode consiste à '''amortir le temps d'accès en cas de défaut dans la TLB L2'''. L'idée est de démarrer un accès à la table des pages en RAM en parallèle de l'accès à la TLB L2. La raison est que le temps d'accès à la TLB L2, avec ''hash-rehashing'', est très long. Il est sensiblement proche du quart du temps de défaut de TLB. Si en plus il fallait rajouter le temps d'accès à la table des pages en cas de défaut, le temps d'accès total serait énorme. Mais en lançant une lecture spéculative de la table des pages, le temps d'accès en cas de défaut est partiellement amorti. Le temps d'accès en cas de succès de TLB L2 reste cependant le même. ====Le ''skewing''==== La technique du ''skewing'' est assez simple à comprendre pour qui se rappelle ce qu'est un cache associatif par voie, et encore plus un cache ''skew-associative''. L'idée est d'utiliser un cache associatif par voie, mais où chaque voie est dédiée à une taille de page bien définie. Un cache associatif à trois voie pourra ainsi avoir une voie pour les pages de 4 kibioctets, une voie pour les pages de 2 mébioctets et une dernière voie pour les pages de plusieurs gibioctets. Cette méthode est conceptuellement équivalente au fait d'utiliser un cache pour chaque taille, à quelques différences près. Notamment, cela permet de mutualiser des circuits qui auraient été dupliqués en utilisant des caches séparés. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le préchargement | prevTextLe préchargement | next=Le pipeline | nextText=Le pipeline }} </noinclude> 2o5ftfchy9r5o11bmaapobieeew01ey 682820 682815 2022-07-28T13:20:42Z Mewtow 31375 /* Les Page walk caches */ wikitext text/x-wiki Dans le chapitre sur la mémoire virtuelle, nous avions abordé la pagination. Nous avions vu que la traduction des adresses virtuelles en adresses physiques se fait grâce à une table des pages située en mémoire RAM, qui contient les correspondances entre adresses physiques et virtuelles. Pour éviter d'avoir à lire la table des pages en mémoire RAM à chaque accès mémoire, les concepteurs de processeurs ont décidé d'implanter un cache dédié, le '''''translation lookaside buffer''''', ou TLB. Il stocke les entrées de la page des tables les plus récemment accédées. [[File:MMU principle updated.png|centre|vignette|upright=2.0|MMU avec une TLB.]] Les caches consomment beaucoup d'énergie et la TLB ne fait pas exception. Diverses estimations montrent que les TLB sont très consommatrices en énergie. Près de 5 à 15% de la consommation d'énergie d'un processeur provient de sa TLB et des circuits associés. Pour réduire cette consommation tout en gardant des performances très importantes, la TLB est conçue avec ces contraintes en tête. Notamment, la TLB est généralement un cache associatif par voie ou directement adressé, et non un cache totalement associatif. Les caches totalement associatifs consomment en effet beaucoup plus d'énergie pour fonctionner que les autres types de caches, pour des performances légèrement meilleures. Le cout en énergie ne vaut pas les performances gagnées, pour une LTB. Pour des raisons de performances, la TLB est parfois découpée en plusieurs sous-caches L1, L2, L3, etc. Sur les architectures Harvard et Harvard modifiées, on trouve parfois deux TLB séparés : un pour les accès aux instructions, et un pour les accès aux données. L'architecture standard pour les TLBs actuelles est la suivante : une TLB de niveau 1 pour les instructions, une autre TLB de niveau 1 pour les données, puis une TLB de niveaux 2 partagée entre instructions et données. La séparation en une TLB L1 pour les instructions et une pour les données est nécessaire sur les architectures à hautes performances. Les processeurs modernes peuvent exécuter plusieurs instructions simultanément, ce qui fait qu'ils accèdent souvent à des données en même temps qu'ils chargent une ou plusieurs instructions. Une TLB unique devrait gérer plusieurs dizaines d'accès en même temps pour alimenter le processeur en données/instructions. La TLB doit alors être une mémoire multiports avec beaucoup de ports, beaucoup trop de ports pour être performante. Utiliser deux TLB séparées élimine ce problème, en limitant le nombre de ports sur chaque TLB. Un autre problème est que le programme prend moins de place que les données, ce qui se marie mal avec une TLB unique mais colle assez bien avec une TLB d'instruction plus petite que celle pour les données. [[File:Hiérarchie de TLB.png|centre|vignette|upright=2|Hiérarchie de TLB.]] ==L'accès à la TLB : succès et défauts d'accès== À chaque accès mémoire, le processeur vérifie si le TLB contient l'adresse physique à laquelle accéder. Si c'est le cas, le processeur n'a pas à accéder à la table des pages en mémoire RAM et lit directement l'information nécessaire depuis ce TLB. On dit que l'on a un succès d'accès à la TLB. Si la TLb ne contient pas l'adresse physique demandée, on fait face à un '''défaut d'accès à la TLB'''. L'accès à la table des pages en mémoire RAM est alors inévitable. [[File:Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Translation Lookaside Buffer]] ===La traduction d'adresse avec la TLB=== [[File:Page table actions.svg|vignette|Page table actions]] La traduction d'une adresse avec une TLB a lieu comme suit. Premièrement, le processeur (sa MMU) interroge la TLB : il envoie l'adresse virtuelle et la TLB répond. Si la TLB contient l'adresse physique associée, elle la fournit directement et le processeur au cache ou à la RAM directement. Si ce n'est pas le cas, le processeur accède à la table des pages en mémoire RAM. Si la page est en RAM, alors la table des pages renvoie l'adresse physique voulue et la TLB est mise à jour. Par contre, si la page n'est pas en RAM, mais a été swappée sur le disque dur, la page est recopiée en mémoire RAM, la table des pages est mise à jour, puis la TLB l'est ensuite. [[File:Steps In a Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Steps In a Translation Lookaside Buffer]] ===Les ''page table walkers''=== Les défauts d'accès à la TLB sont gérés de deux façons : soit le processeur gère tout seul la situation, soit il délègue cette tâche au système d’exploitation. Sur les processeurs anciens, le système d'exploitation gère le défaut d'accès à la TLB. En cas de défaut, le processeur lève une exception matérielle spécialisée, qui exécute une routine d'interruption qui accède à la table des pages en RAM et effectue la traduction d'adresse. Mais cette solution logicielle n'a pas de bonnes performances. D'autres processeurs gèrent eux-mêmes le défaut d'accès à la TLB et vont chercher d'eux-mêmes les informations nécessaires dans la table des pages. Ils disposent de circuits, les '''''page table walkers''''' (PTW), qui s'occupent eux-mêmes du défaut. L'avantage en termes de performance est certain : plus besoin de lever une exception matérielle, plus besoin de lever une interruption couteuse à chaque défaut de TLB. Un autre avantage est que la gestion des bits de statut, qui mémorisent des informations sur chaque page, est gérée par le PTW. Sur les processeurs superscalaires à exécution dans le désordre qu'on abordera dans quelques chapitres, les PWT peuvent gérer un défaut de TLB pendant que le processeur fait d'autres opérations en parallèle, ce que ne permet pas la solution logicielle. Mieux : les PWT et TLB modernes sont conçus pour gérer plusieurs défauts simultanés, ce qui permet de grandement gagner en performance par rapport à l'approche logicielle. Le défaut principal des PWT est qu'ils sont conçus pour un format bien précis de table des pages, éventuellement deux ou trois autres, mais guère plus. Il est rare qu'ils gèrent plusieurs types de tables des pages différents. Leur flexibilité est donc assez faible. En comparaison, la solution logicielle n'a pas de limites précises, tant que le système d'exploitation gère le format de table des pages voulu. Les PTW sont généralement implémentés avec des circuits séquentiels spécifiques, nommés machines à état. Ils ont besoin, pour faire leur travail, de mémoriser l'adresse de la table des pages, ou du moins l'adresse de la table des pages de niveau 1 pour des tables des pages hiérarchiques. L'adresse de la table des pages est mémorisée dans un registre spécialisé, manipulé seulement par le système d'exploitation. Les informations nécessaires pour gérer chaque défaut de TLB sont stockées dans des registres spécialisés appelés des tampons de PTW (''PTW buffers''). Sur les architectures à plusieurs processeurs, chaque cœur ou processeur a son propre PTW. Dans le cas le plus simple, la table des pages est une table des pages simple, unique, qui contient des numéros de page physique. Le PTW a juste besoin de calculer une adresse et de faire une lecture pour récupérer le numéro de page physique. Dans le cas où la table des pages est hiérarchique, le processus doit être répété plusieurs fois, autant de fois qu'il faut passer d'une table des pages à la suivante. Dans le cas d'une table des pages inversée, le PTW doit parcourir automatiquement la mémoire pour lire chaque entrée de la table des pages une par une, faire une comparaison pour détecter la bonne entrée, puis déclencher une lecture une fois la bonne entrée détectée. Le processus est donc simple sur une table des pages unique, mais plus complexe dans les autres cas. La difficulté est de parcourir la mémoire. Pour le cas des pages des tables inversées, parcourir la mémoire en lisant des adresses consécutives est simple : un simple compteur d'adresse suffit. Par contre, le processus est plus complexe pour les tables des pages hiérarchiques, et demande généralement une implémentation avec du microcode. Le PWT communique alors avec le séquenceur pour lui demander d’exécuter une suite d’instructions microcodée pour gérer le défaut. ===Les ''Page walk caches''=== Pour accélérer le parcours de ou des tables des pages, l'unité de gestion mémoire (la MMU) des processeurs modernes incorpore des caches spécialisés, qui mémorisent des morceaux de la table des pages. La MMU contient des caches pour accélérer le parcours des tables des pages hiérarchiques, qui sont appelés des ''MMU caches'' ou encore caches de la MMU en français. Ils sont différents des TLB proprement dit sur plusieurs points. Les TLB proprement dites existent sur les ordinateurs avec des tables des pages hiérarchiques, mais elles sont séparées des caches de la MMU. La différence principale entre TLB et cache de la MMU tient dans leur contenu. Les TLB stockent des correspondances adresse logique-physique obtenues une fois qu'on a parcouru l'ensemble des niveaux d'une table des pages à la recherche d'une adresse physique précise, pas le contenu des tables des pages elles-mêmes. Les caches de la MMU, quant à eux, mémorisent les données lues dans les tables de page accédées lors des défauts de TLB les plus récents. Ils stockent les correspondances de la table de niveau 1 ou les autres tables des pages de niveau supérieur. Ils sont très utiles, car les accès mémoires ont une bonne localité spatiale, ce qui fait que des accès consécutifs ont des chances d’accéder aux mêmes entrées de la table de niveau 1 et de niveau 2, voire des niveaux 3 et 4. Il faut dire que sur les ordinateurs x86 64 bits, une entrée de la table des pages de premier niveau correspond à 512 gibioctets de mémoire... Il existe plusieurs manières de concevoir les caches de la MMU. La première est tout simplement d'associer une entrée de la table des pages avec son adresse physique, l'adresse physique servant de tag et l'entrée prenant une ligne de cache. C'est ce qui est fait sur les ''page walk caches'' des processeurs AMD. Ils se marient bien avec le fonctionnement normal du ''page table walker'', qui génère des adresses physiques. Une autre approche associe certains bits de l'adresse virtuelle à lire/écrire avec une entrée, au lieu de l'adresse physique de l'entrée. Par exemple, les bits de poids fort qui sont utilisés pour adresser la table de premier niveau sont utilisés comme tag dans le cache de la MMU. Même chose pour les bits précédents, qui servent à adresser la table de second niveau, et ainsi de suite. C’est ce qui est fait sur les ''paging structure cache'' des processeurs Intel. Une troisième approche est celle du '' translation path cache''. Si on compare les ''page walk caches'' avec les ''paging structure cache'', les ''page walk caches'' sont plus simples à fabriquer mais plus lents, alors que c'est l'inverse pour les ''paging structure caches''. Les ''page walk caches'' sont des caches normaux, sans particularité notable si ce n'est qu'ils sont intégrés à la MMU et qu'ils stockent des entrées des table de haut niveau de la table des pages. Ils sont donc aussi facile à fabriquer/concevoir que n'importe quel autre cache, voire plus facile vu que les entrées sont petites et ont peu de bits à stocker. Par contre, un défaut de TLB entraine plusieurs lectures consécutives dans un ''page walk caches''. Une première lecture pour récupérer l'entrée de la table de premier niveau, une seconde pour l'entrée adéquate de la table de second niveau, et ainsi de suite jusqu'à effectuer la lecture en mémoire. Le parcours de la table des pages s'effectue normalement, dans le même ordre que sans cache de MMU. Les ''paging structure cache'' permettent d'optimiser la recherche en sautant des étapes, ce qui rend le parcours de la table des pages beaucoup plus rapide si les entrées adéquates sont dans le cache. Les ''paging structure cache'' utilisent des tags plus petits que leurs concurrents, ce qui fait qu'ils prennent moins de place et de portes logiques à capacité égale et sont moins consommateurs en énergie.En clair, à part la simplciité de conception, les ''paging structure cache'' ont de meilleurs performances pour un budget en circuits et énergie plus faible. Il est possible d'utiliser un seul cache, qui mémorise les entrées des différents niveaux de la table des pages. Une autre possibilité est d'utiliser un cache pour chaque niveau de la table des pages. On a ainsi un cache pour la table de niveau 1, un autre pour les tables de niveau 2, etc. Faire ainsi facilite l'implémentation du remplacement des lignes de cache et améliore son efficacité. Un autre avantage est qu'il est plus facile de gérer plusieurs défauts simultanés. On peut accéder au cache pour la table de premier niveau en même temps qu'au cache pour les tables de second niveau, et idem pour les autres caches. ==Les pages larges et leur impact sur la TLB== Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages larges ont l'avantage d'utiliser la TLB de manière optimale. Pour une capacité de TLB identique, on peut adresser beaucoup plus de mémoire avec des pages larges, ce qui rend les défauts de TLB plus rares. Par contre, ces différentes tailles se marient mal avec une TLB unique. Un des problèmes est que les numéros de page physique n'ont pas le même nombre de bits suivant la taille des pages, ce qui pose des problèmes avec l'associativité de la TLB. Ce problème fait que l'usage d'une TLB unique est possible, mais pas forcément optimal. ===L'usage de plusieurs TLB, chacune dédiée à une taille de page=== L'usage d'une TLB unique pour toutes les tailles de page est possible et même courant pour la TLB de niveau 2 (L2). Mais les TLB de niveau 1 sont souvent séparées en plusieurs TLB, une par taille de page possible. Les TLB pour les pages larges sont souvent plus petites que la TLB pour les pages de 4 kibioctets, afin de profiter des économies de TLB liées aux pages larges. Un problème est que la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. Pour résoudre ce problème, toutes les TLB L1 sont accédées en parallèle lors d'un accès mémoire et le processeur sélectionne ensuite le résultat de celle qui correspond à la taille de page voulue. [[File:TLB pour plusieurs tailles de page.png|centre|vignette|upright=2|TLB pour plusieurs tailles de page]] ===L'usage d'une TLB unique pour toutes les tailles de page=== Les TLB de niveau 2 gèrent plusieurs tailles de page en même temps. Mais les techniques pour faire cela sont assez couteuses en circuits et en performances. Aussi, les techniques utilisées pour gérer plusieurs tailles de page sont couramment implémentées sur les TLB de niveau 2, mais sont impraticables sur les TLB de niveau 1. Les deux techniques qui permettent cela sont appelées le '''''hash-rehashing''''' et le '''''skewing'''''. Elles répondent à un problème assez simple à 'expliquer : la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. On doit accéder à la TLB en postulant que la page a une certaine taille, donc en précisant un numéro de page d'une certaine taille, pour ensuite avoir un défaut ou un succès de TLB. ====Le ''hash-rehashing''==== La première technique, celle du ''hash-rehashing'', consiste simplement à accéder la TLB en supposant que la page voulue a la taille usuelle, à savoir 4 kibioctets. En cas de succès de TLB, la page avait bien la taille supposée. Dans le cas contraire, on effectue un second accès en supposant que sa taille est de 2 mébioctets, et rebelote pour une page de 1-2 gibioctets en cas de défaut de TLB. Une fois toutes les tailles essayées, on accède à la table des pages en mémoire RAM. C'était la technique utilisée sur les processeurs Intel d’architecture Skylake et Broadwell. L'inconvénient est que les accès aux pages larges subissent une perte de performance notable, leur temps d'accès étant allongé. Cela est contrebalancé par le fait que ces tailles de page ont été inventées pour réduire le nombre de défauts de TLB, mais ces défauts sont assez rares pour l'impact soit seulement mitigé, pas compensé. L'allongement du temps d'accès peut être compensé par diverses méthodes. La première méthode est celle des '''accès simultanés à la TLB'''. Les TLB sont des caches assez performants, qui sont conçus pour être capables d'effectuer plusieurs accès en parallèle. On peut alors profiter de cette particularité pour lancer plusieurs accès au TLB en même temps, un par taille de page. Avec cette technique, les accès se faisant en parallèle et non l'un après l'autre, le temps d'accès est presque le même que si la TLB ne gérait qu'une seule taille de page. Le désavantage est que les multiples accès consomment de l'énergie et du courant, ce qui augmente la consommation énergétique de la TLB, qui est déjà très importante. La seconde solution est la '''prédiction de taille de page'''. L'idée est que le processeur tente de prédire quelle sera la taille de page, afin de tomber directement sur la bonne taille de page. Au lieu de tenter d'abord pour une page de 4 kibioctets, puis 2 mébioctets et enfin 1-2 Gibioctets, le processeur testera la taille de page la plus probable, puis la seconde plus probable, avant de tester la dernière taille de page possible. Le problème est alors de concevoir un circuit capable de réaliser cette prédiction. * Une manière simple mais extrêmement inefficace de faire cela est de mémoriser la taille des pages récemment accédées dans un cache spécialisé, qui mémorise la correspondance entre le numéro de la page et sa taille. La taille de la page est mémorisée dans ce cache, après le premier accès à cette page. Mais le défaut que le temps d'accès à ce cache de prédiction s'ajoute au temps d'accès à la TLBL2, ce qui en ruine totalement l'intérêt. Aussi, il faut trouver une solution alternative. * Une autre solution n'utilise pas le numéro de page, mais l'instruction responsable de l'accès à la TLB. Un accès à la TLB signifie un accès en mémoire RAM, qui est réalisé par une instruction. Instruction qui est identifiée par une adresse, elle-même située dans le ''program counter''. L'idée est que si une instruction est exécutée plusieurs fois, elle a tendance à accéder aux données d'une même page (localité spatiale). Ce n'est pas systématique, mais c'est une bonne supposition. On peut donc associer cette instruction à la taille de la page accédée récemment. Le cache de prédiction mémorise donc l'association entre adresse de cette instruction et taille de la page. Lors de l'accès mémoire, le ''program counter'' est récupéré et envoyé au cache de prédiction. En cas de succès d'accès, on obtient la taille de la page prédite. Cette méthode a le défaut que si plusieurs instructions accèdent à la même page, elles prendront chacune une ligne de cache dans le cache de prédiction et rien ne sera mutualisé. * Une solution alternative est de récupérer lune adresse virtuelle proche de l'adresse lue/écrite avant que l'accès mémoire soit démarré. L'idée est que lors du décodage de l'instruction d'accès mémoire, on récupère les registres utilisés, et on y accède pour lire en avance l'adresse virtuelle. Une dernière méthode consiste à '''amortir le temps d'accès en cas de défaut dans la TLB L2'''. L'idée est de démarrer un accès à la table des pages en RAM en parallèle de l'accès à la TLB L2. La raison est que le temps d'accès à la TLB L2, avec ''hash-rehashing'', est très long. Il est sensiblement proche du quart du temps de défaut de TLB. Si en plus il fallait rajouter le temps d'accès à la table des pages en cas de défaut, le temps d'accès total serait énorme. Mais en lançant une lecture spéculative de la table des pages, le temps d'accès en cas de défaut est partiellement amorti. Le temps d'accès en cas de succès de TLB L2 reste cependant le même. ====Le ''skewing''==== La technique du ''skewing'' est assez simple à comprendre pour qui se rappelle ce qu'est un cache associatif par voie, et encore plus un cache ''skew-associative''. L'idée est d'utiliser un cache associatif par voie, mais où chaque voie est dédiée à une taille de page bien définie. Un cache associatif à trois voie pourra ainsi avoir une voie pour les pages de 4 kibioctets, une voie pour les pages de 2 mébioctets et une dernière voie pour les pages de plusieurs gibioctets. Cette méthode est conceptuellement équivalente au fait d'utiliser un cache pour chaque taille, à quelques différences près. Notamment, cela permet de mutualiser des circuits qui auraient été dupliqués en utilisant des caches séparés. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le préchargement | prevTextLe préchargement | next=Le pipeline | nextText=Le pipeline }} </noinclude> 9p2j4k6kwe9wjowibyg2jstcvr156m3 682821 682820 2022-07-28T16:18:41Z Mewtow 31375 wikitext text/x-wiki Dans le chapitre sur la mémoire virtuelle, nous avions abordé la pagination. Nous avions vu que la traduction des adresses virtuelles en adresses physiques se fait grâce à une table des pages située en mémoire RAM, qui contient les correspondances entre adresses physiques et virtuelles. Pour éviter d'avoir à lire la table des pages en mémoire RAM à chaque accès mémoire, les concepteurs de processeurs ont décidé d'implanter un cache dédié, le '''''translation lookaside buffer''''', ou TLB. Il stocke de quoi faire la traduction entre adresse virtuelle et adresse physique, à savoir une correspondance entre numéro de page logique et numéro de page physique. [[File:MMU principle updated.png|centre|vignette|upright=2.0|MMU avec une TLB.]] Les caches consomment beaucoup d'énergie et la TLB ne fait pas exception. Diverses estimations montrent que les TLB sont très consommatrices en énergie. Près de 5 à 15% de la consommation d'énergie d'un processeur provient de sa TLB et des circuits associés. Pour réduire cette consommation tout en gardant des performances très importantes, la TLB est conçue avec ces contraintes en tête. Notamment, la TLB est généralement un cache associatif par voie ou directement adressé, et non un cache totalement associatif. Les caches totalement associatifs consomment en effet beaucoup plus d'énergie pour fonctionner que les autres types de caches, pour des performances légèrement meilleures. Le cout en énergie ne vaut pas les performances gagnées, pour une LTB. Pour des raisons de performances, la TLB est parfois découpée en plusieurs sous-caches L1, L2, L3, etc. Sur les architectures Harvard et Harvard modifiées, on trouve parfois deux TLB séparés : un pour les accès aux instructions, et un pour les accès aux données. L'architecture standard pour les TLBs actuelles est la suivante : une TLB de niveau 1 pour les instructions, une autre TLB de niveau 1 pour les données, puis une TLB de niveaux 2 partagée entre instructions et données. La séparation en une TLB L1 pour les instructions et une pour les données est nécessaire sur les architectures à hautes performances. Les processeurs modernes peuvent exécuter plusieurs instructions simultanément, ce qui fait qu'ils accèdent souvent à des données en même temps qu'ils chargent une ou plusieurs instructions. Une TLB unique devrait gérer plusieurs dizaines d'accès en même temps pour alimenter le processeur en données/instructions. La TLB doit alors être une mémoire multiports avec beaucoup de ports, beaucoup trop de ports pour être performante. Utiliser deux TLB séparées élimine ce problème, en limitant le nombre de ports sur chaque TLB. Un autre problème est que le programme prend moins de place que les données, ce qui se marie mal avec une TLB unique mais colle assez bien avec une TLB d'instruction plus petite que celle pour les données. [[File:Hiérarchie de TLB.png|centre|vignette|upright=2|Hiérarchie de TLB.]] ==L'accès à la TLB : succès et défauts d'accès== À chaque accès mémoire, le processeur vérifie si le TLB contient l'adresse physique à laquelle accéder. Si c'est le cas, le processeur n'a pas à accéder à la table des pages en mémoire RAM et lit directement l'information nécessaire depuis ce TLB. On dit que l'on a un succès d'accès à la TLB. Si la TLb ne contient pas l'adresse physique demandée, on fait face à un '''défaut d'accès à la TLB'''. L'accès à la table des pages en mémoire RAM est alors inévitable. [[File:Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Translation Lookaside Buffer]] ===La traduction d'adresse avec la TLB=== [[File:Page table actions.svg|vignette|Page table actions]] La traduction d'une adresse avec une TLB a lieu comme suit. Premièrement, le processeur (sa MMU) interroge la TLB : il envoie l'adresse virtuelle et la TLB répond. Si la TLB contient l'adresse physique associée, elle la fournit directement et le processeur au cache ou à la RAM directement. Si ce n'est pas le cas, le processeur accède à la table des pages en mémoire RAM. Si la page est en RAM, alors la table des pages renvoie l'adresse physique voulue et la TLB est mise à jour. Par contre, si la page n'est pas en RAM, mais a été swappée sur le disque dur, la page est recopiée en mémoire RAM, la table des pages est mise à jour, puis la TLB l'est ensuite. [[File:Steps In a Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Steps In a Translation Lookaside Buffer]] ===Les ''page table walkers''=== Les défauts d'accès à la TLB sont gérés de deux façons : soit le processeur gère tout seul la situation, soit il délègue cette tâche au système d’exploitation. Sur les processeurs anciens, le système d'exploitation gère le défaut d'accès à la TLB. En cas de défaut, le processeur lève une exception matérielle spécialisée, qui exécute une routine d'interruption qui accède à la table des pages en RAM et effectue la traduction d'adresse. Mais cette solution logicielle n'a pas de bonnes performances. D'autres processeurs gèrent eux-mêmes le défaut d'accès à la TLB et vont chercher d'eux-mêmes les informations nécessaires dans la table des pages. Ils disposent de circuits, les '''''page table walkers''''' (PTW), qui s'occupent eux-mêmes du défaut. L'avantage en termes de performance est certain : plus besoin de lever une exception matérielle, plus besoin de lever une interruption couteuse à chaque défaut de TLB. Un autre avantage est que la gestion des bits de statut, qui mémorisent des informations sur chaque page, est gérée par le PTW. Sur les processeurs superscalaires à exécution dans le désordre qu'on abordera dans quelques chapitres, les PWT peuvent gérer un défaut de TLB pendant que le processeur fait d'autres opérations en parallèle, ce que ne permet pas la solution logicielle. Mieux : les PWT et TLB modernes sont conçus pour gérer plusieurs défauts simultanés, ce qui permet de grandement gagner en performance par rapport à l'approche logicielle. Le défaut principal des PWT est qu'ils sont conçus pour un format bien précis de table des pages, éventuellement deux ou trois autres, mais guère plus. Il est rare qu'ils gèrent plusieurs types de tables des pages différents. Leur flexibilité est donc assez faible. En comparaison, la solution logicielle n'a pas de limites précises, tant que le système d'exploitation gère le format de table des pages voulu. Les PTW sont généralement implémentés avec des circuits séquentiels spécifiques, nommés machines à état. Ils ont besoin, pour faire leur travail, de mémoriser l'adresse de la table des pages, ou du moins l'adresse de la table des pages de niveau 1 pour des tables des pages hiérarchiques. L'adresse de la table des pages est mémorisée dans un registre spécialisé, manipulé seulement par le système d'exploitation. Les informations nécessaires pour gérer chaque défaut de TLB sont stockées dans des registres spécialisés appelés des tampons de PTW (''PTW buffers''). Sur les architectures à plusieurs processeurs, chaque cœur ou processeur a son propre PTW. Dans le cas le plus simple, la table des pages est une table des pages simple, unique, qui contient des numéros de page physique. Le PTW a juste besoin de calculer une adresse et de faire une lecture pour récupérer le numéro de page physique. Dans le cas où la table des pages est hiérarchique, le processus doit être répété plusieurs fois, autant de fois qu'il faut passer d'une table des pages à la suivante. Dans le cas d'une table des pages inversée, le PTW doit parcourir automatiquement la mémoire pour lire chaque entrée de la table des pages une par une, faire une comparaison pour détecter la bonne entrée, puis déclencher une lecture une fois la bonne entrée détectée. Le processus est donc simple sur une table des pages unique, mais plus complexe dans les autres cas. La difficulté est de parcourir la mémoire. Pour le cas des pages des tables inversées, parcourir la mémoire en lisant des adresses consécutives est simple : un simple compteur d'adresse suffit. Par contre, le processus est plus complexe pour les tables des pages hiérarchiques, et demande généralement une implémentation avec du microcode. Le PWT communique alors avec le séquenceur pour lui demander d’exécuter une suite d’instructions microcodée pour gérer le défaut. ===Les ''Page walk caches''=== Pour accélérer le parcours de ou des tables des pages, l'unité de gestion mémoire (la MMU) des processeurs modernes incorpore des caches spécialisés, qui mémorisent des morceaux de la table des pages. La MMU contient des caches pour accélérer le parcours des tables des pages hiérarchiques, qui sont appelés des ''MMU caches'' ou encore caches de la MMU en français. Ils sont différents des TLB proprement dit sur plusieurs points. Les TLB proprement dites existent sur les ordinateurs avec des tables des pages hiérarchiques, mais elles sont séparées des caches de la MMU. La différence principale entre TLB et cache de la MMU tient dans leur contenu. Les TLB stockent des correspondances adresse logique-physique obtenues une fois qu'on a parcouru l'ensemble des niveaux d'une table des pages à la recherche d'une adresse physique précise, pas le contenu des tables des pages elles-mêmes. Les caches de la MMU, quant à eux, mémorisent les données lues dans les tables de page accédées lors des défauts de TLB les plus récents. Ils stockent les correspondances de la table de niveau 1 ou les autres tables des pages de niveau supérieur. Ils sont très utiles, car les accès mémoires ont une bonne localité spatiale, ce qui fait que des accès consécutifs ont des chances d’accéder aux mêmes entrées de la table de niveau 1 et de niveau 2, voire des niveaux 3 et 4. Il faut dire que sur les ordinateurs x86 64 bits, une entrée de la table des pages de premier niveau correspond à 512 gibioctets de mémoire... Il existe plusieurs manières de concevoir les caches de la MMU. La première est tout simplement d'associer une entrée de la table des pages avec son adresse physique, l'adresse physique servant de tag et l'entrée prenant une ligne de cache. C'est ce qui est fait sur les ''page walk caches'' des processeurs AMD. Ils se marient bien avec le fonctionnement normal du ''page table walker'', qui génère des adresses physiques. Une autre approche associe certains bits de l'adresse virtuelle à lire/écrire avec une entrée, au lieu de l'adresse physique de l'entrée. Par exemple, les bits de poids fort qui sont utilisés pour adresser la table de premier niveau sont utilisés comme tag dans le cache de la MMU. Même chose pour les bits précédents, qui servent à adresser la table de second niveau, et ainsi de suite. C’est ce qui est fait sur les ''paging structure cache'' des processeurs Intel. Une troisième approche est celle du '' translation path cache''. Si on compare les ''page walk caches'' avec les ''paging structure cache'', les ''page walk caches'' sont plus simples à fabriquer mais plus lents, alors que c'est l'inverse pour les ''paging structure caches''. Les ''page walk caches'' sont des caches normaux, sans particularité notable si ce n'est qu'ils sont intégrés à la MMU et qu'ils stockent des entrées des table de haut niveau de la table des pages. Ils sont donc aussi facile à fabriquer/concevoir que n'importe quel autre cache, voire plus facile vu que les entrées sont petites et ont peu de bits à stocker. Par contre, un défaut de TLB entraine plusieurs lectures consécutives dans un ''page walk caches''. Une première lecture pour récupérer l'entrée de la table de premier niveau, une seconde pour l'entrée adéquate de la table de second niveau, et ainsi de suite jusqu'à effectuer la lecture en mémoire. Le parcours de la table des pages s'effectue normalement, dans le même ordre que sans cache de MMU. Les ''paging structure cache'' permettent d'optimiser la recherche en sautant des étapes, ce qui rend le parcours de la table des pages beaucoup plus rapide si les entrées adéquates sont dans le cache. Les ''paging structure cache'' utilisent des tags plus petits que leurs concurrents, ce qui fait qu'ils prennent moins de place et de portes logiques à capacité égale et sont moins consommateurs en énergie.En clair, à part la simplciité de conception, les ''paging structure cache'' ont de meilleurs performances pour un budget en circuits et énergie plus faible. Il est possible d'utiliser un seul cache, qui mémorise les entrées des différents niveaux de la table des pages. Une autre possibilité est d'utiliser un cache pour chaque niveau de la table des pages. On a ainsi un cache pour la table de niveau 1, un autre pour les tables de niveau 2, etc. Faire ainsi facilite l'implémentation du remplacement des lignes de cache et améliore son efficacité. Un autre avantage est qu'il est plus facile de gérer plusieurs défauts simultanés. On peut accéder au cache pour la table de premier niveau en même temps qu'au cache pour les tables de second niveau, et idem pour les autres caches. ==Les pages larges et leur impact sur la TLB== Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages larges ont l'avantage d'utiliser la TLB de manière optimale. Pour une capacité de TLB identique, on peut adresser beaucoup plus de mémoire avec des pages larges, ce qui rend les défauts de TLB plus rares. Par contre, ces différentes tailles se marient mal avec une TLB unique. Un des problèmes est que les numéros de page physique n'ont pas le même nombre de bits suivant la taille des pages, ce qui pose des problèmes avec l'associativité de la TLB. Ce problème fait que l'usage d'une TLB unique est possible, mais pas forcément optimal. ===L'usage de plusieurs TLB, chacune dédiée à une taille de page=== L'usage d'une TLB unique pour toutes les tailles de page est possible et même courant pour la TLB de niveau 2 (L2). Mais les TLB de niveau 1 sont souvent séparées en plusieurs TLB, une par taille de page possible. Les TLB pour les pages larges sont souvent plus petites que la TLB pour les pages de 4 kibioctets, afin de profiter des économies de TLB liées aux pages larges. Un problème est que la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. Pour résoudre ce problème, toutes les TLB L1 sont accédées en parallèle lors d'un accès mémoire et le processeur sélectionne ensuite le résultat de celle qui correspond à la taille de page voulue. [[File:TLB pour plusieurs tailles de page.png|centre|vignette|upright=2|TLB pour plusieurs tailles de page]] ===L'usage d'une TLB unique pour toutes les tailles de page=== Les TLB de niveau 2 gèrent plusieurs tailles de page en même temps. Mais les techniques pour faire cela sont assez couteuses en circuits et en performances. Aussi, les techniques utilisées pour gérer plusieurs tailles de page sont couramment implémentées sur les TLB de niveau 2, mais sont impraticables sur les TLB de niveau 1. Les deux techniques qui permettent cela sont appelées le '''''hash-rehashing''''' et le '''''skewing'''''. Elles répondent à un problème assez simple à 'expliquer : la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. On doit accéder à la TLB en postulant que la page a une certaine taille, donc en précisant un numéro de page d'une certaine taille, pour ensuite avoir un défaut ou un succès de TLB. ====Le ''hash-rehashing''==== La première technique, celle du ''hash-rehashing'', consiste simplement à accéder la TLB en supposant que la page voulue a la taille usuelle, à savoir 4 kibioctets. En cas de succès de TLB, la page avait bien la taille supposée. Dans le cas contraire, on effectue un second accès en supposant que sa taille est de 2 mébioctets, et rebelote pour une page de 1-2 gibioctets en cas de défaut de TLB. Une fois toutes les tailles essayées, on accède à la table des pages en mémoire RAM. C'était la technique utilisée sur les processeurs Intel d’architecture Skylake et Broadwell. L'inconvénient est que les accès aux pages larges subissent une perte de performance notable, leur temps d'accès étant allongé. Cela est contrebalancé par le fait que ces tailles de page ont été inventées pour réduire le nombre de défauts de TLB, mais ces défauts sont assez rares pour l'impact soit seulement mitigé, pas compensé. L'allongement du temps d'accès peut être compensé par diverses méthodes. La première méthode est celle des '''accès simultanés à la TLB'''. Les TLB sont des caches assez performants, qui sont conçus pour être capables d'effectuer plusieurs accès en parallèle. On peut alors profiter de cette particularité pour lancer plusieurs accès au TLB en même temps, un par taille de page. Avec cette technique, les accès se faisant en parallèle et non l'un après l'autre, le temps d'accès est presque le même que si la TLB ne gérait qu'une seule taille de page. Le désavantage est que les multiples accès consomment de l'énergie et du courant, ce qui augmente la consommation énergétique de la TLB, qui est déjà très importante. La seconde solution est la '''prédiction de taille de page'''. L'idée est que le processeur tente de prédire quelle sera la taille de page, afin de tomber directement sur la bonne taille de page. Au lieu de tenter d'abord pour une page de 4 kibioctets, puis 2 mébioctets et enfin 1-2 Gibioctets, le processeur testera la taille de page la plus probable, puis la seconde plus probable, avant de tester la dernière taille de page possible. Le problème est alors de concevoir un circuit capable de réaliser cette prédiction. * Une manière simple mais extrêmement inefficace de faire cela est de mémoriser la taille des pages récemment accédées dans un cache spécialisé, qui mémorise la correspondance entre le numéro de la page et sa taille. La taille de la page est mémorisée dans ce cache, après le premier accès à cette page. Mais le défaut que le temps d'accès à ce cache de prédiction s'ajoute au temps d'accès à la TLBL2, ce qui en ruine totalement l'intérêt. Aussi, il faut trouver une solution alternative. * Une autre solution n'utilise pas le numéro de page, mais l'instruction responsable de l'accès à la TLB. Un accès à la TLB signifie un accès en mémoire RAM, qui est réalisé par une instruction. Instruction qui est identifiée par une adresse, elle-même située dans le ''program counter''. L'idée est que si une instruction est exécutée plusieurs fois, elle a tendance à accéder aux données d'une même page (localité spatiale). Ce n'est pas systématique, mais c'est une bonne supposition. On peut donc associer cette instruction à la taille de la page accédée récemment. Le cache de prédiction mémorise donc l'association entre adresse de cette instruction et taille de la page. Lors de l'accès mémoire, le ''program counter'' est récupéré et envoyé au cache de prédiction. En cas de succès d'accès, on obtient la taille de la page prédite. Cette méthode a le défaut que si plusieurs instructions accèdent à la même page, elles prendront chacune une ligne de cache dans le cache de prédiction et rien ne sera mutualisé. * Une solution alternative est de récupérer lune adresse virtuelle proche de l'adresse lue/écrite avant que l'accès mémoire soit démarré. L'idée est que lors du décodage de l'instruction d'accès mémoire, on récupère les registres utilisés, et on y accède pour lire en avance l'adresse virtuelle. Une dernière méthode consiste à '''amortir le temps d'accès en cas de défaut dans la TLB L2'''. L'idée est de démarrer un accès à la table des pages en RAM en parallèle de l'accès à la TLB L2. La raison est que le temps d'accès à la TLB L2, avec ''hash-rehashing'', est très long. Il est sensiblement proche du quart du temps de défaut de TLB. Si en plus il fallait rajouter le temps d'accès à la table des pages en cas de défaut, le temps d'accès total serait énorme. Mais en lançant une lecture spéculative de la table des pages, le temps d'accès en cas de défaut est partiellement amorti. Le temps d'accès en cas de succès de TLB L2 reste cependant le même. ====Le ''skewing''==== La technique du ''skewing'' est assez simple à comprendre pour qui se rappelle ce qu'est un cache associatif par voie, et encore plus un cache ''skew-associative''. L'idée est d'utiliser un cache associatif par voie, mais où chaque voie est dédiée à une taille de page bien définie. Un cache associatif à trois voie pourra ainsi avoir une voie pour les pages de 4 kibioctets, une voie pour les pages de 2 mébioctets et une dernière voie pour les pages de plusieurs gibioctets. Cette méthode est conceptuellement équivalente au fait d'utiliser un cache pour chaque taille, à quelques différences près. Notamment, cela permet de mutualiser des circuits qui auraient été dupliqués en utilisant des caches séparés. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le préchargement | prevTextLe préchargement | next=Le pipeline | nextText=Le pipeline }} </noinclude> nnsjql0m3h2i70mbv2bjn54sjl7rpsy 682822 682821 2022-07-28T16:25:27Z Mewtow 31375 /* Les Page walk caches */ wikitext text/x-wiki Dans le chapitre sur la mémoire virtuelle, nous avions abordé la pagination. Nous avions vu que la traduction des adresses virtuelles en adresses physiques se fait grâce à une table des pages située en mémoire RAM, qui contient les correspondances entre adresses physiques et virtuelles. Pour éviter d'avoir à lire la table des pages en mémoire RAM à chaque accès mémoire, les concepteurs de processeurs ont décidé d'implanter un cache dédié, le '''''translation lookaside buffer''''', ou TLB. Il stocke de quoi faire la traduction entre adresse virtuelle et adresse physique, à savoir une correspondance entre numéro de page logique et numéro de page physique. [[File:MMU principle updated.png|centre|vignette|upright=2.0|MMU avec une TLB.]] Les caches consomment beaucoup d'énergie et la TLB ne fait pas exception. Diverses estimations montrent que les TLB sont très consommatrices en énergie. Près de 5 à 15% de la consommation d'énergie d'un processeur provient de sa TLB et des circuits associés. Pour réduire cette consommation tout en gardant des performances très importantes, la TLB est conçue avec ces contraintes en tête. Notamment, la TLB est généralement un cache associatif par voie ou directement adressé, et non un cache totalement associatif. Les caches totalement associatifs consomment en effet beaucoup plus d'énergie pour fonctionner que les autres types de caches, pour des performances légèrement meilleures. Le cout en énergie ne vaut pas les performances gagnées, pour une LTB. Pour des raisons de performances, la TLB est parfois découpée en plusieurs sous-caches L1, L2, L3, etc. Sur les architectures Harvard et Harvard modifiées, on trouve parfois deux TLB séparés : un pour les accès aux instructions, et un pour les accès aux données. L'architecture standard pour les TLBs actuelles est la suivante : une TLB de niveau 1 pour les instructions, une autre TLB de niveau 1 pour les données, puis une TLB de niveaux 2 partagée entre instructions et données. La séparation en une TLB L1 pour les instructions et une pour les données est nécessaire sur les architectures à hautes performances. Les processeurs modernes peuvent exécuter plusieurs instructions simultanément, ce qui fait qu'ils accèdent souvent à des données en même temps qu'ils chargent une ou plusieurs instructions. Une TLB unique devrait gérer plusieurs dizaines d'accès en même temps pour alimenter le processeur en données/instructions. La TLB doit alors être une mémoire multiports avec beaucoup de ports, beaucoup trop de ports pour être performante. Utiliser deux TLB séparées élimine ce problème, en limitant le nombre de ports sur chaque TLB. Un autre problème est que le programme prend moins de place que les données, ce qui se marie mal avec une TLB unique mais colle assez bien avec une TLB d'instruction plus petite que celle pour les données. [[File:Hiérarchie de TLB.png|centre|vignette|upright=2|Hiérarchie de TLB.]] ==L'accès à la TLB : succès et défauts d'accès== À chaque accès mémoire, le processeur vérifie si le TLB contient l'adresse physique à laquelle accéder. Si c'est le cas, le processeur n'a pas à accéder à la table des pages en mémoire RAM et lit directement l'information nécessaire depuis ce TLB. On dit que l'on a un succès d'accès à la TLB. Si la TLb ne contient pas l'adresse physique demandée, on fait face à un '''défaut d'accès à la TLB'''. L'accès à la table des pages en mémoire RAM est alors inévitable. [[File:Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Translation Lookaside Buffer]] ===La traduction d'adresse avec la TLB=== [[File:Page table actions.svg|vignette|Page table actions]] La traduction d'une adresse avec une TLB a lieu comme suit. Premièrement, le processeur (sa MMU) interroge la TLB : il envoie l'adresse virtuelle et la TLB répond. Si la TLB contient l'adresse physique associée, elle la fournit directement et le processeur au cache ou à la RAM directement. Si ce n'est pas le cas, le processeur accède à la table des pages en mémoire RAM. Si la page est en RAM, alors la table des pages renvoie l'adresse physique voulue et la TLB est mise à jour. Par contre, si la page n'est pas en RAM, mais a été swappée sur le disque dur, la page est recopiée en mémoire RAM, la table des pages est mise à jour, puis la TLB l'est ensuite. [[File:Steps In a Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Steps In a Translation Lookaside Buffer]] ===Les ''page table walkers''=== Les défauts d'accès à la TLB sont gérés de deux façons : soit le processeur gère tout seul la situation, soit il délègue cette tâche au système d’exploitation. Sur les processeurs anciens, le système d'exploitation gère le défaut d'accès à la TLB. En cas de défaut, le processeur lève une exception matérielle spécialisée, qui exécute une routine d'interruption qui accède à la table des pages en RAM et effectue la traduction d'adresse. Mais cette solution logicielle n'a pas de bonnes performances. D'autres processeurs gèrent eux-mêmes le défaut d'accès à la TLB et vont chercher d'eux-mêmes les informations nécessaires dans la table des pages. Ils disposent de circuits, les '''''page table walkers''''' (PTW), qui s'occupent eux-mêmes du défaut. L'avantage en termes de performance est certain : plus besoin de lever une exception matérielle, plus besoin de lever une interruption couteuse à chaque défaut de TLB. Un autre avantage est que la gestion des bits de statut, qui mémorisent des informations sur chaque page, est gérée par le PTW. Sur les processeurs superscalaires à exécution dans le désordre qu'on abordera dans quelques chapitres, les PWT peuvent gérer un défaut de TLB pendant que le processeur fait d'autres opérations en parallèle, ce que ne permet pas la solution logicielle. Mieux : les PWT et TLB modernes sont conçus pour gérer plusieurs défauts simultanés, ce qui permet de grandement gagner en performance par rapport à l'approche logicielle. Le défaut principal des PWT est qu'ils sont conçus pour un format bien précis de table des pages, éventuellement deux ou trois autres, mais guère plus. Il est rare qu'ils gèrent plusieurs types de tables des pages différents. Leur flexibilité est donc assez faible. En comparaison, la solution logicielle n'a pas de limites précises, tant que le système d'exploitation gère le format de table des pages voulu. Les PTW sont généralement implémentés avec des circuits séquentiels spécifiques, nommés machines à état. Ils ont besoin, pour faire leur travail, de mémoriser l'adresse de la table des pages, ou du moins l'adresse de la table des pages de niveau 1 pour des tables des pages hiérarchiques. L'adresse de la table des pages est mémorisée dans un registre spécialisé, manipulé seulement par le système d'exploitation. Les informations nécessaires pour gérer chaque défaut de TLB sont stockées dans des registres spécialisés appelés des tampons de PTW (''PTW buffers''). Sur les architectures à plusieurs processeurs, chaque cœur ou processeur a son propre PTW. Dans le cas le plus simple, la table des pages est une table des pages simple, unique, qui contient des numéros de page physique. Le PTW a juste besoin de calculer une adresse et de faire une lecture pour récupérer le numéro de page physique. Dans le cas où la table des pages est hiérarchique, le processus doit être répété plusieurs fois, autant de fois qu'il faut passer d'une table des pages à la suivante. Dans le cas d'une table des pages inversée, le PTW doit parcourir automatiquement la mémoire pour lire chaque entrée de la table des pages une par une, faire une comparaison pour détecter la bonne entrée, puis déclencher une lecture une fois la bonne entrée détectée. Le processus est donc simple sur une table des pages unique, mais plus complexe dans les autres cas. La difficulté est de parcourir la mémoire. Pour le cas des pages des tables inversées, parcourir la mémoire en lisant des adresses consécutives est simple : un simple compteur d'adresse suffit. Par contre, le processus est plus complexe pour les tables des pages hiérarchiques, et demande généralement une implémentation avec du microcode. Le PWT communique alors avec le séquenceur pour lui demander d’exécuter une suite d’instructions microcodée pour gérer le défaut. ===Les ''Page walk caches''=== Pour accélérer le parcours des tables des pages hiérarchiques, l'unité de gestion mémoire (la MMU) des processeurs modernes incorpore des caches spécialisés, appelés des ''MMU caches'' ou encore caches de la MMU en français. Ils sont systématiquement utilisés en complément d'une TLB. La différence principale entre TLB et cache de la MMU tient dans leur contenu. Les TLB stockent des correspondances adresse logique-physique obtenues une fois qu'on a parcouru l'ensemble des niveaux d'une table des pages à la recherche d'une adresse physique précise, elles stockent le résultat de la traduction d'adresse. Les caches de la MMU, quant à eux, mémorisent non pas le résultat final, mais les résultats des étapes intermédiaires. Elles mémorisent les entrées de la table des pages accédées lors des défauts de TLB les plus récents, qui ne sont pas déjà dans la TLB. Ils stockent les entrées de la table de niveau 1 ou les autres tables des pages de niveau supérieur, mais pas les entrées qui contiennent un numéro de page physique. Les caches de la MMU sont très utiles, car les accès mémoires ont une bonne localité spatiale, ce qui fait que des accès consécutifs ont des chances d’accéder aux mêmes entrées de la table de niveau 1 et de niveau 2, voire des niveaux 3 et 4. Il faut dire que sur les ordinateurs x86 64 bits, une entrée de la table des pages de premier niveau correspond à 512 gibioctets de mémoire... Il existe plusieurs manières de concevoir les caches de la MMU. La première est tout simplement d'associer une entrée de la table des pages avec son adresse physique, l'adresse physique servant de tag et l'entrée prenant une ligne de cache. C'est ce qui est fait sur les ''page walk caches'' des processeurs AMD. Ils se marient bien avec le fonctionnement normal du ''page table walker'', qui génère des adresses physiques. Une autre approche associe certains bits de l'adresse virtuelle à lire/écrire avec une entrée, au lieu de l'adresse physique de l'entrée. Par exemple, les bits de poids fort qui sont utilisés pour adresser la table de premier niveau sont utilisés comme tag dans le cache de la MMU. Même chose pour les bits précédents, qui servent à adresser la table de second niveau, et ainsi de suite. C’est ce qui est fait sur les ''paging structure cache'' des processeurs Intel. Une troisième approche est celle du '' translation path cache''. Si on compare les ''page walk caches'' avec les ''paging structure cache'', les ''page walk caches'' sont plus simples à fabriquer mais plus lents, alors que c'est l'inverse pour les ''paging structure caches''. Les ''page walk caches'' sont des caches normaux, sans particularité notable si ce n'est qu'ils sont intégrés à la MMU et qu'ils stockent des entrées des table de haut niveau de la table des pages. Ils sont donc aussi facile à fabriquer/concevoir que n'importe quel autre cache, voire plus facile vu que les entrées sont petites et ont peu de bits à stocker. Par contre, un défaut de TLB entraine plusieurs lectures consécutives dans un ''page walk caches''. Une première lecture pour récupérer l'entrée de la table de premier niveau, une seconde pour l'entrée adéquate de la table de second niveau, et ainsi de suite jusqu'à effectuer la lecture en mémoire. Le parcours de la table des pages s'effectue normalement, dans le même ordre que sans cache de MMU. Les ''paging structure cache'' permettent d'optimiser la recherche en sautant des étapes, ce qui rend le parcours de la table des pages beaucoup plus rapide si les entrées adéquates sont dans le cache. Les ''paging structure cache'' utilisent des tags plus petits que leurs concurrents, ce qui fait qu'ils prennent moins de place et de portes logiques à capacité égale et sont moins consommateurs en énergie.En clair, à part la simplciité de conception, les ''paging structure cache'' ont de meilleurs performances pour un budget en circuits et énergie plus faible. Il est possible d'utiliser un seul cache, qui mémorise les entrées des différents niveaux de la table des pages. Une autre possibilité est d'utiliser un cache pour chaque niveau de la table des pages. On a ainsi un cache pour la table de niveau 1, un autre pour les tables de niveau 2, etc. Faire ainsi facilite l'implémentation du remplacement des lignes de cache et améliore son efficacité. Un autre avantage est qu'il est plus facile de gérer plusieurs défauts simultanés. On peut accéder au cache pour la table de premier niveau en même temps qu'au cache pour les tables de second niveau, et idem pour les autres caches. ==Les pages larges et leur impact sur la TLB== Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages larges ont l'avantage d'utiliser la TLB de manière optimale. Pour une capacité de TLB identique, on peut adresser beaucoup plus de mémoire avec des pages larges, ce qui rend les défauts de TLB plus rares. Par contre, ces différentes tailles se marient mal avec une TLB unique. Un des problèmes est que les numéros de page physique n'ont pas le même nombre de bits suivant la taille des pages, ce qui pose des problèmes avec l'associativité de la TLB. Ce problème fait que l'usage d'une TLB unique est possible, mais pas forcément optimal. ===L'usage de plusieurs TLB, chacune dédiée à une taille de page=== L'usage d'une TLB unique pour toutes les tailles de page est possible et même courant pour la TLB de niveau 2 (L2). Mais les TLB de niveau 1 sont souvent séparées en plusieurs TLB, une par taille de page possible. Les TLB pour les pages larges sont souvent plus petites que la TLB pour les pages de 4 kibioctets, afin de profiter des économies de TLB liées aux pages larges. Un problème est que la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. Pour résoudre ce problème, toutes les TLB L1 sont accédées en parallèle lors d'un accès mémoire et le processeur sélectionne ensuite le résultat de celle qui correspond à la taille de page voulue. [[File:TLB pour plusieurs tailles de page.png|centre|vignette|upright=2|TLB pour plusieurs tailles de page]] ===L'usage d'une TLB unique pour toutes les tailles de page=== Les TLB de niveau 2 gèrent plusieurs tailles de page en même temps. Mais les techniques pour faire cela sont assez couteuses en circuits et en performances. Aussi, les techniques utilisées pour gérer plusieurs tailles de page sont couramment implémentées sur les TLB de niveau 2, mais sont impraticables sur les TLB de niveau 1. Les deux techniques qui permettent cela sont appelées le '''''hash-rehashing''''' et le '''''skewing'''''. Elles répondent à un problème assez simple à 'expliquer : la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. On doit accéder à la TLB en postulant que la page a une certaine taille, donc en précisant un numéro de page d'une certaine taille, pour ensuite avoir un défaut ou un succès de TLB. ====Le ''hash-rehashing''==== La première technique, celle du ''hash-rehashing'', consiste simplement à accéder la TLB en supposant que la page voulue a la taille usuelle, à savoir 4 kibioctets. En cas de succès de TLB, la page avait bien la taille supposée. Dans le cas contraire, on effectue un second accès en supposant que sa taille est de 2 mébioctets, et rebelote pour une page de 1-2 gibioctets en cas de défaut de TLB. Une fois toutes les tailles essayées, on accède à la table des pages en mémoire RAM. C'était la technique utilisée sur les processeurs Intel d’architecture Skylake et Broadwell. L'inconvénient est que les accès aux pages larges subissent une perte de performance notable, leur temps d'accès étant allongé. Cela est contrebalancé par le fait que ces tailles de page ont été inventées pour réduire le nombre de défauts de TLB, mais ces défauts sont assez rares pour l'impact soit seulement mitigé, pas compensé. L'allongement du temps d'accès peut être compensé par diverses méthodes. La première méthode est celle des '''accès simultanés à la TLB'''. Les TLB sont des caches assez performants, qui sont conçus pour être capables d'effectuer plusieurs accès en parallèle. On peut alors profiter de cette particularité pour lancer plusieurs accès au TLB en même temps, un par taille de page. Avec cette technique, les accès se faisant en parallèle et non l'un après l'autre, le temps d'accès est presque le même que si la TLB ne gérait qu'une seule taille de page. Le désavantage est que les multiples accès consomment de l'énergie et du courant, ce qui augmente la consommation énergétique de la TLB, qui est déjà très importante. La seconde solution est la '''prédiction de taille de page'''. L'idée est que le processeur tente de prédire quelle sera la taille de page, afin de tomber directement sur la bonne taille de page. Au lieu de tenter d'abord pour une page de 4 kibioctets, puis 2 mébioctets et enfin 1-2 Gibioctets, le processeur testera la taille de page la plus probable, puis la seconde plus probable, avant de tester la dernière taille de page possible. Le problème est alors de concevoir un circuit capable de réaliser cette prédiction. * Une manière simple mais extrêmement inefficace de faire cela est de mémoriser la taille des pages récemment accédées dans un cache spécialisé, qui mémorise la correspondance entre le numéro de la page et sa taille. La taille de la page est mémorisée dans ce cache, après le premier accès à cette page. Mais le défaut que le temps d'accès à ce cache de prédiction s'ajoute au temps d'accès à la TLBL2, ce qui en ruine totalement l'intérêt. Aussi, il faut trouver une solution alternative. * Une autre solution n'utilise pas le numéro de page, mais l'instruction responsable de l'accès à la TLB. Un accès à la TLB signifie un accès en mémoire RAM, qui est réalisé par une instruction. Instruction qui est identifiée par une adresse, elle-même située dans le ''program counter''. L'idée est que si une instruction est exécutée plusieurs fois, elle a tendance à accéder aux données d'une même page (localité spatiale). Ce n'est pas systématique, mais c'est une bonne supposition. On peut donc associer cette instruction à la taille de la page accédée récemment. Le cache de prédiction mémorise donc l'association entre adresse de cette instruction et taille de la page. Lors de l'accès mémoire, le ''program counter'' est récupéré et envoyé au cache de prédiction. En cas de succès d'accès, on obtient la taille de la page prédite. Cette méthode a le défaut que si plusieurs instructions accèdent à la même page, elles prendront chacune une ligne de cache dans le cache de prédiction et rien ne sera mutualisé. * Une solution alternative est de récupérer lune adresse virtuelle proche de l'adresse lue/écrite avant que l'accès mémoire soit démarré. L'idée est que lors du décodage de l'instruction d'accès mémoire, on récupère les registres utilisés, et on y accède pour lire en avance l'adresse virtuelle. Une dernière méthode consiste à '''amortir le temps d'accès en cas de défaut dans la TLB L2'''. L'idée est de démarrer un accès à la table des pages en RAM en parallèle de l'accès à la TLB L2. La raison est que le temps d'accès à la TLB L2, avec ''hash-rehashing'', est très long. Il est sensiblement proche du quart du temps de défaut de TLB. Si en plus il fallait rajouter le temps d'accès à la table des pages en cas de défaut, le temps d'accès total serait énorme. Mais en lançant une lecture spéculative de la table des pages, le temps d'accès en cas de défaut est partiellement amorti. Le temps d'accès en cas de succès de TLB L2 reste cependant le même. ====Le ''skewing''==== La technique du ''skewing'' est assez simple à comprendre pour qui se rappelle ce qu'est un cache associatif par voie, et encore plus un cache ''skew-associative''. L'idée est d'utiliser un cache associatif par voie, mais où chaque voie est dédiée à une taille de page bien définie. Un cache associatif à trois voie pourra ainsi avoir une voie pour les pages de 4 kibioctets, une voie pour les pages de 2 mébioctets et une dernière voie pour les pages de plusieurs gibioctets. Cette méthode est conceptuellement équivalente au fait d'utiliser un cache pour chaque taille, à quelques différences près. Notamment, cela permet de mutualiser des circuits qui auraient été dupliqués en utilisant des caches séparés. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le préchargement | prevTextLe préchargement | next=Le pipeline | nextText=Le pipeline }} </noinclude> pnjftgyzax0zdlit3trav5uohnuvuwb 682823 682822 2022-07-28T16:29:02Z Mewtow 31375 /* Les Page walk caches */ wikitext text/x-wiki Dans le chapitre sur la mémoire virtuelle, nous avions abordé la pagination. Nous avions vu que la traduction des adresses virtuelles en adresses physiques se fait grâce à une table des pages située en mémoire RAM, qui contient les correspondances entre adresses physiques et virtuelles. Pour éviter d'avoir à lire la table des pages en mémoire RAM à chaque accès mémoire, les concepteurs de processeurs ont décidé d'implanter un cache dédié, le '''''translation lookaside buffer''''', ou TLB. Il stocke de quoi faire la traduction entre adresse virtuelle et adresse physique, à savoir une correspondance entre numéro de page logique et numéro de page physique. [[File:MMU principle updated.png|centre|vignette|upright=2.0|MMU avec une TLB.]] Les caches consomment beaucoup d'énergie et la TLB ne fait pas exception. Diverses estimations montrent que les TLB sont très consommatrices en énergie. Près de 5 à 15% de la consommation d'énergie d'un processeur provient de sa TLB et des circuits associés. Pour réduire cette consommation tout en gardant des performances très importantes, la TLB est conçue avec ces contraintes en tête. Notamment, la TLB est généralement un cache associatif par voie ou directement adressé, et non un cache totalement associatif. Les caches totalement associatifs consomment en effet beaucoup plus d'énergie pour fonctionner que les autres types de caches, pour des performances légèrement meilleures. Le cout en énergie ne vaut pas les performances gagnées, pour une LTB. Pour des raisons de performances, la TLB est parfois découpée en plusieurs sous-caches L1, L2, L3, etc. Sur les architectures Harvard et Harvard modifiées, on trouve parfois deux TLB séparés : un pour les accès aux instructions, et un pour les accès aux données. L'architecture standard pour les TLBs actuelles est la suivante : une TLB de niveau 1 pour les instructions, une autre TLB de niveau 1 pour les données, puis une TLB de niveaux 2 partagée entre instructions et données. La séparation en une TLB L1 pour les instructions et une pour les données est nécessaire sur les architectures à hautes performances. Les processeurs modernes peuvent exécuter plusieurs instructions simultanément, ce qui fait qu'ils accèdent souvent à des données en même temps qu'ils chargent une ou plusieurs instructions. Une TLB unique devrait gérer plusieurs dizaines d'accès en même temps pour alimenter le processeur en données/instructions. La TLB doit alors être une mémoire multiports avec beaucoup de ports, beaucoup trop de ports pour être performante. Utiliser deux TLB séparées élimine ce problème, en limitant le nombre de ports sur chaque TLB. Un autre problème est que le programme prend moins de place que les données, ce qui se marie mal avec une TLB unique mais colle assez bien avec une TLB d'instruction plus petite que celle pour les données. [[File:Hiérarchie de TLB.png|centre|vignette|upright=2|Hiérarchie de TLB.]] ==L'accès à la TLB : succès et défauts d'accès== À chaque accès mémoire, le processeur vérifie si le TLB contient l'adresse physique à laquelle accéder. Si c'est le cas, le processeur n'a pas à accéder à la table des pages en mémoire RAM et lit directement l'information nécessaire depuis ce TLB. On dit que l'on a un succès d'accès à la TLB. Si la TLb ne contient pas l'adresse physique demandée, on fait face à un '''défaut d'accès à la TLB'''. L'accès à la table des pages en mémoire RAM est alors inévitable. [[File:Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Translation Lookaside Buffer]] ===La traduction d'adresse avec la TLB=== [[File:Page table actions.svg|vignette|Page table actions]] La traduction d'une adresse avec une TLB a lieu comme suit. Premièrement, le processeur (sa MMU) interroge la TLB : il envoie l'adresse virtuelle et la TLB répond. Si la TLB contient l'adresse physique associée, elle la fournit directement et le processeur au cache ou à la RAM directement. Si ce n'est pas le cas, le processeur accède à la table des pages en mémoire RAM. Si la page est en RAM, alors la table des pages renvoie l'adresse physique voulue et la TLB est mise à jour. Par contre, si la page n'est pas en RAM, mais a été swappée sur le disque dur, la page est recopiée en mémoire RAM, la table des pages est mise à jour, puis la TLB l'est ensuite. [[File:Steps In a Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Steps In a Translation Lookaside Buffer]] ===Les ''page table walkers''=== Les défauts d'accès à la TLB sont gérés de deux façons : soit le processeur gère tout seul la situation, soit il délègue cette tâche au système d’exploitation. Sur les processeurs anciens, le système d'exploitation gère le défaut d'accès à la TLB. En cas de défaut, le processeur lève une exception matérielle spécialisée, qui exécute une routine d'interruption qui accède à la table des pages en RAM et effectue la traduction d'adresse. Mais cette solution logicielle n'a pas de bonnes performances. D'autres processeurs gèrent eux-mêmes le défaut d'accès à la TLB et vont chercher d'eux-mêmes les informations nécessaires dans la table des pages. Ils disposent de circuits, les '''''page table walkers''''' (PTW), qui s'occupent eux-mêmes du défaut. L'avantage en termes de performance est certain : plus besoin de lever une exception matérielle, plus besoin de lever une interruption couteuse à chaque défaut de TLB. Un autre avantage est que la gestion des bits de statut, qui mémorisent des informations sur chaque page, est gérée par le PTW. Sur les processeurs superscalaires à exécution dans le désordre qu'on abordera dans quelques chapitres, les PWT peuvent gérer un défaut de TLB pendant que le processeur fait d'autres opérations en parallèle, ce que ne permet pas la solution logicielle. Mieux : les PWT et TLB modernes sont conçus pour gérer plusieurs défauts simultanés, ce qui permet de grandement gagner en performance par rapport à l'approche logicielle. Le défaut principal des PWT est qu'ils sont conçus pour un format bien précis de table des pages, éventuellement deux ou trois autres, mais guère plus. Il est rare qu'ils gèrent plusieurs types de tables des pages différents. Leur flexibilité est donc assez faible. En comparaison, la solution logicielle n'a pas de limites précises, tant que le système d'exploitation gère le format de table des pages voulu. Les PTW sont généralement implémentés avec des circuits séquentiels spécifiques, nommés machines à état. Ils ont besoin, pour faire leur travail, de mémoriser l'adresse de la table des pages, ou du moins l'adresse de la table des pages de niveau 1 pour des tables des pages hiérarchiques. L'adresse de la table des pages est mémorisée dans un registre spécialisé, manipulé seulement par le système d'exploitation. Les informations nécessaires pour gérer chaque défaut de TLB sont stockées dans des registres spécialisés appelés des tampons de PTW (''PTW buffers''). Sur les architectures à plusieurs processeurs, chaque cœur ou processeur a son propre PTW. Dans le cas le plus simple, la table des pages est une table des pages simple, unique, qui contient des numéros de page physique. Le PTW a juste besoin de calculer une adresse et de faire une lecture pour récupérer le numéro de page physique. Dans le cas où la table des pages est hiérarchique, le processus doit être répété plusieurs fois, autant de fois qu'il faut passer d'une table des pages à la suivante. Dans le cas d'une table des pages inversée, le PTW doit parcourir automatiquement la mémoire pour lire chaque entrée de la table des pages une par une, faire une comparaison pour détecter la bonne entrée, puis déclencher une lecture une fois la bonne entrée détectée. Le processus est donc simple sur une table des pages unique, mais plus complexe dans les autres cas. La difficulté est de parcourir la mémoire. Pour le cas des pages des tables inversées, parcourir la mémoire en lisant des adresses consécutives est simple : un simple compteur d'adresse suffit. Par contre, le processus est plus complexe pour les tables des pages hiérarchiques, et demande généralement une implémentation avec du microcode. Le PWT communique alors avec le séquenceur pour lui demander d’exécuter une suite d’instructions microcodée pour gérer le défaut. ===Les ''Page walk caches''=== Pour accélérer le parcours des tables des pages hiérarchiques, l'unité de gestion mémoire (la MMU) des processeurs modernes incorpore des caches spécialisés, appelés des ''MMU caches'' ou encore caches de la MMU en français. Ils sont systématiquement utilisés en complément d'une TLB. La différence principale entre TLB et cache de la MMU tient dans leur contenu. Les TLB stockent des correspondances adresse logique-physique obtenues une fois qu'on a parcouru l'ensemble des niveaux d'une table des pages à la recherche d'une adresse physique précise, elles stockent le résultat de la traduction d'adresse. Les caches de la MMU, quant à eux, mémorisent non pas le résultat final, mais les résultats des étapes intermédiaires. Elles mémorisent les entrées de la table des pages accédées lors des défauts de TLB les plus récents, qui ne sont pas déjà dans la TLB. Ils stockent les entrées de la table de niveau 1 ou les autres tables des pages de niveau supérieur, mais pas les entrées qui contiennent un numéro de page physique. Cette différence de contenu se traduit par de nombreuses différences pratiques. La première est que la taille des lignes de cache n'est pas la même. Les TLB prennent un numéro de page logique et renvoient un numéro de page physique, les deux ayant la même taille. Les caches de la MMU prennent en entrée des numéros de page logique ou des morceaux de celle-ci (tout dépend de sa conception, comme on le verra plus bas), mais fournissent en sortie une adresse mémoire complète. La différence de taille entre numéro de page physique et adresse complète fait que la sortie d'une TLB et d'un cache de MMU n'a pas la même taille. Même chose pour les entrées, mais à un degré moindre. Les caches de la MMU sont très utiles, car les accès mémoires ont une bonne localité spatiale, ce qui fait que des accès consécutifs ont des chances d’accéder aux mêmes entrées de la table de niveau 1 et de niveau 2, voire des niveaux 3 et 4. Il faut dire que sur les ordinateurs x86 64 bits, une entrée de la table des pages de premier niveau correspond à 512 gibioctets de mémoire... Il existe plusieurs manières de concevoir les caches de la MMU. La première est tout simplement d'associer une entrée de la table des pages avec son adresse physique, l'adresse physique servant de tag et l'entrée prenant une ligne de cache. C'est ce qui est fait sur les ''page walk caches'' des processeurs AMD. Ils se marient bien avec le fonctionnement normal du ''page table walker'', qui génère des adresses physiques. Une autre approche associe certains bits de l'adresse virtuelle à lire/écrire avec une entrée, au lieu de l'adresse physique de l'entrée. Par exemple, les bits de poids fort qui sont utilisés pour adresser la table de premier niveau sont utilisés comme tag dans le cache de la MMU. Même chose pour les bits précédents, qui servent à adresser la table de second niveau, et ainsi de suite. C’est ce qui est fait sur les ''paging structure cache'' des processeurs Intel. Une troisième approche est celle du '' translation path cache''. Si on compare les ''page walk caches'' avec les ''paging structure cache'', les ''page walk caches'' sont plus simples à fabriquer mais plus lents, alors que c'est l'inverse pour les ''paging structure caches''. Les ''page walk caches'' sont des caches normaux, sans particularité notable si ce n'est qu'ils sont intégrés à la MMU et qu'ils stockent des entrées des table de haut niveau de la table des pages. Ils sont donc aussi facile à fabriquer/concevoir que n'importe quel autre cache, voire plus facile vu que les entrées sont petites et ont peu de bits à stocker. Par contre, un défaut de TLB entraine plusieurs lectures consécutives dans un ''page walk caches''. Une première lecture pour récupérer l'entrée de la table de premier niveau, une seconde pour l'entrée adéquate de la table de second niveau, et ainsi de suite jusqu'à effectuer la lecture en mémoire. Le parcours de la table des pages s'effectue normalement, dans le même ordre que sans cache de MMU. Les ''paging structure cache'' permettent d'optimiser la recherche en sautant des étapes, ce qui rend le parcours de la table des pages beaucoup plus rapide si les entrées adéquates sont dans le cache. Les ''paging structure cache'' utilisent des tags plus petits que leurs concurrents, ce qui fait qu'ils prennent moins de place et de portes logiques à capacité égale et sont moins consommateurs en énergie.En clair, à part la simplciité de conception, les ''paging structure cache'' ont de meilleurs performances pour un budget en circuits et énergie plus faible. Il est possible d'utiliser un seul cache, qui mémorise les entrées des différents niveaux de la table des pages. Une autre possibilité est d'utiliser un cache pour chaque niveau de la table des pages. On a ainsi un cache pour la table de niveau 1, un autre pour les tables de niveau 2, etc. Faire ainsi facilite l'implémentation du remplacement des lignes de cache et améliore son efficacité. Un autre avantage est qu'il est plus facile de gérer plusieurs défauts simultanés. On peut accéder au cache pour la table de premier niveau en même temps qu'au cache pour les tables de second niveau, et idem pour les autres caches. ==Les pages larges et leur impact sur la TLB== Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages larges ont l'avantage d'utiliser la TLB de manière optimale. Pour une capacité de TLB identique, on peut adresser beaucoup plus de mémoire avec des pages larges, ce qui rend les défauts de TLB plus rares. Par contre, ces différentes tailles se marient mal avec une TLB unique. Un des problèmes est que les numéros de page physique n'ont pas le même nombre de bits suivant la taille des pages, ce qui pose des problèmes avec l'associativité de la TLB. Ce problème fait que l'usage d'une TLB unique est possible, mais pas forcément optimal. ===L'usage de plusieurs TLB, chacune dédiée à une taille de page=== L'usage d'une TLB unique pour toutes les tailles de page est possible et même courant pour la TLB de niveau 2 (L2). Mais les TLB de niveau 1 sont souvent séparées en plusieurs TLB, une par taille de page possible. Les TLB pour les pages larges sont souvent plus petites que la TLB pour les pages de 4 kibioctets, afin de profiter des économies de TLB liées aux pages larges. Un problème est que la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. Pour résoudre ce problème, toutes les TLB L1 sont accédées en parallèle lors d'un accès mémoire et le processeur sélectionne ensuite le résultat de celle qui correspond à la taille de page voulue. [[File:TLB pour plusieurs tailles de page.png|centre|vignette|upright=2|TLB pour plusieurs tailles de page]] ===L'usage d'une TLB unique pour toutes les tailles de page=== Les TLB de niveau 2 gèrent plusieurs tailles de page en même temps. Mais les techniques pour faire cela sont assez couteuses en circuits et en performances. Aussi, les techniques utilisées pour gérer plusieurs tailles de page sont couramment implémentées sur les TLB de niveau 2, mais sont impraticables sur les TLB de niveau 1. Les deux techniques qui permettent cela sont appelées le '''''hash-rehashing''''' et le '''''skewing'''''. Elles répondent à un problème assez simple à 'expliquer : la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. On doit accéder à la TLB en postulant que la page a une certaine taille, donc en précisant un numéro de page d'une certaine taille, pour ensuite avoir un défaut ou un succès de TLB. ====Le ''hash-rehashing''==== La première technique, celle du ''hash-rehashing'', consiste simplement à accéder la TLB en supposant que la page voulue a la taille usuelle, à savoir 4 kibioctets. En cas de succès de TLB, la page avait bien la taille supposée. Dans le cas contraire, on effectue un second accès en supposant que sa taille est de 2 mébioctets, et rebelote pour une page de 1-2 gibioctets en cas de défaut de TLB. Une fois toutes les tailles essayées, on accède à la table des pages en mémoire RAM. C'était la technique utilisée sur les processeurs Intel d’architecture Skylake et Broadwell. L'inconvénient est que les accès aux pages larges subissent une perte de performance notable, leur temps d'accès étant allongé. Cela est contrebalancé par le fait que ces tailles de page ont été inventées pour réduire le nombre de défauts de TLB, mais ces défauts sont assez rares pour l'impact soit seulement mitigé, pas compensé. L'allongement du temps d'accès peut être compensé par diverses méthodes. La première méthode est celle des '''accès simultanés à la TLB'''. Les TLB sont des caches assez performants, qui sont conçus pour être capables d'effectuer plusieurs accès en parallèle. On peut alors profiter de cette particularité pour lancer plusieurs accès au TLB en même temps, un par taille de page. Avec cette technique, les accès se faisant en parallèle et non l'un après l'autre, le temps d'accès est presque le même que si la TLB ne gérait qu'une seule taille de page. Le désavantage est que les multiples accès consomment de l'énergie et du courant, ce qui augmente la consommation énergétique de la TLB, qui est déjà très importante. La seconde solution est la '''prédiction de taille de page'''. L'idée est que le processeur tente de prédire quelle sera la taille de page, afin de tomber directement sur la bonne taille de page. Au lieu de tenter d'abord pour une page de 4 kibioctets, puis 2 mébioctets et enfin 1-2 Gibioctets, le processeur testera la taille de page la plus probable, puis la seconde plus probable, avant de tester la dernière taille de page possible. Le problème est alors de concevoir un circuit capable de réaliser cette prédiction. * Une manière simple mais extrêmement inefficace de faire cela est de mémoriser la taille des pages récemment accédées dans un cache spécialisé, qui mémorise la correspondance entre le numéro de la page et sa taille. La taille de la page est mémorisée dans ce cache, après le premier accès à cette page. Mais le défaut que le temps d'accès à ce cache de prédiction s'ajoute au temps d'accès à la TLBL2, ce qui en ruine totalement l'intérêt. Aussi, il faut trouver une solution alternative. * Une autre solution n'utilise pas le numéro de page, mais l'instruction responsable de l'accès à la TLB. Un accès à la TLB signifie un accès en mémoire RAM, qui est réalisé par une instruction. Instruction qui est identifiée par une adresse, elle-même située dans le ''program counter''. L'idée est que si une instruction est exécutée plusieurs fois, elle a tendance à accéder aux données d'une même page (localité spatiale). Ce n'est pas systématique, mais c'est une bonne supposition. On peut donc associer cette instruction à la taille de la page accédée récemment. Le cache de prédiction mémorise donc l'association entre adresse de cette instruction et taille de la page. Lors de l'accès mémoire, le ''program counter'' est récupéré et envoyé au cache de prédiction. En cas de succès d'accès, on obtient la taille de la page prédite. Cette méthode a le défaut que si plusieurs instructions accèdent à la même page, elles prendront chacune une ligne de cache dans le cache de prédiction et rien ne sera mutualisé. * Une solution alternative est de récupérer lune adresse virtuelle proche de l'adresse lue/écrite avant que l'accès mémoire soit démarré. L'idée est que lors du décodage de l'instruction d'accès mémoire, on récupère les registres utilisés, et on y accède pour lire en avance l'adresse virtuelle. Une dernière méthode consiste à '''amortir le temps d'accès en cas de défaut dans la TLB L2'''. L'idée est de démarrer un accès à la table des pages en RAM en parallèle de l'accès à la TLB L2. La raison est que le temps d'accès à la TLB L2, avec ''hash-rehashing'', est très long. Il est sensiblement proche du quart du temps de défaut de TLB. Si en plus il fallait rajouter le temps d'accès à la table des pages en cas de défaut, le temps d'accès total serait énorme. Mais en lançant une lecture spéculative de la table des pages, le temps d'accès en cas de défaut est partiellement amorti. Le temps d'accès en cas de succès de TLB L2 reste cependant le même. ====Le ''skewing''==== La technique du ''skewing'' est assez simple à comprendre pour qui se rappelle ce qu'est un cache associatif par voie, et encore plus un cache ''skew-associative''. L'idée est d'utiliser un cache associatif par voie, mais où chaque voie est dédiée à une taille de page bien définie. Un cache associatif à trois voie pourra ainsi avoir une voie pour les pages de 4 kibioctets, une voie pour les pages de 2 mébioctets et une dernière voie pour les pages de plusieurs gibioctets. Cette méthode est conceptuellement équivalente au fait d'utiliser un cache pour chaque taille, à quelques différences près. Notamment, cela permet de mutualiser des circuits qui auraient été dupliqués en utilisant des caches séparés. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le préchargement | prevTextLe préchargement | next=Le pipeline | nextText=Le pipeline }} </noinclude> p74tiuix6671g7vu8o6r23wzjikssyy 682824 682823 2022-07-28T16:31:02Z Mewtow 31375 /* Les Page walk caches */ wikitext text/x-wiki Dans le chapitre sur la mémoire virtuelle, nous avions abordé la pagination. Nous avions vu que la traduction des adresses virtuelles en adresses physiques se fait grâce à une table des pages située en mémoire RAM, qui contient les correspondances entre adresses physiques et virtuelles. Pour éviter d'avoir à lire la table des pages en mémoire RAM à chaque accès mémoire, les concepteurs de processeurs ont décidé d'implanter un cache dédié, le '''''translation lookaside buffer''''', ou TLB. Il stocke de quoi faire la traduction entre adresse virtuelle et adresse physique, à savoir une correspondance entre numéro de page logique et numéro de page physique. [[File:MMU principle updated.png|centre|vignette|upright=2.0|MMU avec une TLB.]] Les caches consomment beaucoup d'énergie et la TLB ne fait pas exception. Diverses estimations montrent que les TLB sont très consommatrices en énergie. Près de 5 à 15% de la consommation d'énergie d'un processeur provient de sa TLB et des circuits associés. Pour réduire cette consommation tout en gardant des performances très importantes, la TLB est conçue avec ces contraintes en tête. Notamment, la TLB est généralement un cache associatif par voie ou directement adressé, et non un cache totalement associatif. Les caches totalement associatifs consomment en effet beaucoup plus d'énergie pour fonctionner que les autres types de caches, pour des performances légèrement meilleures. Le cout en énergie ne vaut pas les performances gagnées, pour une LTB. Pour des raisons de performances, la TLB est parfois découpée en plusieurs sous-caches L1, L2, L3, etc. Sur les architectures Harvard et Harvard modifiées, on trouve parfois deux TLB séparés : un pour les accès aux instructions, et un pour les accès aux données. L'architecture standard pour les TLBs actuelles est la suivante : une TLB de niveau 1 pour les instructions, une autre TLB de niveau 1 pour les données, puis une TLB de niveaux 2 partagée entre instructions et données. La séparation en une TLB L1 pour les instructions et une pour les données est nécessaire sur les architectures à hautes performances. Les processeurs modernes peuvent exécuter plusieurs instructions simultanément, ce qui fait qu'ils accèdent souvent à des données en même temps qu'ils chargent une ou plusieurs instructions. Une TLB unique devrait gérer plusieurs dizaines d'accès en même temps pour alimenter le processeur en données/instructions. La TLB doit alors être une mémoire multiports avec beaucoup de ports, beaucoup trop de ports pour être performante. Utiliser deux TLB séparées élimine ce problème, en limitant le nombre de ports sur chaque TLB. Un autre problème est que le programme prend moins de place que les données, ce qui se marie mal avec une TLB unique mais colle assez bien avec une TLB d'instruction plus petite que celle pour les données. [[File:Hiérarchie de TLB.png|centre|vignette|upright=2|Hiérarchie de TLB.]] ==L'accès à la TLB : succès et défauts d'accès== À chaque accès mémoire, le processeur vérifie si le TLB contient l'adresse physique à laquelle accéder. Si c'est le cas, le processeur n'a pas à accéder à la table des pages en mémoire RAM et lit directement l'information nécessaire depuis ce TLB. On dit que l'on a un succès d'accès à la TLB. Si la TLb ne contient pas l'adresse physique demandée, on fait face à un '''défaut d'accès à la TLB'''. L'accès à la table des pages en mémoire RAM est alors inévitable. [[File:Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Translation Lookaside Buffer]] ===La traduction d'adresse avec la TLB=== [[File:Page table actions.svg|vignette|Page table actions]] La traduction d'une adresse avec une TLB a lieu comme suit. Premièrement, le processeur (sa MMU) interroge la TLB : il envoie l'adresse virtuelle et la TLB répond. Si la TLB contient l'adresse physique associée, elle la fournit directement et le processeur au cache ou à la RAM directement. Si ce n'est pas le cas, le processeur accède à la table des pages en mémoire RAM. Si la page est en RAM, alors la table des pages renvoie l'adresse physique voulue et la TLB est mise à jour. Par contre, si la page n'est pas en RAM, mais a été swappée sur le disque dur, la page est recopiée en mémoire RAM, la table des pages est mise à jour, puis la TLB l'est ensuite. [[File:Steps In a Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Steps In a Translation Lookaside Buffer]] ===Les ''page table walkers''=== Les défauts d'accès à la TLB sont gérés de deux façons : soit le processeur gère tout seul la situation, soit il délègue cette tâche au système d’exploitation. Sur les processeurs anciens, le système d'exploitation gère le défaut d'accès à la TLB. En cas de défaut, le processeur lève une exception matérielle spécialisée, qui exécute une routine d'interruption qui accède à la table des pages en RAM et effectue la traduction d'adresse. Mais cette solution logicielle n'a pas de bonnes performances. D'autres processeurs gèrent eux-mêmes le défaut d'accès à la TLB et vont chercher d'eux-mêmes les informations nécessaires dans la table des pages. Ils disposent de circuits, les '''''page table walkers''''' (PTW), qui s'occupent eux-mêmes du défaut. L'avantage en termes de performance est certain : plus besoin de lever une exception matérielle, plus besoin de lever une interruption couteuse à chaque défaut de TLB. Un autre avantage est que la gestion des bits de statut, qui mémorisent des informations sur chaque page, est gérée par le PTW. Sur les processeurs superscalaires à exécution dans le désordre qu'on abordera dans quelques chapitres, les PWT peuvent gérer un défaut de TLB pendant que le processeur fait d'autres opérations en parallèle, ce que ne permet pas la solution logicielle. Mieux : les PWT et TLB modernes sont conçus pour gérer plusieurs défauts simultanés, ce qui permet de grandement gagner en performance par rapport à l'approche logicielle. Le défaut principal des PWT est qu'ils sont conçus pour un format bien précis de table des pages, éventuellement deux ou trois autres, mais guère plus. Il est rare qu'ils gèrent plusieurs types de tables des pages différents. Leur flexibilité est donc assez faible. En comparaison, la solution logicielle n'a pas de limites précises, tant que le système d'exploitation gère le format de table des pages voulu. Les PTW sont généralement implémentés avec des circuits séquentiels spécifiques, nommés machines à état. Ils ont besoin, pour faire leur travail, de mémoriser l'adresse de la table des pages, ou du moins l'adresse de la table des pages de niveau 1 pour des tables des pages hiérarchiques. L'adresse de la table des pages est mémorisée dans un registre spécialisé, manipulé seulement par le système d'exploitation. Les informations nécessaires pour gérer chaque défaut de TLB sont stockées dans des registres spécialisés appelés des tampons de PTW (''PTW buffers''). Sur les architectures à plusieurs processeurs, chaque cœur ou processeur a son propre PTW. Dans le cas le plus simple, la table des pages est une table des pages simple, unique, qui contient des numéros de page physique. Le PTW a juste besoin de calculer une adresse et de faire une lecture pour récupérer le numéro de page physique. Dans le cas où la table des pages est hiérarchique, le processus doit être répété plusieurs fois, autant de fois qu'il faut passer d'une table des pages à la suivante. Dans le cas d'une table des pages inversée, le PTW doit parcourir automatiquement la mémoire pour lire chaque entrée de la table des pages une par une, faire une comparaison pour détecter la bonne entrée, puis déclencher une lecture une fois la bonne entrée détectée. Le processus est donc simple sur une table des pages unique, mais plus complexe dans les autres cas. La difficulté est de parcourir la mémoire. Pour le cas des pages des tables inversées, parcourir la mémoire en lisant des adresses consécutives est simple : un simple compteur d'adresse suffit. Par contre, le processus est plus complexe pour les tables des pages hiérarchiques, et demande généralement une implémentation avec du microcode. Le PWT communique alors avec le séquenceur pour lui demander d’exécuter une suite d’instructions microcodée pour gérer le défaut. ===Les ''Page walk caches''=== Pour accélérer le parcours des tables des pages hiérarchiques, l'unité de gestion mémoire (la MMU) des processeurs modernes incorpore des caches spécialisés, appelés des ''MMU caches'' ou encore caches de la MMU en français. Ils sont systématiquement utilisés en complément d'une TLB. La différence principale entre TLB et cache de la MMU tient dans leur contenu. Les TLB stockent des correspondances adresse logique-physique obtenues une fois qu'on a parcouru l'ensemble des niveaux d'une table des pages à la recherche d'une adresse physique précise, elles stockent le résultat de la traduction d'adresse. Les caches de la MMU, quant à eux, mémorisent non pas le résultat final, mais les résultats des étapes intermédiaires. Elles mémorisent les entrées de la table des pages accédées lors des défauts de TLB les plus récents, qui ne sont pas déjà dans la TLB. Ils stockent les entrées de la table de niveau 1 ou les autres tables des pages de niveau supérieur, mais pas les entrées qui contiennent un numéro de page physique. Cette différence de contenu se traduit par de nombreuses différences pratiques. La première est que la taille des lignes de cache n'est pas la même. Les TLB prennent un numéro de page logique et renvoient un numéro de page physique, les deux ayant la même taille. Les caches de la MMU prennent en entrée des numéros de page logique ou des morceaux de celle-ci (tout dépend de sa conception, comme on le verra plus bas), mais fournissent en sortie une adresse mémoire complète. La différence de taille entre numéro de page physique et adresse complète fait que la sortie d'une TLB et d'un cache de MMU n'a pas la même taille. Même chose pour les entrées, mais à un degré moindre. L'usage qui est fait par la MMU de la sortie du cache est aussi très différent, au vu de la nature différente des données stockées. Les caches de la MMU sont très utiles, car les accès mémoires ont une bonne localité spatiale, ce qui fait que des accès consécutifs ont des chances d’accéder aux mêmes entrées de la table de niveau 1 et de niveau 2, voire des niveaux 3 et 4. Il faut dire que sur les ordinateurs x86 64 bits, une entrée de la table des pages de premier niveau correspond à 512 gibioctets de mémoire... Il existe plusieurs manières de concevoir les caches de la MMU. La première est tout simplement d'associer une entrée de la table des pages avec son adresse physique, l'adresse physique servant de tag et l'entrée prenant une ligne de cache. C'est ce qui est fait sur les ''page walk caches'' des processeurs AMD. Ils se marient bien avec le fonctionnement normal du ''page table walker'', qui génère des adresses physiques. Une autre approche associe certains bits de l'adresse virtuelle à lire/écrire avec une entrée, au lieu de l'adresse physique de l'entrée. Par exemple, les bits de poids fort qui sont utilisés pour adresser la table de premier niveau sont utilisés comme tag dans le cache de la MMU. Même chose pour les bits précédents, qui servent à adresser la table de second niveau, et ainsi de suite. C’est ce qui est fait sur les ''paging structure cache'' des processeurs Intel. Une troisième approche est celle du '' translation path cache''. Si on compare les ''page walk caches'' avec les ''paging structure cache'', les ''page walk caches'' sont plus simples à fabriquer mais plus lents, alors que c'est l'inverse pour les ''paging structure caches''. Les ''page walk caches'' sont des caches normaux, sans particularité notable si ce n'est qu'ils sont intégrés à la MMU et qu'ils stockent des entrées des table de haut niveau de la table des pages. Ils sont donc aussi facile à fabriquer/concevoir que n'importe quel autre cache, voire plus facile vu que les entrées sont petites et ont peu de bits à stocker. Par contre, un défaut de TLB entraine plusieurs lectures consécutives dans un ''page walk caches''. Une première lecture pour récupérer l'entrée de la table de premier niveau, une seconde pour l'entrée adéquate de la table de second niveau, et ainsi de suite jusqu'à effectuer la lecture en mémoire. Le parcours de la table des pages s'effectue normalement, dans le même ordre que sans cache de MMU. Les ''paging structure cache'' permettent d'optimiser la recherche en sautant des étapes, ce qui rend le parcours de la table des pages beaucoup plus rapide si les entrées adéquates sont dans le cache. Les ''paging structure cache'' utilisent des tags plus petits que leurs concurrents, ce qui fait qu'ils prennent moins de place et de portes logiques à capacité égale et sont moins consommateurs en énergie.En clair, à part la simplciité de conception, les ''paging structure cache'' ont de meilleurs performances pour un budget en circuits et énergie plus faible. Il est possible d'utiliser un seul cache, qui mémorise les entrées des différents niveaux de la table des pages. Une autre possibilité est d'utiliser un cache pour chaque niveau de la table des pages. On a ainsi un cache pour la table de niveau 1, un autre pour les tables de niveau 2, etc. Faire ainsi facilite l'implémentation du remplacement des lignes de cache et améliore son efficacité. Un autre avantage est qu'il est plus facile de gérer plusieurs défauts simultanés. On peut accéder au cache pour la table de premier niveau en même temps qu'au cache pour les tables de second niveau, et idem pour les autres caches. ==Les pages larges et leur impact sur la TLB== Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages larges ont l'avantage d'utiliser la TLB de manière optimale. Pour une capacité de TLB identique, on peut adresser beaucoup plus de mémoire avec des pages larges, ce qui rend les défauts de TLB plus rares. Par contre, ces différentes tailles se marient mal avec une TLB unique. Un des problèmes est que les numéros de page physique n'ont pas le même nombre de bits suivant la taille des pages, ce qui pose des problèmes avec l'associativité de la TLB. Ce problème fait que l'usage d'une TLB unique est possible, mais pas forcément optimal. ===L'usage de plusieurs TLB, chacune dédiée à une taille de page=== L'usage d'une TLB unique pour toutes les tailles de page est possible et même courant pour la TLB de niveau 2 (L2). Mais les TLB de niveau 1 sont souvent séparées en plusieurs TLB, une par taille de page possible. Les TLB pour les pages larges sont souvent plus petites que la TLB pour les pages de 4 kibioctets, afin de profiter des économies de TLB liées aux pages larges. Un problème est que la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. Pour résoudre ce problème, toutes les TLB L1 sont accédées en parallèle lors d'un accès mémoire et le processeur sélectionne ensuite le résultat de celle qui correspond à la taille de page voulue. [[File:TLB pour plusieurs tailles de page.png|centre|vignette|upright=2|TLB pour plusieurs tailles de page]] ===L'usage d'une TLB unique pour toutes les tailles de page=== Les TLB de niveau 2 gèrent plusieurs tailles de page en même temps. Mais les techniques pour faire cela sont assez couteuses en circuits et en performances. Aussi, les techniques utilisées pour gérer plusieurs tailles de page sont couramment implémentées sur les TLB de niveau 2, mais sont impraticables sur les TLB de niveau 1. Les deux techniques qui permettent cela sont appelées le '''''hash-rehashing''''' et le '''''skewing'''''. Elles répondent à un problème assez simple à 'expliquer : la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. On doit accéder à la TLB en postulant que la page a une certaine taille, donc en précisant un numéro de page d'une certaine taille, pour ensuite avoir un défaut ou un succès de TLB. ====Le ''hash-rehashing''==== La première technique, celle du ''hash-rehashing'', consiste simplement à accéder la TLB en supposant que la page voulue a la taille usuelle, à savoir 4 kibioctets. En cas de succès de TLB, la page avait bien la taille supposée. Dans le cas contraire, on effectue un second accès en supposant que sa taille est de 2 mébioctets, et rebelote pour une page de 1-2 gibioctets en cas de défaut de TLB. Une fois toutes les tailles essayées, on accède à la table des pages en mémoire RAM. C'était la technique utilisée sur les processeurs Intel d’architecture Skylake et Broadwell. L'inconvénient est que les accès aux pages larges subissent une perte de performance notable, leur temps d'accès étant allongé. Cela est contrebalancé par le fait que ces tailles de page ont été inventées pour réduire le nombre de défauts de TLB, mais ces défauts sont assez rares pour l'impact soit seulement mitigé, pas compensé. L'allongement du temps d'accès peut être compensé par diverses méthodes. La première méthode est celle des '''accès simultanés à la TLB'''. Les TLB sont des caches assez performants, qui sont conçus pour être capables d'effectuer plusieurs accès en parallèle. On peut alors profiter de cette particularité pour lancer plusieurs accès au TLB en même temps, un par taille de page. Avec cette technique, les accès se faisant en parallèle et non l'un après l'autre, le temps d'accès est presque le même que si la TLB ne gérait qu'une seule taille de page. Le désavantage est que les multiples accès consomment de l'énergie et du courant, ce qui augmente la consommation énergétique de la TLB, qui est déjà très importante. La seconde solution est la '''prédiction de taille de page'''. L'idée est que le processeur tente de prédire quelle sera la taille de page, afin de tomber directement sur la bonne taille de page. Au lieu de tenter d'abord pour une page de 4 kibioctets, puis 2 mébioctets et enfin 1-2 Gibioctets, le processeur testera la taille de page la plus probable, puis la seconde plus probable, avant de tester la dernière taille de page possible. Le problème est alors de concevoir un circuit capable de réaliser cette prédiction. * Une manière simple mais extrêmement inefficace de faire cela est de mémoriser la taille des pages récemment accédées dans un cache spécialisé, qui mémorise la correspondance entre le numéro de la page et sa taille. La taille de la page est mémorisée dans ce cache, après le premier accès à cette page. Mais le défaut que le temps d'accès à ce cache de prédiction s'ajoute au temps d'accès à la TLBL2, ce qui en ruine totalement l'intérêt. Aussi, il faut trouver une solution alternative. * Une autre solution n'utilise pas le numéro de page, mais l'instruction responsable de l'accès à la TLB. Un accès à la TLB signifie un accès en mémoire RAM, qui est réalisé par une instruction. Instruction qui est identifiée par une adresse, elle-même située dans le ''program counter''. L'idée est que si une instruction est exécutée plusieurs fois, elle a tendance à accéder aux données d'une même page (localité spatiale). Ce n'est pas systématique, mais c'est une bonne supposition. On peut donc associer cette instruction à la taille de la page accédée récemment. Le cache de prédiction mémorise donc l'association entre adresse de cette instruction et taille de la page. Lors de l'accès mémoire, le ''program counter'' est récupéré et envoyé au cache de prédiction. En cas de succès d'accès, on obtient la taille de la page prédite. Cette méthode a le défaut que si plusieurs instructions accèdent à la même page, elles prendront chacune une ligne de cache dans le cache de prédiction et rien ne sera mutualisé. * Une solution alternative est de récupérer lune adresse virtuelle proche de l'adresse lue/écrite avant que l'accès mémoire soit démarré. L'idée est que lors du décodage de l'instruction d'accès mémoire, on récupère les registres utilisés, et on y accède pour lire en avance l'adresse virtuelle. Une dernière méthode consiste à '''amortir le temps d'accès en cas de défaut dans la TLB L2'''. L'idée est de démarrer un accès à la table des pages en RAM en parallèle de l'accès à la TLB L2. La raison est que le temps d'accès à la TLB L2, avec ''hash-rehashing'', est très long. Il est sensiblement proche du quart du temps de défaut de TLB. Si en plus il fallait rajouter le temps d'accès à la table des pages en cas de défaut, le temps d'accès total serait énorme. Mais en lançant une lecture spéculative de la table des pages, le temps d'accès en cas de défaut est partiellement amorti. Le temps d'accès en cas de succès de TLB L2 reste cependant le même. ====Le ''skewing''==== La technique du ''skewing'' est assez simple à comprendre pour qui se rappelle ce qu'est un cache associatif par voie, et encore plus un cache ''skew-associative''. L'idée est d'utiliser un cache associatif par voie, mais où chaque voie est dédiée à une taille de page bien définie. Un cache associatif à trois voie pourra ainsi avoir une voie pour les pages de 4 kibioctets, une voie pour les pages de 2 mébioctets et une dernière voie pour les pages de plusieurs gibioctets. Cette méthode est conceptuellement équivalente au fait d'utiliser un cache pour chaque taille, à quelques différences près. Notamment, cela permet de mutualiser des circuits qui auraient été dupliqués en utilisant des caches séparés. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le préchargement | prevTextLe préchargement | next=Le pipeline | nextText=Le pipeline }} </noinclude> aal8zmio5t4eyppv38tuljff5ao4qt4 682828 682824 2022-07-28T18:01:54Z Mewtow 31375 wikitext text/x-wiki Dans le chapitre sur la mémoire virtuelle, nous avions abordé la pagination. Nous avions vu que la traduction des adresses virtuelles en adresses physiques se fait grâce à une table des pages située en mémoire RAM, qui contient les correspondances entre adresses physiques et virtuelles. Pour éviter d'avoir à lire la table des pages en mémoire RAM à chaque accès mémoire, les concepteurs de processeurs ont décidé d'implanter un cache dédié, le '''''translation lookaside buffer''''', ou TLB. Il stocke de quoi faire la traduction entre adresse virtuelle et adresse physique, à savoir une correspondance entre numéro de page logique et numéro de page physique. [[File:MMU principle updated.png|centre|vignette|upright=2.0|MMU avec une TLB.]] Les caches consomment beaucoup d'énergie et la TLB ne fait pas exception. Diverses estimations montrent que les TLB sont très consommatrices en énergie. Près de 5 à 15% de la consommation d'énergie d'un processeur provient de sa TLB et des circuits associés. Pour réduire cette consommation tout en gardant des performances très importantes, la TLB est conçue avec ces contraintes en tête. Notamment, la TLB est généralement un cache associatif par voie ou directement adressé, et non un cache totalement associatif. Les caches totalement associatifs consomment en effet beaucoup plus d'énergie pour fonctionner que les autres types de caches, pour des performances légèrement meilleures. Le cout en énergie ne vaut pas les performances gagnées, pour une LTB. Pour des raisons de performances, la TLB est parfois découpée en plusieurs sous-caches L1, L2, L3, etc. Sur les architectures Harvard et Harvard modifiées, on trouve parfois deux TLB séparés : un pour les accès aux instructions, et un pour les accès aux données. L'architecture standard pour les TLBs actuelles est la suivante : une TLB de niveau 1 pour les instructions, une autre TLB de niveau 1 pour les données, puis une TLB de niveaux 2 partagée entre instructions et données. La séparation en une TLB L1 pour les instructions et une pour les données est nécessaire sur les architectures à hautes performances. Les processeurs modernes peuvent exécuter plusieurs instructions simultanément, ce qui fait qu'ils accèdent souvent à des données en même temps qu'ils chargent une ou plusieurs instructions. Une TLB unique devrait gérer plusieurs dizaines d'accès en même temps pour alimenter le processeur en données/instructions. La TLB doit alors être une mémoire multiports avec beaucoup de ports, beaucoup trop de ports pour être performante. Utiliser deux TLB séparées élimine ce problème, en limitant le nombre de ports sur chaque TLB. Un autre problème est que le programme prend moins de place que les données, ce qui se marie mal avec une TLB unique mais colle assez bien avec une TLB d'instruction plus petite que celle pour les données. [[File:Hiérarchie de TLB.png|centre|vignette|upright=2|Hiérarchie de TLB.]] Les nombreuses optimisations relatives aux caches s'appliquent aux TLB. Notamment, le préchargement est utilisé sur les TLB des processeurs modernes. Les techniques de préchargement utilisées pour les caches, et donc pour les TLB, ont été vues dans le chapitre sur le préchargement. Pour les TLB, seules les techniques pour le préchargement des données sont utilisées, la table des pages étant une structure de donnée des plus classique. Il s'agit d'un simple tableau pour une table des page simple ou inversée, d'un mélange entre arbre et tableau pour les tables des page hiérarchiques. En conséquence, les préfetcheurs des TLB utilisent généralement le préchargement séquentiel, en enjambées, un préchargement de Markov, etc. ==L'accès à la TLB : succès et défauts d'accès== À chaque accès mémoire, le processeur vérifie si le TLB contient l'adresse physique à laquelle accéder. Si c'est le cas, le processeur n'a pas à accéder à la table des pages en mémoire RAM et lit directement l'information nécessaire depuis ce TLB. On dit que l'on a un succès d'accès à la TLB. Si la TLb ne contient pas l'adresse physique demandée, on fait face à un '''défaut d'accès à la TLB'''. L'accès à la table des pages en mémoire RAM est alors inévitable. [[File:Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Translation Lookaside Buffer]] ===La traduction d'adresse avec la TLB=== [[File:Page table actions.svg|vignette|Page table actions]] La traduction d'une adresse avec une TLB a lieu comme suit. Premièrement, le processeur (sa MMU) interroge la TLB : il envoie l'adresse virtuelle et la TLB répond. Si la TLB contient l'adresse physique associée, elle la fournit directement et le processeur au cache ou à la RAM directement. Si ce n'est pas le cas, le processeur accède à la table des pages en mémoire RAM. Si la page est en RAM, alors la table des pages renvoie l'adresse physique voulue et la TLB est mise à jour. Par contre, si la page n'est pas en RAM, mais a été swappée sur le disque dur, la page est recopiée en mémoire RAM, la table des pages est mise à jour, puis la TLB l'est ensuite. [[File:Steps In a Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Steps In a Translation Lookaside Buffer]] ===Les ''page table walkers''=== Les défauts d'accès à la TLB sont gérés de deux façons : soit le processeur gère tout seul la situation, soit il délègue cette tâche au système d’exploitation. Sur les processeurs anciens, le système d'exploitation gère le défaut d'accès à la TLB. En cas de défaut, le processeur lève une exception matérielle spécialisée, qui exécute une routine d'interruption qui accède à la table des pages en RAM et effectue la traduction d'adresse. Mais cette solution logicielle n'a pas de bonnes performances. D'autres processeurs gèrent eux-mêmes le défaut d'accès à la TLB et vont chercher d'eux-mêmes les informations nécessaires dans la table des pages. Ils disposent de circuits, les '''''page table walkers''''' (PTW), qui s'occupent eux-mêmes du défaut. L'avantage en termes de performance est certain : plus besoin de lever une exception matérielle, plus besoin de lever une interruption couteuse à chaque défaut de TLB. Un autre avantage est que la gestion des bits de statut, qui mémorisent des informations sur chaque page, est gérée par le PTW. Sur les processeurs superscalaires à exécution dans le désordre qu'on abordera dans quelques chapitres, les PWT peuvent gérer un défaut de TLB pendant que le processeur fait d'autres opérations en parallèle, ce que ne permet pas la solution logicielle. Mieux : les PWT et TLB modernes sont conçus pour gérer plusieurs défauts simultanés, ce qui permet de grandement gagner en performance par rapport à l'approche logicielle. Le défaut principal des PWT est qu'ils sont conçus pour un format bien précis de table des pages, éventuellement deux ou trois autres, mais guère plus. Il est rare qu'ils gèrent plusieurs types de tables des pages différents. Leur flexibilité est donc assez faible. En comparaison, la solution logicielle n'a pas de limites précises, tant que le système d'exploitation gère le format de table des pages voulu. Les PTW sont généralement implémentés avec des circuits séquentiels spécifiques, nommés machines à état. Ils ont besoin, pour faire leur travail, de mémoriser l'adresse de la table des pages, ou du moins l'adresse de la table des pages de niveau 1 pour des tables des pages hiérarchiques. L'adresse de la table des pages est mémorisée dans un registre spécialisé, manipulé seulement par le système d'exploitation. Les informations nécessaires pour gérer chaque défaut de TLB sont stockées dans des registres spécialisés appelés des tampons de PTW (''PTW buffers''). Sur les architectures à plusieurs processeurs, chaque cœur ou processeur a son propre PTW. Dans le cas le plus simple, la table des pages est une table des pages simple, unique, qui contient des numéros de page physique. Le PTW a juste besoin de calculer une adresse et de faire une lecture pour récupérer le numéro de page physique. Dans le cas où la table des pages est hiérarchique, le processus doit être répété plusieurs fois, autant de fois qu'il faut passer d'une table des pages à la suivante. Dans le cas d'une table des pages inversée, le PTW doit parcourir automatiquement la mémoire pour lire chaque entrée de la table des pages une par une, faire une comparaison pour détecter la bonne entrée, puis déclencher une lecture une fois la bonne entrée détectée. Le processus est donc simple sur une table des pages unique, mais plus complexe dans les autres cas. La difficulté est de parcourir la mémoire. Pour le cas des pages des tables inversées, parcourir la mémoire en lisant des adresses consécutives est simple : un simple compteur d'adresse suffit. Par contre, le processus est plus complexe pour les tables des pages hiérarchiques, et demande généralement une implémentation avec du microcode. Le PWT communique alors avec le séquenceur pour lui demander d’exécuter une suite d’instructions microcodée pour gérer le défaut. ===Les ''Page walk caches''=== Pour accélérer le parcours des tables des pages hiérarchiques, l'unité de gestion mémoire (la MMU) des processeurs modernes incorpore des caches spécialisés, appelés des ''MMU caches'' ou encore caches de la MMU en français. Ils sont systématiquement utilisés en complément d'une TLB. La différence principale entre TLB et cache de la MMU tient dans leur contenu. Les TLB stockent des correspondances adresse logique-physique obtenues une fois qu'on a parcouru l'ensemble des niveaux d'une table des pages à la recherche d'une adresse physique précise, elles stockent le résultat de la traduction d'adresse. Les caches de la MMU, quant à eux, mémorisent non pas le résultat final, mais les résultats des étapes intermédiaires. Elles mémorisent les entrées de la table des pages accédées lors des défauts de TLB les plus récents, qui ne sont pas déjà dans la TLB. Ils stockent les entrées de la table de niveau 1 ou les autres tables des pages de niveau supérieur, mais pas les entrées qui contiennent un numéro de page physique. Cette différence de contenu se traduit par de nombreuses différences pratiques. La première est que la taille des lignes de cache n'est pas la même. Les TLB prennent un numéro de page logique et renvoient un numéro de page physique, les deux ayant la même taille. Les caches de la MMU prennent en entrée des numéros de page logique ou des morceaux de celle-ci (tout dépend de sa conception, comme on le verra plus bas), mais fournissent en sortie une adresse mémoire complète. La différence de taille entre numéro de page physique et adresse complète fait que la sortie d'une TLB et d'un cache de MMU n'a pas la même taille. Même chose pour les entrées, mais à un degré moindre. L'usage qui est fait par la MMU de la sortie du cache est aussi très différent, au vu de la nature différente des données stockées. Les caches de la MMU sont très utiles, car les accès mémoires ont une bonne localité spatiale, ce qui fait que des accès consécutifs ont des chances d’accéder aux mêmes entrées de la table de niveau 1 et de niveau 2, voire des niveaux 3 et 4. Il faut dire que sur les ordinateurs x86 64 bits, une entrée de la table des pages de premier niveau correspond à 512 gibioctets de mémoire... Il existe plusieurs manières de concevoir les caches de la MMU. La première est tout simplement d'associer une entrée de la table des pages avec son adresse physique, l'adresse physique servant de tag et l'entrée prenant une ligne de cache. C'est ce qui est fait sur les ''page walk caches'' des processeurs AMD. Ils se marient bien avec le fonctionnement normal du ''page table walker'', qui génère des adresses physiques. Une autre approche associe certains bits de l'adresse virtuelle à lire/écrire avec une entrée, au lieu de l'adresse physique de l'entrée. Par exemple, les bits de poids fort qui sont utilisés pour adresser la table de premier niveau sont utilisés comme tag dans le cache de la MMU. Même chose pour les bits précédents, qui servent à adresser la table de second niveau, et ainsi de suite. C’est ce qui est fait sur les ''paging structure cache'' des processeurs Intel. Une troisième approche est celle du '' translation path cache''. Si on compare les ''page walk caches'' avec les ''paging structure cache'', les ''page walk caches'' sont plus simples à fabriquer mais plus lents, alors que c'est l'inverse pour les ''paging structure caches''. Les ''page walk caches'' sont des caches normaux, sans particularité notable si ce n'est qu'ils sont intégrés à la MMU et qu'ils stockent des entrées des table de haut niveau de la table des pages. Ils sont donc aussi facile à fabriquer/concevoir que n'importe quel autre cache, voire plus facile vu que les entrées sont petites et ont peu de bits à stocker. Par contre, un défaut de TLB entraine plusieurs lectures consécutives dans un ''page walk caches''. Une première lecture pour récupérer l'entrée de la table de premier niveau, une seconde pour l'entrée adéquate de la table de second niveau, et ainsi de suite jusqu'à effectuer la lecture en mémoire. Le parcours de la table des pages s'effectue normalement, dans le même ordre que sans cache de MMU. Les ''paging structure cache'' permettent d'optimiser la recherche en sautant des étapes, ce qui rend le parcours de la table des pages beaucoup plus rapide si les entrées adéquates sont dans le cache. Les ''paging structure cache'' utilisent des tags plus petits que leurs concurrents, ce qui fait qu'ils prennent moins de place et de portes logiques à capacité égale et sont moins consommateurs en énergie.En clair, à part la simplciité de conception, les ''paging structure cache'' ont de meilleurs performances pour un budget en circuits et énergie plus faible. Il est possible d'utiliser un seul cache, qui mémorise les entrées des différents niveaux de la table des pages. Une autre possibilité est d'utiliser un cache pour chaque niveau de la table des pages. On a ainsi un cache pour la table de niveau 1, un autre pour les tables de niveau 2, etc. Faire ainsi facilite l'implémentation du remplacement des lignes de cache et améliore son efficacité. Un autre avantage est qu'il est plus facile de gérer plusieurs défauts simultanés. On peut accéder au cache pour la table de premier niveau en même temps qu'au cache pour les tables de second niveau, et idem pour les autres caches. ==Les pages larges et leur impact sur la TLB== Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages larges ont l'avantage d'utiliser la TLB de manière optimale. Pour une capacité de TLB identique, on peut adresser beaucoup plus de mémoire avec des pages larges, ce qui rend les défauts de TLB plus rares. Par contre, ces différentes tailles se marient mal avec une TLB unique. Un des problèmes est que les numéros de page physique n'ont pas le même nombre de bits suivant la taille des pages, ce qui pose des problèmes avec l'associativité de la TLB. Ce problème fait que l'usage d'une TLB unique est possible, mais pas forcément optimal. ===L'usage de plusieurs TLB, chacune dédiée à une taille de page=== L'usage d'une TLB unique pour toutes les tailles de page est possible et même courant pour la TLB de niveau 2 (L2). Mais les TLB de niveau 1 sont souvent séparées en plusieurs TLB, une par taille de page possible. Les TLB pour les pages larges sont souvent plus petites que la TLB pour les pages de 4 kibioctets, afin de profiter des économies de TLB liées aux pages larges. Un problème est que la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. Pour résoudre ce problème, toutes les TLB L1 sont accédées en parallèle lors d'un accès mémoire et le processeur sélectionne ensuite le résultat de celle qui correspond à la taille de page voulue. [[File:TLB pour plusieurs tailles de page.png|centre|vignette|upright=2|TLB pour plusieurs tailles de page]] ===L'usage d'une TLB unique pour toutes les tailles de page=== Les TLB de niveau 2 gèrent plusieurs tailles de page en même temps. Mais les techniques pour faire cela sont assez couteuses en circuits et en performances. Aussi, les techniques utilisées pour gérer plusieurs tailles de page sont couramment implémentées sur les TLB de niveau 2, mais sont impraticables sur les TLB de niveau 1. Les deux techniques qui permettent cela sont appelées le '''''hash-rehashing''''' et le '''''skewing'''''. Elles répondent à un problème assez simple à 'expliquer : la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. On doit accéder à la TLB en postulant que la page a une certaine taille, donc en précisant un numéro de page d'une certaine taille, pour ensuite avoir un défaut ou un succès de TLB. ====Le ''hash-rehashing''==== La première technique, celle du ''hash-rehashing'', consiste simplement à accéder la TLB en supposant que la page voulue a la taille usuelle, à savoir 4 kibioctets. En cas de succès de TLB, la page avait bien la taille supposée. Dans le cas contraire, on effectue un second accès en supposant que sa taille est de 2 mébioctets, et rebelote pour une page de 1-2 gibioctets en cas de défaut de TLB. Une fois toutes les tailles essayées, on accède à la table des pages en mémoire RAM. C'était la technique utilisée sur les processeurs Intel d’architecture Skylake et Broadwell. L'inconvénient est que les accès aux pages larges subissent une perte de performance notable, leur temps d'accès étant allongé. Cela est contrebalancé par le fait que ces tailles de page ont été inventées pour réduire le nombre de défauts de TLB, mais ces défauts sont assez rares pour l'impact soit seulement mitigé, pas compensé. L'allongement du temps d'accès peut être compensé par diverses méthodes. La première méthode est celle des '''accès simultanés à la TLB'''. Les TLB sont des caches assez performants, qui sont conçus pour être capables d'effectuer plusieurs accès en parallèle. On peut alors profiter de cette particularité pour lancer plusieurs accès au TLB en même temps, un par taille de page. Avec cette technique, les accès se faisant en parallèle et non l'un après l'autre, le temps d'accès est presque le même que si la TLB ne gérait qu'une seule taille de page. Le désavantage est que les multiples accès consomment de l'énergie et du courant, ce qui augmente la consommation énergétique de la TLB, qui est déjà très importante. La seconde solution est la '''prédiction de taille de page'''. L'idée est que le processeur tente de prédire quelle sera la taille de page, afin de tomber directement sur la bonne taille de page. Au lieu de tenter d'abord pour une page de 4 kibioctets, puis 2 mébioctets et enfin 1-2 Gibioctets, le processeur testera la taille de page la plus probable, puis la seconde plus probable, avant de tester la dernière taille de page possible. Le problème est alors de concevoir un circuit capable de réaliser cette prédiction. * Une manière simple mais extrêmement inefficace de faire cela est de mémoriser la taille des pages récemment accédées dans un cache spécialisé, qui mémorise la correspondance entre le numéro de la page et sa taille. La taille de la page est mémorisée dans ce cache, après le premier accès à cette page. Mais le défaut que le temps d'accès à ce cache de prédiction s'ajoute au temps d'accès à la TLBL2, ce qui en ruine totalement l'intérêt. Aussi, il faut trouver une solution alternative. * Une autre solution n'utilise pas le numéro de page, mais l'instruction responsable de l'accès à la TLB. Un accès à la TLB signifie un accès en mémoire RAM, qui est réalisé par une instruction. Instruction qui est identifiée par une adresse, elle-même située dans le ''program counter''. L'idée est que si une instruction est exécutée plusieurs fois, elle a tendance à accéder aux données d'une même page (localité spatiale). Ce n'est pas systématique, mais c'est une bonne supposition. On peut donc associer cette instruction à la taille de la page accédée récemment. Le cache de prédiction mémorise donc l'association entre adresse de cette instruction et taille de la page. Lors de l'accès mémoire, le ''program counter'' est récupéré et envoyé au cache de prédiction. En cas de succès d'accès, on obtient la taille de la page prédite. Cette méthode a le défaut que si plusieurs instructions accèdent à la même page, elles prendront chacune une ligne de cache dans le cache de prédiction et rien ne sera mutualisé. * Une solution alternative est de récupérer lune adresse virtuelle proche de l'adresse lue/écrite avant que l'accès mémoire soit démarré. L'idée est que lors du décodage de l'instruction d'accès mémoire, on récupère les registres utilisés, et on y accède pour lire en avance l'adresse virtuelle. Une dernière méthode consiste à '''amortir le temps d'accès en cas de défaut dans la TLB L2'''. L'idée est de démarrer un accès à la table des pages en RAM en parallèle de l'accès à la TLB L2. La raison est que le temps d'accès à la TLB L2, avec ''hash-rehashing'', est très long. Il est sensiblement proche du quart du temps de défaut de TLB. Si en plus il fallait rajouter le temps d'accès à la table des pages en cas de défaut, le temps d'accès total serait énorme. Mais en lançant une lecture spéculative de la table des pages, le temps d'accès en cas de défaut est partiellement amorti. Le temps d'accès en cas de succès de TLB L2 reste cependant le même. ====Le ''skewing''==== La technique du ''skewing'' est assez simple à comprendre pour qui se rappelle ce qu'est un cache associatif par voie, et encore plus un cache ''skew-associative''. L'idée est d'utiliser un cache associatif par voie, mais où chaque voie est dédiée à une taille de page bien définie. Un cache associatif à trois voie pourra ainsi avoir une voie pour les pages de 4 kibioctets, une voie pour les pages de 2 mébioctets et une dernière voie pour les pages de plusieurs gibioctets. Cette méthode est conceptuellement équivalente au fait d'utiliser un cache pour chaque taille, à quelques différences près. Notamment, cela permet de mutualiser des circuits qui auraient été dupliqués en utilisant des caches séparés. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le préchargement | prevTextLe préchargement | next=Le pipeline | nextText=Le pipeline }} </noinclude> 566vi6k960vbtk949qayqqz6pgbhisb 682829 682828 2022-07-28T18:08:13Z Mewtow 31375 wikitext text/x-wiki Dans le chapitre sur la mémoire virtuelle, nous avions abordé la pagination. Nous avions vu que la traduction des adresses virtuelles en adresses physiques se fait grâce à une table des pages située en mémoire RAM, qui contient les correspondances entre adresses physiques et virtuelles. Pour éviter d'avoir à lire la table des pages en mémoire RAM à chaque accès mémoire, les concepteurs de processeurs ont décidé d'implanter un cache dédié, le '''''translation lookaside buffer''''', ou TLB. Il stocke de quoi faire la traduction entre adresse virtuelle et adresse physique, à savoir une correspondance entre numéro de page logique et numéro de page physique. [[File:MMU principle updated.png|centre|vignette|upright=2.0|MMU avec une TLB.]] Les caches consomment beaucoup d'énergie et la TLB ne fait pas exception. Diverses estimations montrent que les TLB sont très consommatrices en énergie. Près de 5 à 15% de la consommation d'énergie d'un processeur provient de sa TLB et des circuits associés. Pour réduire cette consommation tout en gardant des performances très importantes, la TLB est conçue avec ces contraintes en tête. Notamment, la TLB est généralement un cache associatif par voie ou directement adressé, et non un cache totalement associatif. Les caches totalement associatifs consomment en effet beaucoup plus d'énergie pour fonctionner que les autres types de caches, pour des performances légèrement meilleures. Le cout en énergie ne vaut pas les performances gagnées, pour une LTB. Pour des raisons de performances, la TLB est parfois découpée en plusieurs sous-caches L1, L2, L3, etc. Sur les architectures Harvard et Harvard modifiées, on trouve parfois deux TLB séparés : un pour les accès aux instructions, et un pour les accès aux données. L'architecture standard pour les TLBs actuelles est la suivante : une TLB de niveau 1 pour les instructions, une autre TLB de niveau 1 pour les données, puis une TLB de niveaux 2 partagée entre instructions et données. La séparation en une TLB L1 pour les instructions et une pour les données est nécessaire sur les architectures à hautes performances. Les processeurs modernes peuvent exécuter plusieurs instructions simultanément, ce qui fait qu'ils accèdent souvent à des données en même temps qu'ils chargent une ou plusieurs instructions. Une TLB unique devrait gérer plusieurs dizaines d'accès en même temps pour alimenter le processeur en données/instructions. La TLB doit alors être une mémoire multiports avec beaucoup de ports, beaucoup trop de ports pour être performante. Utiliser deux TLB séparées élimine ce problème, en limitant le nombre de ports sur chaque TLB. Un autre problème est que le programme prend moins de place que les données, ce qui se marie mal avec une TLB unique mais colle assez bien avec une TLB d'instruction plus petite que celle pour les données. [[File:Hiérarchie de TLB.png|centre|vignette|upright=2|Hiérarchie de TLB.]] Les nombreuses optimisations relatives aux caches s'appliquent aux TLB. Notamment, le préchargement est utilisé sur les TLB des processeurs modernes. Les techniques de préchargement utilisées pour les caches, et donc pour les TLB, ont été vues dans le chapitre sur le préchargement. Pour les TLB, seules les techniques pour le préchargement des données sont utilisées, la table des pages étant une structure de donnée des plus classique. Il s'agit d'un simple tableau pour une table des page simple ou inversée, d'un mélange entre arbre et tableau pour les tables des page hiérarchiques. En conséquence, les préfetcheurs des TLB utilisent généralement le préchargement séquentiel, en enjambées, un préchargement de Markov, etc. Le préchargement sur les TLB peut cependant causer quelques situations spécifiques, qu'il faut gérer au mieux. Notamment, il est possible que le processeur tente de précharger une portion de la table des pages qui a été swappée sur le disque dur. Dans ce cas, on a deux solutions : soit on émet un défaut de page pour que le système d'exploitation charge la partie manquante depuis le disque dur, soit on ne fait rien et le préchargement est annulé. Dans la quasi-totalité des processeurs, c'est la seconde solution qui est utilisée. Le gain de performance en cas de bonne prédiction ne vaut pas la perte liée à un accès au disque dur en cas de préchargement inutile. ==L'accès à la TLB : succès et défauts d'accès== À chaque accès mémoire, le processeur vérifie si le TLB contient l'adresse physique à laquelle accéder. Si c'est le cas, le processeur n'a pas à accéder à la table des pages en mémoire RAM et lit directement l'information nécessaire depuis ce TLB. On dit que l'on a un succès d'accès à la TLB. Si la TLb ne contient pas l'adresse physique demandée, on fait face à un '''défaut d'accès à la TLB'''. L'accès à la table des pages en mémoire RAM est alors inévitable. [[File:Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Translation Lookaside Buffer]] ===La traduction d'adresse avec la TLB=== [[File:Page table actions.svg|vignette|Page table actions]] La traduction d'une adresse avec une TLB a lieu comme suit. Premièrement, le processeur (sa MMU) interroge la TLB : il envoie l'adresse virtuelle et la TLB répond. Si la TLB contient l'adresse physique associée, elle la fournit directement et le processeur au cache ou à la RAM directement. Si ce n'est pas le cas, le processeur accède à la table des pages en mémoire RAM. Si la page est en RAM, alors la table des pages renvoie l'adresse physique voulue et la TLB est mise à jour. Par contre, si la page n'est pas en RAM, mais a été swappée sur le disque dur, la page est recopiée en mémoire RAM, la table des pages est mise à jour, puis la TLB l'est ensuite. [[File:Steps In a Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Steps In a Translation Lookaside Buffer]] ===Les ''page table walkers''=== Les défauts d'accès à la TLB sont gérés de deux façons : soit le processeur gère tout seul la situation, soit il délègue cette tâche au système d’exploitation. Sur les processeurs anciens, le système d'exploitation gère le défaut d'accès à la TLB. En cas de défaut, le processeur lève une exception matérielle spécialisée, qui exécute une routine d'interruption qui accède à la table des pages en RAM et effectue la traduction d'adresse. Mais cette solution logicielle n'a pas de bonnes performances. D'autres processeurs gèrent eux-mêmes le défaut d'accès à la TLB et vont chercher d'eux-mêmes les informations nécessaires dans la table des pages. Ils disposent de circuits, les '''''page table walkers''''' (PTW), qui s'occupent eux-mêmes du défaut. L'avantage en termes de performance est certain : plus besoin de lever une exception matérielle, plus besoin de lever une interruption couteuse à chaque défaut de TLB. Un autre avantage est que la gestion des bits de statut, qui mémorisent des informations sur chaque page, est gérée par le PTW. Sur les processeurs superscalaires à exécution dans le désordre qu'on abordera dans quelques chapitres, les PWT peuvent gérer un défaut de TLB pendant que le processeur fait d'autres opérations en parallèle, ce que ne permet pas la solution logicielle. Mieux : les PWT et TLB modernes sont conçus pour gérer plusieurs défauts simultanés, ce qui permet de grandement gagner en performance par rapport à l'approche logicielle. Le défaut principal des PWT est qu'ils sont conçus pour un format bien précis de table des pages, éventuellement deux ou trois autres, mais guère plus. Il est rare qu'ils gèrent plusieurs types de tables des pages différents. Leur flexibilité est donc assez faible. En comparaison, la solution logicielle n'a pas de limites précises, tant que le système d'exploitation gère le format de table des pages voulu. Les PTW sont généralement implémentés avec des circuits séquentiels spécifiques, nommés machines à état. Ils ont besoin, pour faire leur travail, de mémoriser l'adresse de la table des pages, ou du moins l'adresse de la table des pages de niveau 1 pour des tables des pages hiérarchiques. L'adresse de la table des pages est mémorisée dans un registre spécialisé, manipulé seulement par le système d'exploitation. Les informations nécessaires pour gérer chaque défaut de TLB sont stockées dans des registres spécialisés appelés des tampons de PTW (''PTW buffers''). Sur les architectures à plusieurs processeurs, chaque cœur ou processeur a son propre PTW. Dans le cas le plus simple, la table des pages est une table des pages simple, unique, qui contient des numéros de page physique. Le PTW a juste besoin de calculer une adresse et de faire une lecture pour récupérer le numéro de page physique. Dans le cas où la table des pages est hiérarchique, le processus doit être répété plusieurs fois, autant de fois qu'il faut passer d'une table des pages à la suivante. Dans le cas d'une table des pages inversée, le PTW doit parcourir automatiquement la mémoire pour lire chaque entrée de la table des pages une par une, faire une comparaison pour détecter la bonne entrée, puis déclencher une lecture une fois la bonne entrée détectée. Le processus est donc simple sur une table des pages unique, mais plus complexe dans les autres cas. La difficulté est de parcourir la mémoire. Pour le cas des pages des tables inversées, parcourir la mémoire en lisant des adresses consécutives est simple : un simple compteur d'adresse suffit. Par contre, le processus est plus complexe pour les tables des pages hiérarchiques, et demande généralement une implémentation avec du microcode. Le PWT communique alors avec le séquenceur pour lui demander d’exécuter une suite d’instructions microcodée pour gérer le défaut. ===Les ''Page walk caches''=== Pour accélérer le parcours des tables des pages hiérarchiques, l'unité de gestion mémoire (la MMU) des processeurs modernes incorpore des caches spécialisés, appelés des ''MMU caches'' ou encore caches de la MMU en français. Ils sont systématiquement utilisés en complément d'une TLB. La différence principale entre TLB et cache de la MMU tient dans leur contenu. Les TLB stockent des correspondances adresse logique-physique obtenues une fois qu'on a parcouru l'ensemble des niveaux d'une table des pages à la recherche d'une adresse physique précise, elles stockent le résultat de la traduction d'adresse. Les caches de la MMU, quant à eux, mémorisent non pas le résultat final, mais les résultats des étapes intermédiaires. Elles mémorisent les entrées de la table des pages accédées lors des défauts de TLB les plus récents, qui ne sont pas déjà dans la TLB. Ils stockent les entrées de la table de niveau 1 ou les autres tables des pages de niveau supérieur, mais pas les entrées qui contiennent un numéro de page physique. Cette différence de contenu se traduit par de nombreuses différences pratiques. La première est que la taille des lignes de cache n'est pas la même. Les TLB prennent un numéro de page logique et renvoient un numéro de page physique, les deux ayant la même taille. Les caches de la MMU prennent en entrée des numéros de page logique ou des morceaux de celle-ci (tout dépend de sa conception, comme on le verra plus bas), mais fournissent en sortie une adresse mémoire complète. La différence de taille entre numéro de page physique et adresse complète fait que la sortie d'une TLB et d'un cache de MMU n'a pas la même taille. Même chose pour les entrées, mais à un degré moindre. L'usage qui est fait par la MMU de la sortie du cache est aussi très différent, au vu de la nature différente des données stockées. Les caches de la MMU sont très utiles, car les accès mémoires ont une bonne localité spatiale, ce qui fait que des accès consécutifs ont des chances d’accéder aux mêmes entrées de la table de niveau 1 et de niveau 2, voire des niveaux 3 et 4. Il faut dire que sur les ordinateurs x86 64 bits, une entrée de la table des pages de premier niveau correspond à 512 gibioctets de mémoire... Il existe plusieurs manières de concevoir les caches de la MMU. La première est tout simplement d'associer une entrée de la table des pages avec son adresse physique, l'adresse physique servant de tag et l'entrée prenant une ligne de cache. C'est ce qui est fait sur les ''page walk caches'' des processeurs AMD. Ils se marient bien avec le fonctionnement normal du ''page table walker'', qui génère des adresses physiques. Une autre approche associe certains bits de l'adresse virtuelle à lire/écrire avec une entrée, au lieu de l'adresse physique de l'entrée. Par exemple, les bits de poids fort qui sont utilisés pour adresser la table de premier niveau sont utilisés comme tag dans le cache de la MMU. Même chose pour les bits précédents, qui servent à adresser la table de second niveau, et ainsi de suite. C’est ce qui est fait sur les ''paging structure cache'' des processeurs Intel. Une troisième approche est celle du '' translation path cache''. Si on compare les ''page walk caches'' avec les ''paging structure cache'', les ''page walk caches'' sont plus simples à fabriquer mais plus lents, alors que c'est l'inverse pour les ''paging structure caches''. Les ''page walk caches'' sont des caches normaux, sans particularité notable si ce n'est qu'ils sont intégrés à la MMU et qu'ils stockent des entrées des table de haut niveau de la table des pages. Ils sont donc aussi facile à fabriquer/concevoir que n'importe quel autre cache, voire plus facile vu que les entrées sont petites et ont peu de bits à stocker. Par contre, un défaut de TLB entraine plusieurs lectures consécutives dans un ''page walk caches''. Une première lecture pour récupérer l'entrée de la table de premier niveau, une seconde pour l'entrée adéquate de la table de second niveau, et ainsi de suite jusqu'à effectuer la lecture en mémoire. Le parcours de la table des pages s'effectue normalement, dans le même ordre que sans cache de MMU. Les ''paging structure cache'' permettent d'optimiser la recherche en sautant des étapes, ce qui rend le parcours de la table des pages beaucoup plus rapide si les entrées adéquates sont dans le cache. Les ''paging structure cache'' utilisent des tags plus petits que leurs concurrents, ce qui fait qu'ils prennent moins de place et de portes logiques à capacité égale et sont moins consommateurs en énergie.En clair, à part la simplciité de conception, les ''paging structure cache'' ont de meilleurs performances pour un budget en circuits et énergie plus faible. Il est possible d'utiliser un seul cache, qui mémorise les entrées des différents niveaux de la table des pages. Une autre possibilité est d'utiliser un cache pour chaque niveau de la table des pages. On a ainsi un cache pour la table de niveau 1, un autre pour les tables de niveau 2, etc. Faire ainsi facilite l'implémentation du remplacement des lignes de cache et améliore son efficacité. Un autre avantage est qu'il est plus facile de gérer plusieurs défauts simultanés. On peut accéder au cache pour la table de premier niveau en même temps qu'au cache pour les tables de second niveau, et idem pour les autres caches. ==Les pages larges et leur impact sur la TLB== Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages larges ont l'avantage d'utiliser la TLB de manière optimale. Pour une capacité de TLB identique, on peut adresser beaucoup plus de mémoire avec des pages larges, ce qui rend les défauts de TLB plus rares. Par contre, ces différentes tailles se marient mal avec une TLB unique. Un des problèmes est que les numéros de page physique n'ont pas le même nombre de bits suivant la taille des pages, ce qui pose des problèmes avec l'associativité de la TLB. Ce problème fait que l'usage d'une TLB unique est possible, mais pas forcément optimal. ===L'usage de plusieurs TLB, chacune dédiée à une taille de page=== L'usage d'une TLB unique pour toutes les tailles de page est possible et même courant pour la TLB de niveau 2 (L2). Mais les TLB de niveau 1 sont souvent séparées en plusieurs TLB, une par taille de page possible. Les TLB pour les pages larges sont souvent plus petites que la TLB pour les pages de 4 kibioctets, afin de profiter des économies de TLB liées aux pages larges. Un problème est que la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. Pour résoudre ce problème, toutes les TLB L1 sont accédées en parallèle lors d'un accès mémoire et le processeur sélectionne ensuite le résultat de celle qui correspond à la taille de page voulue. [[File:TLB pour plusieurs tailles de page.png|centre|vignette|upright=2|TLB pour plusieurs tailles de page]] ===L'usage d'une TLB unique pour toutes les tailles de page=== Les TLB de niveau 2 gèrent plusieurs tailles de page en même temps. Mais les techniques pour faire cela sont assez couteuses en circuits et en performances. Aussi, les techniques utilisées pour gérer plusieurs tailles de page sont couramment implémentées sur les TLB de niveau 2, mais sont impraticables sur les TLB de niveau 1. Les deux techniques qui permettent cela sont appelées le '''''hash-rehashing''''' et le '''''skewing'''''. Elles répondent à un problème assez simple à 'expliquer : la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. On doit accéder à la TLB en postulant que la page a une certaine taille, donc en précisant un numéro de page d'une certaine taille, pour ensuite avoir un défaut ou un succès de TLB. ====Le ''hash-rehashing''==== La première technique, celle du ''hash-rehashing'', consiste simplement à accéder la TLB en supposant que la page voulue a la taille usuelle, à savoir 4 kibioctets. En cas de succès de TLB, la page avait bien la taille supposée. Dans le cas contraire, on effectue un second accès en supposant que sa taille est de 2 mébioctets, et rebelote pour une page de 1-2 gibioctets en cas de défaut de TLB. Une fois toutes les tailles essayées, on accède à la table des pages en mémoire RAM. C'était la technique utilisée sur les processeurs Intel d’architecture Skylake et Broadwell. L'inconvénient est que les accès aux pages larges subissent une perte de performance notable, leur temps d'accès étant allongé. Cela est contrebalancé par le fait que ces tailles de page ont été inventées pour réduire le nombre de défauts de TLB, mais ces défauts sont assez rares pour l'impact soit seulement mitigé, pas compensé. L'allongement du temps d'accès peut être compensé par diverses méthodes. La première méthode est celle des '''accès simultanés à la TLB'''. Les TLB sont des caches assez performants, qui sont conçus pour être capables d'effectuer plusieurs accès en parallèle. On peut alors profiter de cette particularité pour lancer plusieurs accès au TLB en même temps, un par taille de page. Avec cette technique, les accès se faisant en parallèle et non l'un après l'autre, le temps d'accès est presque le même que si la TLB ne gérait qu'une seule taille de page. Le désavantage est que les multiples accès consomment de l'énergie et du courant, ce qui augmente la consommation énergétique de la TLB, qui est déjà très importante. La seconde solution est la '''prédiction de taille de page'''. L'idée est que le processeur tente de prédire quelle sera la taille de page, afin de tomber directement sur la bonne taille de page. Au lieu de tenter d'abord pour une page de 4 kibioctets, puis 2 mébioctets et enfin 1-2 Gibioctets, le processeur testera la taille de page la plus probable, puis la seconde plus probable, avant de tester la dernière taille de page possible. Le problème est alors de concevoir un circuit capable de réaliser cette prédiction. * Une manière simple mais extrêmement inefficace de faire cela est de mémoriser la taille des pages récemment accédées dans un cache spécialisé, qui mémorise la correspondance entre le numéro de la page et sa taille. La taille de la page est mémorisée dans ce cache, après le premier accès à cette page. Mais le défaut que le temps d'accès à ce cache de prédiction s'ajoute au temps d'accès à la TLBL2, ce qui en ruine totalement l'intérêt. Aussi, il faut trouver une solution alternative. * Une autre solution n'utilise pas le numéro de page, mais l'instruction responsable de l'accès à la TLB. Un accès à la TLB signifie un accès en mémoire RAM, qui est réalisé par une instruction. Instruction qui est identifiée par une adresse, elle-même située dans le ''program counter''. L'idée est que si une instruction est exécutée plusieurs fois, elle a tendance à accéder aux données d'une même page (localité spatiale). Ce n'est pas systématique, mais c'est une bonne supposition. On peut donc associer cette instruction à la taille de la page accédée récemment. Le cache de prédiction mémorise donc l'association entre adresse de cette instruction et taille de la page. Lors de l'accès mémoire, le ''program counter'' est récupéré et envoyé au cache de prédiction. En cas de succès d'accès, on obtient la taille de la page prédite. Cette méthode a le défaut que si plusieurs instructions accèdent à la même page, elles prendront chacune une ligne de cache dans le cache de prédiction et rien ne sera mutualisé. * Une solution alternative est de récupérer lune adresse virtuelle proche de l'adresse lue/écrite avant que l'accès mémoire soit démarré. L'idée est que lors du décodage de l'instruction d'accès mémoire, on récupère les registres utilisés, et on y accède pour lire en avance l'adresse virtuelle. Une dernière méthode consiste à '''amortir le temps d'accès en cas de défaut dans la TLB L2'''. L'idée est de démarrer un accès à la table des pages en RAM en parallèle de l'accès à la TLB L2. La raison est que le temps d'accès à la TLB L2, avec ''hash-rehashing'', est très long. Il est sensiblement proche du quart du temps de défaut de TLB. Si en plus il fallait rajouter le temps d'accès à la table des pages en cas de défaut, le temps d'accès total serait énorme. Mais en lançant une lecture spéculative de la table des pages, le temps d'accès en cas de défaut est partiellement amorti. Le temps d'accès en cas de succès de TLB L2 reste cependant le même. ====Le ''skewing''==== La technique du ''skewing'' est assez simple à comprendre pour qui se rappelle ce qu'est un cache associatif par voie, et encore plus un cache ''skew-associative''. L'idée est d'utiliser un cache associatif par voie, mais où chaque voie est dédiée à une taille de page bien définie. Un cache associatif à trois voie pourra ainsi avoir une voie pour les pages de 4 kibioctets, une voie pour les pages de 2 mébioctets et une dernière voie pour les pages de plusieurs gibioctets. Cette méthode est conceptuellement équivalente au fait d'utiliser un cache pour chaque taille, à quelques différences près. Notamment, cela permet de mutualiser des circuits qui auraient été dupliqués en utilisant des caches séparés. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le préchargement | prevTextLe préchargement | next=Le pipeline | nextText=Le pipeline }} </noinclude> l35nu80odt5cyrgfx6f43pka56i4x0a 682830 682829 2022-07-28T18:09:57Z Mewtow 31375 wikitext text/x-wiki Dans le chapitre sur la mémoire virtuelle, nous avions abordé la pagination. Nous avions vu que la traduction des adresses virtuelles en adresses physiques se fait grâce à une table des pages située en mémoire RAM, qui contient les correspondances entre adresses physiques et virtuelles. Pour éviter d'avoir à lire la table des pages en mémoire RAM à chaque accès mémoire, les concepteurs de processeurs ont décidé d'implanter un cache dédié, le '''''translation lookaside buffer''''', ou TLB. Il stocke de quoi faire la traduction entre adresse virtuelle et adresse physique, à savoir une correspondance entre numéro de page logique et numéro de page physique. [[File:MMU principle updated.png|centre|vignette|upright=2.0|MMU avec une TLB.]] Si elles ont quelques spécificités, qui leur valent un chapitré dédié dans ce cours, les TLB n'en restent pas moins des caches tout ce qu'il y a de plus normaux. Leur conception interne est presque identique à celle d'un cache normal, leurs performances sont influencées par les mêmes paramètres. Tout ce qu'on a vu sur les caches dans le chapitre dédié s'applique aussi aux TLB. Les caches consomment beaucoup d'énergie et la TLB ne fait pas exception. Diverses estimations montrent que les TLB sont très consommatrices en énergie. Près de 5 à 15% de la consommation d'énergie d'un processeur provient de sa TLB et des circuits associés. Pour réduire cette consommation tout en gardant des performances très importantes, la TLB est conçue avec ces contraintes en tête. Notamment, la TLB est généralement un cache associatif par voie ou directement adressé, et non un cache totalement associatif. Les caches totalement associatifs consomment en effet beaucoup plus d'énergie pour fonctionner que les autres types de caches, pour des performances légèrement meilleures. Le cout en énergie ne vaut pas les performances gagnées, pour une LTB. Pour des raisons de performances, la TLB est parfois découpée en plusieurs sous-caches L1, L2, L3, etc. Sur les architectures Harvard et Harvard modifiées, on trouve parfois deux TLB séparés : un pour les accès aux instructions, et un pour les accès aux données. L'architecture standard pour les TLBs actuelles est la suivante : une TLB de niveau 1 pour les instructions, une autre TLB de niveau 1 pour les données, puis une TLB de niveaux 2 partagée entre instructions et données. La séparation en une TLB L1 pour les instructions et une pour les données est nécessaire sur les architectures à hautes performances. Les processeurs modernes peuvent exécuter plusieurs instructions simultanément, ce qui fait qu'ils accèdent souvent à des données en même temps qu'ils chargent une ou plusieurs instructions. Une TLB unique devrait gérer plusieurs dizaines d'accès en même temps pour alimenter le processeur en données/instructions. La TLB doit alors être une mémoire multiports avec beaucoup de ports, beaucoup trop de ports pour être performante. Utiliser deux TLB séparées élimine ce problème, en limitant le nombre de ports sur chaque TLB. Un autre problème est que le programme prend moins de place que les données, ce qui se marie mal avec une TLB unique mais colle assez bien avec une TLB d'instruction plus petite que celle pour les données. [[File:Hiérarchie de TLB.png|centre|vignette|upright=2|Hiérarchie de TLB.]] Les nombreuses optimisations relatives aux caches s'appliquent aux TLB. Notamment, le préchargement est utilisé sur les TLB des processeurs modernes. Les techniques de préchargement utilisées pour les caches, et donc pour les TLB, ont été vues dans le chapitre sur le préchargement. Pour les TLB, seules les techniques pour le préchargement des données sont utilisées, la table des pages étant une structure de donnée des plus classique. Il s'agit d'un simple tableau pour une table des page simple ou inversée, d'un mélange entre arbre et tableau pour les tables des page hiérarchiques. En conséquence, les préfetcheurs des TLB utilisent généralement le préchargement séquentiel, en enjambées, un préchargement de Markov, etc. Le préchargement sur les TLB peut cependant causer quelques situations spécifiques, qu'il faut gérer au mieux. Notamment, il est possible que le processeur tente de précharger une portion de la table des pages qui a été swappée sur le disque dur. Dans ce cas, on a deux solutions : soit on émet un défaut de page pour que le système d'exploitation charge la partie manquante depuis le disque dur, soit on ne fait rien et le préchargement est annulé. Dans la quasi-totalité des processeurs, c'est la seconde solution qui est utilisée. Le gain de performance en cas de bonne prédiction ne vaut pas la perte liée à un accès au disque dur en cas de préchargement inutile. ==L'accès à la TLB : succès et défauts d'accès== À chaque accès mémoire, le processeur vérifie si le TLB contient l'adresse physique à laquelle accéder. Si c'est le cas, le processeur n'a pas à accéder à la table des pages en mémoire RAM et lit directement l'information nécessaire depuis ce TLB. On dit que l'on a un succès d'accès à la TLB. Si la TLb ne contient pas l'adresse physique demandée, on fait face à un '''défaut d'accès à la TLB'''. L'accès à la table des pages en mémoire RAM est alors inévitable. [[File:Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Translation Lookaside Buffer]] ===La traduction d'adresse avec la TLB=== [[File:Page table actions.svg|vignette|Page table actions]] La traduction d'une adresse avec une TLB a lieu comme suit. Premièrement, le processeur (sa MMU) interroge la TLB : il envoie l'adresse virtuelle et la TLB répond. Si la TLB contient l'adresse physique associée, elle la fournit directement et le processeur au cache ou à la RAM directement. Si ce n'est pas le cas, le processeur accède à la table des pages en mémoire RAM. Si la page est en RAM, alors la table des pages renvoie l'adresse physique voulue et la TLB est mise à jour. Par contre, si la page n'est pas en RAM, mais a été swappée sur le disque dur, la page est recopiée en mémoire RAM, la table des pages est mise à jour, puis la TLB l'est ensuite. [[File:Steps In a Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Steps In a Translation Lookaside Buffer]] ===Les ''page table walkers''=== Les défauts d'accès à la TLB sont gérés de deux façons : soit le processeur gère tout seul la situation, soit il délègue cette tâche au système d’exploitation. Sur les processeurs anciens, le système d'exploitation gère le défaut d'accès à la TLB. En cas de défaut, le processeur lève une exception matérielle spécialisée, qui exécute une routine d'interruption qui accède à la table des pages en RAM et effectue la traduction d'adresse. Mais cette solution logicielle n'a pas de bonnes performances. D'autres processeurs gèrent eux-mêmes le défaut d'accès à la TLB et vont chercher d'eux-mêmes les informations nécessaires dans la table des pages. Ils disposent de circuits, les '''''page table walkers''''' (PTW), qui s'occupent eux-mêmes du défaut. L'avantage en termes de performance est certain : plus besoin de lever une exception matérielle, plus besoin de lever une interruption couteuse à chaque défaut de TLB. Un autre avantage est que la gestion des bits de statut, qui mémorisent des informations sur chaque page, est gérée par le PTW. Sur les processeurs superscalaires à exécution dans le désordre qu'on abordera dans quelques chapitres, les PWT peuvent gérer un défaut de TLB pendant que le processeur fait d'autres opérations en parallèle, ce que ne permet pas la solution logicielle. Mieux : les PWT et TLB modernes sont conçus pour gérer plusieurs défauts simultanés, ce qui permet de grandement gagner en performance par rapport à l'approche logicielle. Le défaut principal des PWT est qu'ils sont conçus pour un format bien précis de table des pages, éventuellement deux ou trois autres, mais guère plus. Il est rare qu'ils gèrent plusieurs types de tables des pages différents. Leur flexibilité est donc assez faible. En comparaison, la solution logicielle n'a pas de limites précises, tant que le système d'exploitation gère le format de table des pages voulu. Les PTW sont généralement implémentés avec des circuits séquentiels spécifiques, nommés machines à état. Ils ont besoin, pour faire leur travail, de mémoriser l'adresse de la table des pages, ou du moins l'adresse de la table des pages de niveau 1 pour des tables des pages hiérarchiques. L'adresse de la table des pages est mémorisée dans un registre spécialisé, manipulé seulement par le système d'exploitation. Les informations nécessaires pour gérer chaque défaut de TLB sont stockées dans des registres spécialisés appelés des tampons de PTW (''PTW buffers''). Sur les architectures à plusieurs processeurs, chaque cœur ou processeur a son propre PTW. Dans le cas le plus simple, la table des pages est une table des pages simple, unique, qui contient des numéros de page physique. Le PTW a juste besoin de calculer une adresse et de faire une lecture pour récupérer le numéro de page physique. Dans le cas où la table des pages est hiérarchique, le processus doit être répété plusieurs fois, autant de fois qu'il faut passer d'une table des pages à la suivante. Dans le cas d'une table des pages inversée, le PTW doit parcourir automatiquement la mémoire pour lire chaque entrée de la table des pages une par une, faire une comparaison pour détecter la bonne entrée, puis déclencher une lecture une fois la bonne entrée détectée. Le processus est donc simple sur une table des pages unique, mais plus complexe dans les autres cas. La difficulté est de parcourir la mémoire. Pour le cas des pages des tables inversées, parcourir la mémoire en lisant des adresses consécutives est simple : un simple compteur d'adresse suffit. Par contre, le processus est plus complexe pour les tables des pages hiérarchiques, et demande généralement une implémentation avec du microcode. Le PWT communique alors avec le séquenceur pour lui demander d’exécuter une suite d’instructions microcodée pour gérer le défaut. ===Les ''Page walk caches''=== Pour accélérer le parcours des tables des pages hiérarchiques, l'unité de gestion mémoire (la MMU) des processeurs modernes incorpore des caches spécialisés, appelés des ''MMU caches'' ou encore caches de la MMU en français. Ils sont systématiquement utilisés en complément d'une TLB. La différence principale entre TLB et cache de la MMU tient dans leur contenu. Les TLB stockent des correspondances adresse logique-physique obtenues une fois qu'on a parcouru l'ensemble des niveaux d'une table des pages à la recherche d'une adresse physique précise, elles stockent le résultat de la traduction d'adresse. Les caches de la MMU, quant à eux, mémorisent non pas le résultat final, mais les résultats des étapes intermédiaires. Elles mémorisent les entrées de la table des pages accédées lors des défauts de TLB les plus récents, qui ne sont pas déjà dans la TLB. Ils stockent les entrées de la table de niveau 1 ou les autres tables des pages de niveau supérieur, mais pas les entrées qui contiennent un numéro de page physique. Cette différence de contenu se traduit par de nombreuses différences pratiques. La première est que la taille des lignes de cache n'est pas la même. Les TLB prennent un numéro de page logique et renvoient un numéro de page physique, les deux ayant la même taille. Les caches de la MMU prennent en entrée des numéros de page logique ou des morceaux de celle-ci (tout dépend de sa conception, comme on le verra plus bas), mais fournissent en sortie une adresse mémoire complète. La différence de taille entre numéro de page physique et adresse complète fait que la sortie d'une TLB et d'un cache de MMU n'a pas la même taille. Même chose pour les entrées, mais à un degré moindre. L'usage qui est fait par la MMU de la sortie du cache est aussi très différent, au vu de la nature différente des données stockées. Les caches de la MMU sont très utiles, car les accès mémoires ont une bonne localité spatiale, ce qui fait que des accès consécutifs ont des chances d’accéder aux mêmes entrées de la table de niveau 1 et de niveau 2, voire des niveaux 3 et 4. Il faut dire que sur les ordinateurs x86 64 bits, une entrée de la table des pages de premier niveau correspond à 512 gibioctets de mémoire... Il existe plusieurs manières de concevoir les caches de la MMU. La première est tout simplement d'associer une entrée de la table des pages avec son adresse physique, l'adresse physique servant de tag et l'entrée prenant une ligne de cache. C'est ce qui est fait sur les ''page walk caches'' des processeurs AMD. Ils se marient bien avec le fonctionnement normal du ''page table walker'', qui génère des adresses physiques. Une autre approche associe certains bits de l'adresse virtuelle à lire/écrire avec une entrée, au lieu de l'adresse physique de l'entrée. Par exemple, les bits de poids fort qui sont utilisés pour adresser la table de premier niveau sont utilisés comme tag dans le cache de la MMU. Même chose pour les bits précédents, qui servent à adresser la table de second niveau, et ainsi de suite. C’est ce qui est fait sur les ''paging structure cache'' des processeurs Intel. Une troisième approche est celle du '' translation path cache''. Si on compare les ''page walk caches'' avec les ''paging structure cache'', les ''page walk caches'' sont plus simples à fabriquer mais plus lents, alors que c'est l'inverse pour les ''paging structure caches''. Les ''page walk caches'' sont des caches normaux, sans particularité notable si ce n'est qu'ils sont intégrés à la MMU et qu'ils stockent des entrées des table de haut niveau de la table des pages. Ils sont donc aussi facile à fabriquer/concevoir que n'importe quel autre cache, voire plus facile vu que les entrées sont petites et ont peu de bits à stocker. Par contre, un défaut de TLB entraine plusieurs lectures consécutives dans un ''page walk caches''. Une première lecture pour récupérer l'entrée de la table de premier niveau, une seconde pour l'entrée adéquate de la table de second niveau, et ainsi de suite jusqu'à effectuer la lecture en mémoire. Le parcours de la table des pages s'effectue normalement, dans le même ordre que sans cache de MMU. Les ''paging structure cache'' permettent d'optimiser la recherche en sautant des étapes, ce qui rend le parcours de la table des pages beaucoup plus rapide si les entrées adéquates sont dans le cache. Les ''paging structure cache'' utilisent des tags plus petits que leurs concurrents, ce qui fait qu'ils prennent moins de place et de portes logiques à capacité égale et sont moins consommateurs en énergie.En clair, à part la simplciité de conception, les ''paging structure cache'' ont de meilleurs performances pour un budget en circuits et énergie plus faible. Il est possible d'utiliser un seul cache, qui mémorise les entrées des différents niveaux de la table des pages. Une autre possibilité est d'utiliser un cache pour chaque niveau de la table des pages. On a ainsi un cache pour la table de niveau 1, un autre pour les tables de niveau 2, etc. Faire ainsi facilite l'implémentation du remplacement des lignes de cache et améliore son efficacité. Un autre avantage est qu'il est plus facile de gérer plusieurs défauts simultanés. On peut accéder au cache pour la table de premier niveau en même temps qu'au cache pour les tables de second niveau, et idem pour les autres caches. ==Les pages larges et leur impact sur la TLB== Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages larges ont l'avantage d'utiliser la TLB de manière optimale. Pour une capacité de TLB identique, on peut adresser beaucoup plus de mémoire avec des pages larges, ce qui rend les défauts de TLB plus rares. Par contre, ces différentes tailles se marient mal avec une TLB unique. Un des problèmes est que les numéros de page physique n'ont pas le même nombre de bits suivant la taille des pages, ce qui pose des problèmes avec l'associativité de la TLB. Ce problème fait que l'usage d'une TLB unique est possible, mais pas forcément optimal. ===L'usage de plusieurs TLB, chacune dédiée à une taille de page=== L'usage d'une TLB unique pour toutes les tailles de page est possible et même courant pour la TLB de niveau 2 (L2). Mais les TLB de niveau 1 sont souvent séparées en plusieurs TLB, une par taille de page possible. Les TLB pour les pages larges sont souvent plus petites que la TLB pour les pages de 4 kibioctets, afin de profiter des économies de TLB liées aux pages larges. Un problème est que la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. Pour résoudre ce problème, toutes les TLB L1 sont accédées en parallèle lors d'un accès mémoire et le processeur sélectionne ensuite le résultat de celle qui correspond à la taille de page voulue. [[File:TLB pour plusieurs tailles de page.png|centre|vignette|upright=2|TLB pour plusieurs tailles de page]] ===L'usage d'une TLB unique pour toutes les tailles de page=== Les TLB de niveau 2 gèrent plusieurs tailles de page en même temps. Mais les techniques pour faire cela sont assez couteuses en circuits et en performances. Aussi, les techniques utilisées pour gérer plusieurs tailles de page sont couramment implémentées sur les TLB de niveau 2, mais sont impraticables sur les TLB de niveau 1. Les deux techniques qui permettent cela sont appelées le '''''hash-rehashing''''' et le '''''skewing'''''. Elles répondent à un problème assez simple à 'expliquer : la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. On doit accéder à la TLB en postulant que la page a une certaine taille, donc en précisant un numéro de page d'une certaine taille, pour ensuite avoir un défaut ou un succès de TLB. ====Le ''hash-rehashing''==== La première technique, celle du ''hash-rehashing'', consiste simplement à accéder la TLB en supposant que la page voulue a la taille usuelle, à savoir 4 kibioctets. En cas de succès de TLB, la page avait bien la taille supposée. Dans le cas contraire, on effectue un second accès en supposant que sa taille est de 2 mébioctets, et rebelote pour une page de 1-2 gibioctets en cas de défaut de TLB. Une fois toutes les tailles essayées, on accède à la table des pages en mémoire RAM. C'était la technique utilisée sur les processeurs Intel d’architecture Skylake et Broadwell. L'inconvénient est que les accès aux pages larges subissent une perte de performance notable, leur temps d'accès étant allongé. Cela est contrebalancé par le fait que ces tailles de page ont été inventées pour réduire le nombre de défauts de TLB, mais ces défauts sont assez rares pour l'impact soit seulement mitigé, pas compensé. L'allongement du temps d'accès peut être compensé par diverses méthodes. La première méthode est celle des '''accès simultanés à la TLB'''. Les TLB sont des caches assez performants, qui sont conçus pour être capables d'effectuer plusieurs accès en parallèle. On peut alors profiter de cette particularité pour lancer plusieurs accès au TLB en même temps, un par taille de page. Avec cette technique, les accès se faisant en parallèle et non l'un après l'autre, le temps d'accès est presque le même que si la TLB ne gérait qu'une seule taille de page. Le désavantage est que les multiples accès consomment de l'énergie et du courant, ce qui augmente la consommation énergétique de la TLB, qui est déjà très importante. La seconde solution est la '''prédiction de taille de page'''. L'idée est que le processeur tente de prédire quelle sera la taille de page, afin de tomber directement sur la bonne taille de page. Au lieu de tenter d'abord pour une page de 4 kibioctets, puis 2 mébioctets et enfin 1-2 Gibioctets, le processeur testera la taille de page la plus probable, puis la seconde plus probable, avant de tester la dernière taille de page possible. Le problème est alors de concevoir un circuit capable de réaliser cette prédiction. * Une manière simple mais extrêmement inefficace de faire cela est de mémoriser la taille des pages récemment accédées dans un cache spécialisé, qui mémorise la correspondance entre le numéro de la page et sa taille. La taille de la page est mémorisée dans ce cache, après le premier accès à cette page. Mais le défaut que le temps d'accès à ce cache de prédiction s'ajoute au temps d'accès à la TLBL2, ce qui en ruine totalement l'intérêt. Aussi, il faut trouver une solution alternative. * Une autre solution n'utilise pas le numéro de page, mais l'instruction responsable de l'accès à la TLB. Un accès à la TLB signifie un accès en mémoire RAM, qui est réalisé par une instruction. Instruction qui est identifiée par une adresse, elle-même située dans le ''program counter''. L'idée est que si une instruction est exécutée plusieurs fois, elle a tendance à accéder aux données d'une même page (localité spatiale). Ce n'est pas systématique, mais c'est une bonne supposition. On peut donc associer cette instruction à la taille de la page accédée récemment. Le cache de prédiction mémorise donc l'association entre adresse de cette instruction et taille de la page. Lors de l'accès mémoire, le ''program counter'' est récupéré et envoyé au cache de prédiction. En cas de succès d'accès, on obtient la taille de la page prédite. Cette méthode a le défaut que si plusieurs instructions accèdent à la même page, elles prendront chacune une ligne de cache dans le cache de prédiction et rien ne sera mutualisé. * Une solution alternative est de récupérer lune adresse virtuelle proche de l'adresse lue/écrite avant que l'accès mémoire soit démarré. L'idée est que lors du décodage de l'instruction d'accès mémoire, on récupère les registres utilisés, et on y accède pour lire en avance l'adresse virtuelle. Une dernière méthode consiste à '''amortir le temps d'accès en cas de défaut dans la TLB L2'''. L'idée est de démarrer un accès à la table des pages en RAM en parallèle de l'accès à la TLB L2. La raison est que le temps d'accès à la TLB L2, avec ''hash-rehashing'', est très long. Il est sensiblement proche du quart du temps de défaut de TLB. Si en plus il fallait rajouter le temps d'accès à la table des pages en cas de défaut, le temps d'accès total serait énorme. Mais en lançant une lecture spéculative de la table des pages, le temps d'accès en cas de défaut est partiellement amorti. Le temps d'accès en cas de succès de TLB L2 reste cependant le même. ====Le ''skewing''==== La technique du ''skewing'' est assez simple à comprendre pour qui se rappelle ce qu'est un cache associatif par voie, et encore plus un cache ''skew-associative''. L'idée est d'utiliser un cache associatif par voie, mais où chaque voie est dédiée à une taille de page bien définie. Un cache associatif à trois voie pourra ainsi avoir une voie pour les pages de 4 kibioctets, une voie pour les pages de 2 mébioctets et une dernière voie pour les pages de plusieurs gibioctets. Cette méthode est conceptuellement équivalente au fait d'utiliser un cache pour chaque taille, à quelques différences près. Notamment, cela permet de mutualiser des circuits qui auraient été dupliqués en utilisant des caches séparés. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le préchargement | prevTextLe préchargement | next=Le pipeline | nextText=Le pipeline }} </noinclude> ajvmbkg2sm9opl7pe0hvo6yyo2keoyh 682831 682830 2022-07-28T18:13:46Z Mewtow 31375 wikitext text/x-wiki Dans le chapitre sur la mémoire virtuelle, nous avions abordé la pagination. Nous avions vu que la traduction des adresses virtuelles en adresses physiques se fait grâce à une table des pages située en mémoire RAM, qui contient les correspondances entre adresses physiques et virtuelles. Pour éviter d'avoir à lire la table des pages en mémoire RAM à chaque accès mémoire, les concepteurs de processeurs ont décidé d'implanter un cache dédié, le '''''translation lookaside buffer''''', ou TLB. Il stocke de quoi faire la traduction entre adresse virtuelle et adresse physique, à savoir une correspondance entre numéro de page logique et numéro de page physique. [[File:MMU principle updated.png|centre|vignette|upright=2.0|MMU avec une TLB.]] Si elles ont quelques spécificités, qui leur valent un chapitré dédié dans ce cours, les TLB n'en restent pas moins des caches tout ce qu'il y a de plus normaux. Leur conception interne est presque identique à celle d'un cache normal, leurs performances sont influencées par les mêmes paramètres. Tout ce qu'on a vu sur les caches dans le chapitre dédié s'applique aussi aux TLB. Les caches consomment beaucoup d'énergie et la TLB ne fait pas exception. Diverses estimations montrent que les TLB sont très consommatrices en énergie. Près de 5 à 15% de la consommation d'énergie d'un processeur provient de sa TLB et des circuits associés. Pour réduire cette consommation tout en gardant des performances très importantes, la TLB est conçue avec ces contraintes en tête. Notamment, la TLB est généralement un cache associatif par voie ou directement adressé, et non un cache totalement associatif. Le cout en énergie des caches totalement associatifs ne vaut pas les performances gagnées, pour une LTB. Pour des raisons de performances, la TLB est parfois découpée en plusieurs sous-caches L1, L2, L3, etc. Sur les architectures Harvard et Harvard modifiées, on trouve parfois deux TLB séparés : un pour les accès aux instructions, et un pour les accès aux données. L'architecture standard pour les TLBs actuelles est la suivante : une TLB de niveau 1 pour les instructions, une autre TLB de niveau 1 pour les données, puis une TLB de niveaux 2 partagée entre instructions et données. La séparation en une TLB L1 pour les instructions et une pour les données est nécessaire sur les architectures à hautes performances. Les processeurs modernes peuvent exécuter plusieurs instructions simultanément, ce qui fait qu'ils accèdent souvent à des données en même temps qu'ils chargent une ou plusieurs instructions. Une TLB unique devrait gérer plusieurs dizaines d'accès en même temps pour alimenter le processeur en données/instructions. La TLB doit alors être une mémoire multiports avec beaucoup de ports, beaucoup trop de ports pour être performante. Utiliser deux TLB séparées élimine ce problème, en limitant le nombre de ports sur chaque TLB. Un autre problème est que le programme prend moins de place que les données, ce qui se marie mal avec une TLB unique mais colle assez bien avec une TLB d'instruction plus petite que celle pour les données. [[File:Hiérarchie de TLB.png|centre|vignette|upright=2|Hiérarchie de TLB.]] Les nombreuses optimisations relatives aux caches s'appliquent aux TLB. Notamment, le préchargement est utilisé sur les TLB des processeurs modernes. Les techniques de préchargement utilisées pour les caches, et donc pour les TLB, ont été vues dans le chapitre sur le préchargement. Pour les TLB, seules les techniques pour le préchargement des données sont utilisées, la table des pages étant une structure de donnée des plus classique. Il s'agit d'un simple tableau pour une table des page simple ou inversée, d'un mélange entre arbre et tableau pour les tables des page hiérarchiques. En conséquence, les préfetcheurs des TLB utilisent généralement le préchargement séquentiel, en enjambées, un préchargement de Markov, etc. Le préchargement sur les TLB peut cependant causer quelques situations spécifiques, qu'il faut gérer au mieux. Notamment, il est possible que le processeur tente de précharger une portion de la table des pages qui a été swappée sur le disque dur. Dans ce cas, on a deux solutions : soit on émet un défaut de page pour que le système d'exploitation charge la partie manquante depuis le disque dur, soit on ne fait rien et le préchargement est annulé. Dans la quasi-totalité des processeurs, c'est la seconde solution qui est utilisée. Le gain de performance en cas de bonne prédiction ne vaut pas la perte liée à un accès au disque dur en cas de préchargement inutile. ==L'accès à la TLB : succès et défauts d'accès== À chaque accès mémoire, le processeur vérifie si le TLB contient l'adresse physique à laquelle accéder. Si c'est le cas, le processeur n'a pas à accéder à la table des pages en mémoire RAM et lit directement l'information nécessaire depuis ce TLB. On dit que l'on a un succès d'accès à la TLB. Si la TLb ne contient pas l'adresse physique demandée, on fait face à un '''défaut d'accès à la TLB'''. L'accès à la table des pages en mémoire RAM est alors inévitable. [[File:Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Translation Lookaside Buffer]] ===La traduction d'adresse avec la TLB=== [[File:Page table actions.svg|vignette|Page table actions]] La traduction d'une adresse avec une TLB a lieu comme suit. Premièrement, le processeur (sa MMU) interroge la TLB : il envoie l'adresse virtuelle et la TLB répond. Si la TLB contient l'adresse physique associée, elle la fournit directement et le processeur au cache ou à la RAM directement. Si ce n'est pas le cas, le processeur accède à la table des pages en mémoire RAM. Si la page est en RAM, alors la table des pages renvoie l'adresse physique voulue et la TLB est mise à jour. Par contre, si la page n'est pas en RAM, mais a été swappée sur le disque dur, la page est recopiée en mémoire RAM, la table des pages est mise à jour, puis la TLB l'est ensuite. [[File:Steps In a Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Steps In a Translation Lookaside Buffer]] ===Les ''page table walkers''=== Les défauts d'accès à la TLB sont gérés de deux façons : soit le processeur gère tout seul la situation, soit il délègue cette tâche au système d’exploitation. Sur les processeurs anciens, le système d'exploitation gère le défaut d'accès à la TLB. En cas de défaut, le processeur lève une exception matérielle spécialisée, qui exécute une routine d'interruption qui accède à la table des pages en RAM et effectue la traduction d'adresse. Mais cette solution logicielle n'a pas de bonnes performances. D'autres processeurs gèrent eux-mêmes le défaut d'accès à la TLB et vont chercher d'eux-mêmes les informations nécessaires dans la table des pages. Ils disposent de circuits, les '''''page table walkers''''' (PTW), qui s'occupent eux-mêmes du défaut. L'avantage en termes de performance est certain : plus besoin de lever une exception matérielle, plus besoin de lever une interruption couteuse à chaque défaut de TLB. Un autre avantage est que la gestion des bits de statut, qui mémorisent des informations sur chaque page, est gérée par le PTW. Sur les processeurs superscalaires à exécution dans le désordre qu'on abordera dans quelques chapitres, les PWT peuvent gérer un défaut de TLB pendant que le processeur fait d'autres opérations en parallèle, ce que ne permet pas la solution logicielle. Mieux : les PWT et TLB modernes sont conçus pour gérer plusieurs défauts simultanés, ce qui permet de grandement gagner en performance par rapport à l'approche logicielle. Le défaut principal des PWT est qu'ils sont conçus pour un format bien précis de table des pages, éventuellement deux ou trois autres, mais guère plus. Il est rare qu'ils gèrent plusieurs types de tables des pages différents. Leur flexibilité est donc assez faible. En comparaison, la solution logicielle n'a pas de limites précises, tant que le système d'exploitation gère le format de table des pages voulu. Les PTW sont généralement implémentés avec des circuits séquentiels spécifiques, nommés machines à état. Ils ont besoin, pour faire leur travail, de mémoriser l'adresse de la table des pages, ou du moins l'adresse de la table des pages de niveau 1 pour des tables des pages hiérarchiques. L'adresse de la table des pages est mémorisée dans un registre spécialisé, manipulé seulement par le système d'exploitation. Les informations nécessaires pour gérer chaque défaut de TLB sont stockées dans des registres spécialisés appelés des tampons de PTW (''PTW buffers''). Sur les architectures à plusieurs processeurs, chaque cœur ou processeur a son propre PTW. Dans le cas le plus simple, la table des pages est une table des pages simple, unique, qui contient des numéros de page physique. Le PTW a juste besoin de calculer une adresse et de faire une lecture pour récupérer le numéro de page physique. Dans le cas où la table des pages est hiérarchique, le processus doit être répété plusieurs fois, autant de fois qu'il faut passer d'une table des pages à la suivante. Dans le cas d'une table des pages inversée, le PTW doit parcourir automatiquement la mémoire pour lire chaque entrée de la table des pages une par une, faire une comparaison pour détecter la bonne entrée, puis déclencher une lecture une fois la bonne entrée détectée. Le processus est donc simple sur une table des pages unique, mais plus complexe dans les autres cas. La difficulté est de parcourir la mémoire. Pour le cas des pages des tables inversées, parcourir la mémoire en lisant des adresses consécutives est simple : un simple compteur d'adresse suffit. Par contre, le processus est plus complexe pour les tables des pages hiérarchiques, et demande généralement une implémentation avec du microcode. Le PWT communique alors avec le séquenceur pour lui demander d’exécuter une suite d’instructions microcodée pour gérer le défaut. ===Les ''Page walk caches''=== Pour accélérer le parcours des tables des pages hiérarchiques, l'unité de gestion mémoire (la MMU) des processeurs modernes incorpore des caches spécialisés, appelés des ''MMU caches'' ou encore caches de la MMU en français. Ils sont systématiquement utilisés en complément d'une TLB. La différence principale entre TLB et cache de la MMU tient dans leur contenu. Les TLB stockent des correspondances adresse logique-physique obtenues une fois qu'on a parcouru l'ensemble des niveaux d'une table des pages à la recherche d'une adresse physique précise, elles stockent le résultat de la traduction d'adresse. Les caches de la MMU, quant à eux, mémorisent non pas le résultat final, mais les résultats des étapes intermédiaires. Elles mémorisent les entrées de la table des pages accédées lors des défauts de TLB les plus récents, qui ne sont pas déjà dans la TLB. Ils stockent les entrées de la table de niveau 1 ou les autres tables des pages de niveau supérieur, mais pas les entrées qui contiennent un numéro de page physique. Cette différence de contenu se traduit par de nombreuses différences pratiques. La première est que la taille des lignes de cache n'est pas la même. Les TLB prennent un numéro de page logique et renvoient un numéro de page physique, les deux ayant la même taille. Les caches de la MMU prennent en entrée des numéros de page logique ou des morceaux de celle-ci (tout dépend de sa conception, comme on le verra plus bas), mais fournissent en sortie une adresse mémoire complète. La différence de taille entre numéro de page physique et adresse complète fait que la sortie d'une TLB et d'un cache de MMU n'a pas la même taille. Même chose pour les entrées, mais à un degré moindre. L'usage qui est fait par la MMU de la sortie du cache est aussi très différent, au vu de la nature différente des données stockées. Les caches de la MMU sont très utiles, car les accès mémoires ont une bonne localité spatiale, ce qui fait que des accès consécutifs ont des chances d’accéder aux mêmes entrées de la table de niveau 1 et de niveau 2, voire des niveaux 3 et 4. Il faut dire que sur les ordinateurs x86 64 bits, une entrée de la table des pages de premier niveau correspond à 512 gibioctets de mémoire... Il existe plusieurs manières de concevoir les caches de la MMU. La première est tout simplement d'associer une entrée de la table des pages avec son adresse physique, l'adresse physique servant de tag et l'entrée prenant une ligne de cache. C'est ce qui est fait sur les ''page walk caches'' des processeurs AMD. Ils se marient bien avec le fonctionnement normal du ''page table walker'', qui génère des adresses physiques. Une autre approche associe certains bits de l'adresse virtuelle à lire/écrire avec une entrée, au lieu de l'adresse physique de l'entrée. Par exemple, les bits de poids fort qui sont utilisés pour adresser la table de premier niveau sont utilisés comme tag dans le cache de la MMU. Même chose pour les bits précédents, qui servent à adresser la table de second niveau, et ainsi de suite. C’est ce qui est fait sur les ''paging structure cache'' des processeurs Intel. Une troisième approche est celle du '' translation path cache''. Si on compare les ''page walk caches'' avec les ''paging structure cache'', les ''page walk caches'' sont plus simples à fabriquer mais plus lents, alors que c'est l'inverse pour les ''paging structure caches''. Les ''page walk caches'' sont des caches normaux, sans particularité notable si ce n'est qu'ils sont intégrés à la MMU et qu'ils stockent des entrées des table de haut niveau de la table des pages. Ils sont donc aussi facile à fabriquer/concevoir que n'importe quel autre cache, voire plus facile vu que les entrées sont petites et ont peu de bits à stocker. Par contre, un défaut de TLB entraine plusieurs lectures consécutives dans un ''page walk caches''. Une première lecture pour récupérer l'entrée de la table de premier niveau, une seconde pour l'entrée adéquate de la table de second niveau, et ainsi de suite jusqu'à effectuer la lecture en mémoire. Le parcours de la table des pages s'effectue normalement, dans le même ordre que sans cache de MMU. Les ''paging structure cache'' permettent d'optimiser la recherche en sautant des étapes, ce qui rend le parcours de la table des pages beaucoup plus rapide si les entrées adéquates sont dans le cache. Les ''paging structure cache'' utilisent des tags plus petits que leurs concurrents, ce qui fait qu'ils prennent moins de place et de portes logiques à capacité égale et sont moins consommateurs en énergie.En clair, à part la simplciité de conception, les ''paging structure cache'' ont de meilleurs performances pour un budget en circuits et énergie plus faible. Il est possible d'utiliser un seul cache, qui mémorise les entrées des différents niveaux de la table des pages. Une autre possibilité est d'utiliser un cache pour chaque niveau de la table des pages. On a ainsi un cache pour la table de niveau 1, un autre pour les tables de niveau 2, etc. Faire ainsi facilite l'implémentation du remplacement des lignes de cache et améliore son efficacité. Un autre avantage est qu'il est plus facile de gérer plusieurs défauts simultanés. On peut accéder au cache pour la table de premier niveau en même temps qu'au cache pour les tables de second niveau, et idem pour les autres caches. ==Les pages larges et leur impact sur la TLB== Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages larges ont l'avantage d'utiliser la TLB de manière optimale. Pour une capacité de TLB identique, on peut adresser beaucoup plus de mémoire avec des pages larges, ce qui rend les défauts de TLB plus rares. Par contre, ces différentes tailles se marient mal avec une TLB unique. Un des problèmes est que les numéros de page physique n'ont pas le même nombre de bits suivant la taille des pages, ce qui pose des problèmes avec l'associativité de la TLB. Ce problème fait que l'usage d'une TLB unique est possible, mais pas forcément optimal. ===L'usage de plusieurs TLB, chacune dédiée à une taille de page=== L'usage d'une TLB unique pour toutes les tailles de page est possible et même courant pour la TLB de niveau 2 (L2). Mais les TLB de niveau 1 sont souvent séparées en plusieurs TLB, une par taille de page possible. Les TLB pour les pages larges sont souvent plus petites que la TLB pour les pages de 4 kibioctets, afin de profiter des économies de TLB liées aux pages larges. Un problème est que la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. Pour résoudre ce problème, toutes les TLB L1 sont accédées en parallèle lors d'un accès mémoire et le processeur sélectionne ensuite le résultat de celle qui correspond à la taille de page voulue. [[File:TLB pour plusieurs tailles de page.png|centre|vignette|upright=2|TLB pour plusieurs tailles de page]] ===L'usage d'une TLB unique pour toutes les tailles de page=== Les TLB de niveau 2 gèrent plusieurs tailles de page en même temps. Mais les techniques pour faire cela sont assez couteuses en circuits et en performances. Aussi, les techniques utilisées pour gérer plusieurs tailles de page sont couramment implémentées sur les TLB de niveau 2, mais sont impraticables sur les TLB de niveau 1. Les deux techniques qui permettent cela sont appelées le '''''hash-rehashing''''' et le '''''skewing'''''. Elles répondent à un problème assez simple à 'expliquer : la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. On doit accéder à la TLB en postulant que la page a une certaine taille, donc en précisant un numéro de page d'une certaine taille, pour ensuite avoir un défaut ou un succès de TLB. ====Le ''hash-rehashing''==== La première technique, celle du ''hash-rehashing'', consiste simplement à accéder la TLB en supposant que la page voulue a la taille usuelle, à savoir 4 kibioctets. En cas de succès de TLB, la page avait bien la taille supposée. Dans le cas contraire, on effectue un second accès en supposant que sa taille est de 2 mébioctets, et rebelote pour une page de 1-2 gibioctets en cas de défaut de TLB. Une fois toutes les tailles essayées, on accède à la table des pages en mémoire RAM. C'était la technique utilisée sur les processeurs Intel d’architecture Skylake et Broadwell. L'inconvénient est que les accès aux pages larges subissent une perte de performance notable, leur temps d'accès étant allongé. Cela est contrebalancé par le fait que ces tailles de page ont été inventées pour réduire le nombre de défauts de TLB, mais ces défauts sont assez rares pour l'impact soit seulement mitigé, pas compensé. L'allongement du temps d'accès peut être compensé par diverses méthodes. La première méthode est celle des '''accès simultanés à la TLB'''. Les TLB sont des caches assez performants, qui sont conçus pour être capables d'effectuer plusieurs accès en parallèle. On peut alors profiter de cette particularité pour lancer plusieurs accès au TLB en même temps, un par taille de page. Avec cette technique, les accès se faisant en parallèle et non l'un après l'autre, le temps d'accès est presque le même que si la TLB ne gérait qu'une seule taille de page. Le désavantage est que les multiples accès consomment de l'énergie et du courant, ce qui augmente la consommation énergétique de la TLB, qui est déjà très importante. La seconde solution est la '''prédiction de taille de page'''. L'idée est que le processeur tente de prédire quelle sera la taille de page, afin de tomber directement sur la bonne taille de page. Au lieu de tenter d'abord pour une page de 4 kibioctets, puis 2 mébioctets et enfin 1-2 Gibioctets, le processeur testera la taille de page la plus probable, puis la seconde plus probable, avant de tester la dernière taille de page possible. Le problème est alors de concevoir un circuit capable de réaliser cette prédiction. * Une manière simple mais extrêmement inefficace de faire cela est de mémoriser la taille des pages récemment accédées dans un cache spécialisé, qui mémorise la correspondance entre le numéro de la page et sa taille. La taille de la page est mémorisée dans ce cache, après le premier accès à cette page. Mais le défaut que le temps d'accès à ce cache de prédiction s'ajoute au temps d'accès à la TLBL2, ce qui en ruine totalement l'intérêt. Aussi, il faut trouver une solution alternative. * Une autre solution n'utilise pas le numéro de page, mais l'instruction responsable de l'accès à la TLB. Un accès à la TLB signifie un accès en mémoire RAM, qui est réalisé par une instruction. Instruction qui est identifiée par une adresse, elle-même située dans le ''program counter''. L'idée est que si une instruction est exécutée plusieurs fois, elle a tendance à accéder aux données d'une même page (localité spatiale). Ce n'est pas systématique, mais c'est une bonne supposition. On peut donc associer cette instruction à la taille de la page accédée récemment. Le cache de prédiction mémorise donc l'association entre adresse de cette instruction et taille de la page. Lors de l'accès mémoire, le ''program counter'' est récupéré et envoyé au cache de prédiction. En cas de succès d'accès, on obtient la taille de la page prédite. Cette méthode a le défaut que si plusieurs instructions accèdent à la même page, elles prendront chacune une ligne de cache dans le cache de prédiction et rien ne sera mutualisé. * Une solution alternative est de récupérer lune adresse virtuelle proche de l'adresse lue/écrite avant que l'accès mémoire soit démarré. L'idée est que lors du décodage de l'instruction d'accès mémoire, on récupère les registres utilisés, et on y accède pour lire en avance l'adresse virtuelle. Une dernière méthode consiste à '''amortir le temps d'accès en cas de défaut dans la TLB L2'''. L'idée est de démarrer un accès à la table des pages en RAM en parallèle de l'accès à la TLB L2. La raison est que le temps d'accès à la TLB L2, avec ''hash-rehashing'', est très long. Il est sensiblement proche du quart du temps de défaut de TLB. Si en plus il fallait rajouter le temps d'accès à la table des pages en cas de défaut, le temps d'accès total serait énorme. Mais en lançant une lecture spéculative de la table des pages, le temps d'accès en cas de défaut est partiellement amorti. Le temps d'accès en cas de succès de TLB L2 reste cependant le même. ====Le ''skewing''==== La technique du ''skewing'' est assez simple à comprendre pour qui se rappelle ce qu'est un cache associatif par voie, et encore plus un cache ''skew-associative''. L'idée est d'utiliser un cache associatif par voie, mais où chaque voie est dédiée à une taille de page bien définie. Un cache associatif à trois voie pourra ainsi avoir une voie pour les pages de 4 kibioctets, une voie pour les pages de 2 mébioctets et une dernière voie pour les pages de plusieurs gibioctets. Cette méthode est conceptuellement équivalente au fait d'utiliser un cache pour chaque taille, à quelques différences près. Notamment, cela permet de mutualiser des circuits qui auraient été dupliqués en utilisant des caches séparés. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le préchargement | prevTextLe préchargement | next=Le pipeline | nextText=Le pipeline }} </noinclude> s437ssdsb8bgcfdptkuzv0u3dwxo1ab Mathc initiation/Fichiers c : c77cd3 0 78762 682839 682744 2022-07-28T20:33:56Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] [[Mathc initiation/Fichiers h : c77dg| Sommaire]] '''Etude de cos(x)**m sin(x)**n (m) ''' <syntaxhighlight lang="dos"> / Etude de : | cos(x)**m sin(x)**n dx = / Si m est impaire, (1) on sauve un cos(x), (2) le cos(x)**(m-1) paire est remplacé par (3) cos(x)**2 = (1-sin(x)**2). On introduit (4) u = sin(x), du = cos(x) dx m m-1 / / Exemple : | cos(x)**5 sin(x)**3 dx = | cos(x)**4 sin(x)**3 cos(x)dx (1) / / / = | (cos(x)**2)**2 sin(x)**3 cos(x)dx (2) / / = | (1-sin(x)**2)**2 sin(x)**3 cos(x)dx (3) / On pose u = sin(x), du = cos(x)dx / = | (1-u**2)**2 u**3 du (4) / </syntaxhighlight> {{AutoCat}} gg82isgw8mefutr71tzon44hsqnph0g Mathc initiation/Fichiers c : c77cd4 0 78763 682840 682746 2022-07-28T20:34:22Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] [[Mathc initiation/Fichiers h : c77dg| Sommaire]] '''Etude de cos(x)**m sin(x)**n (n) ''' <syntaxhighlight lang="dos"> / Etude de : | cos(x)**m sin(x)**n dx = / Si n est impaire, (1) on sauve un sin(x), (2) le sin(x)**(n-1) paire est remplacé par (3) sin(x)**2 = (1-cos(x)**2). On introduit (4) u = cos(x), du = -sin(x) dx n n-1 / / Exemple : | cos(x)**5 sin(x)**3 dx = | cos(x)**5 sin(x)**2 sin(x)dx (1) / / / = | cos(x)**5 sin(x)**2 sin(x)dx (2) / / = | cos(x)**5 (1-cos(x)**2) sin(x)dx (3) / On pose u = cos(x), du = -sin(x)dx, -du = sin(x)dx / = - | u**5 (1-u**2) du (4) / </syntaxhighlight> {{AutoCat}} h33t6ksairsistdnwd27hvn1vyn77l3 Mathc initiation/Fichiers c : c77cd5 0 78765 682841 682794 2022-07-28T20:34:38Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] [[Mathc initiation/Fichiers h : c77dg| Sommaire]] '''Etude de cos(x)**m sin(x)**n (mn) ''' <syntaxhighlight lang="dos"> / Etude de : | cos(x)**m sin(x)**n dx = / Si m et n sont paires, on utilise : sin(x)**2 = 1/2 (1−cos(2x)) cos(x)**2 = 1/2 (1+cos(2x)) / / Exemple : | sin(x)**2 cos(x)**2 dx = | 1/2 (1−cos(2x)) 1/2 (1−cos(2x)) dx / / / = 1/4 | (1−cos(2x)**2) dx (a-b)(a+b)=a**2-b**2 / / cos(x)**2+sin(x)**2 = 1 = 1/4 | sin(2x)**2 dx sin(x)**2 = 1-cos(x)**2 / / = 1/4 | 1/2-1/2 cos(2x) dx sin(x)**2 = 1/2-1/2 cos(2x) / </syntaxhighlight> {{AutoCat}} qk8puxqpkl7i35t98p5xbapu5m804uu 682940 682841 2022-07-29T11:52:33Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] [[Mathc initiation/Fichiers h : c77dg| Sommaire]] '''Etude de cos(x)**m sin(x)**n (mn) ''' <syntaxhighlight lang="dos"> / Etude de : | cos(x)**m sin(x)**n dx = / Si m et n sont paires, on utilise : sin(x)**2 = 1/2 (1−cos(2x)) cos(x)**2 = 1/2 (1+cos(2x)) / / Exemple : | sin(x)**2 cos(x)**2 dx = | 1/2 (1−cos(2x)) 1/2 (1+cos(2x)) dx / / / = 1/4 | (1−cos(2x)**2) dx (a-b)(a+b)=a**2-b**2 / / cos(x)**2+sin(x)**2 = 1 = 1/4 | sin(2x)**2 dx sin(x)**2 = (1-cos(x)**2) / / = 1/4 | 1/2 (1−cos(4x)) dx sin( x)**2 = 1/2 (1−cos(2x)) / sin(2x)**2 = 1/2 (1−cos(4x)) </syntaxhighlight> {{AutoCat}} bxe3iok5mjs912hr7oiuj6e2ts3bm9j Mathc initiation/Fichiers c : c77cd6 0 78766 682833 2022-07-28T20:10:32Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] [[Mathc initiation/Fichiers h : c74| Sommaire]] '''Etude de tan(x)**m sec(x)**n (n) ''' <syntaxhighlight lang="dos"> / Etude de : | tan(x)**m sec(x)**n dx = / Si n est paire, (1) on sauve un sec(x)**2, les sec(x)**(n-2) paires sont remplacés par (2) sec(x)**2 = (tan(x)**2+1). On introduit (3) u = tan(x), du = sec(x)**2 dx n n-2 / / Exemple : | tan(x)**3 sec(x)**4 dx = | tan(x)**3 sec(x)**2 sec(x)**2dx (1) / / / = | tan(x)**3 (tan(x)**2+1) sec(x)**2dx (2) / On pose u = tan(x), du = sec(x)**2dx / = | u**3 (u**2+1) du (3) / </syntaxhighlight> {{AutoCat}} f8fs0uz7lcbgwzwq9xn8fh0umrp9yi3 682842 682833 2022-07-28T20:34:55Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] [[Mathc initiation/Fichiers h : c77dg| Sommaire]] '''Etude de tan(x)**m sec(x)**n (n) ''' <syntaxhighlight lang="dos"> / Etude de : | tan(x)**m sec(x)**n dx = / Si n est paire, (1) on sauve un sec(x)**2, les sec(x)**(n-2) paires sont remplacés par (2) sec(x)**2 = (tan(x)**2+1). On introduit (3) u = tan(x), du = sec(x)**2 dx n n-2 / / Exemple : | tan(x)**3 sec(x)**4 dx = | tan(x)**3 sec(x)**2 sec(x)**2dx (1) / / / = | tan(x)**3 (tan(x)**2+1) sec(x)**2dx (2) / On pose u = tan(x), du = sec(x)**2dx / = | u**3 (u**2+1) du (3) / </syntaxhighlight> {{AutoCat}} fyc7gf6fi741y3ex84lzxnspxu2wzv0 Mathc initiation/Fichiers c : c77cd7 0 78767 682835 2022-07-28T20:22:16Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] [[Mathc initiation/Fichiers h : c74| Sommaire]] '''Etude de tan(x)**m sec(x)**n (m) ''' <syntaxhighlight lang="dos"> / Etude de : | tan(x)**m sec(x)**n dx = / Si m est impaire, (1) on sauve un sec(x)tan(x), les tan(x)**(n-1) paires sont remplacés par (2) tan(x)**2 = (sec(x)**2-1). On introduit (3) u = sec(x), du = sec(x) tan(x) dx m m-1 / / Exemple : | tan(x)**3 sec(x)**4 dx = | tan(x)**2 sec(x)**3 sec(x)tan(x)dx (1) / / / = | (sec(x)**2-1) sec(x)**3 sec(x)tan(x)dx (2) / On pose u = sec(x), du = sec(x)tan(x)dx / = | (u**2-1) u**3 du (3) / </syntaxhighlight> {{AutoCat}} avzybj8h7f7gc8s4ynojot58yh84po0 682843 682835 2022-07-28T20:35:11Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] [[Mathc initiation/Fichiers h : c77dg| Sommaire]] '''Etude de tan(x)**m sec(x)**n (m) ''' <syntaxhighlight lang="dos"> / Etude de : | tan(x)**m sec(x)**n dx = / Si m est impaire, (1) on sauve un sec(x)tan(x), les tan(x)**(n-1) paires sont remplacés par (2) tan(x)**2 = (sec(x)**2-1). On introduit (3) u = sec(x), du = sec(x) tan(x) dx m m-1 / / Exemple : | tan(x)**3 sec(x)**4 dx = | tan(x)**2 sec(x)**3 sec(x)tan(x)dx (1) / / / = | (sec(x)**2-1) sec(x)**3 sec(x)tan(x)dx (2) / On pose u = sec(x), du = sec(x)tan(x)dx / = | (u**2-1) u**3 du (3) / </syntaxhighlight> {{AutoCat}} m3riny6lra51h623itxuy2s8pxro537 Mathc initiation/Fichiers h : c77dg 0 78768 682838 2022-07-28T20:33:10Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] : : [[Mathc initiation/a77| Sommaire]] : : ----{{Partie{{{type|}}}|Application cos(x)**m sin(x)**n|fond={{{fond|}}<nowiki>}</nowiki>}} : Nous allons voir ici quelques applications des équations trigonométriques vue précédement. : <br> * [[Mathc initiation/Fichiers c : c77cd3|Étude de : <........> cos(x)**m sin(x)**n (m)]] * [[Mathc initiation/Fichiers c : c77cd4|Étude de : <........> cos(x)**m sin(x)**n (n)]] * [[Mathc initiation/Fichiers c : c77cd5|Étude de : <........> cos(x)**m sin(x)**n (mn)]] * [[Mathc initiation/Fichiers c : c77cd6|Étude de : <........> tan(x)**m sec(x)**n (n)]] * [[Mathc initiation/Fichiers c : c77cd7|Étude de : <........> tan(x)**m sec(x)**n (m)]] ---- {{AutoCat}} df6zrn820087gtm9v3qv0x8i180gneo 682844 682838 2022-07-28T20:37:35Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] : : [[Mathc initiation/a77| Sommaire]] : : ----{{Partie{{{type|}}}|Application cos(x)**m sin(x)**n|fond={{{fond|}}<nowiki>}</nowiki>}} : Nous allons voir ici quelques applications des équations trigonométriques vue précédemment. Revenez sur ces pages après avoir étudier les intégrales définie. : <br> * [[Mathc initiation/Fichiers c : c77cd3|Étude de : <........> cos(x)**m sin(x)**n (m)]] * [[Mathc initiation/Fichiers c : c77cd4|Étude de : <........> cos(x)**m sin(x)**n (n)]] * [[Mathc initiation/Fichiers c : c77cd5|Étude de : <........> cos(x)**m sin(x)**n (mn)]] * [[Mathc initiation/Fichiers c : c77cd6|Étude de : <........> tan(x)**m sec(x)**n (n)]] * [[Mathc initiation/Fichiers c : c77cd7|Étude de : <........> tan(x)**m sec(x)**n (m)]] ---- {{AutoCat}} 40f6cdvtixjemu959lj283kb53m9ldj 682849 682844 2022-07-28T22:04:42Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] : : [[Mathc initiation/a77| Sommaire]] : : ----{{Partie{{{type|}}}|Application cos(x)**m sin(x)**n|fond={{{fond|}}<nowiki>}</nowiki>}} : Nous allons voir ici quelques applications des équations trigonométriques vue précédemment. Revenez sur ces pages après avoir étudier les intégrales définie. : <br> * [[Mathc initiation/Fichiers c : c77cd3|Étude de : <........> cos(x)**m sin(x)**n (m)]] * [[Mathc initiation/Fichiers c : c77cd4|Étude de : <........> cos(x)**m sin(x)**n (n)]] * [[Mathc initiation/Fichiers c : c77cd5|Étude de : <........> cos(x)**m sin(x)**n (mn)]] * [[Mathc initiation/Fichiers c : c77cd6|Étude de : <........> tan(x)**m sec(x)**n (n)]] * [[Mathc initiation/Fichiers c : c77cd7|Étude de : <........> tan(x)**m sec(x)**n (m)]] * [[Mathc initiation/Fichiers c : c77cd8|Étude de : <........> tan(x)**m sec(x)**n (mn)]] ---- {{AutoCat}} 4b0a5k8pc7afvirxsilj8vmwixnn8rs 682852 682849 2022-07-28T22:10:03Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] : : [[Mathc initiation/a77| Sommaire]] : : ----{{Partie{{{type|}}}|Application cos(x)**m sin(x)**n|fond={{{fond|}}<nowiki>}</nowiki>}} : Nous allons voir ici quelques applications des équations trigonométriques vue précédemment. Revenez sur ces pages après avoir étudier les intégrales. : <br> * [[Mathc initiation/Fichiers c : c77cd3|Étude de : <........> cos(x)**m sin(x)**n (m)]] * [[Mathc initiation/Fichiers c : c77cd4|Étude de : <........> cos(x)**m sin(x)**n (n)]] * [[Mathc initiation/Fichiers c : c77cd5|Étude de : <........> cos(x)**m sin(x)**n (mn)]] * [[Mathc initiation/Fichiers c : c77cd6|Étude de : <........> tan(x)**m sec(x)**n (n)]] * [[Mathc initiation/Fichiers c : c77cd7|Étude de : <........> tan(x)**m sec(x)**n (m)]] * [[Mathc initiation/Fichiers c : c77cd8|Étude de : <........> tan(x)**m sec(x)**n (mn)]] ---- {{AutoCat}} p0inhi3zmyjbk9em2m2yq0hbx4g13oi 682934 682852 2022-07-29T11:14:37Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] : : [[Mathc initiation/a77| Sommaire]] : : ----{{Partie{{{type|}}}|Application cos(x)**m sin(x)**n|fond={{{fond|}}<nowiki>}</nowiki>}} : Nous allons voir ici quelques applications des identités trigonométriques vue précédemment. Revenez sur ces pages après avoir étudier les intégrales. : <br> * [[Mathc initiation/Fichiers c : c77cd3|Étude de : <........> cos(x)**m sin(x)**n (m)]] * [[Mathc initiation/Fichiers c : c77cd4|Étude de : <........> cos(x)**m sin(x)**n (n)]] * [[Mathc initiation/Fichiers c : c77cd5|Étude de : <........> cos(x)**m sin(x)**n (mn)]] * [[Mathc initiation/Fichiers c : c77cd6|Étude de : <........> tan(x)**m sec(x)**n (n)]] * [[Mathc initiation/Fichiers c : c77cd7|Étude de : <........> tan(x)**m sec(x)**n (m)]] * [[Mathc initiation/Fichiers c : c77cd8|Étude de : <........> tan(x)**m sec(x)**n (mn)]] ---- {{AutoCat}} hmo9fl93706ia2mkmwcenv5m2nbyjys Mathc initiation/Fichiers c : c77cd8 0 78769 682850 2022-07-28T22:06:27Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] [[Mathc initiation/Fichiers h : c77dg| Sommaire]] '''Etude de tan(x)**m sec(x)**n (mn) ''' <syntaxhighlight lang="dos"> / Etude de : | tan(x)**m sec(x)**n dx = / Si m est paire et n est impaire, (1) On utilise tan(x)**2 = (sec(x)**2-1) pour ne conserver que les sec(x) (2) On utilise la méthode de réduction de sec(x)**n. / / Exemple : | tan(x)**4 sec(x)**3 dx = | (tan(x)**2)**2 sec(x)**3 dx / / / = | (sec(x)**2-1)**2 sec(x)**3 dx (1) / / = | (sec(x)**4-2sec(x)**2+1) sec(x)**3 dx / / = | (sec(x)**7-2sec(x)**5+sec(x)**3) dx / / / / = | sec(x)**7 dx - 2 | sec(x)**5 + | sec(x)**3 dx (2) / / / Il existe une méthode qui permet de réduire les puissances de sec(x)**n soit jusqu'à n = 0 soit jusqu'à n = 1. Je n'ai pas encore étudié cette formule. </syntaxhighlight> {{AutoCat}} rt2jnfv0g4ma1ykg366qof9ltphee3d 682851 682850 2022-07-28T22:07:12Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] [[Mathc initiation/Fichiers h : c77dg| Sommaire]] '''Etude de tan(x)**m sec(x)**n (mn) ''' <syntaxhighlight lang="dos"> / Etude de : | tan(x)**m sec(x)**n dx = / Si m est paire et n est impaire, (1) On utilise tan(x)**2 = (sec(x)**2-1) pour ne conserver que les sec(x)**n (2) On utilise la méthode de réduction des sec(x)**n. / / Exemple : | tan(x)**4 sec(x)**3 dx = | (tan(x)**2)**2 sec(x)**3 dx / / / = | (sec(x)**2-1)**2 sec(x)**3 dx (1) / / = | (sec(x)**4-2sec(x)**2+1) sec(x)**3 dx / / = | (sec(x)**7-2sec(x)**5+sec(x)**3) dx / / / / = | sec(x)**7 dx - 2 | sec(x)**5 + | sec(x)**3 dx (2) / / / Il existe une méthode qui permet de réduire les puissances de sec(x)**n soit jusqu'à n = 0 soit jusqu'à n = 1. Je n'ai pas encore étudié cette formule. </syntaxhighlight> {{AutoCat}} fd8enjd9aoui7o2s449rwo12tfi7mvf Mathc initiation/Fichiers h : c78dg 0 78770 682933 2022-07-29T11:14:13Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] : : [[Mathc initiation/a78| Sommaire]] : : ----{{Partie{{{type|}}}|Application cos(x)**m sin(x)**n|fond={{{fond|}}<nowiki>}</nowiki>}} : Nous allons voir ici quelques applications des identités trigonométriques hyperbolique vue précédemment. Revenez sur ces pages après avoir étudier les intégrales. : <br> * [[Mathc initiation/Fichiers c : c78cd3|Étude de : <........> cosh(x)**m sinh(x)**n (m)]] * [[Mathc initiation/Fichiers c : c78cd4|Étude de : <........> cosh(x)**m sinh(x)**n (n)]] * [[Mathc initiation/Fichiers c : c78cd5|Étude de : <........> cosh(x)**m sinh(x)**n (mn)]] * [[Mathc initiation/Fichiers c : c78cd6|Étude de : <........> tanh(x)**m sech(x)**n (n)]] * [[Mathc initiation/Fichiers c : c78cd7|Étude de : <........> tanh(x)**m sec(hx)**n (m)]] * [[Mathc initiation/Fichiers c : c78cd8|Étude de : <........> tanh(x)**m sech(x)**n (mn)]] ---- {{AutoCat}} pnh3aov9axgas8wnsp5d8ooik7pnqw2 Mathc initiation/Fichiers c : c78cd3 0 78771 682935 2022-07-29T11:16:41Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] [[Mathc initiation/Fichiers h : c78dg| Sommaire]] '''Etude de cosh(x)**m sinh(x)**n (m) ''' <syntaxhighlight lang="dos"> / Etude de : | cosh(x)**m sinh(x)**n dx = / Si m est impaire, (1) on sauve un cosh(x), (2) le cosh(x)**(m-1) paire est remplacé par (3) cosh(x)**2 = (1+sinh(x)**2). On introduit (4) u = sinh(x), du = cosh(x) dx m m-1 / / Exemple : | cosh(x)**5 sinh(x)**3 dx = | cosh(x)**4 sinh(x)**3 cosh(x)dx (1) / / / = | (cosh(x)**2)**2 sinh(x)**3 cos(x)dx (2) / / = | (1+sinh(x)**2)**2 sinh(x)**3 cosh(x)dx (3) / On pose u = sinh(x), du = cosh(x)dx / = | (1+u**2)**2 u**3 du (4) / </syntaxhighlight> {{AutoCat}} 9pib1ma5j28cx4uxu0vbnyek9euokhn 682936 682935 2022-07-29T11:25:52Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] [[Mathc initiation/Fichiers h : c78dg| Sommaire]] '''Etude de cosh(x)**m sinh(x)**n (m) ''' <syntaxhighlight lang="dos"> / Etude de : | cosh(x)**m sinh(x)**n dx = / Si m est impaire, (1) on sauve un cosh(x), (2) le cosh(x)**(m-1) paire est remplacé par (3) cosh(x)**2 = (1+sinh(x)**2). On introduit (4) u = sinh(x), du = cosh(x) dx m m-1 / / Exemple : | cosh(x)**5 sinh(x)**3 dx = | cosh(x)**4 sinh(x)**3 cosh(x)dx (1) / / / = | (cosh(x)**2)**2 sinh(x)**3 cos(x)dx (2) / / = | (1+sinh(x)**2)**2 sinh(x)**3 cosh(x)dx (3) / On pose u = sinh(x), du = cosh(x)dx / = | (1+u**2)**2 u**3 du (4) / </syntaxhighlight> {{AutoCat}} 1odger5a8j0gm2eajkt2wkb18s91e12 Mathc initiation/Fichiers c : c78cd4 0 78772 682937 2022-07-29T11:28:54Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] [[Mathc initiation/Fichiers h : c78dg| Sommaire]] '''Etude de cosh(x)**m sinh(x)**n (n) ''' <syntaxhighlight lang="dos"> / Etude de : | cosh(x)**m sinh(x)**n dx = / Si n est impaire, (1) on sauve un sinh(x), (2) le sinh(x)**(n-1) paire est remplacé par (3) sinh(x)**2 = (cosh(x)**2-1). On introduit (4) u = cosh(x), du = sinh(x) dx n n-1 / / Exemple : | cosh(x)**5 sinh(x)**3 dx = | cosh(x)**5 sinh(x)**2 sinh(x)dx (1) / / / = | cosh(x)**5 sinh(x)**2 sinh(x)dx (2) / / = | cosh(x)**5 (cosh(x)**2-1) sinh(x)dx (3) / On pose u = cosh(x), du = sinh(x)dx / = | u**5 (u**2-1) du (4) / </syntaxhighlight> {{AutoCat}} 1wyoe3h9vssurjwepqzucxr44egebpq Mathc initiation/Fichiers c : c78cd6 0 78773 682938 2022-07-29T11:34:48Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] [[Mathc initiation/Fichiers h : c78dg| Sommaire]] '''Etude de tanh(x)**m sech(x)**n (n) ''' <syntaxhighlight lang="dos"> / Etude de : | tanh(x)**m sech(x)**n dx = / Si n est paire, (1) on sauve un sech(x)**2, les sec(x)**(n-2) paires sont remplacés par (2) sec(x)**2 = (1-tanh(x)**2). On introduit (3) u = tanh(x), du = sech(x)**2 dx n n-2 / / Exemple : | tanh(x)**3 sech(x)**4 dx = | tanh(x)**3 sech(x)**2 sech(x)**2dx (1) / / / = | tanh(x)**3 (1-tanh(x)**2) sech(x)**2dx (2) / On pose u = tanh(x), du = sech(x)**2dx / = | u**3 (1-u**2) du (3) / </syntaxhighlight> {{AutoCat}} b47nya5kt3pf1i8id9e55ho5txv9oph Mathc initiation/Fichiers c : c78cd7 0 78774 682939 2022-07-29T11:40:30Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] [[Mathc initiation/Fichiers h : c78dg| Sommaire]] '''Etude de tanh(x)**m sech(x)**n (m) ''' <syntaxhighlight lang="dos"> / Etude de : | tanh(x)**m sech(x)**n dx = / Si m est impaire, (1) on sauve un sech(x)tanh(x), les tanh(x)**(n-1) paires sont remplacés par (2) tan(x)**2 = (1-sech(x)**2). On introduit (3) u = sech(x), du = sech(x)tanh(x)dx m m-1 / / Exemple : | tanh(x)**3 sech(x)**4 dx = | tanh(x)**2 sech(x)**3 sech(x)tanh(x)dx (1) / / / = | (1-sech(x)**2) sech(x)**3 sech(x)tanh(x)dx (2) / On pose u = sech(x), du = sech(x)tanh(x)dx / = | (1-u**2) u**3 du (3) / </syntaxhighlight> {{AutoCat}} f9ynakadb4j4txxg2tf9sjafoncy5tn Mathc initiation/Fichiers c : c78cd5 0 78775 682941 2022-07-29T11:58:12Z Xhungab 23827 modification mineure wikitext text/x-wiki [[Catégorie:Mathc initiation (livre)]] [[Mathc initiation/Fichiers h : c78dg| Sommaire]] '''Etude de cosh(x)**m sinh(x)**n (mn) ''' <syntaxhighlight lang="dos"> / Etude de : | cosh(x)**m sinh(x)**n dx = / Si m et n sont paires, on utilise : sinh(x)**2 = 1/2 (cosh(2x)-1) cosh(x)**2 = 1/2 (cosh(2x)+1) / / Exemple : | sinh(x)**2 cosh(x)**2 dx = | 1/2 (cosh(2x)-1) 1/2 (cosh(2x)+1) dx / / / = 1/4 | (cosh(2x)**2-1) dx (a-b)(a+b) = a**2-b**2 / / cosh(x)**2-sinh(x)**2 = 1 = 1/4 | sinh(2x)**2 dx sinh(x)**2 = (cosh(x)**2-1) / / = 1/4 | 1/2 (cosh(4x)-1) dx sin( x)**2 = 1/2 (cosh(2x)-1) / sin(2x)**2 = 1/2 (cosh(4x)-1) </syntaxhighlight> {{AutoCat}} noyijpd279udzelue7opw24q8uueqbl