Next revision | Previous revision |
appunti3s:code_data_bss [2018/04/25 07:55] – external edit 127.0.0.1 | appunti3s:code_data_bss [2020/06/08 22:19] (current) – external edit 127.0.0.1 |
---|
| Nota: questa pagina è stata ;;aggiornata;;: vedere [[appunti3s:gestione_della_memoria]] |
| |
| =====Immagine del processo===== |
| Un programma in esecuzione viene chiamato //processo//. |
| Il file eseguibile, prima dell'esecuzione, viene trasferito dalla memoria di massa alla memoria centrale. |
| Nella memoria centrale il file eseguibile è diviso in sezioni (section): text section, data setion e stack section. |
| Durante il trasferimento, le sezioni vengono scomposte in segmenti(segment) (anche non contigui tra loro) |
| |
| |
| {{:appunti3s:stack.png?|}} |
| ==== Segment ==== |
| Un segmento rappresenta un'area di memoria contigua pari a 64 kB |
| |
| ==== Text segment (Code segment) ==== |
| Area che contiene le istruzioni eseguibili e le costanti. Durante l'esecuzione del programma l'area è di dimensione fissa e di sola lettura. |
| |
| ==== Data segment ==== |
| area che contiene le variabili cosiddette //globali// e quelle //statiche// che sono state inizializzate dal programmatore. È di dimensione costante nel tempo, ma _non_ è di sola lettura, poiché è possibile modificare i valori delle variabili in runtime. Le variabili in quest'area sono visibili a tutte le funzioni per tutta la durata del programma. |
| |
| ====BBS segment ==== |
| (Block Started by Symbol) area che contiene le variabili cosiddette //globali// e quelle //statiche// che _non_ sono inizializzate dal programmatore e che quindi vengono inizializzate a zero dal compilatore. Le altre caratteristiche sono identiche a quelle del Data Segment (vedere l'inizializzazione delle variabili...) |
| |
| ==== Heap segment ==== |
| Significa letteralmente //mucchio//. È detta anche //memoria dinamica// perché all'interno di questa area (di dimensione non fissa) lo spazio viene riservato e liberato //dinamicamente//, sotto il controllo del programmatore, cioè, a seconda delle richieste e delle istruzioni presenti nel programma, durante l'esecuzione. Per questi compiti il programmatore usa l'operatore //new// e l'operatore //delete//. |
| |
| ==== Stack ==== |
| Significa letteralmente //pila//. Come in una pila, gli elementi che compongono lo stack vengono riservati e liberati in ordine inverso. È detta anche //memoria automatica// perché la gestione è automatica, sotto il controllo del sistema operativo. Lo stack contiene le variabili cosiddette //locali// e i //parametri// dichiarati nell'ambito dell'esecuzione di una funzione. Le variabili presenti in questa area sono visibili solo alle rispettive funzioni e solo per l'intervallo di tempo necessario alla funzione. Ogni elemento viene liberato automaticamente al termine della funzione. |
| |
| ==== Confronto ==== |
| |
| Una variabile //locale// (nello stack) ha una vita pari a quella del periodo di esecuzione della funzione. Una variabile allocata dinamicamente (nell'heap) con l'operatore //new// può avere una vita anche più lunga, perché non viene distrutta fino a che non si usa l'operatore //delete//. Può durare di più ma anche di meno... |
| |
| Quando non interviene il programmatore: |
| * Le variabili globali, statiche e gli oggetti sono inizializzati automaticamente a zero. |
| * Le variabili locali e quelle dell'heap (allocate con //new//) rimangono non inizializzate. |
| |
| |