د Mediastreamer2 VoIP انجن سپړنه. 12 برخه

د مقالې مواد زما څخه اخیستل شوي دي زین چینل.

د Mediastreamer2 VoIP انجن سپړنه. 12 برخه

په اخر کې مقالې، ما ژمنه وکړه چې د ټیکر بار اندازې مسله او د میډیا سټیمر کې د ډیر کمپیوټري بار سره معامله کولو لارې چارې په پام کې ونیسم. مګر ما پریکړه وکړه چې دا به ډیر منطقي وي چې د ډیټا حرکت پورې اړوند د کرافټ فلټرونو ډیبګ کولو مسلې پوښئ او یوازې بیا د فعالیت اصلاح کولو مسلو ته پام وکړئ.

د کرافټ فلټرونو ډیبګ کول

وروسته له دې چې موږ په تیره مقاله کې د میډیا سټریمر کې د ډیټا حرکت میکانیزم معاینه کړ ، نو دا به منطقي وي چې پدې کې د پټ خطرونو په اړه وغږیږو. د "ډیټا جریان" اصولو یوه ځانګړتیا دا ده چې د ډیټا جریان څخه د حافظې تخصیص په فلټرونو کې واقع کیږي چې د ډیټا جریان سرچینې کې موقعیت لري ، او فلټرونه دمخه د جریان لارې په پای کې موقعیت لري د بیرته راستنیدو سره حافظه تخصیص کوي. ډډې ته. برسېره پردې، د نوي معلوماتو رامینځته کول او د دوی ویجاړول په منځنیو ټکو کې واقع کیدی شي. په عموم کې، د حافظې خوشې کول د فلټر لخوا ترسره کیږي پرته له هغه چې د ډیټا بلاک رامینځته کړی.

د حافظې د شفافې څارنې له نظره، دا به د فلټر لپاره مناسبه وي، کله چې د ان پټ بلاک ترلاسه کول، د پروسس کولو وروسته سمدلاسه له منځه یوسي، حافظه آزاده کړي، او په محصول کې د محصول ډاټا سره نوی جوړ شوی بلاک واچوي. پدې حالت کې ، په فلټر کې د حافظې لیک په اسانۍ سره موندل کیدی شي - که چیرې تحلیل کونکي په فلټر کې لیک کشف کړي ، نو بیا وروسته فلټر راتلونکي بلاکونه په سمه توګه نه له مینځه وړي او پدې کې غلطي شتون لري. مګر د لوړ فعالیت ساتلو له نظره، د ډیټا بلاکونو سره کار کولو لپاره دا طریقه ګټوره نه ده - دا د ډیټا بلاکونو لپاره پرته له کوم ګټور اخراج پرته د ډیرو عملیاتو / وړیا حافظې تخصیص کولو لامل کیږي.

د دې دلیل لپاره ، د میډیا سټیمر فلټرونه ، د دې لپاره چې د ډیټا پروسس ورو نه کړي ، هغه افعال وکاروئ چې د پیغامونو کاپي کولو پرمهال روښانه کاپي رامینځته کوي (موږ په تیرو مقاله کې د دوی په اړه خبرې وکړې). دا فنکشن یوازې د کاپي شوي "زاړه" پیغام څخه د ډیټا بلاک "ضم کولو" له لارې د پیغام سرلیک نوې کاپي رامینځته کوي. د پایلې په توګه، دوه سرلیکونه د ډیټا بلاک سره وصل شوي او د ډیټا بلاک کې د حوالې کاونټر زیات شوی. مګر دا به د دوه پیغامونو په څیر ښکاري. د دې ډول "عامه" ډیټا بلاک سره ډیر پیغامونه کیدی شي، د بیلګې په توګه، د MS_TEE فلټر په یو وخت کې لس داسې رڼا کاپي تولیدوي، دوی د خپلو محصولاتو ترمنځ ویشي. که چیرې په سلسله کې ټول فلټرونه په سمه توګه کار وکړي، د پایپ لاین په پای کې د دې حوالې شمیره باید صفر ته ورسیږي او د حافظې د ډیلولوشن فعالیت به ویل کیږي: ms_free(). که زنګ نه وي واقع شوی، نو د حافظې دا ټوټه به نور بیرته ستنې ته نه راستنیږي، د بیلګې په توګه. هغه "لیک" کوي. د سپکو کاپي کارولو لګښت په اسانۍ سره د ټاکلو وړتیا له لاسه ورکول دي (لکه څنګه چې دا به د منظم کاپي کارولو په حالت کې وي) په کوم کې چې د ګراف فلټر حافظه لیکیږي.

څنګه چې په "ملي" فلټرونو کې د حافظې لیک موندلو مسؤلیت د میډیا سټریمر پراختیا کونکو پورې اړه لري ، نو ډیری احتمال به تاسو د دوی ډیبګ کولو ته اړتیا ونلرئ. مګر ستاسو د لاسي صنایعو فلټر سره، تاسو پخپله د خپلې خوښۍ ځړونکي یاست، او هغه وخت چې تاسو په خپل کوډ کې د لیکونو په لټون کې مصرف کوئ ستاسو په دقت پورې اړه لري. ستاسو د ډیبګ کولو وخت کمولو لپاره ، موږ اړتیا لرو چې د فلټرونو ډیزاین کولو پرمهال د لیک ځایی کولو تخنیکونه وګورو. سربیره پردې ، دا ممکن پیښ شي چې لیک به یوازې هغه وخت څرګند شي کله چې په ریښتیني سیسټم کې د فلټر پلي کول ، چیرې چې د "مشکوک" شمیر خورا لوی وي ، او د ډیبګ کولو وخت محدود دی.

د حافظې لیک څنګه ځان څرګندوي؟

دا منطقي ده چې فرض کړئ چې د برنامه په محصول کې سر ستاسو د غوښتنلیک لخوا نیول شوي حافظې زیاتوالی به وښیې.

بهرنۍ څرګندونه به پدې حقیقت کې وي چې په یو وخت کې سیسټم به ورو ورو د موږک حرکت ته عکس العمل ښکاره کړي ، ورو ورو سکرین بیا رسم کړي. دا هم امکان لري چې د سیسټم لاګ وده وکړي، په هارډ ډرایو کې ځای وخوري. پدې حالت کې ، ستاسو غوښتنلیک به په عجیب ډول چلند پیل کړي ، امرونو ته ځواب نه ورکوي ، فایل نشي خلاصولی ، او داسې نور.

د لیک حقیقت پیژندلو لپاره ، موږ به د حافظې تحلیل کونکی وکاروو (له دې وروسته د تحلیل کونکي په توګه راجع کیږي). دا کیدای شي ویلګرینډ (ښه مقاله د دې په اړه) یا په کمپیلر کې جوړ شوی Gcc د حافظې پاکوونکي یا بل څه. که شنونکی وښيي چې لیک د ګراف فلټرونو څخه یو کې پیښیږي ، نو دا پدې معنی ده چې دا د لاندې تشریح شوي میتودونو څخه د پلي کولو وخت دی.

د پنیس درې طریقه

لکه څنګه چې پورته یادونه وشوه، د حافظې د لیک په صورت کې، تحلیل کونکی به هغه فلټر ته اشاره وکړي چې د هپ څخه د حافظې تخصیص غوښتنه کوي. مګر دا به هغه فلټر ته اشاره ونه کړي چې "هیر شوی" یې بیرته راګرځوي، کوم چې په حقیقت کې ملامت دی. په دې توګه، شنونکی کولی شي یوازې زموږ ویره تایید کړي، مګر د دوی ریښې ته اشاره نه کوي.

په ګراف کې د "خراب" فلټر موقعیت موندلو لپاره ، تاسو کولی شئ د ګراف لږترلږه نوډونو ته کمولو سره لاړ شئ چیرې چې تحلیل کونکی لاهم لیک کشف کوي او په پاتې دریو پاینونو کې ستونزه لرونکي فلټر ومومئ.

مګر دا پیښ کیدی شي چې په کالم کې د فلټرونو شمیر کمولو سره به تاسو د فلټرونو او ستاسو د سیسټم نورو عناصرو ترمینځ د متقابل عمل نورمال کورس ګډوډ کړئ او لیک به نور څرګند نشي. په دې حالت کې، تاسو باید د بشپړ اندازې ګراف سره کار وکړئ او لاندې تشریح شوي طریقه وکاروئ.

د سلایډ انسولټر طریقه

د پریزنټشن ساده کولو لپاره، موږ به یو ګراف وکاروو چې د فلټرونو یو واحد سلسله لري. نوموړې په انځور کې ښودل شوې ده.

د Mediastreamer2 VoIP انجن سپړنه. 12 برخه

یو عادي ګراف، په کوم کې، د چمتو شوي میډیا سټیمر فلټرونو سره، څلور کرافټ فلټرونه F1…F4 کارول کیږي، څلور مختلف ډولونه چې تاسو ډیر وخت مخکې جوړ کړي او د دوی په درستیت کې هیڅ شک نشته. په هرصورت، فرض کړئ چې ډیری یې د حافظې لیک لري. کله چې زموږ د شنونکي نظارت برنامه پرمخ وړي ، موږ د دې راپور څخه زده کوو چې یو ځانګړي فلټر د یوې ټاکلې اندازې حافظې غوښتنه کړې او دا یې د N وختونو هپ ته نه ده راګرځولې. دا اټکل کول اسانه دي چې د MS_VOID_SOURCE ډول داخلي فلټر کارونو ته به یوه حواله وي. د هغه دنده دا ده چې د حافظې څخه حافظه واخلي. نور فلټرونه باید دا هلته بیرته راولي. هغوی. موږ به لیک پیدا کړو.

د دې لپاره چې معلومه کړي چې د پایپ لاین په کومه برخه کې غیرفعالیت رامینځته شوی چې د حافظې لیک لامل شوی ، دا وړاندیز شوی چې یو اضافي فلټر معرفي کړي چې په ساده ډول پیغامونه له ان پټ څخه محصول ته لیږدوي ، مګر په ورته وخت کې د ان پټ غیر روښانه کاپي رامینځته کوي. پیغام په نورمال "درانه" کاپي کې، بیا په بشپړه توګه هغه پیغام ړنګول چې ننوتلو ته رسیدلی. موږ به دا ډول فلټر یو انسولټر ووایو. موږ باور لرو ځکه چې فلټر ساده دی، په هغې کې لیک خارج شوی دی. او یو بل مثبت ملکیت - که موږ دا زموږ په ګراف کې کوم ځای ته اضافه کړو، نو دا به په هیڅ ډول د سرکټ عملیات اغیزه ونکړي. موږ به د انسولټر فلټر د دوه ګوني شکل سره د یوې دایرې په توګه انځور کړو.

د voidsourse فلټر سمدلاسه وروسته جلا کوونکی فعال کړئ:
د Mediastreamer2 VoIP انجن سپړنه. 12 برخه

موږ برنامه بیا د تحلیل کونکي سره پرمخ وړو ، او موږ ګورو چې دا ځل به تحلیل کونکی ملامت په جلا کونکي باندې واچوي. په هرصورت، دا هغه څوک دی چې اوس د معلوماتو بلاکونه رامینځته کوي، کوم چې بیا د نامعلوم غفلت فلټر (یا فلټرونو) لخوا ورک شوي. بل ګام دا دی چې د زنځیر سره انسولیټر ښي خوا ته ، د یو فلټر په واسطه لیږدول ، او بیا تحلیل پیل کړئ. نو ، ګام په ګام ، د جلا کونکي ښي خوا ته حرکت کول ، موږ داسې وضعیت ترلاسه کوو کله چې د تحلیل کونکي راتلونکي راپور کې د "لیک شوي" حافظې بلاکونو شمیر کم شي. دا پدې مانا ده چې پدې مرحله کې انسولټر د ستونزې لرونکي فلټر څخه سمدستي وروسته په زنځیر کې پای ته ورسید. که چیرې یوازې یو "خراب" فلټر شتون ولري، نو لیک به په بشپړه توګه ورک شي. په دې توګه، موږ ستونزمن فلټر (یا یو له څو څخه) ځایی کړی. د فلټر په "فکس" کولو سره، موږ کولی شو د زنځیر سره ښي خوا ته جلا کوونکی حرکت ته دوام ورکړو تر هغه چې د حافظې لیکونه په بشپړ ډول له مینځه ویسي.

د جلا کونکي فلټر پلي کول

د جلا کونکي پلي کول د عادي فلټر په څیر ښکاري. د سرلیک فایل:

/* Файл 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

فلټر پخپله:

/* Файл 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)

د حافظې مدیریت دندو بدلولو طریقه

د لا زیاتو فرعي څیړنو لپاره، د میډیا سټیمر د دې وړتیا چمتو کوي چې د حافظې لاسرسي فعالیتونه ستاسو سره ځای په ځای کړي، کوم چې د اصلي کار سربیره، "څوک، چیرته او ولې" ثبتوي. درې دندې بدلیږي. دا په لاندې ډول ترسره کیږي:

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

دا خصوصیت په هغه قضیو کې د ژغورنې لپاره راځي کله چې تحلیل کونکي فلټرونه دومره ورو کړي چې د سیسټم عملیات چې زموږ سرکټ جوړ شوی ګډوډ کیږي. په داسې حالت کې، تاسو باید تحلیل پریږدئ او د حافظې دندو بدیل وکاروئ.

موږ د ساده ګراف لپاره د عملونو الګوریتم په پام کې نیولی دی چې څانګې نلري. مګر دا طریقه په نورو قضیو کې پلي کیدی شي، البته د پیچلتیا سره، مګر نظر یو شان پاتې دی.

په راتلونکې مقاله کې ، موږ به د ټیکر بار اندازې مسلې ته وګورو او څنګه د میډیا سټیمر کې د ډیر کمپیوټري بار سره معامله وکړو.

سرچینه: www.habr.com

Add a comment