Kezdőlap › Fórumok › Programozás › miért zabálom a memóriát?
- This topic has 21 hozzászólás, 6 résztvevő, and was last updated 18 years, 4 months telt el by
lacix.
-
SzerzőBejegyzés
-
2007-01-25-22:20 #2088780
Most leállítottam mind a négy programot – a buffered és cached nem változott!?
2007-01-25-22:31 #2088781tovis wrote:a buffered és cached nem változott!?Mondod! vagy kérdezed?
2007-01-25-22:51 #2088782Állítom és nem értem!
2007-01-26-14:40 #2088783Ennyire éhes vagy?
Most kipróbáltam egy régi sd-ramon, de pocsék! :))))„fájlba nyomom – amolyan log fájl”, „9600 Baud -on /dev/ttySx”
Innentől magyarázni kell, hogy mért nő a lemez-gyorsító, meg egyéb tárad?
Majd, ha elfogy a memória nem nő tovább.
Ha újabb programnak kell a hely, akkor majd csökkenni fog.
Ha meg már nem lesz gyorstár a memóriában, csak program, akkor valamelyik meg ki lesz lőve. :))))2007-01-26-23:48 #2088784Közben az LQ -n felhívták figyelmemet hogy ennek így kell működnie, mivel a Linux kernel (a windows -al ellentétben) sokat cachel és bufferel, így gyorsítván a működést, ráadásul ezeket a buffereket sokáig nem szabadítja fel, csak ha muszáj. Ráadásul a cache arányt be lehet állítani:
#echo 30 > /proc/sys/vm/swappiness
ha jól idézem. A szám 0 … 100 ig tejedhet, a nullánáél mindent swappel a 100 meg mindent lefoglal cache -nek.
Szóval nincs hiba sem az én programocskáimban, sem a kernellel nincs semmi baj – így kell működnie;o)2007-02-18-10:18 #2088785Azért még lehet olyan disznóság is hogy a programodban rendszeresen lefoglalsz és később fölszabadítasz egy kis memóriaterületet, de a fölszabadítás néha-néha elmarad. Ezt nevezik memóriaszivárgásnak. Oka egyértelműen programozási hiba. Egyszer én is jártam így egy démonként futó programmal. Egy ideig néztem a forráskódot mire megtaláltam a hibát.
2007-02-18-10:51 #2088786A programocskáim fő tulajdonsága, hogy nem foglal dinamikusan memóriát, az elején – setup/init részeként foglalok némi memóriát – azután már csak stacket használok végig!
Öreg róka vagyok – akkor programoztam DOS -t windows -t maikor még a dinamikus nmemória foglalás nem volt klorrekt. Az NT4.0 és csatlós nem profi rendszerek mint a win9x folyamatosan, operációs rendszer szinten el’szták az erőforrás kezelést! – nem csak a memóriát.2007-02-18-18:42 #2088787Hello!
Nekem is van egy memóriás kérdésem. (Más jellegű, de talán elfér itt.)
Az alábbi két kis programvázlat gcc-ben ekvivalens?
void fgv_1(Típus *x);
Típus* fgv_2();
void típus_felszabadít(Típus *x);1.
fgv_1( fgv_2() );2.
Típus *x = fgv_2();
fgv_1(x);
típus_felszabadít(x);Tehát, ha fgv_1 argumentumában megadok egy fgv_2-t, ami létrehoz vmit a memóriában, akkor az ami létrejött az fgv_1 lefutása után autamatikusan felszabadul?
A 2. megoldás természetesen jól működik, csak az sokkal kényelmetlenebb.Üdv.
L a c i2007-02-18-19:18 #2088788fgv_1( fgv_2() );
Típus *x = fgv_2();
fgv_1(x);Ez ugye annyiban különbözik, hogy a 2. 32 bittel több helyet foglal.
(De ezek, csak címeknek az átadásai, tehát nincs mit felszabadítani. Az eredeti függvényed, viszont statikus, tehát nem fog felszabadulni.)2007-02-18-19:29 #2088789Az ok, hogy csak címek átadása történik, de a Típus* fgv_2() létrehoz dinamikusan pl. malloc-kal egy Típus struktúrát és azt adja vissza. Az nem viláogos, hogy ha így használom:
fgv_1( fgv_2() )
akkor a fgv_2() által foglalt terület fel fog-e szabadulni. -
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz