Esecuzione (informatica): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Yujin (discussione | contributi)
Nessun oggetto della modifica
m evasione
Etichetta: Rollback
 
(114 versioni intermedie di 61 utenti non mostrate)
Riga 1:
{{F|terminologia informatica|febbraio 2013}}
{{stub}}
[[File:Operating_system_placement-it.svg|thumb|Schema di astrazione dall'utente fino all'esecuzione da parte dell'[[hardware]]]]
{{traduci Inglese}}
 
Con '''esecuzione''', in [[informatica]], si indica il processo tramite il quale un sistema di elaborazione ([[computer]] o [[macchina virtuale]]) esegue ([[elaborazione dati|elabora]]) le [[istruzione (informatica)|istruzioni]] di un [[programma (informatica)|programma]], seguendone il [[flusso di esecuzione]] specificato nel rispettivo [[codice sorgente]], dopo le fasi di [[compilazione]]/[[interprete (informatica)|interpretazione]] e [[linker|linking]]. In generale il termine ''"eseguire"'' è usato per indicare l'avvio di un programma [[installazione (informatica)|installato]]; più precisamente, l{{'}}''esecuzione'' è lo stato in cui si trova un [[Processo (informatica)|processo]] quando una [[CPU]] sta eseguendo le istruzioni che lo caratterizzano (a differenza di altri momenti in cui può essere ad esempio in uno stato sospeso (''idle''), o anche in attesa che si renda disponibile una CPU; vedi anche [[scheduler]]).
'''Esecuzione''' in [[Informatica]] è il processo tramite il quale un computer o una macchina virtuale porta avanti le istruzioni di un [[software|programma]].
 
== Descrizione ==
== Contesto dell' esecuzione ==
=== Premesse e contesto ===
Il contesto in cui l'esecuzione prende posto è cruciale. Pochissimi programmi vengono eseguiti su una macchina nuda. I programmi generalmente cotengono assunzioni implicite ed esplicite sulle risorse accessibili al momento dell'esecuzione. La maggior parte dei programmi sono eseguiti con il supporto del [[sistema operativo]] e delle [[librerie di run-time]] specifiche per il linguaggio che provvedono ai servizi cruciali non forniti dal computer stesso. Questo ambiente di supporto, ad esempio, impedisce al processo di manipolare direttamente le periferiche, mettendo a disposizione un servizio più generale e astratto.
{{vedi anche|Compilazione|Linker|Codice oggetto|File eseguibile|Interprete (informatica)}}
[[File:Multi-pass compiler-it.svg|thumb|upright=1.1|I passi della [[compilazione]]]]
 
Il contesto in cui avviene l'esecuzione è cruciale: rispetto al numero totale di programmi disponibili sono pochissimi quelli che possono essere eseguiti direttamente da un [[computer]] senza il supporto del sistema operativo.
== Interpreter ==
Il sistema che esegue un programma si chiama [[Interprete (informatica)|interprete]] del programma. In parole povere, un interprete non fa alto che quello che il programma gli dice di fare.
 
I programmi generalmente contengono assunzioni implicite ed esplicite sulle risorse accessibili al momento dell'esecuzione (ad esempio la disponibilità di [[canali standard]] di comunicazione, o di un ''[[file system]]'' su cui memorizzare dati). La maggior parte dei programmi sono eseguiti con il supporto del sistema operativo e di [[Libreria software|librerie]] specifiche per il linguaggio, i quali forniscono i servizi essenziali non offerti direttamente dal computer stesso. Questo ambiente di supporto, ad esempio, offre ai processi dei metodi uniformi per accedere a [[periferica|periferiche]] anche radicalmente diverse tra loro, e nel contempo impedisce ad essi di accedervi direttamente e di creare così conflitti tra processi ed utenti.
[[Categoria:Informatica]]
 
Un programma scritto in linguaggio [[assembly]] o in un [[linguaggio di programmazione ad alto livello]] ([[codice sorgente]]), può essere eseguito solo [[compilatore|compilando]] il codice sorgente in [[codice oggetto]] ovvero traducendolo in [[linguaggio macchina]] che darà vita poi al [[programma eseguibile]], oppure servendosi di un [[interprete (informatica)|interprete]].
 
=== Indicazioni nell'interfaccia grafica ===
{{vedi anche|Monotasking|Multitasking|Multithreading|Esecuzione in background}}
[[File:Single-thread.png|thumb|upright=1.1|Un [[processore]] single [[thread (informatica)|thread]] esegue un solo thread per [[processo (informatica)|processo]]]]
 
Nei moderni [[sistema operativo|sistemi operativi]] [[multitasking]] le [[shell (informatica)|shell]] grafiche e testuali permettono all'utente di indicare un programma da eseguire (tramite menu, icone o specificandolo in una [[riga di comando]]); quando ciò avviene, la ''shell'' invoca una [[chiamata di sistema]] che crea un [[processo figlio]] ove sono caricati i dati e le istruzioni del programma da mandare in esecuzione. Ad esempio, nei sistemi operativi [[Unix]] e [[Unix-like]] la chiamata di sistema ''[[Fork (programmazione)|fork]]'' (ovvero "forchetta" o "biforcazione") crea un nuovo processo facendo una copia del processo chiamante; il nuovo processo può sostituire interamente i propri dati e le proprie istruzioni con quelle del programma invocando una delle chiamate di sistema della famiglia ''exec''.
 
Al termine della sua esecuzione, il processo chiede al sistema operativo di essere terminato tramite una chiamata di sistema (ad esempio ''exit'' nei sistemi Unix) la quale rende disponibile al [[processo padre]] il [[valore di uscita]] e provvede a liberare le risorse che venivano occupate dal processo. L'esecuzione di un processo può terminare anticipatamente, senza che esso chieda da solo di essere terminato, ad esempio quando l'utente o il sistema operativo gli invia un [[segnale (informatica)|segnale]] per richiederne la terminazione (tramite la chiamata di sistema ''[[kill (Unix)|kill]]'' nei sistemi Unix). Un particolare e importante tipo di esecuzione è l'[[esecuzione in background]].
 
== Tipologie ==
=== Da parte del sistema operativo ===
{{vedi anche|Scheduler|Processo (informatica)|Thread (informatica)}}
[[File:Scheduler.png|thumb|Schema di uno [[Scheduler]]]]
 
Nella maggior parte dei computer moderni, basati sull'[[architettura di von Neumann]], l'esecuzione di un [[programma eseguibile|programma binario]] prevede che, sotto l'attività e il controllo del [[sistema operativo]], il programma stesso sia inizialmente caricato in [[memoria primaria]] (es. [[RAM]]), tipicamente a partire da una [[periferica]] di [[memoria di massa]] (o [[memoria secondaria]]), come ad esempio un [[disco rigido]]. Viene quindi identificato il "punto d'ingresso" (''entry point'') del programma (cioè la prima istruzione), e il rispettivo [[indirizzo di memoria]] viene copiato in un [[registro (informatica)|registro]] del [[processore]] detto ''[[program counter]]''. A questo punto viene avviato nel processore, da parte dell'[[unità di controllo (informatica)|Unità di Controllo]], un ''[[ciclo di fetch-execute]]'' che ripetutamente preleva l'istruzione "puntata" dal ''program counter'', incrementa il ''program counter'' in modo da farlo puntare all'istruzione successiva, ed esegue l'istruzione caricata sequenzialmente nell'ordine.
 
Si può osservare che il ciclo ''fetch-execute'', per [[Default (informatica)|default]], comporta dunque l'esecuzione [[sequenza (informatica)|sequenziale]] delle istruzioni del programma. L'istruzione corrente, tuttavia, può modificare il ''program counter'': questa operazione corrisponde ad un'istruzione di salto ''[[struttura di controllo#Goto|goto]]'' o ad una di salto condizionato che è il meccanismo fondamentale su cui si basa l'[[implementare|implementazione]] delle [[struttura di controllo|strutture di controllo]] più evolute da parte di [[compilatore|compilatori]] e interpreti. Un programma in esecuzione è visto dal sistema operativo come un [[processo (informatica)|processo]] o insieme di processi, gestiti attraverso [[chiamata di sistema|chiamate di sistema]], e più programmi/processi possono essere eseguiti contemporaneamente attraverso l'eventuale [[multitasking]] offerto dal sistema operativo stesso e gestito dallo [[scheduler]].
 
=== Da parte dell'hardware ===
{{vedi anche|Ciclo del processore}}
[[File:CicloDelProcessore.gif|thumb|[[Ciclo del processore]] (fetch-execute) dopo la fase iniziale di [[boot]]]]
 
Un programma scritto direttamente o convertito in linguaggio macchina può essere eseguito direttamente da un computer, inteso come [[hardware]]. L'esecuzione di codice da parte di una macchina hardware nel [[ciclo di fetch-execute]] è possibile in virtù della capacità del processore di eseguire una serie di istruzioni base ([[instruction set]]), sulla quale il programma è mappato/tradotto a livello di linguaggio macchina, grazie ai [[circuito elettronico|circuiti elettronici]] di base ([[circuito integrato|circuiti integrati]]) che compongono il processore stesso. Dal punto di vista utente, nei calcolatori moderni questo normalmente avviene grazie all'esercizio, gestione o controllo delle risorse hardware (processore, memoria, ecc...) operata dal [[sistema operativo]] che funge da [[piattaforma (informatica)|piattaforma]] software del sistema. L'unica eccezione si verifica al momento dell'accensione del computer, quando viene fatto il [[boot]] e viene eseguito il [[firmware]] che si occupa di testare l'elettronica e di caricare il sistema operativo. Una volta che il processo di boot ha passato il controllo al sistema operativo, nessun programma può essere eseguito direttamente dall'hardware.
 
Col tempo è divenuto raro che un programma sia adatto all'esecuzione ''diretta'' da parte di un [[computer]] inteso come solo [[hardware]]; di norma, esso richiede una [[macchina virtuale]] che comprende l'hardware del computer con l'aggiunta di uno o più livelli di software che contribuiscono a creare l'[[ambiente di esecuzione]] adatto per il programma stesso. Gli stessi [[programma eseguibile|programmi eseguibili]] richiedono di norma la presenza di un determinato [[sistema operativo]], di determinate [[libreria software|librerie]], e così via. Benché le linee generali del funzionamento di una macchina virtuale siano talvolta piuttosto simili a quelle descritte sopra per la macchina di von Neumann, in molti casi esse se ne discostano in maniera sostanziale, introducendo numerosi concetti non presenti in tale architettura (per esempio, lo stack dei [[record di attivazione]]). Si può dire che un linguaggio di programmazione è tanto più [[linguaggio di programmazione ad alto livello|ad alto livello]] quanto più la corrispondente macchina virtuale esibisce caratteristiche concettualmente distanti dai meccanismi fondamentali dell'architettura di von Neumann (o, in generale, dell'architettura hardware sottostante).
 
== Voci correlate ==
* [[Boss mode]]
* [[Ciclo del processore]]
* [[Codice oggetto]]
* [[Esecuzione in background]]
* [[File eseguibile]]
==* Contesto[[Flusso dell'di esecuzione ==]]
* [[Interprete (informatica)]]
* [[Esecuzione in background]]
* [[Linguaggio macchina]]
* [[Pipeline dati]]
* [[Programma (informatica)]]
* [[Processo (informatica)]]
* [[Run-time]]
* [[Scheduler]]
* [[Thread (informatica)]]
* [[Task manager]]
 
== Altri progetti ==
{{Interprogetto|wikt=esecuzione}}
 
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{FOLDOC|execution|execution}}
* {{Garzanti}}
 
{{Portale|informatica}}
 
[[Categoria:Terminologia informatica]]