Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-10-2011, 11:44   #1
nico88desmo
Senior Member
 
Iscritto dal: Jul 2006
Messaggi: 1568
[C] Allocazione/Deallocazione memoria

Un saluto a tutti.

Avrei un dubbio sul funzionamento del seguente codice sorgente

Codice:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>

typedef struct _prova {
	long *c;
	char *s;
} prova;


int main() {
  char wait;
  
  printf("creo");
  scanf("%c",&wait);
  prova *p = malloc(sizeof(prova)*1000000);
  
  int i=0;
  for (; i<1000000; i++){
    p[i].c=malloc(sizeof(long));
    p[i].s=malloc(sizeof(char)*10);
  }
  
  printf("creato");
  scanf("%c",&wait);
  for (i = 0; i<1000000; i++){
		free(p[i].c);
		free(p[i].s);
  }
  free(p);
  printf("eliminato");
  scanf("%c",&wait);
}
In pratica creo un vettore di elementi di tipo prova, alloco ciascun elemento e infine li dealloco tutti.

Il problema e' il seguente: guardando il processo associato al sorgente nel task manager, nonostante l'eliminazione di tutto il vettore, vedo che al processo e' associata parecchia memoria (come se la free non funzionasse);
Qualcuno saprebbe spiegarmi il motivo?

Grazie
nico88desmo è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2011, 17:16   #2
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
Il problema e' il seguente: guardando il processo associato al sorgente nel task manager, nonostante l'eliminazione di tutto il vettore, vedo che al processo e' associata parecchia memoria (come se la free non funzionasse);
Qualcuno saprebbe spiegarmi il motivo?

Grazie[/quote]

prova con la fflush()
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2011, 17:43   #3
Freaxxx
Senior Member
 
L'Avatar di Freaxxx
 
Iscritto dal: Dec 2006
Messaggi: 3808
provato con Codeblocks 10.05 sotto Windows 7 professional 32 bit ed il processo occupa pochi kb dopo il messaggio di eliminazione del vettore.
Freaxxx è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2011, 17:53   #4
Floris
Senior Member
 
L'Avatar di Floris
 
Iscritto dal: Jan 2007
Messaggi: 2267
Se Freaxxx ha ragione, allora può essere che Windows non liberi le pagine occupate dal processo ma non più utilizzate.
__________________
Concluso con:...
Floris è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2011, 17:57   #5
Freaxxx
Senior Member
 
L'Avatar di Freaxxx
 
Iscritto dal: Dec 2006
Messaggi: 3808
per inciso l'ho provato su una macchina con AMD C50, ovvero una macchina con CPU e Northbridge ( e GPU ) integrati in un solo package, quindi il controller di memoria è integrato nel DIE della CPU, i tempi di accesso in memoria sono particolarmente brevi con queste nuove APU/CPU, magari tu lo provi su una piattaforma con controller di memoria esterno e montato sulla scheda madre.
Freaxxx è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2011, 18:05   #6
demos88
Senior Member
 
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
Quote:
Originariamente inviato da Freaxxx Guarda i messaggi
per inciso l'ho provato su una macchina con AMD C50, ovvero una macchina con CPU e Northbridge ( e GPU ) integrati in un solo package, quindi il controller di memoria è integrato nel DIE della CPU, i tempi di accesso in memoria sono particolarmente brevi con queste nuove APU/CPU, magari tu lo provi su una piattaforma con controller di memoria esterno e montato sulla scheda madre.
si parlerebbe cmq di una differenza dell'ordine dei nanosecondi...
Penso dipenda dal sistema operativo e dal modo in cui alloca (e dealloca) memoria ai programmi. Ma potrebbe dipendere anche dall'ambiente di sviluppo...
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2011, 18:08   #7
Freaxxx
Senior Member
 
L'Avatar di Freaxxx
 
Iscritto dal: Dec 2006
Messaggi: 3808
Quote:
Originariamente inviato da demos88 Guarda i messaggi
si parlerebbe cmq di una differenza dell'ordine dei nanosecondi...
Penso dipenda dal sistema operativo e dal modo in cui alloca (e dealloca) memoria ai programmi. Ma potrebbe dipendere anche dall'ambiente di sviluppo...
in linea teorica si, ma assumendo per vero il fatto che passi per la scheda madre, c'è anche da includere come possibili variabili le prestazioni dei driver del chipset della scheda madre.
Freaxxx è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2011, 18:26   #8
demos88
Senior Member
 
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
Quote:
Originariamente inviato da Freaxxx Guarda i messaggi
in linea teorica si, ma assumendo per vero il fatto che passi per la scheda madre, c'è anche da includere come possibili variabili le prestazioni dei driver del chipset della scheda madre.
capisco, ma di fatto la gestione della memoria è affidata al kernel dell'OS.
L'hardware è a disposizione diretta del sistema operativo, tratta i dati per quel che sono e non si preoccupa di altro.
Quello che ti dice "gli indirizzi di memoria da 0x00000 a 0x000FF sono allocati" non è l'hardware, ma l'OS. Se l'OS invia un comando di dealloc, quell'area di memoria verrà in ogni caso liberata con una serie di istruzioni che la macchina esegue ad occhi chiusi e l'OS considera quell'area di memoria vuota e quindi non allocata, e anche se l'hardware non l'avesse liberata (penso che tra l'altro l'hardware non faccia niente) non importa, sarà marcata libera.
Le istruzioni di deallocazione sono corrette, probabilmente l'ambiente di sviluppo le tiene allocate perchè magari è in qualche particolare forma di debug.
Quello che voglio dire è che driver, hardware, bios ecc... possono certamente influenzare la velocità di allocazione e deallocazione, ma deallocare 22mB (se ho fatto i conti giusti con puntatori da 32bit) è una operazione da qualche microsecondo pure per un processore 486...
Dipende da come l'ambiente di sviluppo (se il programma viene lanciato da lì) o l'OS decide di gestire l'allocazione (gestione che tra l'altro è, e deve essere, totalmente trasparente al programma e all'utente).
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight

Ultima modifica di demos88 : 22-10-2011 alle 18:30.
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2011, 18:27   #9
demos88
Senior Member
 
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
ops doppio
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2011, 19:12   #10
Freaxxx
Senior Member
 
L'Avatar di Freaxxx
 
Iscritto dal: Dec 2006
Messaggi: 3808
Quote:
Originariamente inviato da demos88 Guarda i messaggi
capisco, ma di fatto la gestione della memoria è affidata al kernel dell'OS.
L'hardware è a disposizione diretta del sistema operativo, tratta i dati per quel che sono e non si preoccupa di altro.
Quello che ti dice "gli indirizzi di memoria da 0x00000 a 0x000FF sono allocati" non è l'hardware, ma l'OS. Se l'OS invia un comando di dealloc, quell'area di memoria verrà in ogni caso liberata con una serie di istruzioni che la macchina esegue ad occhi chiusi e l'OS considera quell'area di memoria vuota e quindi non allocata, e anche se l'hardware non l'avesse liberata (penso che tra l'altro l'hardware non faccia niente) non importa, sarà marcata libera.
Le istruzioni di deallocazione sono corrette, probabilmente l'ambiente di sviluppo le tiene allocate perchè magari è in qualche particolare forma di debug.
Quello che voglio dire è che driver, hardware, bios ecc... possono certamente influenzare la velocità di allocazione e deallocazione, ma deallocare 22mB (se ho fatto i conti giusti con puntatori da 32bit) è una operazione da qualche microsecondo pure per un processore 486...
Dipende da come l'ambiente di sviluppo (se il programma viene lanciato da lì) o l'OS decide di gestire l'allocazione (gestione che tra l'altro è, e deve essere, totalmente trasparente al programma e all'utente).
perché, i driver che cosa sono se non moduli software per il kernel alla fine della fiera? specialmente quelli critici come quelli per il chipset; il tuo computer non fa altro che eseguire istruzioni, è una macchina stupida, ha di buono che è veloce e rispetta una sequenza operativa, ma da come scrivi sembra quasi che tu possa demandare tutto al kernel tanto da quel punto in poi sarà tutto chiaro, pulito e sicuro: ma anche no.

per quanto riguarda le varie modalità debug e i motivi per i quali non liberare subito una porzione di memoria non mi esprimo perché sono ovviamente tante le possibilità; magari prova anche tu con codeblocks.
Freaxxx è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2011, 19:54   #11
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
se si programma sotto windows questi problemi di memoria si verificano spesso.
sotto linux non ho mai visto questi problemi. Il codice mi sembra giusto, e quindi se lo testi su una macchina linux dovrebbe filare tutto liscio.
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2011, 20:26   #12
demos88
Senior Member
 
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
Quote:
Originariamente inviato da Freaxxx Guarda i messaggi
perché, i driver che cosa sono se non moduli software per il kernel alla fine della fiera? specialmente quelli critici come quelli per il chipset; il tuo computer non fa altro che eseguire istruzioni, è una macchina stupida, ha di buono che è veloce e rispetta una sequenza operativa, ma da come scrivi sembra quasi che tu possa demandare tutto al kernel tanto da quel punto in poi sarà tutto chiaro, pulito e sicuro: ma anche no.

per quanto riguarda le varie modalità debug e i motivi per i quali non liberare subito una porzione di memoria non mi esprimo perché sono ovviamente tante le possibilità; magari prova anche tu con codeblocks.
Io posso solo basarmi su quello che ho studiato nei vari corsi universitari e conoscenze personali, e francamente se la MMU hardware arrancasse sarebbe molto grave xD
Penso che sia un qualche passaggio nella gestione ad alto livello (software) della memoria, probabilmente una scelta implementativa, ma concordo che stiamo parlando del sesso degli angeli, ci sono troppe variabili da considerare
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2011, 14:19   #13
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Freaxxx Guarda i messaggi
perché, i driver che cosa sono se non moduli software per il kernel alla fine della fiera? specialmente quelli critici come quelli per il chipset; il tuo computer non fa altro che eseguire istruzioni, è una macchina stupida, ha di buono che è veloce e rispetta una sequenza operativa, ma da come scrivi sembra quasi che tu possa demandare tutto al kernel tanto da quel punto in poi sarà tutto chiaro, pulito e sicuro: ma anche no.

per quanto riguarda le varie modalità debug e i motivi per i quali non liberare subito una porzione di memoria non mi esprimo perché sono ovviamente tante le possibilità; magari prova anche tu con codeblocks.
L'hardware non ha il concetto di memoria libera od occupata, tantomento il driver del chipset. La memoria che vedi come occupata e' la memoria che il SO ha assegnato al processo. Tieni presente inoltre che tu non vai a prendere la memoria direttamente dal kernel, malloc/free non sono chiamate di sistema ma di libreria. Queste non si limitano ad allocare/liberare memoria, ma fanno diversi giri per cose come cercar di minimizzare la frammentazione, ad esempio cercando di riciclare memoria che e' stata liberata.
Se c'e' da cercare una causa per la memoria che non viene liberata, i primi indiziati sono proprio malloc/free (modalita' di debug, flag di compilazione etc.)
Detto questo su VS2010 e Windows 7 funziona regolarmente. Con che Compilatore/SO ti accade ?
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2011, 23:16   #14
nico88desmo
Senior Member
 
Iscritto dal: Jul 2006
Messaggi: 1568
Ringrazio tutti per le diverse risposte.
Quindi il codice sorgente è corretto.

Non ho specificato, sto sviluppando un progetto in C sotto ambiente unix, più precisamente:
ubuntu 10.04
kernel 2.6.35-30-generic

L'hardware su cui sto provando è il seguente:
processore: core i5-460m
memoria: 4gb ram

Non ho ancora provato a fare la fflush, ora vedo se mi risolve questo problema.

Ad ogni modo, potrebbe essere che il processo libera la memoria, tuttavia se la "tiene" riservata per future allocazioni??

Ringrazio tutti
nico88desmo è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2011, 11:48   #15
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da nico88desmo Guarda i messaggi
Ad ogni modo, potrebbe essere che il processo libera la memoria, tuttavia se la "tiene" riservata per future allocazioni??
Si', e' quello che dicevo precedentemente.
Il riuso della memoria allocata e poi liberata e' una delle tecniche utilizzate da una malloc per migliorare le performance.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
AMD Radeon RX 9060 XT: staccato (di molt...
WhatsApp introduce la condivisione della...
iPad con chip A16 a 339€: l'11'' con 128...
OpenClaw spaventa le aziende: perch&eacu...
Samsung T7 2TB crolla su Amazon: SSD por...
Tutte le JBL a prezzi da non perdere su ...
PS6 e RDNA 5: la GPU sarà 'quasi ...
Meta cambia rotta sul metaverso: Horizon...
Zeekr debutta in Italia con Jameel Motor...
Robotaxi sotto controllo remoto: Waymo a...
Ubisoft continua i tagli: 40 licenziamen...
PromptSpy: il primo malware Android che ...
Navigare all'estero con costi accessibil...
Boom del fotovoltaico in Africa: +54% in...
Cisco mette l'IA agentica al centro con ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:13.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v