Inachunguza injini ya Mediastreamer2 VoIP. Sehemu ya 12

Nyenzo za kifungu zimechukuliwa kutoka kwangu chaneli ya zen.

Inachunguza injini ya Mediastreamer2 VoIP. Sehemu ya 12

Zamani Ibara ya, Niliahidi kuzingatia suala la makadirio ya mzigo wa ticker na njia za kukabiliana na mzigo mkubwa wa kompyuta kwenye kipeperushi cha media. Lakini niliamua kuwa itakuwa jambo la kimantiki zaidi kushughulikia masuala ya utatuzi wa vichujio vya ufundi vinavyohusiana na uhamishaji wa data na kisha kuzingatia masuala ya uboreshaji wa utendakazi.

Utatuzi wa vichungi vya ufundi

Baada ya kuchunguza utaratibu wa uhamishaji wa data katika kipeperushi cha media katika nakala iliyotangulia, itakuwa busara kuzungumza juu ya hatari iliyofichwa ndani yake. Moja ya vipengele vya kanuni ya "mtiririko wa data" ni kwamba ugawaji wa kumbukumbu kutoka kwa lundo hutokea kwenye vichungi vilivyo kwenye vyanzo vya mtiririko wa data, na vichungi vilivyo kwenye mwisho wa njia ya mtiririko tayari husambaza kumbukumbu kwa kurudi. kwa lundo. Kwa kuongeza, kuundwa kwa data mpya na uharibifu wao unaweza kutokea mahali fulani katika pointi za kati. Kwa ujumla, kutolewa kwa kumbukumbu kunafanywa na chujio kingine isipokuwa ile iliyounda kizuizi cha data.

Kutoka kwa mtazamo wa ufuatiliaji wa uwazi wa kumbukumbu, itakuwa busara kwa chujio, wakati wa kupokea kizuizi cha pembejeo, kuharibu mara moja baada ya usindikaji, kufungia kumbukumbu, na kuweka kizuizi kipya kilichoundwa na data ya pato kwenye pato. Katika kesi hii, uvujaji wa kumbukumbu kwenye kichungi unaweza kufuatiliwa kwa urahisi - ikiwa kichanganuzi kiligundua uvujaji wa kichungi, kisha kichujio kinachofuata hakiharibu vizuizi vinavyoingia na kuna hitilafu ndani yake. Lakini kutoka kwa mtazamo wa kudumisha utendaji wa juu, mbinu hii ya kufanya kazi na vitalu vya data haina tija - inaongoza kwa idadi kubwa ya shughuli za kutenga / kumbukumbu ya bure kwa vitalu vya data bila kutolea nje muhimu.

Kwa sababu hii, vichungi vya mkondo wa media, ili sio kupunguza kasi ya usindikaji wa data, tumia kazi zinazounda nakala nyepesi wakati wa kunakili ujumbe (tulizungumza juu yao katika nakala iliyotangulia). Vitendaji hivi huunda tu nakala mpya ya kichwa cha ujumbe kwa "kuambatisha" kizuizi cha data kutoka kwa ujumbe "zamani" ulionakiliwa kwake. Kwa hivyo, vichwa viwili vimeunganishwa kwenye kizuizi kimoja cha data na kihesabu cha kumbukumbu kwenye kizuizi cha data kinaongezwa. Lakini itaonekana kama ujumbe mbili. Kunaweza kuwa na jumbe zaidi zilizo na kizuizi cha data cha "umma", kwa mfano, kichujio cha MS_TEE hutoa nakala kumi za mwanga mara moja, na kuzisambaza kati ya matokeo yake. Ikiwa vichungi vyote kwenye mnyororo vitafanya kazi kwa usahihi, mwisho wa bomba hesabu hii ya marejeleo inapaswa kufikia sifuri na kazi ya uwekaji kumbukumbu itaitwa: ms_free(). Ikiwa simu haitokei, basi kipande hiki cha kumbukumbu hakitarejeshwa tena kwenye chungu, i.e. yeye "huvuja". Gharama ya kutumia nakala nyepesi ni upotezaji wa uwezo wa kuamua kwa urahisi (kama ingekuwa katika kesi ya kutumia nakala za kawaida) ambamo kichujio cha grafu kumbukumbu inavuja.

Kwa kuwa jukumu la kutafuta uvujaji wa kumbukumbu katika vichungi vya "asili" liko kwa watengenezaji wa kipeperushi cha media, basi uwezekano mkubwa hautalazimika kuzitatua. Lakini kwa kichujio chako cha uundaji, wewe mwenyewe ndiye panzi wa furaha yako mwenyewe, na wakati unaotumia kutafuta uvujaji wa nambari yako itategemea usahihi wako. Ili kupunguza muda wako wa utatuzi, tunahitaji kuangalia mbinu za ujanibishaji wa uvujaji wakati wa kuunda vichujio. Kwa kuongeza, inaweza kutokea kwamba uvujaji utajidhihirisha tu wakati wa kutumia chujio katika mfumo halisi, ambapo idadi ya "watuhumiwa" inaweza kuwa kubwa, na wakati wa kufuta ni mdogo.

Uvujaji wa kumbukumbu unajidhihirishaje?

Ni busara kudhani kuwa katika matokeo ya programu juu itaonyesha asilimia inayoongezeka ya kumbukumbu iliyochukuliwa na programu yako.

Udhihirisho wa nje utajumuisha ukweli kwamba wakati fulani mfumo utachukua hatua polepole kwa harakati ya panya, polepole kuchora skrini. Inawezekana pia kwamba logi ya mfumo itakua, kula nafasi kwenye gari ngumu. Katika kesi hii, programu yako itaanza kutenda kwa kushangaza, bila kujibu amri, haiwezi kufungua faili, nk.

Ili kutambua ukweli wa uvujaji, tutatumia kichanganuzi cha kumbukumbu (hapa kinajulikana kama kichanganuzi). Inaweza kuwa valgrind (nzuri makala kuhusu hilo) au kujengwa ndani ya mkusanyaji gcc KumbukumbuSanitizer au kitu kingine. Ikiwa analyzer inaonyesha kwamba uvujaji hutokea katika moja ya vichungi vya grafu, basi ina maana kwamba ni wakati wa kutumia mojawapo ya njia zilizoelezwa hapo chini.

Njia tatu za Pines

Kama ilivyoelezwa hapo juu, ikiwa kumbukumbu itavuja, kichanganuzi kitaelekeza kwenye kichujio ambacho kiliomba mgao wa kumbukumbu kutoka kwa lundo. Lakini haitaelekeza kwenye chujio ambacho "kilisahau" kuirejesha, ambayo, kwa kweli, ni lawama. Kwa hivyo, analyzer inaweza tu kudhibitisha hofu zetu, lakini sio kuashiria mizizi yao.

Ili kujua eneo la kichujio "mbaya" kwenye grafu, unaweza kwenda kwa kupunguza grafu hadi idadi ya chini ya nodi ambazo kichanganuzi bado hugundua uvujaji na kupata kichujio chenye shida katika misonobari mitatu iliyobaki.

Lakini inaweza kutokea kwamba kwa kupunguza idadi ya vichungi kwenye safu utaharibu kozi ya kawaida ya mwingiliano kati ya vichungi na vitu vingine vya mfumo wako na uvujaji hautaonekana tena. Katika kesi hii, itabidi ufanye kazi na grafu ya ukubwa kamili na utumie mbinu iliyoelezwa hapo chini.

Njia ya insulator ya kuteleza

Kwa urahisi wa uwasilishaji, tutatumia grafu ambayo ina msururu mmoja wa vichujio. Anaonyeshwa kwenye picha.

Inachunguza injini ya Mediastreamer2 VoIP. Sehemu ya 12

Grafu ya kawaida, ambayo, pamoja na vichujio vya utiririshaji wa media vilivyotengenezwa tayari, vichungi vinne vya ufundi F1…F4 hutumiwa, aina nne tofauti ambazo ulitengeneza muda mrefu uliopita na huna shaka juu ya usahihi wao. Walakini, tuseme kwamba kadhaa kati yao wana uvujaji wa kumbukumbu. Tunapoendesha programu yetu ya usimamizi wa kichanganuzi, tunajifunza kutokana na ripoti yake kwamba kichujio fulani kiliomba kiasi fulani cha kumbukumbu na hakikurejesha kwenye lundo la N mara. Ni rahisi kukisia kuwa kutakuwa na marejeleo ya vichujio vya ndani vya aina ya MS_VOID_SOURCE. Kazi yake ni kuchukua kumbukumbu kutoka kwa lundo. Vichungi vingine vinapaswa kuirejesha hapo. Wale. tutapata uvujaji.

Ili kubaini ni sehemu gani ya kutotumika kwa bomba ilitokea ambayo ilisababisha uvujaji wa kumbukumbu, inapendekezwa kuanzishwa kwa kichujio cha ziada ambacho huhamisha tu ujumbe kutoka kwa ingizo hadi pato, lakini wakati huo huo huunda nakala isiyo ya mwanga ya ingizo. ujumbe kwenye nakala "nzito" ya kawaida, kisha kufuta kabisa ujumbe uliofika mlangoni. Tutaita kichungi kama hicho kuwa insulator. Tunaamini kwamba kwa kuwa kichujio ni rahisi, uvujaji ndani yake haujajumuishwa. Na mali moja nzuri zaidi - ikiwa tunaiongeza mahali popote kwenye grafu yetu, basi hii haitaathiri uendeshaji wa mzunguko kwa njia yoyote. Tutaonyesha kichujio cha kizio kama mduara na mtaro mara mbili.

Washa kitenga mara baada ya kichujio cha voidsourse:
Inachunguza injini ya Mediastreamer2 VoIP. Sehemu ya 12

Tunaendesha programu na analyzer tena, na tunaona kwamba wakati huu, analyzer ataweka lawama kwa isolator. Baada ya yote, ni yeye ambaye sasa huunda vizuizi vya data, ambavyo hupotea na chujio kisichojulikana (au vichungi). Hatua inayofuata ni kuhamisha kihami kando ya mnyororo kwenda kulia, kwa kichungi kimoja, na kuanza uchambuzi tena. Kwa hiyo, hatua kwa hatua, kusonga isolator kwa haki, tunapata hali wakati idadi ya "kuvuja" vitalu vya kumbukumbu katika ripoti inayofuata ya analyzer inapungua. Hii ina maana kwamba katika hatua hii insulator iliishia kwenye mnyororo mara baada ya chujio cha matatizo. Ikiwa kulikuwa na chujio moja tu "mbaya", basi uvujaji utatoweka kabisa. Kwa hivyo, tuliweka kichujio chenye shida (au moja ya kadhaa). Baada ya "kurekebisha" kichungi, tunaweza kuendelea kusogeza kitenganishi kulia kando ya mnyororo hadi uvujaji wa kumbukumbu utakapoondolewa kabisa.

Utekelezaji wa kichujio cha kutengwa

Utekelezaji wa kitenganishi unaonekana kama kichujio cha kawaida. Faili ya kichwa:

/* Π€Π°ΠΉΠ» 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

Kichujio chenyewe:

/* Π€Π°ΠΉΠ» 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)

Njia ya kubadilisha kazi za usimamizi wa kumbukumbu

Kwa utafiti wa hila zaidi, mkondo wa vyombo vya habari hutoa uwezo wa kuchukua nafasi ya kazi za kufikia kumbukumbu na yako mwenyewe, ambayo, pamoja na kazi kuu, itarekodi "Nani, wapi na kwa nini." Vipengele vitatu vinabadilishwa. Hii inafanywa kwa njia ifuatayo:

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);

Kipengele hiki kinakuja kuwaokoa katika kesi wakati analyzer inapunguza kasi ya filters kiasi kwamba uendeshaji wa mfumo ambao mzunguko wetu umejengwa huvunjika. Katika hali kama hiyo, lazima uachane na analyzer na utumie uingizwaji wa kazi za kumbukumbu.

Tumezingatia algorithm ya vitendo kwa grafu rahisi ambayo haina matawi. Lakini njia hii inaweza kutumika kwa kesi nyingine, bila shaka na matatizo, lakini wazo bado ni sawa.

Katika makala inayofuata, tutaangalia suala la makadirio ya mzigo wa ticker na jinsi ya kukabiliana na mzigo mkubwa wa kompyuta kwenye kipeperushi cha vyombo vya habari.

Chanzo: mapenzi.com

Kuongeza maoni