A cikk anyaga az én .

A mĂșltban , megĂgĂ©rtem, hogy foglalkozom a terhelĂ©sĂ©rtĂ©kelĂ©s kĂ©rdĂ©sĂ©vel a ticker esetĂ©ben, Ă©s a tĂșlzott szĂĄmĂtĂĄsi terhelĂ©s kezelĂ©sĂ©nek mĂłdjaival a mĂ©diastreamerben. De Ășgy döntöttem, logikusabb lesz elĆször a kraft szƱrĆk hibakeresĂ©si kĂ©rdĂ©seit bemutatni, amelyek az adatok ĂĄthelyezĂ©sĂ©vel kapcsolatosak, Ă©s csak ezt követĆen foglalkozni a teljesĂtmĂ©nyoptimalizĂĄlĂĄs kĂ©rdĂ©seivel.
A kraft szƱrĆk hibakeresĂ©se
MiutĂĄn a korĂĄbbi cikkben ĂĄttekintettĂŒk az adatok ĂĄthelyezĂ©sĂ©nek mechanizmusĂĄt a mĂ©diastreamerben, logikus lenne beszĂ©lni az abban rejlĆ veszĂ©lyekrĆl. Az "adata ĂĄramlĂĄsa" elv egyik sajĂĄtossĂĄga, hogy a memĂłria kiemelĂ©se a halombĂłl azokban a szƱrĆkben törtĂ©nik, amelyek az adatfolyam kezdetĂ©n helyezkednek el, mĂg a memĂłria felszabadĂtĂĄsa, vissza a halomba, mĂĄr a folyamat vĂ©gĂ©n talĂĄlhatĂł szƱrĆk ĂĄltal törtĂ©nik. Ezen kĂvĂŒl az Ășj adatok lĂ©trehozĂĄsa Ă©s megsemmisĂtĂ©se valahol a köztes pontokban is elĆfordulhat. ĂltalĂĄnos esetben a memĂłria felszabadĂtĂĄsĂĄt nem az a szƱrĆ vĂ©gzi, amelyik lĂ©trehozta az adatblokkot.
A memĂłria ĂĄtlĂĄthatĂł nyomon követĂ©se szempontjĂĄbĂłl Ă©sszerƱ lenne, ha a szƱrĆ, miutĂĄn megkapta a bemeneti blokkjĂĄt, azonnal megsemmisĂtenĂ© azt a feldolgozĂĄs utĂĄn a memĂłria felszabadĂtĂĄsĂĄval, Ă©s a kimeneten egy Ășjonnan lĂ©trehozott blokkot helyezne el a kimeneti adatokkal. Ebben az esetben a memĂłria szivĂĄrgĂĄsa a szƱrĆben könnyen nyomon követhetĆ lenne â ha az elemzĆ szivĂĄrgĂĄst Ă©szlel a szƱrĆben, akkor a következĆ szƱrĆ nem semmisĂti meg megfelelĆen a bejövĆ blokkokat, ami hiba lenne benne. De a magas teljesĂtmĂ©ny fenntartĂĄsa szempontjĂĄbĂłl ez a megközelĂtĂ©s a dolgokkal valĂł munkĂĄra nem produktĂv â ez nagyszĂĄmĂș mƱvelethez vezet a memĂłria kiemelĂ©sĂ©re/felszabadĂtĂĄsĂĄra az adatblokkok szĂĄmĂĄra, bĂĄrmilyen hasznos kimenet nĂ©lkĂŒl.
EzĂ©rt a mĂ©diastreamer szƱrĆk, hogy ne lassĂtsĂĄk az adatok feldolgozĂĄsĂĄt, ĂŒzenetek mĂĄsolĂĄsakor olyan funkciĂłkat hasznĂĄlnak, amelyek könnyƱ mĂĄsolatokat hoznak lĂ©tre (errĆl az elĆzĆ cikkĂŒnkben Ărtunk). Ezek a funkciĂłk csak Ășj ĂŒzenetfejlĂ©c pĂ©ldĂĄnyt hoznak lĂ©tre, "rögzĂtve" hozzĂĄ a mĂĄsolt "rĂ©gi" ĂŒzenet adatblokkot. Ennek eredmĂ©nyekĂ©nt egy adatblokkhoz kĂ©t fejlĂ©c kapcsolĂłdik, Ă©s a hivatkozĂĄsi szĂĄmlĂĄlĂł az adatblokkban növekszik. De ez Ășgy fog kinĂ©zni, mint kĂ©t ĂŒzenet. Az ilyen "megosztott" adatblokkal rendelkezĆ ĂŒzenetek szĂĄma lehet több is, pĂ©ldĂĄul az MS_TEE szƱrĆ egyszerre több ilyen könnyƱ mĂĄsolatot generĂĄl, amelyeket a kimenetei között oszt el. Minden szƱrĆ megfelelĆ mƱködĂ©se mellett a csĆ vĂ©gĂ©n ennek a hivatkozĂĄsi szĂĄmlĂĄlĂłnak nullĂĄra kell csökkennie, amelyet a memĂłriafelszabadĂtĂł funkciĂł hĂv meg: ms_free(). Ha a hĂvĂĄs nem törtĂ©nik meg, akkor ez a memĂłria mĂĄr nem tĂ©rhet vissza a halomba, azaz "szivĂĄrogni" fog. A könnyƱ mĂĄsolatok hasznĂĄlatĂĄnak ĂĄra az a lehetĆsĂ©g elvesztĂ©se, hogy könnyen megĂĄllapĂtsuk (ahogy az normĂĄl mĂĄsolatokkal lett volna), hogy mely szƱrĆ grafikonban szivĂĄrog a memĂłria.
Mivel a memĂłria szivĂĄrgĂĄsok keresĂ©sĂ©nek felelĆssĂ©ge a "natĂv" szƱrĆkben a mĂ©diastreamer fejlesztĆinĂ©l van, valĂłszĂnƱleg nem kell Ćket hibakeresni. De a sajĂĄt kĂ©szĂtĂ©sƱ szƱrĆddel â te vagy a sajĂĄt boldogsĂĄgod kovĂĄcsa, Ă©s a te precizitĂĄsodtĂłl fĂŒgg, mennyi idĆt töltesz el a hibĂĄk keresĂ©sĂ©vel a kĂłdodban. Az idĆd letartĂłztatĂĄsĂĄnak csökkentĂ©se Ă©rdekĂ©ben meg kell vizsgĂĄlnunk a memĂłria szivĂĄrgĂĄsok lokalizĂĄlĂĄsĂĄnak mĂłdszereit a szƱrĆk fejlesztĂ©sekor. EzenkĂvĂŒl elĆfordulhat, hogy a szivĂĄrgĂĄs csak akkor nyilvĂĄnul meg, amikor a szƱrĆt egy valĂłs rendszerben alkalmazzĂĄk, ahol a "gyanĂșsĂtottak" szĂĄma hatalmas lehet, Ă©s a hibakeresĂ©sre szĂĄnt idĆ korlĂĄtozott.
Hogyan mutatkozik meg a memĂłria szivĂĄrgĂĄs?
Logikus feltĂ©telezni, hogy a program kimenetĂ©ben top a memĂłria folyamatosan növekvĆ szĂĄzalĂ©ka fog megjelenni, amelyet az alkalmazĂĄsod foglal el.
A kĂŒlsĆ megnyilvĂĄnulĂĄs abban ĂĄll majd, hogy a rendszer egy idĆ utĂĄn lassan reagĂĄl a mouse mozgĂĄsĂĄra, lassan frissĂti a kĂ©pernyĆt. ElĆfordulhat, hogy a rendszer naplĂłja is nĆni fog, ezzel helyet foglalva a merevlemezen. Eközben az alkalmazĂĄsod furcsa mĂłdon fog viselkedni, nem reagĂĄl a parancsokra, nem tud fĂĄjlt megnyitni, stb.
A szivĂĄrgĂĄs megĂĄllapĂtĂĄsĂĄhoz memĂłriaelemzĆt (a tovĂĄbbiakban: elemzĆ) fogunk hasznĂĄlni. Ez lehet Valgrind (jĂł errĆl) vagy a fordĂtĂłba beĂ©pĂtett gcc vagy valami mĂĄs. Ha az elemzĆ azt mutatja, hogy a szivĂĄrgĂĄs egy grafikon egyik szƱrĆjĂ©ben törtĂ©nik, az azt jelenti, hogy itt az ideje alkalmazni az alĂĄbb leĂrt mĂłdszerek egyikĂ©t.
A hĂĄrom szƱrĆ mĂłdszere
Ahogy korĂĄbban emlĂtve lett, szivĂĄrgĂĄs esetĂ©n az elemzĆ arra a szƱrĆre mutat, amely a memĂłriĂĄt igĂ©nyelte a halombĂłl. De nem fogja megmutatni azt a szƱrĆt, amely "elfelejtette" visszaadni, amely valĂłjĂĄban a hibĂĄs. Ăgy az elemzĆ csak megerĆsĂtheti a gyanĂșnkat, de nem mutatja meg annak gyökerĂ©t.
A "rossz" szƱrĆ helyĂ©nek meghatĂĄrozĂĄsĂĄhoz a grafikon minimalizĂĄlĂĄsĂĄnak lehetsĂ©ges ĂștjĂĄt követhetjĂŒk, hogy a lehetĆ legkisebb csomĂłpontoknĂĄl az elemzĆ mĂ©g mindig Ă©szleli a szivĂĄrgĂĄst, Ă©s a megmaradt hĂĄrom szƱrĆn belĂŒl lokalizĂĄljuk a problĂ©mĂĄs szƱrĆt.
De elĆfordulhat, hogy a grafikon szƱrĆinek szĂĄmĂĄnak csökkentĂ©sekor megszakĂtod a szƱrĆk normĂĄl kölcsönhatĂĄsĂĄt a rendszered többi elemĂ©vel, Ă©s a szivĂĄrgĂĄs mĂĄr nem mutatkozik meg. Ebben az esetben a teljes mĂ©retƱ grafikonon kell dolgozni, Ă©s az alĂĄbb ismertetett megközelĂtĂ©st kell alkalmazni.
A mozgĂł szigetelĆ mĂłdszere
A magyarĂĄzat egyszerƱsĂtĂ©se Ă©rdekĂ©ben egy olyan grafikonnal fogunk dolgozni, amely egy szƱrĆlĂĄncbĂłl ĂĄll. Ez a rajzon lĂĄthatĂł.
![]()
Egy normĂĄl grĂĄf, amelyben a mĂ©diastreamer kĂ©sz szƱrĆi mellett nĂ©gy kĂ©zmƱves szƱrĆ van F1âŠF4, nĂ©gy kĂŒlönbözĆ tĂpustĂłl, amelyeket rĂ©gen kĂ©szĂtettĂ©l, Ă©s biztos vagy a helyessĂ©gĂŒkben. MindazonĂĄltal feltĂ©telezzĂŒk, hogy ezek közĂŒl nĂ©hĂĄnyban memĂłria szivĂĄrgĂĄs van. A programunk futtatĂĄsĂĄval, amely a figyelĆ elemzĆt hasznĂĄlja, az abbĂłl szĂĄrmazĂł jelentĂ©sbĆl megtudjuk, hogy egy bizonyos szƱrĆ kĂ©rt egy bizonyos mennyisĂ©gƱ memĂłriĂĄt, Ă©s azt nem adta vissza a heap-be N darabszor. Könnyen kitalĂĄlhatĂł, hogy a hivatkozĂĄs a MS_VOID_SOURCE tĂpusĂș szƱrĆ belsĆ funkciĂłira mutat. Ennek feladata az, hogy memĂłriĂĄt vegyen el a heap-bĆl. Azt mĂĄs szƱrĆknek kell visszaadniuk. TehĂĄt Ă©szleljĂŒk a szivĂĄrgĂĄs tĂ©nyĂ©t.
Annak meghatĂĄrozĂĄsĂĄra, hogy a gyĂĄrtĂłsor mely szakaszĂĄn törtĂ©nt az a tĂ©tlensĂ©g, amely memĂłria szivĂĄrgĂĄshoz vezetett, javasolt egy tovĂĄbbi szƱrĆt bevezetni, amely egyszerƱen ĂĄtkonvertĂĄlja az ĂŒzeneteket a bemenetrĆl a kimenetre, viszont lĂ©trehoz egy nem könnyƱ, hanem normĂĄlis "nehĂ©z" mĂĄsolatot a bemeneti ĂŒzenetrĆl, majd teljesen eltĂĄvolĂtja a bemenetre Ă©rkezĆ ĂŒzenetet. Ezt a szƱrĆt izolĂĄtornak nevezzĂŒk. FeltĂ©telezzĂŒk, hogy mivel a szƱrĆ egyszerƱ, ezĂ©rt benne a szivĂĄrgĂĄs kizĂĄrt. Egy mĂĄsik pozitĂv tulajdonsĂĄga pedig, hogy ha bĂĄrmelyik helyre beillesztjĂŒk a grĂĄfunkba, az nem befolyĂĄsolja a sĂ©ma mƱködĂ©sĂ©t. Az izolĂĄlĂł szƱrĆt dupla kerĂŒletƱ körkĂ©nt ĂĄbrĂĄzoljuk.
Az izolĂĄtort azonnal a voidsource szƱrĆ utĂĄn kapcsoljuk be:
![]()
Ăjra elindĂtjuk a programot az elemzĆvel, Ă©s azt lĂĄtjuk, hogy ez alkalommal az elemzĆ az izolĂĄtort okolja. VĂ©gĂŒl is Ć hozza lĂ©tre azokat az adatblokkot, amelyek kĂ©sĆbb egy ismeretlen gondatlan szƱrĆ (vagy szƱrĆk) ĂĄltal elvesznek. A következĆ lĂ©pĂ©sben az izolĂĄtort egy szƱrĆvel jobbra mozgatjuk, Ă©s Ășjra elindĂtjuk az elemzĂ©st. TehĂĄt, lĂ©pĂ©srĆl lĂ©pĂ©sre jobbra mozgatva az izolĂĄtort, olyan helyzetet kapunk, amikor a következĆ elemzĆ jelentĂ©sben az "elhalvĂĄnyult" memĂłria blokkok szĂĄma csökken. Ez azt jelenti, hogy ezen a lĂ©pĂ©sen az izolĂĄtor a problĂ©mĂĄs szƱrĆ utĂĄn helyezkedett el a lĂĄncban. Ha a "rossz" szƱrĆ egyetlen volt, akkor a szivĂĄrgĂĄs teljesen eltƱnik. Ăgy lokalizĂĄltuk a problĂ©mĂĄs szƱrĆt (vagy az egyik a több közĂŒl). A szƱrĆ "javĂtĂĄsa" utĂĄn folytathatjuk az izolĂĄtor jobbra mozgatĂĄsĂĄt a lĂĄncon, amĂg teljes mĂ©rtĂ©kben meg nem szĂŒntetjĂŒk a memĂłria szivĂĄrgĂĄsokat.
Az izolĂĄlĂł szƱrĆ implementĂĄlĂĄsa
Az izolĂĄtor megvalĂłsĂtĂĄsa Ășgy nĂ©z ki, mint egy normĂĄl szƱrĆ. FejlĂ©c:
/* ЀаĐčĐ» 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
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)
MemĂłriakezelĆ fĂŒggvĂ©nyek helyettesĂtĂ©si metĂłdus
Finomabb kutatĂĄsokhoz a mĂ©diastreamer lehetĆsĂ©get biztosĂt a memĂłriĂĄhoz valĂł hozzĂĄfĂ©rĂ©s fĂŒggvĂ©nyeinek sajĂĄt magunk ĂĄltal törtĂ©nĆ helyettesĂtĂ©sĂ©re, amelyek alapvetĆ munkĂĄjukon tĂșl rögzĂtik, hogy "Ki, hova Ă©s miĂ©rt". HĂĄrom fĂŒggvĂ©ny kerĂŒl helyettesĂtĂ©sre. 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 lehetĆsĂ©g hasznos, amikor az elemzĆ annyira lelassĂtja a szƱrĆk mƱködĂ©sĂ©t, hogy ez zavart okoz a rendszerben, amelybe a sĂ©mĂĄnk be van Ă©pĂtve. Ebben a helyzetben kĂ©nytelenek vagyunk lemondani az elemzĆrĆl, Ă©s a memĂłriakezelĆ fĂŒggvĂ©nyek helyettesĂtĂ©sĂ©t alkalmazni.
MegvizsgĂĄltuk az eljĂĄrĂĄsok algoritmusĂĄt egy egyszerƱ grĂĄf szĂĄmĂĄra, amely nem tartalmaz ĂĄgazĂĄsokat. De ezt a megközelĂtĂ©st mĂĄs esetekre is alkalmazni lehet, persze bonyolultabb formĂĄban, de az ötlet ugyanaz marad.
A következĆ cikkben a ticker terhelĂ©sĂ©nek Ă©rtĂ©kelĂ©sĂ©vel Ă©s a mĂ©diastreamerben jelentkezĆ tĂșlzott szĂĄmĂtĂĄsi terhelĂ©s kezelĂ©sĂ©nek mĂłdjaival foglalkozunk.
ForrĂĄs: habr.com
