Mediastreamer2 VoIP انجڻ جي ڳولا. حصو 12

مضمون جو مواد منهنجي طرفان ورتو ويو آهي زين چينل.

Mediastreamer2 VoIP انجڻ جي ڳولا. حصو 12

آخري ۾ مضمون، مون واعدو ڪيو ته ٽڪر لوڊ جي تخميني جي مسئلي تي غور ڪرڻ ۽ ميڊيا اسٽريمر ۾ اضافي ڪمپيوٽنگ لوڊ سان ڊيل ڪرڻ جا طريقا. پر مون فيصلو ڪيو ته اهو وڌيڪ منطقي هوندو ته ڊيبگنگ ڪرافٽ فلٽرز جي مسئلن کي ڍڪڻ لاءِ ڊيٽا جي حرڪت سان لاڳاپيل ۽ صرف پوءِ ئي ڪارڪردگي بهتر ڪرڻ جي مسئلن تي غور ڪيو وڃي.

ڊيبگنگ ڪرافٽ فلٽر

اسان گذريل مضمون ۾ ميڊيا اسٽريمر ۾ ڊيٽا جي حرڪت جي ميکانيزم کي جانچڻ کان پوءِ، ان ۾ لڪيل خطرن بابت ڳالهائڻ منطقي هوندو. "ڊيٽا فلو" اصول جي خاصيتن مان هڪ آهي ته هيپ مان ميموري جو مختص ڪرڻ ڊيٽا جي وهڪري جي ذريعن تي واقع فلٽرن ۾ ٿئي ٿو، ۽ فلٽر جي وهڪري جي آخر ۾ واقع آهي اڳ ۾ ئي واپسي سان ميموري کي ڊيل ڪيو. ڍير ڏانهن. ان کان سواء، نئين ڊيٽا جي پيدائش ۽ انهن جي تباهي وچولي پوائنٽن ۾ ڪٿي به ٿي سگهي ٿي. عام طور تي، ميموري جي ڇڏڻ هڪ فلٽر طرفان انجام ڏنو ويو آهي، انهي کان سواء جيڪو ڊيٽا بلاڪ ٺاهي ٿو.

ميموري جي شفاف نگراني جي نقطي نظر کان، فلٽر لاء مناسب هوندو، جڏهن هڪ ان پٽ بلاڪ حاصل ڪري، پروسيسنگ کان پوء فوري طور تي ان کي تباهه ڪرڻ، ميموري کي آزاد ڪرڻ، ۽ هڪ نئين ٺاهيل بلاڪ کي آئوٽ پٽ تي ڊيٽا سان گڏ رکي. ان صورت ۾، فلٽر ۾ ميموري ليڪ آسانيءَ سان معلوم ٿي سگهي ٿي - جيڪڏهن تجزيي نگار کي فلٽر ۾ ليڪ معلوم ٿئي ٿي، ته ان جي پٺيان ايندڙ فلٽر ايندڙ بلاڪن کي صحيح طرح ڊاهي نه ٿو ڏئي ۽ ان ۾ ڪا خامي آهي. پر اعلي ڪارڪردگي کي برقرار رکڻ جي نقطي نظر کان، ڊيٽا بلاڪ سان ڪم ڪرڻ لاء هي طريقو ڪارائتو نه آهي - اهو ڪنهن به مفيد خارج ٿيڻ کان سواء ڊيٽا بلاڪ لاء مختص / مفت ميموري کي مختص ڪرڻ لاء وڏي تعداد ۾ عملن جي ڪري ٿي.

انهي سبب لاء، ميڊيا اسٽريمر فلٽر، ڊيٽا پروسيسنگ کي سست نه ڪرڻ لاء، جڏهن پيغامن کي نقل ڪندي فنڪشن استعمال ڪندا آهن جيڪي روشني ڪاپيون ٺاهيندا آهن (اسان انهن بابت اڳئين مضمون ۾ ڳالهايو). اهي فنڪشن صرف پيغام جي هيڊر جي هڪ نئين ڪاپي ٺاهيندا آهن "منسلڪ" ذريعي ڊيٽا بلاڪ کي نقل ٿيل "پراڻي" پيغام مان. نتيجي طور، ٻه هيڊر هڪ ڊيٽا بلاڪ سان ڳنڍيل آهن ۽ ڊيٽا بلاڪ ۾ ريفرنس ڪائونٽر وڌايو ويو آهي. پر اهو ٻه پيغام وانگر نظر ايندو. اهڙي ”عوامي“ ڊيٽا بلاڪ سان وڌيڪ نياپا ٿي سگهن ٿا، مثال طور، MS_TEE فلٽر هڪ ئي وقت ڏهه اهڙيون روشنيون ڪاپيون ٺاهي ٿو، انهن کي پنهنجي آئوٽ پُٽ ۾ ورهائي ٿو. جيڪڏهن زنجير ۾ سڀئي فلٽر صحيح طريقي سان ڪم ڪن ٿا، پائپ لائن جي آخر تائين هن حوالن جي ڳڻپ صفر تائين پهچڻ گهرجي ۽ ميموري ڊيلوڪيشن فنڪشن کي سڏيو ويندو: ms_free(). جيڪڏهن ڪال نه ٿي ٿئي، ته پوءِ ميموري جو هي ٽڪرو هاڻي ڍير ڏانهن واپس نه ويندو، يعني. هو ”ليڪس“ ڪري ٿو. هلڪي ڪاپيون استعمال ڪرڻ جي قيمت آساني سان طئي ڪرڻ جي صلاحيت جي نقصان آهي (جيئن ته اهو باقاعده ڪاپي استعمال ڪرڻ جي صورت ۾ هوندو) جنهن ۾ گراف فلٽر ياداشت ليڪ ٿي رهي آهي.

جيئن ته "مقامي" فلٽرن ۾ ميموري لڪ ڳولڻ جي ذميواري ميڊيا اسٽريمر جي ڊولپرز تي آهي، پوء گهڻو ڪري توهان کي انهن کي ڊيب ڪرڻ جي ضرورت نه هوندي. پر توهان جي ٺهڪندڙ فلٽر سان، توهان پاڻ آهيو توهان جي پنهنجي خوشيءَ جو گهوڙو، ۽ جيڪو وقت توهان پنهنجي ڪوڊ ۾ ليڪ ڳولڻ ۾ گذاريو ٿا اهو توهان جي درستگي تي منحصر هوندو. توھان جي ڊيبگنگ وقت کي گھٽائڻ لاءِ، اسان کي ڏسڻ جي ضرورت آھي ليڪ لوڪلائيزيشن ٽيڪنڪ کي جڏھن فلٽر ٺاھڻ. ان کان علاوه، اهو ٿي سگهي ٿو ته ليکڪ پاڻ کي ظاهر ڪندو جڏهن فلٽر کي حقيقي سسٽم ۾ لاڳو ڪيو وڃي، جتي "مشڪمن" جو تعداد تمام وڏو ٿي سگهي ٿو، ۽ ڊيبگنگ لاء وقت محدود آهي.

هڪ ميموري ليڪ پاڻ کي ڪيئن ظاهر ڪري ٿو؟

اهو فرض ڪرڻ منطقي آهي ته پروگرام جي پيداوار ۾ مٿي توهان جي ايپليڪيشن پاران قبضو ڪيل ميموري جو وڌندڙ سيڪڙو ڏيکاريندو.

خارجي مظهر حقيقت تي مشتمل هوندو ته ڪنهن نقطي تي سسٽم مائوس جي حرڪت تي سست رد عمل ظاهر ڪندو، سست رفتاري سان اسڪرين کي ٻيهر ٺاهيندو. اهو پڻ ممڪن آهي ته سسٽم لاگ وڌو ويندو، هارڊ ڊرائيو تي جاء کائڻ. انهي صورت ۾، توهان جي درخواست عجيب طريقي سان عمل ڪرڻ شروع ڪيو ويندو، حڪمن جو جواب نه ڏيڻ، فائل نه کوليو، وغيره.

لڪ جي حقيقت کي سڃاڻڻ لاءِ، اسان استعمال ڪنداسين ميموري تجزيه ڪندڙ (هتان کان پوءِ انالائيزر جو حوالو ڏنو ويو آهي). ٿي سگهي ٿو والجنڊ (سٺو هڪ مضمون ان جي باري ۾) يا ڪمپيلر ۾ ٺهيل gcc ياداشت صاف ڪرڻ وارو يا ٻيو ڪجهه. جيڪڏهن تجزيي نگار ڏيکاري ٿو ته ليڪ گراف فلٽرن مان هڪ ۾ ٿئي ٿي، پوء ان جو مطلب اهو آهي ته اهو هيٺ ڏنل بيان ڪيل طريقن مان هڪ کي لاڳو ڪرڻ جو وقت آهي.

ٽي پائن جو طريقو

جيئن مٿي ذڪر ڪيو ويو آهي، ميموري لڪ جي صورت ۾، تجزيه ڪندڙ ان فلٽر ڏانهن اشارو ڪندو جنهن ڍير مان ميموري مختص ڪرڻ جي درخواست ڪئي. پر اهو فلٽر ڏانهن اشارو نه ڪندو ته "وساريو ويو" ان کي واپس ڪرڻ لاء، جيڪو، حقيقت ۾، الزام آهي. اهڙيء طرح، تجزيه ڪندڙ صرف اسان جي خوف جي تصديق ڪري سگهي ٿو، پر انهن جي روٽ ڏانهن اشارو نه.

گراف ۾ "خراب" فلٽر جي جڳھ کي ڳولڻ لاء، توھان گراف کي گھٽائي سگھوٿا نوڊس جي گھٽ ۾ گھٽ تعداد تائين جنھن تي تجزيي نگار اڃا تائين ھڪڙي ليکي کي ڳولي ٿو ۽ باقي ٽن پائن ۾ مشڪلاتي فلٽر کي ڳولي ٿو.

پر اهو ٿي سگهي ٿو ته ڪالمن ۾ فلٽرن جي تعداد کي گهٽائڻ سان توهان فلٽرن ۽ توهان جي سسٽم جي ٻين عنصرن جي وچ ۾ رابطي جي معمولي طريقي ۾ خلل وجهندا ۽ لڪ اڃا ظاهر نه ٿيندي. انهي حالت ۾، توهان کي مڪمل سائيز گراف سان ڪم ڪرڻو پوندو ۽ هيٺ بيان ڪيل طريقي کي استعمال ڪرڻو پوندو.

سلائيڊنگ انسولٽر جو طريقو

پريزنٽيشن جي سادگي لاءِ، اسان هڪ گراف استعمال ڪنداسين جيڪو فلٽرن جي هڪ زنجير تي مشتمل هوندو. هوء تصوير ۾ ڏيکاريل آهي.

Mediastreamer2 VoIP انجڻ جي ڳولا. حصو 12

هڪ عام گراف، جنهن ۾، تيار ٿيل ميڊيا اسٽريمر فلٽرن سان گڏ، چار ڪرافٽ فلٽر F1…F4 استعمال ڪيا ويا آهن، چار مختلف قسمون جيڪي توهان گهڻو وقت اڳ ٺاهيون آهن ۽ انهن جي درستي تي ڪو شڪ ناهي. بهرحال، فرض ڪريو ته انهن مان ڪيترن ئي ميموري ليک آهي. جڏهن اسان جي تجزيي جي نگراني واري پروگرام کي هلائي رهيا آهيون، اسان ان جي رپورٽ مان سکندا آهيون ته هڪ خاص فلٽر هڪ خاص مقدار جي ميموري جي درخواست ڪئي ۽ ان کي هيپ N ڀيرا واپس نه ڪيو. اهو اندازو لڳائڻ آسان آهي ته MS_VOID_SOURCE قسم جي اندروني فلٽر افعال جو حوالو هوندو. هن جو ڪم آهي ڍير مان ياداشت ڪڍڻ. ٻيا فلٽر ان کي اتي واپس ڪرڻ گهرجي. اهي. اسان ليڪ ڳولينداسين.

اهو طئي ڪرڻ لاءِ ته پائپ لائن جي ڪهڙي حصي ۾ غير فعال ٿي وئي جيڪا ميموري لڪ جي ڪري ٿي، اهو هڪ اضافي فلٽر متعارف ڪرائڻ جو تجويز ڪيو ويو آهي جيڪو صرف پيغامن کي ان پٽ کان آئوٽ پٽ ڏانهن منتقل ڪري ٿو، پر ساڳئي وقت هڪ غير روشني، عام ٺاهي ٿو. ان پٽ ميسيج جي ”هيوي“ ڪاپي، پوءِ ان پيغام کي مڪمل طور تي ڊليٽ ڪيو جيڪو آئوٽ پٽ تي پهتو. داخلا. اسان اهڙي فلٽر کي انسولٽر سڏينداسين. اسان سمجهون ٿا ته فلٽر سادو آهي، ان ۾ لڪيج خارج ٿيل آهي. ۽ هڪ وڌيڪ مثبت ملڪيت - جيڪڏهن اسان ان کي اسان جي گراف ۾ ڪنهن به جاء تي شامل ڪيو، پوء اهو ڪنهن به طريقي سان سرڪٽ جي آپريشن کي متاثر نه ڪندو. اسان انسوليٽر فلٽر کي دائري جي طور تي ڊبل سموچ سان ڏيکارينداسين.

voidsourse فلٽر کان پوءِ الڳ ڪندڙ کي فعال ڪريو:
Mediastreamer2 VoIP انجڻ جي ڳولا. حصو 12

اسان پروگرام کي ٻيهر تجزيي سان هلائيندا آهيون، ۽ اسان ڏسون ٿا ته هن ڀيري، تجزيه ڪندڙ کي الڳ ڪندڙ تي الزام لڳائيندو. آخرڪار، اھو اھو آھي جيڪو ھاڻي ڊيٽا جا بلاڪ ٺاھي ٿو، جيڪي پوء گم ٿيل آھن اڻڄاتل غفلت فلٽر (يا فلٽر). ايندڙ قدم انسوليٽر کي زنجير جي ساڄي پاسي، هڪ فلٽر ذريعي، ۽ ٻيهر تجزيو شروع ڪرڻ آهي. تنهن ڪري، قدم سان قدم، الڳ ڪندڙ کي ساڄي طرف منتقل ڪندي، اسان هڪ صورتحال حاصل ڪندا آهيون جڏهن تجزيي جي ايندڙ رپورٽ ۾ "ليڪ ٿيل" ميموري بلاڪ جو تعداد گهٽجي ويندو آهي. هن جو مطلب اهو آهي ته هن قدم تي انسولٽر کي زنجير ۾ فوري طور تي مسئلو فلٽر کان پوء ختم ٿي ويو. جيڪڏهن اتي صرف هڪ "خراب" فلٽر هو، پوء ليک مڪمل طور تي غائب ٿي ويندو. اهڙيء طرح، اسان مسئلو فلٽر کي مقامي ڪيو (يا ڪيترن ئي مان هڪ). فلٽر کي "مقرر" ڪرڻ سان، اسان زنجير جي ساڄي پاسي آئسولٽر کي منتقل ڪرڻ جاري رکي سگهون ٿا جيستائين ميموري ليڪس مڪمل طور تي ختم نه ٿي وڃي.

هڪ الڳ ڪندڙ فلٽر کي لاڳو ڪرڻ

Isolator عمل درآمد صرف هڪ عام فلٽر وانگر ڏسڻ ۾ اچي ٿو. هيڊر فائل:

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

تبصرو شامل ڪريو