A cikk anyaga az én .

Az utolsĂłban , MegĂgĂ©rtem, hogy megvizsgĂĄlom a ticker terhelĂ©sĂ©nek felmĂ©rĂ©sĂ©t Ă©s a mĂ©dia streamer tĂșlzott szĂĄmĂtĂĄsi terhelĂ©se elleni kĂŒzdelem mĂłdjait. De Ășgy döntöttem, hogy logikusabb lenne, ha kitĂ©rnĂ©k az adatmozgĂĄssal kapcsolatos kĂ©zmƱves szƱrĆk hibakeresĂ©sĂ©nek kĂ©rdĂ©seire, Ă©s csak ezutĂĄn foglalkoznĂ©k a teljesĂtmĂ©nyoptimalizĂĄlĂĄssal.
KĂ©zmƱves szƱrĆk hibakeresĂ©se
MiutĂĄn az elĆzĆ cikkben megnĂ©ztĂŒk az adatok mozgatĂĄsĂĄnak mechanizmusĂĄt a mĂ©dia streamerben, logikus lenne a benne rejlĆ veszĂ©lyekrĆl beszĂ©lni. Az âadatfolyamâ elv egyik jellemzĆje, hogy a halombĂłl az adatfolyam forrĂĄsĂĄnĂĄl elhelyezkedĆ szƱrĆkben foglaljĂĄk le a memĂłriĂĄt, Ă©s az ĂĄramlĂĄs vĂ©gĂ©n elhelyezett szƱrĆk felszabadĂtjĂĄk Ă©s visszajuttatjĂĄk a memĂłriĂĄt a kupacba. pĂĄlya. EzenkĂvĂŒl valahol a kettĆ között törtĂ©nhet Ășj adatok lĂ©trehozĂĄsa Ă©s megsemmisĂtĂ©se. A memĂłriafelszabadĂtĂĄst ĂĄltalĂĄban mĂĄs szƱrĆ hajtja vĂ©gre, mint az, amelyik lĂ©trehozta az adatblokkot.
A transzparens memĂłriafigyelĂ©s szempontjĂĄbĂłl cĂ©lszerƱ lenne, ha a szƱrĆ egy bemeneti blokk vĂ©telekor azt feldolgozĂĄs utĂĄn azonnal megsemmisĂtenĂ©, a memĂłria felszabadĂtĂĄsĂĄval, Ă©s egy Ășjonnan lĂ©trehozott blokkot adna ki kimeneti adatokkal. Ebben az esetben a szƱrĆ memĂłriaszivĂĄrgĂĄsa könnyen nyomon követhetĆ - ha az analizĂĄtor szivĂĄrgĂĄst Ă©szlel a szƱrĆben, akkor a következĆ szƱrĆ nem semmisĂti meg megfelelĆen a bejövĆ blokkokat, Ă©s hiba van benne. A nagy teljesĂtmĂ©ny fenntartĂĄsa szempontjĂĄbĂłl azonban ez az adatblokkokkal valĂł munkavĂ©gzĂ©s nem produktĂv â nagyszĂĄmĂș mƱvelethez vezet az adatblokkok memĂłriĂĄjĂĄnak lefoglalĂĄsĂĄra/felszabadĂtĂĄsĂĄra, hasznos kimenet nĂ©lkĂŒl.
Emiatt a mĂ©dia streamer szƱrĆk, hogy ne lassĂtsĂĄk az adatfeldolgozĂĄst, olyan funkciĂłkat hasznĂĄlnak, amelyek egyszerƱ mĂĄsolatokat kĂ©szĂtenek az ĂŒzenetek mĂĄsolĂĄsakor (az elĆzĆ cikkben beszĂ©ltĂŒnk rĂłluk). Ezek a funkciĂłk csak akkor hozzĂĄk lĂ©tre az ĂŒzenet fejlĂ©cĂ©nek Ășj pĂ©ldĂĄnyĂĄt, ha âcsatolnakâ hozzĂĄ egy adatblokkot a mĂĄsolandĂł ârĂ©giâ ĂŒzenetbĆl. Ennek eredmĂ©nyekĂ©nt egy adatblokkhoz kĂ©t fejlĂ©c kapcsolĂłdik, Ă©s az adatblokkban lĂ©vĆ referenciaszĂĄmlĂĄlĂł növekszik. De Ășgy fog kinĂ©zni, mint kĂ©t ĂŒzenet. Egy ilyen âszocializĂĄltâ adatblokknĂĄl több ĂŒzenet is lehet, pĂ©ldĂĄul az MS_TEE szƱrĆ egy tucat ilyen fĂ©nymĂĄsolatot generĂĄl egyszerre, elosztva azokat a kimenetei között. Ha a lĂĄnc összes szƱrĆje megfelelĆen mƱködik, a folyamat vĂ©gĂ©re ennek a referenciaszĂĄmlĂĄlĂłnak el kell Ă©rnie a nullĂĄt, Ă©s a memĂłriafelszabadĂtĂĄsi fĂŒggvĂ©ny meghĂvĂĄsra kerĂŒl: ms_free(). Ha a hĂvĂĄs nem törtĂ©nik meg, akkor ez a memĂłriadarab többĂ© nem kerĂŒl vissza a kupacba, azaz. "szivĂĄrogni fog". A könnyƱ mĂĄsolatok hasznĂĄlatĂĄnak ĂĄra annak a kĂ©pessĂ©gĂ©nek elvesztĂ©se, hogy könnyen megĂĄllapĂthatĂł legyen (mint a normĂĄl mĂĄsolatok esetĂ©ben), hogy melyik grafikonszƱrĆ szivĂĄrog ki a memĂłriĂĄbĂłl.
Mivel a mĂ©dia streamer fejlesztĆi felelĆsek a natĂv szƱrĆk memĂłriaszivĂĄrgĂĄsĂĄnak megtalĂĄlĂĄsĂĄĂ©rt, valĂłszĂnƱleg nem kell hibakeresĂ©st vĂ©geznie. A kĂ©zmƱves szƱrĆvel azonban sajĂĄt boldogsĂĄgod szöcske vagy, Ă©s a kĂłdodban lĂ©vĆ szivĂĄrgĂĄsok keresĂ©sĂ©vel töltött idĆ a pontossĂĄgodtĂłl fĂŒgg. A hibakeresĂ©si idĆ csökkentĂ©se Ă©rdekĂ©ben a szƱrĆk fejlesztĂ©se sorĂĄn figyelembe kell vennĂŒnk a szivĂĄrgĂĄsĂ©szlelĂ©si technikĂĄkat. Emellett elĆfordulhat, hogy a szivĂĄrgĂĄs csak akkor jelenik meg, ha a szƱrĆt egy valĂłs rendszerben alkalmazzĂĄk, ahol a âgyanĂșsĂtottakâ szĂĄma ĂłriĂĄsi Ă©s a hibakeresĂ©si idĆ korlĂĄtozott.
Hogyan nyilvĂĄnul meg a memĂłriazavar?
Logikus azt feltĂ©telezni, hogy a program kimenetĂ©ben felsĆ megmutatja az alkalmazĂĄs ĂĄltal elfoglalt memĂłria növekvĆ szĂĄzalĂ©kĂĄt.
A kĂŒlsĆ megnyilvĂĄnulĂĄs az lesz, hogy egy bizonyos ponton a rendszer lassan reagĂĄl az egĂ©r mozgĂĄsĂĄra, Ă©s lassan Ășjrarajzolja a kĂ©pernyĆt. Az is lehetsĂ©ges, hogy a rendszernaplĂł növekedni fog, Ă©s helyet foglal a merevlemezen. Ebben az esetben az alkalmazĂĄs furcsĂĄn kezd viselkedni, nem reagĂĄl a parancsokra, nem tud megnyitni egy fĂĄjlt stb.
A szivĂĄrgĂĄs Ă©szlelĂ©sĂ©hez memĂłriaanalizĂĄtort (a tovĂĄbbiakban analizĂĄtor) hasznĂĄlunk. Lehet, hogy valgrind (jĂł rĂłla) vagy beĂ©pĂtve a fordĂtĂłba gcc vagy bĂĄrmi mĂĄst. Ha az analizĂĄtor azt mutatja, hogy az egyik grafikonszƱrĆben szivĂĄrgĂĄs lĂ©p fel, akkor ez azt jelenti, hogy ideje alkalmazni az alĂĄbbiakban ismertetett mĂłdszerek valamelyikĂ©t.
HĂĄrom fenyĆ mĂłdszer
Ahogy fentebb emlĂtettĂŒk, memĂłriaszivĂĄrgĂĄs esetĂ©n az analizĂĄtor arra a szƱrĆre mutat, amely memĂłriafoglalĂĄst kĂ©rt a kupacbĂłl. De nem mutat rĂĄ arra a szƱrĆre, amelyik âelfelejtetteâ visszakĂŒldeni, ami valĂłjĂĄban a tettes. Ăgy az elemzĆ csak megerĆsĂtheti fĂ©lelmeinket, de nem jelzi annak gyökerĂ©t.
A ârosszâ szƱrĆ helyĂ©nek meghatĂĄrozĂĄsĂĄhoz a grafikonon csökkentheti a grafikont azon csomĂłpontok minimĂĄlis szĂĄmĂĄra, amelyeknĂ©l az analizĂĄtor mĂ©g mindig szivĂĄrgĂĄst Ă©szlel, Ă©s lokalizĂĄlja a problĂ©mĂĄs szƱrĆt a fennmaradĂł hĂĄrom fenyĆben.
ElĆfordulhat azonban, hogy a szƱrĆk szĂĄmĂĄnak csökkentĂ©sĂ©vel a grafikonon megzavarja a szƱrĆk Ă©s a rendszer mĂĄs elemei közötti interakciĂł normĂĄl menetĂ©t, Ă©s a szivĂĄrgĂĄs megszƱnik. Ebben az esetben teljes mĂ©retƱ grafikonnal kell dolgoznia, Ă©s az alĂĄbbiakban vĂĄzolt megközelĂtĂ©st kell alkalmaznia.
CsĂșszĂł szigetelĆ mĂłdszer
A bemutatĂĄs egyszerƱsĂtĂ©se Ă©rdekĂ©ben olyan grafikont fogunk hasznĂĄlni, amely egy szƱrĆlĂĄncbĂłl ĂĄll. Ć lĂĄthatĂł a kĂ©pen.
![]()
Egy normĂĄl grafikon, amelyen a kĂ©sz mĂ©dia streamer szƱrĆkkel egyĂŒtt nĂ©gy darab F1...F4 kĂ©zmƱves szƱrĆt hasznĂĄlnak, nĂ©gy kĂŒlönbözĆ tĂpusbĂłl, amelyeket Ăn mĂĄr rĂ©gen kĂ©szĂtett, Ă©s nincs kĂ©tsĂ©ge a helyessĂ©gĂŒkrĆl. TĂ©telezzĂŒk fel azonban, hogy közĂŒlĂŒk többnek memĂłriaszivĂĄrgĂĄsa van. Az analizĂĄtor figyelĂ©sĂ©re szolgĂĄlĂł programunkat futtatva a jelentĂ©sĂ©bĆl megtudjuk, hogy egy bizonyos szƱrĆ bizonyos mennyisĂ©gƱ memĂłriĂĄt kĂ©rt, Ă©s nem adta vissza a kupacba N szĂĄmĂș alkalommal. Könnyen kitalĂĄlhatja, hogy lesz egy hivatkozĂĄs az MS_VOID_SOURCE tĂpusĂș belsĆ szƱrĆfunkciĂłkra. Az Ć feladata, hogy emlĂ©ket vegyen a kupacbĂłl. MĂĄs szƱrĆknek vissza kell juttatniuk oda. Azok. Ă©szleljĂŒk a szivĂĄrgĂĄs tĂ©nyĂ©t.
Annak meghatĂĄrozĂĄsĂĄra, hogy a folyamat melyik szakaszĂĄn törtĂ©nt tĂ©tlensĂ©g, ami memĂłriaszivĂĄrgĂĄshoz vezetett, egy tovĂĄbbi szƱrĆ bevezetĂ©se javasolt, amely egyszerƱen ĂĄthelyezi az ĂŒzeneteket a bemenetrĆl a kimenetre, ugyanakkor lĂ©trehozza a bemeneti ĂŒzenet nem vilĂĄgos mĂĄsolatĂĄt. , hanem egy normĂĄl ânehĂ©zâ, majd teljesen törli a belĂ©pĂ©skor kapott ĂŒzenetet. Az ilyen szƱrĆt szigetelĆnek nevezzĂŒk. Ăgy gondoljuk, hogy mivel a szƱrĆ egyszerƱ, nincs benne szivĂĄrgĂĄs. Ăs mĂ©g egy pozitĂv tulajdonsĂĄg - ha hozzĂĄadjuk bĂĄrhovĂĄ a grafikonon, ez semmilyen mĂłdon nem befolyĂĄsolja az ĂĄramkör mƱködĂ©sĂ©t. A szƱrĆ-levĂĄlasztĂłt kör alakban ĂĄbrĂĄzoljuk kettĆs ĂĄramkörrel.
A levĂĄlasztĂłt közvetlenĂŒl a voidsource szƱrĆ utĂĄn kapcsoljuk be:
![]()
IsmĂ©t lefuttatjuk a programot az analizĂĄtorral, Ă©s azt lĂĄtjuk, hogy ezĂșttal az analizĂĄtor a szigetelĆt fogja hibĂĄztatni. VĂ©gĂŒl is Ć az, aki most adatblokkokat hoz lĂ©tre, amelyeket aztĂĄn egy ismeretlen gondatlan szƱrĆ (vagy szƱrĆk) elveszĂt. KövetkezĆ lĂ©pĂ©skĂ©nt mozgassa a szigetelĆt a lĂĄnc mentĂ©n jobbra, egy szƱrĆvel, Ă©s kezdje Ășjra az elemzĂ©st. TehĂĄt az izolĂĄtort lĂ©pĂ©srĆl lĂ©pĂ©sre jobbra mozgatva olyan helyzetet kapunk, hogy a következĆ analizĂĄtor jelentĂ©sben a âkiszivĂĄrgottâ memĂłriablokkok szĂĄma csökkenni fog. Ez azt jelenti, hogy ennĂ©l a lĂ©pĂ©snĂ©l a szigetelĆ közvetlenĂŒl a problĂ©mĂĄs szƱrĆ utĂĄn volt a lĂĄncban. Ha csak egy ârosszâ szƱrĆ volt, akkor a szivĂĄrgĂĄs teljesen eltƱnik. Ăgy lokalizĂĄltuk a problĂ©mĂĄs szƱrĆt (vagy egyet a több közĂŒl). A szƱrĆ âjavĂtĂĄsaâ utĂĄn folytathatjuk a levĂĄlasztĂł jobb oldali mozgatĂĄsĂĄt a lĂĄnc mentĂ©n, amĂg teljesen le nem kĂŒzdjĂŒk a memĂłriaszivĂĄrgĂĄst.
IzolĂĄtor szƱrĆ megvalĂłsĂtĂĄsa
Az izolĂĄtor megvalĂłsĂtĂĄsa Ășgy nĂ©z ki, mint egy normĂĄl szƱrĆ. FejlĂ©c fĂĄjl:
/* ЀаĐčĐ» iso_filter.h ĐпОŃĐ°ĐœĐžĐ” ĐžĐ·ĐŸĐ»ĐžŃŃŃŃĐ”ĐłĐŸ ŃОлŃŃŃа. */
#ifndef iso_filter_h
#define iso_filter_h
/* ĐĐ°ĐŽĐ°Đ”ĐŒ ĐžĐŽĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃ ŃОлŃŃŃа. */
#include <mediastreamer2/msfilter.h>
#define MY_ISO_FILTER_ID 1024
extern MSFilterDesc iso_filter_desc;
#endif
Maga a szƱrĆ:
/* ЀаĐčĐ» iso_filter.c ĐпОŃĐ°ĐœĐžĐ” ĐžĐ·ĐŸĐ»ĐžŃŃŃŃĐ”ĐłĐŸ ŃОлŃŃŃа. */
#include "iso_filter.h"
static void
iso_init (MSFilter * f)
{
}
static void
iso_uninit (MSFilter * f)
{
}
static void
iso_process (MSFilter * f)
{
mblk_t *im;
while ((im = ms_queue_get (f->inputs[0])) != NULL)
{
ms_queue_put (f->outputs[0], copymsg (im));
freemsg (im);
}
}
static MSFilterMethod iso_methods[] = {
{0, NULL}
};
MSFilterDesc iso_filter_desc = {
MY_ISO_FILTER_ID,
"iso_filter",
"A filter that reads from input and copy to its output.",
MS_FILTER_OTHER,
NULL,
1,
1,
iso_init,
NULL,
iso_process,
NULL,
iso_uninit,
iso_methods
};
MS_FILTER_DESC_EXPORT (iso_desc)
A memóriakezelési funkciók cseréjének módja
A finomabb kutatĂĄs Ă©rdekĂ©ben a mĂ©dia streamer lehetĆsĂ©get ad arra, hogy a memĂłriaelĂ©rĂ©si funkciĂłkat lecserĂ©lje a sajĂĄtjĂĄra, amely a fĆ munka mellett rögzĂti a âKi, hol Ă©s miĂ©rtâ feliratot. HĂĄrom funkciĂł cserĂ©lĆdik. Ez a következĆkĂ©ppen törtĂ©nik:
OrtpMemoryFunctions reserv;
OrtpMemoryFunctions my;
reserv.malloc_fun = ortp_malloc;
reserv.realloc_fun = ortp_realloc;
reserv.free_fun = ortp_free;
my.malloc_fun = &my_malloc;
my.realloc_fun = &my_realloc;
my.free_fun = &my_free;
ortp_set_memory_functions(&my);Ez a funkciĂł olyan esetekben segĂt, amikor az analizĂĄtor annyira lelassĂtja a szƱrĆk mƱködĂ©sĂ©t, hogy annak a rendszernek a mƱködĂ©se, amelybe ĂĄramkörĂŒnk Ă©pĂŒlt, megszakad. Ilyen helyzetben el kell hagynia az analizĂĄtort, Ă©s a memĂłriĂĄval valĂł munkavĂ©gzĂ©shez fĂŒggvĂ©nyek helyettesĂtĂ©sĂ©t kell hasznĂĄlnia.
MegvizsgĂĄltunk egy mƱveleti algoritmust egy egyszerƱ grĂĄfhoz, amely nem tartalmaz ĂĄgakat. De ez a megközelĂtĂ©s mĂĄs esetekre is alkalmazhatĂł, persze bonyolultabban, de az ötlet ugyanaz marad.
A következĆ cikkben megvizsgĂĄljuk a ticker terhelĂ©sĂ©nek becslĂ©sĂ©t Ă©s a mĂ©dia streamer tĂșlzott szĂĄmĂtĂĄsi terhelĂ©se elleni kĂŒzdelem mĂłdjait.
ForrĂĄs: will.com
