Condivisione della tecnologia

Come funzionano i computer (Conoscenze di base per programmatori)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Storia dello sviluppo del computer

La necessità dell'informatica è diffusa nella storia umana e il suo sviluppo è generalmente passato attraverso il processo di sviluppo dagli strumenti informatici generali ai computer meccanici fino agli attuali computer elettronici.
Il bisogno di computer dell'umanità ci spinge a inventare e migliorare continuamente i computer. L'era attuale è l'era dei "computer elettronici" e la tendenza dello sviluppo è: più veloce, più stabile e più piccola.
Libri consigliati: "Una breve storia dei computer"

2. Architettura di Von Neumann

Punto 1
I computer moderni sono più conformiArchitettura di Von Neumann
Inserisci qui la descrizione dell'immagine

  • Unità centrale di elaborazione CPU: esegue operazioni aritmetiche e giudizi logici
  • Memoria: divisa in memoria esterna e memoria interna, utilizzata per archiviare dati (utilizzando la memorizzazione binaria)
  • Dispositivo di input: dispositivo utilizzato dall'utente per impartire comandi al computer
  • Dispositivo di output: dispositivo utilizzato dal computer per segnalare i risultati all'utente
    Per spazio di archiviazione
    Disco rigido>Memoria>>CPU
    Per la velocità di accesso ai dati
    CPU>>Memoria>Disco rigido

Introduzione a von Neumann (il padre dei computer)

John von Neumann (28 dicembre 1903-8 febbraio 1957), matematico e informatico ungherese-americano
Scienziato, fisico e uno dei matematici più importanti del XX secolo. Von Neumann ha conseguito il dottorato in matematica presso l'Università di Budapest. È una delle menti scientifiche più versatili nel campo dei computer moderni, della teoria dei giochi, delle armi nucleari e delle armi biologiche padre dei computer moderni” e “il padre della teoria dei giochi”. ”.
Inserisci qui la descrizione dell'immagine

3. Flusso di lavoro di base della CPU

Successivamente, utilizzeremo un processo da zero per costruire una CPU passo dopo passo. Possiamo utilizzare questo processo per comprendere i principi di funzionamento dei componenti principali del computer come CPU e memoria.

3.1 Porte logiche

Interruttore elettronico – Relè meccanico
Inserisci qui la descrizione dell'immagine
Attraverso gli interruttori elettronici possiamo implementare operazioni logiche a 1 bit (bit) apparentemente inutili, ma almeno funziona, no?
Impareremo di più su come utilizzare gli interruttori elettronici per combinare componenti logici veramente utili.
L'essenza dei futuri tubi a vuoto e transistor è quella di completare un lavoro simile, ma i principi fisici sono più complessi, quindi non vi guideremo attraverso una spiegazione approfondita.

3.2 Circuito del cancello

Successivamente, impareremo come utilizzare gli interruttori elettronici per costruire alcuni componenti utili: è possibile realizzare circuiti logici di base da 1 bit.
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine

3.3 Unità aritmetica e logica ALU (Unità aritmetica e logica)

L'ALU è il componente principale per le operazioni aritmetiche e logiche nei computer ed è il cervello matematico del computer. Successivamente, utilizziamo le porte logiche costruite sopra per completare una nostra ALU, per apprendere e comprendere la sua modalità di funzionamento, in modo da. approfondire la nostra comprensione dei principi moderni del computer.
Inserisci qui la descrizione dell'immagine

3.3.1 Comprensione del sistema esadecimale

Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine

3.3.2 Unità aritmetica

L'unità aritmetica è responsabile di tutte le operazioni digitali nel computer, come le quattro operazioni aritmetiche. Naturalmente, può fare molto di più. Successivamente, ti mostrerò come implementare un sommatore a 8 bit l’intero processo e le altre operazioni non spiegherò più il dispositivo.
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
A questo punto, abbiamo creato da zero un sommatore a 8 bit. Le operazioni dell'unità aritmetica sono ovviamente molto più di queste. Continuando a combinare le porte logiche, l'unità aritmetica può eseguire addizioni, sottrazioni, moltiplicazioni, divisioni e anche altre operazioni aritmetiche, ma un sommatore è sufficiente come dimostrazione. Infatti la difficoltà di realizzare moltiplicatori e divisori è maggiore di quella di sommatori e sottrattori. Se sei interessato puoi provare a saperne di più.

3.3.3 Unità Logica

Le unità logiche vengono utilizzate principalmente per eseguire operazioni logiche. Le operazioni più elementari sono le operazioni AND, OR e NOT, ma non sono solo il confronto di numeri a un bit.
Inserisci qui la descrizione dell'immagine

3.3.4 Simboli ALU

经过我们的努力,通过基本的逻辑门电路,我们⼀步步地做出了⼀个 8 位(bits) ALU,甚至比 Intel 74181 还要强大,Intel 74181 只是⼀个 4 位(bits) ALU(😀)。当然现代的计算机中的 ALU 部件非常强大,复杂度远远超过了我们的想象,32 位 甚至 64 位基本已经普及全球了。但无论如何,再复杂的ALU 也是芯片工程师像我们这样,一层又一层, 一步又一步地将其抽象出来的。ALU 是第⼀次将人类历史上的数学和逻辑学学科有机地结合起来,可以视为人类智慧发展的现代巅峰.
Inserisci qui la descrizione dell'immagine

3.4 Registro (Register) e Memoria (RAM)

L'ALU da sola non è sufficiente. Non possiamo fornire componenti di storage per l'ALU, quindi utilizzeremo i circuiti di gate per spiegare brevemente la produzione dello storage. Si noti che, sebbene non sia chiaramente mostrato nella figura, questi requisiti di storage devono rimanere accesi , cioè questi archivi sono volatili (volatili)
Inserisci qui la descrizione dell'immagine
Nascondiamo alcuni dettagli di implementazione nel mezzo e l'effetto finale è: quando la linea di disabilitazione è impostata, l'input è 1 e 1 viene salvato; quando l'input è 0, viene salvato 0 Quando la linea di abilitazione non è in posizione , la scrittura non è valida.
Possiamo usare le serrature delle porte per costruire i registri e la memoria di cui abbiamo bisogno.
Inserisci qui la descrizione dell'immagine
La costruzione della memoria è un po’ più complicata di così, ma i principi di base sono gli stessi. La memoria costruita in questo modo è chiamata RAM (Random Access Memory) e può supportare la complessità temporale O(1) per accedere ai dati in qualsiasi posizione. Ciò significa che la nostra operazione di accesso all'indice dell'array è O(1).
supporto hardware.

Inserisci qui la descrizione dell'immagine

3.5 Unità di controllo CU (Unità di controllo)

Ora abbiamo ALU e spazio di archiviazione, ma questo non è ancora sufficiente per far funzionare il nostro computer. Abbiamo bisogno di un componente per dirigere l'ALU per eseguire che tipo di calcoli, e questo componente è l'unità di controllo (CU).
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine

3.6 Parametri fondamentali della CPU

Punto 2

3.6.1 Numero di nuclei

Inserisci qui la descrizione dell'immagine
Il numero di box nell'immagine sopra può essere considerato come il numero di core. Come mostrato nell'immagine, si tratta di una CPU a sedici core.
Le prime CPU avevano un singolo core. Con lo sviluppo dei tempi, abbiamo requisiti sempre più elevati per la velocità di elaborazione della CPU. Al momento, dobbiamo rendere la CPU più integrata e contenere più unità di calcolo per calcolare più velocemente l'unità di calcolo deve essere piccola (processo di produzione della CPU, come 5 nm, ecc.). In questo momento, la meccanica classica diventa non valida e inizia a entrare nel campo della meccanica quantistica. La sfida al processo diventa sempre più grande.
In questo momento viene proposto il concetto di multi-core.

3.6.2 Frequenza

Inserisci qui la descrizione dell'immagine

La velocità di elaborazione della CPU è descritta dalla frequenza, che può essere intesa semplicemente come quante istruzioni possono essere eseguite in un secondo (non rigoroso). Ad esempio, la velocità di cui sopra può essere intesa come i calcoli della CPU circa 3,4 miliardi di volte al secondo .
La frequenza della CPU cambia dinamicamente in base al carico di lavoro. All'aumentare della frequenza, consuma più energia e genera più calore. Per proteggere la CPU dalla combustione dovuta al surriscaldamento, ridurrà automaticamente la frequenza.

3.7 Processo di esecuzione delle istruzioni da parte della CPU (istruzione)

Punto 3

3.7.1 Elenco istruzioni

Innanzitutto, introduciamo le istruzioni di cui abbiamo bisogno.
La cosiddetta istruzione, cioè il comando che guida la CPU a eseguire il lavoro, è composta principalmente da codice operazione + operando.
Il codice operativo viene utilizzato per indicare quale azione deve essere eseguita e l'operando sono i dati su cui deve operare questa istruzione, che può essere un indirizzo di memoria o un numero di registro, ecc.
Anche l'istruzione stessa è un numero, memorizzato in una determinata area della memoria in forma binaria.
I programmi che scriviamo nei linguaggi di programmazione devono eventualmente essere tradotti in "istruzioni binarie eseguite sulla CPU".
Anche le istruzioni sono linguaggio macchina (binario) e il linguaggio macchina e il linguaggio assembly hanno una corrispondenza biunivoca.
CPU diverse supportano istruzioni diverse a livello micro, come istruzioni x86 e istruzioni arm, che causano problemi di compatibilità.
Inserisci qui la descrizione dell'immagine
Si può ritenere che le istruzioni che una CPU può eseguire siano state stabilite al momento della progettazione originale della CPU. L'immagine sopra elenca alcune istruzioni semplificate.
L'istruzione a 8 bit può essere divisa in due parti.
I primi 4 bit sono il codice operativo (opcode) che indica cosa fa l'istruzione.
Gli ultimi 4 bit sono operandi (simili ai parametri)
Il nome del registro AB nella tabella sopra è fittizio. Il nome del registro effettivo della CPU è nel formato: eax, ebx, esp, ebp...).

3.7.2 Processo base di esecuzione delle istruzioni

C'è un registro speciale nella CPU, il "contatore del programma" (verrà impostato automaticamente dal sistema dopo che l'exe è stato caricato in memoria), che salva la posizione di memoria da cui verrà eseguita successivamente l'istruzione volta, man mano che l'istruzione viene eseguita, anche il valore del "contatore del programma" verrà aggiornato di conseguenza. Per impostazione predefinita, è un processo di incremento automatico di +1 (esecuzione delle istruzioni in sequenza Se viene incontrata un'istruzione di salto, ad esempio). as (if, while, for, chiamata di funzione...), verrà impostato su un altro valore.
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
Dividiamo l'esecuzione delle istruzioni in tre fasi:
1) Recupero delle istruzioni, la CPU legge il contenuto delle istruzioni dalla memoria alla CPU (sono presenti registri speciali per salvare le istruzioni di lettura).
2) Analizzare l'istruzione e identificarne la funzione, le funzioni e gli operandi corrispondenti
3) Eseguire le istruzioni
L'esecuzione di ciascuna istruzione deve passare attraverso i tre passaggi precedenti e il completamento di un'attività richiede l'esecuzione di diverse istruzioni di cui sopra. Ad esempio, un processo di addizione può richiedere tre istruzioni di cui sopra, il che sembra molto problematico, ma a causa del calcolo della CPU Lo è molto veloce (le operazioni di cui sopra possono essere eseguite più di un miliardo di volte in un secondo) e non richiede molto tempo per un computer.

4. Linguaggio del programma

4.1 Programma

Il cosiddetto programma è un insieme di istruzioni e i dati che devono essere elaborati da questo insieme di istruzioni. In senso stretto, un programma ci appare solitamente come un insieme di file.
Programma = istruzione + dati che devono essere elaborati dall'istruzione.
Inserisci qui la descrizione dell'immagine

4.2 Programmazione anticipata

Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
Questa è una piccola storia interessante che è stata diffusa in precedenza, ma ovviamente non è vera.Ma per i primi computer, la programmazione era davvero necessaria
Programmato con 0 e 1 (Σ(っ°Д °;)っ)
L'immagine sotto mostra il computer Altair 8800, uno dei primi microcomputer. L'utente deve controllare l'interruttore e inserire il programma nel computer poco a poco.
Inserisci qui la descrizione dell'immagine
Se a tutti gli utenti di computer venisse richiesto di utilizzare la programmazione binaria, tutti impazzirebbero. Questa è una soglia troppo alta. Così sono nati i linguaggi di programmazione.

4.3 Sviluppo di linguaggi di programmazione

Per migliorare l'efficienza della programmazione, è stato inizialmente creato il concetto di linguaggio assembly. In effetti, il linguaggio assembly e il linguaggio macchina (cioè le istruzioni) sono direttamente in corrispondenza uno a uno. È solo che, rispetto ai numeri 0 e 1, sono stati inventati alcuni simboli per aiutare gli esseri umani a ricordarli e a comprenderli è quello che abbiamo sopra Quello che vedi è simile a LOAD_A, LOAD_B, ecc. Dopo che i programmatori hanno completato la programmazione, devono utilizzare un assemblatore per tradurre il linguaggio assembly in linguaggio macchina.
Sebbene l'assemblaggio riduca il costo della memoria del programmatore, è comunque necessario che il programma padroneggi tutta la conoscenza dell'hardware del computer. Con il crescente numero di produttori di computer, i programmi scritti in una volta sono spesso adatti solo per un tipo di computer. Questo non è sufficiente, quindi sono nati linguaggi più avanzati che proteggono i dettagli dell'hardware e consentono ai programmatori di pensare alla propria attività a un livello superiore. Qui prendiamo come esempio il linguaggio C. Dopo che il programmatore ha finito di scrivere il programma, deve utilizzare un compilatore e un linker per tradurre il programma in linguaggio assembly, quindi utilizzare l'assemblatore per trasformarlo nel linguaggio macchina finale.
Con l'aiuto dell'idea di incapsulamento, diventa sempre più facile per noi imparare a programmare. Tuttavia, ci sono vantaggi e svantaggi. L'alto grado di astrazione fa sì che molti programmatori considerino il computer come una scatola nera e non siano completamente in grado di capire come funzionano i loro programmi. Spero che nessuno di noi diventi tale.
Il linguaggio Java che utilizziamo è un po' più avanzato del linguaggio C, ma non c'è molta differenza nei principi astratti di base, quindi per ora non lo approfondiremo.
Inserisci qui la descrizione dell'immagine
Nota: un'affermazione in un linguaggio di alto livello corrisponde spesso a molte istruzioni da completare.

5. Sistema operativo

Punto 4
Sistema operativo è un nome collettivo per un insieme di software che gestisce le risorse del computer. Attualmente, i sistemi operativi comuni includono: serie Windows, serie Unix, serie Linux, serie OSX, serie Android, serie iOS, Hongmeng, ecc.
I programmi in esecuzione su sistemi diversi sono diversi (i programmi non sono compatibili a causa di KPI diversi)

5.1 Posizionamento del sistema operativo

Inserisci qui la descrizione dell'immagine
Un sistema operativo ha due funzioni fondamentali:
1) Prevenire l'abuso dell'hardware da parte delle applicazioni spazio-temporali; fornire KPI all'applicazione e consentire all'applicazione di chiamarlo per completare diverse funzioni.
2) Fornire applicazioni con meccanismi semplici e coerenti per controllare dispositivi hardware di basso livello complessi e spesso ampiamente disparati.

Un sistema operativo fa principalmente le seguenti due cose:
1) Gestire diversi dispositivi hardware. I computer possono accedere a molti dispositivi, come scanner di codici, apparecchiature mediche, macchine per ultrasuoni B...
2) Fornire un ambiente operativo stabile per il software. I moderni sistemi operativi devono eseguire molti programmi contemporaneamente. Si spera che questi programmi non possano interferire tra loro. Se si verifica un bug in un programma, non influirà sugli altri programmi .

6. Processo/Compito

Quando ciascuna applicazione viene eseguita su un sistema operativo moderno, il sistema operativo fornirà un'astrazione, come se solo questo programma fosse in esecuzione sul sistema e tutte le risorse hardware fossero utilizzate da questo programma. Questa illusione si ottiene astraendo il concetto di processo, probabilmente uno dei concetti più importanti e di successo nell'informatica.
Un processo è un'astrazione di un programma in esecuzione da parte del sistema operativo. In altre parole, il processo può essere considerato come un processo in esecuzione del programma, allo stesso tempo, all'interno del sistema operativo, il processo è l'unità base di allocazione delle risorse dal sistema operativo.

6.1 Il concetto di processo

Punto 5
I processi sono alcune applicazioni che vengono eseguite sui nostri computer. (Quando si parla di un'applicazione, ci sono due stati. Quando non è in esecuzione, è un file exe che si trova sul disco rigido; quando è in esecuzione, l'exe sarà caricato in memoria e la CPU esegue le istruzioni all'interno).
Inserisci qui la descrizione dell'immagine
Il processo è l'unità base di allocazione delle risorse da parte del sistema operativo.

6.2 Gestione dei processi

Punto 6
Poiché nel sistema sono presenti molti processi, è necessario gestirli
1) La descrizione esprime vari attributi del processo attraverso strutture/classi (i sistemi tradizionali sono implementati tramite C/C++)
2) L'organizzazione collega le suddette strutture multiple (descrizioni) attraverso la struttura dei dati, ed esegue inoltre varie aggiunte, cancellazioni, modifiche e controlli...
Ad esempio, il sistema operativo Linux utilizza una struttura chiamata "PCB" per descrivere le informazioni sul processo (PCB sta per blocco di controllo del processo). -click sull'exe , eseguendo il programma) equivale a creare una struttura PCB significa eliminare il PCB dall'elenco delle connessioni e rilasciare la struttura del PCB significa attraversare l'elenco delle connessioni e visualizzare in sequenza le informazioni corrispondenti .
Il PCB è una struttura molto complessa che contiene molti attributi. Di seguito impariamo alcune informazioni chiave.
1.Identificatore del processo PID
Allo stesso tempo, il PID è unico tra più processi su una macchina e non verrà ripetuto. Molte operazioni interne al sistema trovano il processo corrispondente tramite il PID.
Inserisci qui la descrizione dell'immagine
2. Puntatore di memoria (un set)
Descrive l'area in cui vengono archiviate le istruzioni e i dati dipendenti dal processo
Quando il sistema operativo esegue l'exe, leggerà le istruzioni e i dati nell'exe e li caricherà nella memoria (indirizzo di memoria).
Dall'esterno si vede che l'esecuzione del processo richiede determinate risorse di memoria.
3. Tabella di descrizione del file (tabella/array di sequenza)
Descrive quali file vengono aperti dal processo, corrispondenti ai dati sul disco rigido
Quando un file viene aperto durante il processo, un elemento verrà aggiunto alla tabella della sequenza per facilitarne la lettura.
I seguenti elementi determinano congiuntamente la pianificazione del processo, che è strettamente correlata al nostro sviluppo quotidiano.
Punto 7
La chiave per la pianificazione dei processi del sistema operativoMultiplexing a condivisione di tempo
Gli attuali sistemi operativi sono tutti "sistemi multitask" che possono eseguire più processi contemporaneamente. I sistemi operativi precedenti erano chiamati "sistemi single-task" e potevano eseguire solo un processo contemporaneamente.
Comprensione del multiplexing time-sharing: a un certo momento, la CPU esegue il processo 1, funziona per un po', la CPU esegue il processo 2 e dopo un po' esegue il processo 3... Poiché la velocità di elaborazione della CPU e la velocità di commutazione sono molto elevate, non è visibile ad occhio nudo. Dal punto di vista umano, equivale all'esecuzione simultanea, "esecuzione simultanea".
Esecuzione parallela: ora con le CPU multi-core ogni core e tra core può anche eseguire processi diversi contemporaneamente a livello microscopico.
La concorrenza o la concorrenza è pianificata in modo uniforme dal kernel del sistema operativo e non può essere percepita dai programmatori/utenti ordinari. Pertanto, il parallelismo e la concorrenza vengono solitamente definiti collettivamente "concorrenza" e le tecniche di programmazione corrispondenti sono anche chiamate "programmazione concorrente".
4. Stato del processo
Stato pronto: il processo può essere programmato sulla CPU per eseguire le istruzioni in qualsiasi momento
Stato bloccato: il processo non può essere programmato per eseguire istruzioni sulla CPU. Il motivo per cui è bloccato è che deve eseguire alcune altre operazioni, come operazioni di I/O (lettura e scrittura di dischi rigidi o lettura e scrittura di schede di rete, come ad esempio). input di scansione). Quando è richiesto l'input dell'utente, il processo entra nello stato di blocco)
Quelli sopra indicati sono i due stati principali del processo. Esistono anche altri stati, quindi non entrerò troppo nei dettagli...
5. Priorità del processo
La priorità è letteralmente l'ordine dei processi.
6. Contesto del processo
Multiplexing a condivisione di tempo. Dopo che un processo è stato eseguito per un po', verrà trasferito dalla CPU. Dopo un po' verrà riprogrammato alla CPU. Continuerà ad essere eseguito insieme ai risultati dell'ultima esecuzione i risultati intermedi dell'esecuzione precedente (vari Il valore nel registro della CPU) vengono salvati per il successivo utilizzo.
7. Informativa contabile del processo
Con il supporto delle priorità, le risorse consumate dai diversi processi possono diventare sempre più diverse...
Gli attributi di cui sopra vengono utilizzati per supportare l'esecuzione simultanea del processo di pianificazione.

7. Allocazione della memoria⸺Gestione della memoria (Gestione della memoria)

Il sistema operativo alloca le risorse di memoria utilizzando un modello spaziale: processi diversi utilizzano aree diverse della memoria senza interferire tra loro.

8. Comunicazione tra processi

Come accennato in precedenza, il processo è la più piccola unità di risorse allocata da parte del sistema operativo, il che significa che ciascun processo non può sentire l'esistenza dell'altro. Questa è l'intenzione originale del sistema operativo di astrarre il concetto di processo, che determina il processo Hanno "isolamento" l'uno dall'altro.
Tuttavia, le applicazioni moderne spesso non sono in grado di completare un requisito aziendale complesso attraverso un processo in modo indipendente. Richiedono sempre che processo e processo cooperino per raggiungere lo scopo dell'applicazione. In questo modo, è necessario uno "scambio di informazioni" tra i processi. La necessità di comunicazione tra processi è emersa in questo momento storico.
Attualmente esiste un solo metodo principale di comunicazione tra processi in Java, attraverso la rete (socket)
La rete è un meccanismo IPC relativamente speciale. Oltre a supportare la comunicazione tra due processi sullo stesso host, supporta anche la comunicazione tra processi su host diversi all'interno della stessa rete.