Mediastreamer2 VoIP එන්ජිම ගවේෂණය කිරීම. 12 කොටස

ලිපියේ ද්‍රව්‍ය මගේ වෙතින් ලබාගෙන ඇත සෙන් නාලිකාව.

Mediastreamer2 VoIP එන්ජිම ගවේෂණය කිරීම. 12 කොටස

අන්තිමට ලිපියයි, ටික්කරයේ බර තක්සේරු කිරීමේ ගැටළුව සහ මාධ්‍ය ප්‍රවාහයේ අධික පරිගණක භාරයට එරෙහිව සටන් කිරීමේ ක්‍රම සලකා බැලීමට මම පොරොන්දු වුණෙමි. නමුත් දත්ත චලනය හා සම්බන්ධ යාත්‍රා පෙරහන් දෝෂහරණය කිරීමේ ගැටළු ආවරණය කිරීම වඩාත් තාර්කික බව මම තීරණය කළ අතර පසුව කාර්ය සාධන ප්‍රශස්තිකරණය පිළිබඳ ගැටළු සලකා බලන්න.

යාත්රා පෙරහන් නිදොස් කිරීම

මාධ්‍ය ප්‍රවාහයක දත්ත චලනය කිරීමේ යාන්ත්‍රණය පිළිබඳව අප පෙර ලිපියෙන් සොයා බැලීමෙන් පසුව, එහි සැඟවී ඇති අනතුරු ගැන කතා කිරීම තාර්කික වනු ඇත. “දත්ත ප්‍රවාහ” මූලධර්මයේ එක් ලක්ෂණයක් නම්, දත්ත ප්‍රවාහයේ ප්‍රභවයේ පිහිටා ඇති පෙරහන් ගොඩින් මතකය වෙන් කරනු ලබන අතර, ප්‍රවාහයේ අවසානයේ ඇති පෙරහන් මගින් මතකය නිදහස් කර ගොඩට ආපසු ලබා දීමයි. මාර්ගය. මීට අමතරව, නව දත්ත නිර්මාණය කිරීම සහ එය විනාශ කිරීම අතර කොතැනක හෝ සිදු විය හැක. සාමාන්‍යයෙන්, මතක මුදා හැරීම සිදු කරනු ලබන්නේ දත්ත වාරණය නිර්මාණය කළ තැනැත්තාට වඩා වෙනස් පෙරහනක් මගිනි.

විනිවිද පෙනෙන මතක අධීක්‍ෂණයේ දෘෂ්ටි කෝණයෙන් බලන කල, ෆිල්ටරය ආදාන බ්ලොක් එකක් ලැබීමෙන් පසු එය සැකසීමෙන් පසු එය වහාම විනාශ කිරීම, මතකය නිදහස් කිරීම සහ ප්‍රතිදාන දත්ත සමඟ අලුතින් සාදන ලද බ්ලොක් එකක් ප්‍රතිදානය කිරීම සාධාරණ වනු ඇත. මෙම අවස්ථාවෙහිදී, ෆිල්ටරයේ මතක කාන්දුවක් පහසුවෙන් සොයා ගත හැකිය - විශ්ලේෂකය පෙරහනෙහි කාන්දුවක් අනාවරණය කර ඇත්නම්, ඊළඟ පෙරහන මඟින් පැමිණෙන බ්ලොක් නිසි ලෙස විනාශ නොකරන අතර එහි දෝෂයක් ඇත. නමුත් ඉහළ කාර්ය සාධනයක් පවත්වා ගැනීමේ දෘෂ්ටි කෝණයෙන්, දත්ත බ්ලොක් සමඟ වැඩ කිරීමට මෙම ප්රවේශය ඵලදායී නොවේ - එය කිසිදු ප්රයෝජනවත් ප්රතිදානයකින් තොරව දත්ත බ්ලොක් සඳහා වෙන් කිරීම / නිදහස් මතකය සඳහා මෙහෙයුම් විශාල සංඛ්යාවක් වෙත යොමු කරයි.

මේ හේතුව නිසා, මාධ්‍ය ප්‍රවාහ පෙරහන්, දත්ත සැකසීම මන්දගාමී නොකිරීමට, පණිවිඩ පිටපත් කිරීමේදී පහසු පිටපත් නිර්මාණය කරන කාර්යයන් භාවිතා කරයි (අපි ඒවා ගැන පෙර ලිපියෙන් කතා කළෙමු). මෙම ශ්‍රිතයන් මඟින් පණිවිඩ ශීර්ෂයේ නව අවස්ථාවක් නිර්මාණය කරන්නේ පිටපත් කරන “පැරණි” පණිවිඩයේ දත්ත බ්ලොක් එකක් එයට “ඇමිණීම” මගින් පමණි. එහි ප්‍රතිඵලයක් ලෙස, එක් දත්ත කොටසකට ශීර්ෂ දෙකක් අමුණා ඇති අතර දත්ත කොටසේ විමර්ශන කවුන්ටරය වැඩි වේ. නමුත් එය පණිවිඩ දෙකක් ලෙස පෙනෙනු ඇත. එවැනි "සමාජගත" දත්ත බ්ලොක් එකක් සමඟ තවත් පණිවිඩ තිබිය හැක, උදාහරණයක් ලෙස, MS_TEE ෆිල්ටරය එකවර එවැනි ආලෝක පිටපත් දුසිමක් උත්පාදනය කරයි, එහි ප්රතිදානයන් අතර ඒවා බෙදා හරිනු ලැබේ. දාමයේ ඇති සියලුම පෙරහන් නිවැරදිව ක්‍රියාත්මක වන්නේ නම්, නල මාර්ගයේ අවසානය වන විට මෙම යොමු කවුන්ටරය ශුන්‍යයට ළඟා විය යුතු අතර මතක මුදා හැරීමේ කාර්යය ලෙස හැඳින්වේ: ms_free(). ඇමතුම සිදු නොවන්නේ නම්, මෙම මතක කොටස තවදුරටත් ගොඩට ආපසු නොයනු ඇත, i.e. එය "කාන්දු" වනු ඇත. සැහැල්ලු පිටපත් භාවිතා කිරීම සඳහා මිල වන්නේ ප්‍රස්ථාර ෆිල්ටරය මතකය කාන්දු කරන්නේ කුමන ප්‍රස්ථාර පෙරහනද යන්න පහසුවෙන් තීරණය කිරීමේ හැකියාව නැති වීමයි.

ස්වදේශීය පෙරහන් තුළ මතක කාන්දුවීම් සෙවීම සඳහා මාධ්‍ය ප්‍රවාහ සංවර්ධකයින් වගකිව යුතු බැවින්, ඔබට ඒවා නිදොස් කිරීමට බොහෝ දුරට සිදු නොවනු ඇත. නමුත් ඔබේ අත්කම් පෙරහන සමඟ, ඔබ ඔබේම සතුටේ පළගැටියෙක් වන අතර, ඔබේ කේතයේ කාන්දුවීම් සෙවීමට ඔබ වැය කරන කාලය ඔබේ නිරවද්‍යතාවය මත රඳා පවතී. ඔබගේ නිදොස් කිරීමේ කාලය අඩු කිරීමට, අපි පෙරහන් සංවර්ධනය කිරීමේදී කාන්දු හඳුනාගැනීමේ ක්‍රම දෙස බැලිය යුතුය. ඊට අමතරව, කාන්දුව ප්‍රකාශ වන්නේ සැබෑ පද්ධතියක පෙරණය යෙදූ විට පමණක් වන අතර, එහිදී “සැකකරුවන්” සංඛ්‍යාව විශාල විය හැකි අතර දෝශ නිරාකරණය කිරීමේ කාලය සීමා වේ.

මතක කාන්දුවක් ප්‍රකාශ වන්නේ කෙසේද?

වැඩසටහනේ ප්‍රතිදානයේදී එය උපකල්පනය කිරීම තාර්කික ය ඉහළ ඔබගේ යෙදුම විසින් අල්ලාගෙන ඇති මතකයේ වැඩිවන ප්‍රතිශතය පෙන්වයි.

බාහිර ප්‍රකාශනය වනුයේ යම් අවස්ථාවක දී පද්ධතිය මූසිකයේ චලනයට සෙමින් ප්‍රතිචාර දැක්වීමට පටන් ගන්නා අතර තිරය සෙමෙන් නැවත ඇඳීමයි. ඔබේ දෘඪ තැටියේ ඉඩ අඩු කරමින් පද්ධති ලොගය වර්ධනය වීමටද ඉඩ ඇත. මෙම අවස්ථාවේදී, ඔබගේ යෙදුම අමුතු ලෙස හැසිරීමට පටන් ගනී, විධාන වලට ප්රතිචාර නොදක්වයි, ගොනුවක් විවෘත කළ නොහැක, ආදිය.

කාන්දුවක් ඇතිවීම හඳුනා ගැනීම සඳහා, අපි මතක විශ්ලේෂකයක් භාවිතා කරන්නෙමු (මෙතැන් සිට විශ්ලේෂකය ලෙස හැඳින්වේ). එය විය හැකිය වැල්ග්‍රින්ඩ් (යහපත ලිපියක් ඒ ගැන) හෝ සම්පාදකයට ගොඩනගා ඇත gcc Memory Sanitizer හෝ වෙනත් ඕනෑම දෙයක්. එක් ප්‍රස්ථාර ෆිල්ටරයක කාන්දුවක් සිදුවන බව විශ්ලේෂකය පෙන්වන්නේ නම්, මෙයින් අදහස් කරන්නේ පහත විස්තර කර ඇති එක් ක්‍රමයක් යෙදීමට කාලය පැමිණ ඇති බවයි.

පයින් තුනක් ක්රමය

ඉහත සඳහන් කළ පරිදි, මතක කාන්දුවක් තිබේ නම්, විශ්ලේෂකය ගොඩින් මතක වෙන් කිරීම ඉල්ලා සිටි පෙරහන වෙත යොමු කරයි. නමුත් එය ආපසු ලබා දීමට “අමතක වූ” පෙරණය පෙන්වා නොදෙනු ඇත, එය ඇත්ත වශයෙන්ම වැරදිකරු වේ. මේ අනුව, විශ්ලේෂකයාට අපගේ බිය තහවුරු කළ හැක්කේ, නමුත් ඒවායේ මූලය සඳහන් කළ නොහැක.

ප්‍රස්ථාරයේ “නරක” පෙරහන ඇති ස්ථානය සොයා ගැනීමට, ඔබට ප්‍රස්ථාරය අවම නෝඩ් ගණනට අඩු කිරීමෙන් විශ්ලේෂකය තවමත් කාන්දුවක් හඳුනාගෙන ඉතිරි පයින් තුනේ ගැටළු සහගත පෙරණය ස්ථානගත කළ හැකිය.

නමුත් ප්‍රස්ථාරයේ ඇති ෆිල්ටර ගණන අඩු කිරීමෙන්, ඔබ පෙරහන් සහ ඔබේ පද්ධතියේ අනෙකුත් මූලද්‍රව්‍ය අතර සාමාන්‍ය අන්තර්ක්‍රියාකාරිත්වයට බාධා කරන අතර කාන්දුව තවදුරටත් නොපෙන්වයි. මෙම අවස්ථාවේදී, ඔබට සම්පූර්ණ ප්‍රමාණයේ ප්‍රස්ථාරයක් සමඟ වැඩ කිරීමට සිදුවනු ඇති අතර පහත දක්වා ඇති ප්‍රවේශය භාවිතා කරන්න.

ස්ලයිඩින් පරිවාරක ක්රමය

ඉදිරිපත් කිරීමේ සරල බව සඳහා, අපි එක් පෙරහන් දාමයකින් සමන්විත ප්රස්ථාරයක් භාවිතා කරමු. ඇය පින්තූරයේ පෙන්වා ඇත.

Mediastreamer2 VoIP එන්ජිම ගවේෂණය කිරීම. 12 කොටස

සූදානම් කළ මාධ්‍ය ප්‍රවාහ පෙරහන් සමඟින්, ඔබ බොහෝ කලකට පෙර සාදන ලද සහ ඒවායේ නිරවද්‍යතාවය ගැන සැකයක් නැති, විවිධ වර්ග හතරකින් යුත්, F1...F4 යාත්‍රා පෙරහන් හතරක් භාවිතා කරන සාමාන්‍ය ප්‍රස්ථාරයක්. කෙසේ වෙතත්, ඔවුන්ගෙන් කිහිප දෙනෙකුට මතක කාන්දුවීම් ඇති බව අපි සිතමු. විශ්ලේෂකය නිරීක්ෂණය කිරීම සඳහා අපගේ වැඩසටහන ක්‍රියාත්මක කරමින්, යම් පෙරහනක් යම් මතක ප්‍රමාණයක් ඉල්ලා ඇති බවත්, එය N ගොඩට වාර ගණනක් ආපසු නොදුන් බවත් එහි වාර්තාවෙන් අපි ඉගෙන ගනිමු. MS_VOID_SOURCE ආකාරයේ අභ්‍යන්තර පෙරහන් කාර්යයන් වෙත සබැඳියක් ඇති බව ඔබට පහසුවෙන් අනුමාන කළ හැක. ඔහුගේ කාර්යය වන්නේ ගොඩින් මතකය ලබා ගැනීමයි. වෙනත් පෙරහන් එය එහි ආපසු ලබා දිය යුතුය. එම. කාන්දු වීමේ කාරනය අපි හඳුනා ගනිමු.

මතක කාන්දුවකට තුඩු දෙන නල මාර්ගයේ අක්‍රියතාවය කුමක්ද යන්න තීරණය කිරීම සඳහා, ආදානයේ සිට ප්‍රතිදානය දක්වා පණිවිඩ සරලව මාරු කරන අතිරේක පෙරහනක් හඳුන්වා දීමට යෝජනා කරයි, නමුත් ඒ සමඟම සැහැල්ලු නොවන ආදාන පණිවිඩයේ පිටපතක් නිර්මාණය කරයි. , නමුත් ඒ වෙනුවට සාමාන්ය "බර" එකක්, පසුව ඇතුල්වීමේදී ලැබුණු පණිවිඩය සම්පූර්ණයෙන්ම මකා දමයි. එවැනි පෙරහනක් අපි පරිවාරකයක් ලෙස හඳුන්වමු. ෆිල්ටරය සරල බැවින් එහි කාන්දුවක් නොමැති බව අපි විශ්වාස කරමු. සහ තවත් එක් ධනාත්මක දේපලක් - අපි එය අපගේ ප්‍රස්ථාරයේ ඕනෑම තැනක එකතු කළහොත්, මෙය පරිපථයේ ක්‍රියාකාරිත්වයට කිසිදු ආකාරයකින් බලපාන්නේ නැත. අපි පෙරහන්-හුදකලා ද්විත්ව පරිපථයක් සහිත රවුමක ස්වරූපයෙන් නිරූපණය කරමු.

voidsource ෆිල්ටරය අවසන් වූ වහාම අපි හුදකලාකය සක්‍රිය කරමු:
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

අදහස් එක් කරන්න