Raksta materiÄls Åemts no mana
PagÄtnÄ
Amatniecības filtru atkļūdoŔana
PÄc tam, kad iepriekÅ”ÄjÄ rakstÄ apskatÄ«jÄm datu pÄrvietoÅ”anas mehÄnismu mediju straumÄtÄjÄ, bÅ«tu loÄ£iski runÄt par tajÄ slÄptajÄm briesmÄm. Viena no ādatu plÅ«smasā principa iezÄ«mÄm ir tÄda, ka atmiÅa no kaudzes tiek pieŔķirta filtros, kas atrodas datu plÅ«smas avotÄ, un atmiÅu atbrÄ«vo un atgriež kaudzÄ ar filtriem, kas atrodas plÅ«smas beigÄs. ceļŔ. TurklÄt jaunu datu radÄ«Å”ana un iznÄ«cinÄÅ”ana var notikt kaut kur pa vidu. Parasti atmiÅas atbrÄ«voÅ”anu veic cits filtrs, nevis tas, kas izveidoja datu bloku.
No caurspÄ«dÄ«gas atmiÅas uzraudzÄ«bas viedokļa bÅ«tu saprÄtÄ«gi, ja filtrs, saÅemot ievades bloku, pÄc apstrÄdes, atbrÄ«vojot atmiÅu, to nekavÄjoties iznÄ«cinÄtu un izvadÄ«tu jaunizveidotu bloku ar izvaddatiem. Å ÄdÄ gadÄ«jumÄ bÅ«tu viegli izsekot atmiÅas noplÅ«dei filtrÄ - ja analizators konstatÄ noplÅ«di filtrÄ, tad nÄkamais filtrs pareizi neiznÄ«cina ienÄkoÅ”os blokus un tajÄ ir kļūda. Bet no augstas veiktspÄjas uzturÄÅ”anas viedokļa Ŕī pieeja darbam ar datu blokiem nav produktÄ«va - tas noved pie liela skaita operÄciju, lai pieŔķirtu/atbrÄ«votu atmiÅu datu blokiem bez noderÄ«gas izvades.
Å Ä« iemesla dÄļ multivides straumÄtÄju filtri, lai nepalÄninÄtu datu apstrÄdi, izmanto funkcijas, kas, kopÄjot ziÅojumus, izveido vienkÄrÅ”as kopijas (par tÄm mÄs runÄjÄm iepriekÅ”ÄjÄ rakstÄ). Å Ä«s funkcijas tikai izveido jaunu ziÅojuma galvenes gadÄ«jumu, āpievienojotā tai datu bloku no kopÄjamÄ āvecÄā ziÅojuma. RezultÄtÄ vienam datu blokam tiek pievienotas divas galvenes un tiek palielinÄts atsauces skaitÄ«tÄjs datu blokÄ. Bet tas izskatÄ«sies pÄc diviem ziÅojumiem. Ar Å”Ädu āsocializÄtuā datu bloku ziÅojumu var bÅ«t vairÄk, piemÄram, MS_TEE filtrs uzreiz Ä£enerÄ duci Å”Ädu gaiÅ”u kopiju, sadalot tÄs pa saviem izvadiem. Ja visi Ä·Ädes filtri darbojas pareizi, lÄ«dz konveijera beigÄm Å”im atsauces skaitÄ«tÄjam vajadzÄtu sasniegt nulli un tiks izsaukta atmiÅas atbrÄ«voÅ”anas funkcija: ms_free(). Ja zvans nenotiek, tad Ŕī atmiÅas daļa vairs netiks atgriezta kaudzÄ, t.i. tas "noplÅ«dÄ«s". Vieglo kopiju izmantoÅ”anas cena ir zaudÄta iespÄja viegli noteikt (kÄ tas bÅ«tu parasto kopiju gadÄ«jumÄ), kuram grafika filtram noplÅ«st atmiÅa.
TÄ kÄ multivides straumÄtÄju izstrÄdÄtÄji ir atbildÄ«gi par atmiÅas noplÅ«des atraÅ”anu vietÄjos filtros, visticamÄk, jums tÄs nebÅ«s jÄatkļūdo. Bet ar savu amatniecÄ«bas filtru jÅ«s esat savas laimes sienÄzis, un laiks, ko pavadÄ«sit, meklÄjot noplÅ«des savÄ kodÄ, bÅ«s atkarÄ«gs no jÅ«su precizitÄtes. Lai samazinÄtu atkļūdoÅ”anas laiku, izstrÄdÄjot filtrus, ir jÄÅem vÄrÄ noplūžu noteikÅ”anas metodes. TurklÄt var gadÄ«ties, ka noplÅ«de izpaudÄ«sies tikai tad, kad filtrs tiks uzlikts reÄlÄ sistÄmÄ, kur āaizdomÄs turamoā skaits var bÅ«t milzÄ«gs un atkļūdoÅ”anas laiks ierobežots.
KÄ izpaužas atmiÅas noplÅ«de?
Ir loÄ£iski pieÅemt, ka programmas izvadÄ tops parÄdÄ«s pieaugoÅ”o lietojumprogrammas aizÅemtÄs atmiÅas procentuÄlo daudzumu.
ÄrÄjÄ izpausme bÅ«s tÄda, ka kÄdÄ brÄ«dÄ« sistÄma sÄks lÄnÄm reaÄ£Ät uz peles kustÄ«bu un lÄnÄm pÄrzÄ«mÄs ekrÄnu. IespÄjams, ka sistÄmas žurnÄls pieaugs, aizÅemot vietu jÅ«su cietajÄ diskÄ. Å ajÄ gadÄ«jumÄ jÅ«su lietojumprogramma sÄks darboties dÄ«vaini, neatbildÄs uz komandÄm, nevarÄs atvÄrt failu utt.
Lai noteiktu noplÅ«des raÅ”anos, mÄs izmantosim atmiÅas analizatoru (turpmÄk ā analizators). Tas varÄtu bÅ«t Valgrinda (labi
Trīs priežu metode
KÄ minÄts iepriekÅ”, ja ir atmiÅas noplÅ«de, analizators norÄdÄ«s uz filtru, kas pieprasÄ«ja atmiÅas pieŔķirÅ”anu no kaudzes. Bet tas nenorÄdÄ«s filtru, kas āaizmirsaā to atgriezt, kas patiesÄ«bÄ ir vaininieks. TÄdÄjÄdi analizators var tikai apstiprinÄt mÅ«su bailes, bet ne norÄdÄ«t to sakni.
Lai noskaidrotu āsliktÄā filtra atraÅ”anÄs vietu grafikÄ, varat samazinÄt grafiku lÄ«dz minimÄlajam mezglu skaitam, kuros analizators joprojÄm konstatÄ noplÅ«di, un lokalizÄt problemÄtisko filtru atlikuÅ”ajÄs trÄ«s priedÄs.
Bet var gadÄ«ties, ka, samazinot filtru skaitu grafikÄ, jÅ«s izjauksiet normÄlu filtru mijiedarbÄ«bas gaitu ar citiem jÅ«su sistÄmas elementiem un noplÅ«de vairs neparÄdÄ«sies. Å ajÄ gadÄ«jumÄ jums bÅ«s jÄstrÄdÄ ar pilna izmÄra grafiku un jÄizmanto tÄlÄk aprakstÄ«tÄ pieeja.
BÄ«dÄmÄ izolatora metode
PrezentÄcijas vienkÄrŔības labad mÄs izmantosim grafiku, kas sastÄv no vienas filtru Ä·Ädes. ViÅa ir parÄdÄ«ta attÄlÄ.
Parasts grafiks, kurÄ lÄ«dzÄs gataviem mediju straumÄtÄju filtriem tiek izmantoti Äetri Äetru dažÄdu veidu craft filtri F1...F4, kurus esi izveidojis jau sen un par to pareizÄ«bu neÅ”aubies. TomÄr pieÅemsim, ka vairÄkiem no tiem ir atmiÅas noplÅ«des. Kad mÄs palaižam savu programmu analizatora pÄrraudzÄ«bai, no tÄ ziÅojuma mÄs uzzinÄm, ka noteikts filtrs pieprasÄ«ja noteiktu atmiÅas apjomu un neatgrieza to kaudzÄ N reižu skaitu. Varat viegli uzminÄt, ka bÅ«s saite uz MS_VOID_SOURCE tipa iekÅ”ÄjÄm filtra funkcijÄm. ViÅa uzdevums ir izÅemt atmiÅu no kaudzes. Citiem filtriem tas ir jÄatgriež tur. Tie. mÄs noteiksim noplÅ«des faktu.
Lai noteiktu, kurÄ cauruļvada posmÄ notikusi bezdarbÄ«ba, kas izraisÄ«ja atmiÅas noplÅ«di, tiek ierosinÄts ieviest papildu filtru, kas vienkÄrÅ”i pÄrslÄdz ziÅojumus no ievades uz izvadi, bet tajÄ paÅ”Ä laikÄ izveido ievades ziÅojuma kopiju, kas nav gaiÅ”a. , bet gan parastu āsmagoā, pÄc tam pilnÄ«bÄ izdzÄÅ” pie ieejas saÅemto ziÅu. MÄs Å”Ädu filtru sauksim par izolatoru. MÄs uzskatÄm, ka, tÄ kÄ filtrs ir vienkÄrÅ”s, tajÄ nav noplÅ«des. Un vÄl viena pozitÄ«va Ä«paŔība - ja mÄs to pievienosim jebkurÄ grafikÄ, tas nekÄdÄ veidÄ neietekmÄs Ä·Ädes darbÄ«bu. MÄs attÄlosim filtru-izolatoru apļa formÄ ar dubultu Ä·Ädi.
MÄs ieslÄdzam izolatoru tÅ«lÄ«t pÄc voidsource filtra:
MÄs atkal palaižam programmu ar analizatoru, un mÄs redzam, ka Å”oreiz analizators vainos izolatoru. Galu galÄ tieÅ”i viÅÅ” tagad izveido datu blokus, kurus pÄc tam pazaudÄ nezinÄms neuzmanÄ«gs filtrs (vai filtri). NÄkamais solis ir pÄrvietot izolatoru pa Ä·Ädi pa labi, par vienu filtru, un sÄkt analÄ«zi no jauna. TÄtad, soli pa solim pÄrvietojot izolatoru pa labi, mÄs iegÅ«sim situÄciju, ka nÄkamajÄ analizatora ziÅojumÄ samazinÄsies ānoplÅ«duÅ”oā atmiÅas bloku skaits. Tas nozÄ«mÄ, ka Å”ajÄ posmÄ izolators atradÄs Ä·ÄdÄ tÅ«lÄ«t pÄc problÄmas filtra. Ja bija tikai viens āsliktsā filtrs, tad noplÅ«de pazudÄ«s pavisam. TÄdÄjÄdi mÄs lokalizÄjÄm problemÄtisko filtru (vai vienu no vairÄkiem). PÄc filtra ānofiksÄÅ”anasā mÄs varam turpinÄt virzÄ«t izolatoru pa Ä·Ädi pa labi, lÄ«dz pilnÄ«bÄ uzvarÄsim atmiÅas noplÅ«des.
Izolatora filtra ievieŔana
Izolatora ievieÅ”ana izskatÄs tÄpat kÄ parasts filtrs. Galvenes fails:
/* Š¤Š°Š¹Š» 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
Pats filtrs:
/* Š¤Š°Š¹Š» 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)
AtmiÅas pÄrvaldÄ«bas funkciju aizstÄÅ”anas metode
SmalkÄkai izpÄtei mediju straumÄtÄjs nodroÅ”ina iespÄju atmiÅas piekļuves funkcijas aizstÄt ar savÄjÄm, kas papildus galvenajam darbam ierakstÄ«s āKas, kur un kÄpÄcā. Tiek aizstÄtas trÄ«s funkcijas. Tas tiek darÄ«ts Å”Ädi:
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);
Å Ä« funkcija palÄ«dz gadÄ«jumos, kad analizators tik ļoti palÄnina filtru darbÄ«bu, ka tiek traucÄta tÄs sistÄmas darbÄ«ba, kurÄ ir iebÅ«vÄta mÅ«su Ä·Äde. Å ÄdÄ situÄcijÄ jums ir jÄatsakÄs no analizatora un jÄizmanto funkciju aizstÄÅ”ana darbam ar atmiÅu.
MÄs esam apsvÄruÅ”i darbÄ«bu algoritmu vienkÄrÅ”am grafikam, kas nesatur zarus. TaÄu Å”o pieeju var pielietot arÄ« citos gadÄ«jumos, protams, sarežģītÄk, taÄu ideja paliek nemainÄ«ga.
NÄkamajÄ rakstÄ mÄs apskatÄ«sim jautÄjumu par slodžu slodzes novÄrtÄÅ”anu un veidus, kÄ cÄ«nÄ«ties pret pÄrmÄrÄ«gu skaitļoÅ”anas slodzi multivides straumÄtÄjÄ.
Avots: www.habr.com