Recommandations de livres connexes
Principes de lecture :不求甚解,观其大略
- Codage : le langage caché derrière les logiciels et le matériel informatique
- "Comprendre les systèmes informatiques"
- Structures de données et algorithmes
- "structure de données et algorithme java" "algorithme"
- "Introduction aux algorithmes" "L'art de la programmation informatique"
- Système d'exploitation : analyse du code source du noyau Linux Conception et mise en œuvre du noyau Linux Système d'exploitation sur 30 jours
- Réseau : il est recommandé de lire la version originale du volume 1 de l'« Explication détaillée TCP/IP » de Mechanic.
- Principe de compilation : le mode d'implémentation du langage de programmation du livre dragon mécanique
- Base de données : Derby source SQLite
Principes de base du processeur
Le processus de production du CPU
Essence : un tas de sable + un tas de cuivre + un tas de colle + ajout de métal spécifique + procédé spécial
Désoxydation du sable-> quartz-> silice-> purification-> lingot de silicium-> coupe-> plaquette-> application de résine photosensible-> lithographie-> gravure-> élimination de la résine photosensible-> placage-> polissage-> couche de cuivre -> test -> Tranche -> Paquet
Le processus de production du processeur Intel (description vidéo)
Comment le processeur est fabriqué (description textuelle)
A l'intérieur du processeur : silicium -> ajout d'éléments spéciaux -> semi-conducteur P semi-conducteur N -> jonction PN -> diode -> transistor à effet de champ -> interrupteur logique
Circuits logiques de base : Porte ET Porte OU Porte NON Porte NI (OU exclusif) Adder Accumulator Latch…
Réaliser le calcul manuel (lire l'instruction de mémoire à chaque fois, (haute puissance faible puissance))
Livres recommandés : Chapitre 17 de Coding
Pour le fonctionnement du processeur, c'est par haute fréquence, basse fréquence -> converti en logique, c'est un nombre binaire : 0, 1 -> indiquez à l'ordinateur quelle broche doit être activée et désactivée
Saisie manuelle : ordinateur à bande papier
Mnémonique : 01000010->mov sub...
Langage de haut niveau -> Compilateur -> Langage machine
Le principe du CPU
Le problème le plus fondamental que les ordinateurs doivent résoudre : comment représenter les nombres
comment fonctionnent les transistors
Comment fonctionne un transistor
Processus d'exécution du langage d'assemblage
L'essence de l'assemblage : le mnémonique du langage machine, en fait, c'est du langage machine : mov sub add représente des données binaires
Processus : allumer l'ordinateur -> CPU lit le programme en mémoire (entrée de signal électrique) -> le générateur d'horloge oscille continuellement marche/arrêt -> pousse le CPU à exécuter pas à pas (le nombre d'étapes exécutées dépend du cycle d'horloge requis par l'instruction) -> calcul terminé -> réécriture (signal électrique) -> écriture sur la sortie de la carte graphique (sout ou graphique)
Ordinateur quantique (il suffit de comprendre)
qubit
La composition de l'ordinateur
CPU和内存,是计算机的核心
Composition de base du CPU
PC -> Program Counter compteur de programme (enregistre l'adresse d'instruction actuelle)
Registres -> Registre : stocke temporairement les données nécessaires aux calculs CPU
ALU -> Unité arithmétique et logique
CU -> Unité de contrôle Contrôle du signal d'interruption de l'unité de contrôle
MMU -> Unité de gestion de la mémoire Unité de gestion de la mémoire - implémentation matérielle + système d'exploitation
Hyperthreading : Une ALU correspond à plusieurs PC|Registre
dits quatre cœurs et huit threads comme indiqué sur la figure :
hiérarchie de la mémoire
Pourquoi avoir une cache ?
Parce que la vitesse du CPU aux différents registres et à la mémoire principale n'est pas la même
structure physique du cache
按块读取
Le principe le plus élémentaire de la mise en cache : le principe de localité du programme, qui peut améliorer l'efficacité et
donner pleinement accès à la capacité des broches du processeur du bus à lire plus de données à la fois
cache
Afin d'assurer la cohérence des données : dans l'unité de comportement du cache, quatre
protocoles de cohérence de l'état de la ligne de cache sont définis
taille de la ligne de cache
Ligne de cache : actuellement, le cache L3 est le plus adapté à l'industrie. Plus
la ligne de cache est grande, plus l'efficacité de l'espace local est élevée, mais plus le temps de lecture est lent
. Plus la ligne de
cache Valeur, actuellement principalement utilisée : 64 octets
100 millions d'efficacité d'exécution d'affectation de la même ligne de cache volatile assure la visibilité entre les threads
package com.mashibing.juc.c_028_FalseSharing;
public class T03_CacheLinePadding {
public static volatile long[] arr = new long[2];
public static void main(String[] args) throws Exception {
Thread t1 = new Thread(()->{
for (long i = 0; i < 10000_0000L; i++) {
arr[0] = i;
}
});
Thread t2 = new Thread(()->{
for (long i = 0; i < 10000_0000L; i++) {
arr[1] = i;
}
});
final long start = System.nanoTime();
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println((System.nanoTime() - start)/100_0000);
}
}
100 millions d'efficacité d'exécution d'affectation de différentes lignes de cache
package com.mashibing.juc.c_028_FalseSharing;
public class T04_CacheLinePadding {
public static volatile long[] arr = new long[16];
public static void main(String[] args) throws Exception {
Thread t1 = new Thread(()->{
for (long i = 0; i < 10000_0000L; i++) {
arr[0] = i;
}
});
Thread t2 = new Thread(()->{
for (long i = 0; i < 10000_0000L; i++) {
arr[8] = i;
}
});
final long start = System.nanoTime();
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println((System.nanoTime() - start)/100_0000);
}
}
Les résultats montrent clairement que l'exécution est plus rapide avec différentes lignes de cache
Par conséquent, un modèle de programmation est né - l'alignement de la ligne de cache Alignement de la
ligne de cache : pour certains numéros particulièrement sensibles, il y aura un accès à haute contention de threads. Pour s'assurer qu'un faux partage ne se produit pas, une programmation d'alignement de ligne de cache peut être utilisée.
Par exemple, 7 données longues sont remplies avant et après le disrupteur pour garantir des lignes de cache indépendantes :
dans JDK7, beaucoup utilisent un remplissage long pour améliorer l'efficacité
JDK8, ajout de l'annotation @Contended (expérimentale) : JVM -XX : -RestrictContended
package com.mashibing.juc.c_028_FalseSharing;
import sun.misc.Contended;
/**
* T05_Contended
* Description
*
* @date 2020/5/26 - 23:38
*/
public class T05_Contended {
@Contended
volatile long x;
@Contended
volatile long y;
public static void main(String[] args) throws InterruptedException {
T05_Contended t = new T05_Contended();
Thread t1 = new Thread(()->{
for (long i=0;i<1_0000_0000L;i++){
t.x=i;
}
});
Thread t2 = new Thread(()->{
for (long i=0;i<1_0000_0000L;i++){
t.y=i;
}
});
final long start = System.nanoTime();
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println((System.nanoTime() - start)/100_0000);
}
}