የ Mediastreamer2 VoIP ሞተርን ማሰስ። ክፍል 12

የጽሁፉ ይዘት ከኔ የተወሰደ ነው። የዜን ቻናል.

የ Mediastreamer2 VoIP ሞተርን ማሰስ። ክፍል 12

በመጨረሻው ጽሑፍ፣ የቲኬር ጭነት ግምትን ጉዳይ እና በመገናኛ ብዙሃን ዥረት ውስጥ ከመጠን በላይ የኮምፒዩተር ጭነትን ለመቋቋም መንገዶችን ከግምት ውስጥ እንዳስገባ ቃል ገባሁ። ነገር ግን ከውሂብ እንቅስቃሴ ጋር የተያያዙ የእደ-ጥበብ ማጣሪያዎችን የማረም ጉዳዮችን ለመሸፈን የበለጠ ምክንያታዊ እንደሚሆን ወሰንኩ እና ከዚያ በኋላ የአፈፃፀም ማሻሻያ ጉዳዮችን ግምት ውስጥ ያስገቡ።

የእጅ ሥራ ማጣሪያዎችን ማረም

በቀደመው መጣጥፍ ውስጥ በሚዲያ ዥረት ውስጥ የመረጃ እንቅስቃሴን ዘዴ ከመረመርን በኋላ በውስጡ የተደበቁትን አደጋዎች ማውራት ምክንያታዊ ይሆናል። የ "የውሂብ ፍሰት" መርህ አንዱ ገፅታ የማስታወሻ ክምር መመደብ በመረጃ ፍሰቱ ምንጮች ላይ በሚገኙ ማጣሪያዎች ውስጥ ይከሰታል, እና በወራጅ መንገዱ መጨረሻ ላይ የሚገኙት ማጣሪያዎች ማህደረ ትውስታውን ከመመለስ ጋር ያስተናግዳሉ. ወደ ክምር. በተጨማሪም, አዳዲስ መረጃዎችን መፍጠር እና ጥፋታቸው በመካከለኛው ቦታ ላይ ሊከሰት ይችላል. በአጠቃላይ የማህደረ ትውስታ መለቀቅ የሚከናወነው የውሂብ እገዳን ከፈጠረው ሌላ ማጣሪያ ነው.

የማስታወስን ግልጽነት ካለው የክትትል እይታ አንጻር ማጣሪያው የግቤት ማገጃውን ሲቀበል ወዲያውኑ ከሂደቱ በኋላ ማጥፋት ፣ ማህደረ ትውስታን ነፃ ማውጣት እና በውጤቱ ላይ የውጤት ውሂብ ያለው አዲስ የተፈጠረ ብሎክ ማስቀመጥ ምክንያታዊ ነው። በዚህ ሁኔታ በማጣሪያው ውስጥ ያለው የማስታወሻ ፍሰት በቀላሉ ሊታወቅ ይችላል - ተንታኙ በማጣሪያው ውስጥ መፍሰስ ካወቀ ፣ ከዚያ በኋላ ያለው ማጣሪያ የሚመጡ ብሎኮችን በትክክል አያጠፋም እና በውስጡ ስህተት አለ። ነገር ግን ከፍተኛ አፈፃፀምን ከማስጠበቅ አንጻር ይህ ከውሂብ ብሎኮች ጋር አብሮ የመስራት ዘዴ ውጤታማ አይደለም - ምንም ጠቃሚ የጭስ ማውጫ ሳይኖር የውሂብ ብሎኮችን ነፃ ማህደረ ትውስታን ለመመደብ ወደ ብዙ ስራዎች ይመራል ።

በዚህ ምክንያት, የሚዲያ ዥረት ማጣሪያዎች, የውሂብ ሂደትን ላለመቀነስ, መልዕክቶችን ሲገለብጡ የብርሃን ቅጂዎችን የሚፈጥሩ ተግባራትን ይጠቀማሉ (በቀደመው ጽሑፍ ውስጥ ስለእነሱ ተነጋገርን). እነዚህ ተግባራት የመልእክቱን ራስጌ አዲስ ቅጂ የሚፈጥሩት የውሂብ እገዳውን ከተቀዳው "አሮጌ" መልእክት ወደ እሱ "በማያያዝ" ብቻ ነው። በውጤቱም, ሁለት ራስጌዎች ከአንድ የውሂብ እገዳ ጋር ተያይዘዋል እና በመረጃ እገዳው ውስጥ ያለው የማጣቀሻ ቆጣሪ ይጨምራል. ግን ሁለት መልእክቶች ይመስላሉ. እንደዚህ ያለ "ይፋዊ" የውሂብ ብሎክ ያላቸው ተጨማሪ መልዕክቶች ሊኖሩ ይችላሉ፣ ለምሳሌ፣ MS_TEE ማጣሪያ በአንድ ጊዜ አስር የብርሃን ቅጂዎችን ያመነጫል፣ ከውጤቶቹ መካከል ያሰራጫል። በሰንሰለቱ ውስጥ ያሉት ሁሉም ማጣሪያዎች በትክክል የሚሰሩ ከሆነ በቧንቧው መጨረሻ ላይ ይህ የማመሳከሪያ ቁጥር ዜሮ መድረስ አለበት እና የማስታወሻ ማከፋፈያው ተግባር ይባላል: ms_ነጻ(). ጥሪው ካልተከሰተ, ይህ የማስታወሻ ክፍል ከአሁን በኋላ ወደ ክምር አይመለስም, ማለትም. እሱ "ያፈሳል". የብርሃን ቅጂዎችን የመጠቀም ዋጋ የማስታወስ ችሎታው በሚፈስበት የግራፍ ማጣሪያ (በመደበኛ ቅጂዎች ላይ እንደሚደረገው) በቀላሉ የመወሰን ችሎታ ማጣት ነው።

በ"ቤተኛ" ማጣሪያዎች ውስጥ የማህደረ ትውስታን የማግኘት ሃላፊነት የሚዲያ ዥረቱ ገንቢዎች ስላለ እነሱን ማረም አይኖርብዎትም። ነገር ግን በእደ ጥበባት ማጣሪያዎ እርስዎ እራስዎ የእራስዎ ደስታ አንበጣ ነዎት እና በኮድዎ ውስጥ ፍንጣቂዎችን ለመፈለግ የሚያሳልፉት ጊዜ እንደ ትክክለኛነትዎ ይወሰናል። የማረሚያ ጊዜዎን ለመቀነስ ማጣሪያዎችን በሚነድፉበት ጊዜ የሚፈስ የትርጉም ቴክኒኮችን መመልከት አለብን። በተጨማሪም ፣ ፍሳሹ እራሱን የሚገለጠው ማጣሪያውን በእውነተኛ ስርዓት ውስጥ ሲተገበሩ ብቻ ነው ፣ የ “ተጠርጣሪዎች” ብዛት ትልቅ ሊሆን ይችላል ፣ እና ለማረም ጊዜ ውስን ነው።

የማስታወስ ችሎታ መፍሰስ እራሱን እንዴት ያሳያል?

በፕሮግራሙ ውፅዓት ውስጥ እንደሆነ መገመት ምክንያታዊ ነው ጫፍ በመተግበሪያዎ የተያዘውን የማህደረ ትውስታ መቶኛ ይጨምራል።

ውጫዊው መገለጫው በተወሰነ ጊዜ ስርዓቱ የመዳፊቱን እንቅስቃሴ በቀስታ ምላሽ ስለሚሰጥ ማያ ገጹን በቀስታ እንደገና በመሳል ያካትታል። እንዲሁም የስርዓት ምዝግብ ማስታወሻው ሊያድግ ይችላል, በሃርድ ድራይቭ ላይ ያለውን ቦታ ይበላል. በዚህ አጋጣሚ ማመልከቻዎ እንግዳ የሆነ ባህሪ ማሳየት ይጀምራል, ለትእዛዞች ምላሽ አይሰጥም, ፋይሉን መክፈት አይችልም, ወዘተ.

የመፍሰሱን እውነታ ለመለየት የማስታወሻ ተንታኝ እንጠቀማለን (ከዚህ በኋላ ተንታኝ ይባላል)። ሊሆን ይችላል ቫልግሪንድ (ጥሩ ጽሑፍ ስለ እሱ) ወይም በማጠናከሪያው ውስጥ ተገንብቷል gcc ማህደረ ትውስታ ማጽጃ ወይም ሌላ ነገር. ተንታኙ ፍሳሹ በአንዱ የግራፍ ማጣሪያዎች ውስጥ እንደሚከሰት ካሳየ ከዚህ በታች ከተገለጹት ዘዴዎች ውስጥ አንዱን ተግባራዊ ለማድረግ ጊዜው አሁን ነው ማለት ነው።

ሶስት የጥድ ዘዴ

ከላይ እንደተጠቀሰው የማህደረ ትውስታ መፍሰስ በሚከሰትበት ጊዜ ተንታኙ ከቁልል ውስጥ የማህደረ ትውስታ ክፍፍልን ወደጠየቀው ማጣሪያ ይጠቁማል። ነገር ግን እሱን ለመመለስ "የረሳው" ማጣሪያውን አያመለክትም, ይህም በእውነቱ, ጥፋተኛ ነው. ስለዚህ ተንታኙ ፍርሃታችንን ብቻ ሊያረጋግጥ ይችላል, ነገር ግን ወደ ሥሮቻቸው አይጠቁም.

በግራፉ ውስጥ ያለው "መጥፎ" ማጣሪያ ያለበትን ቦታ ለማወቅ ግራፉን ወደ ዝቅተኛው የአንጓዎች ብዛት በመቀነስ ተንታኙ አሁንም ፍሳሹን የሚያውቅበት እና በቀሪዎቹ ሶስት ጥድ ውስጥ ያለውን ችግር ያለበት ማጣሪያ ማግኘት ይችላሉ።

ነገር ግን በአምዱ ውስጥ ያሉትን የማጣሪያዎች ብዛት በመቀነስ በማጣሪያዎች እና በሌሎች የስርዓትዎ አካላት መካከል ያለውን መደበኛ መስተጋብር ሊያስተጓጉል ይችላል እና ፍሰቱ ከአሁን በኋላ አይታይም። በዚህ ሁኔታ, ከሙሉ መጠን ግራፍ ጋር መስራት እና ከዚህ በታች የተገለጸውን ዘዴ መጠቀም አለብዎት.

ተንሸራታች የኢንሱሌተር ዘዴ

ለአቀራረብ ቀላልነት አንድ ነጠላ የማጣሪያዎች ሰንሰለት የያዘውን ግራፍ እንጠቀማለን. በሥዕሉ ላይ ትታያለች።

የ Mediastreamer2 VoIP ሞተርን ማሰስ። ክፍል 12

ተራ ግራፍ፣ በውስጡም ከተዘጋጁ የሚዲያ ዥረት ማጣሪያዎች ጋር፣ አራት የእጅ ሥራ ማጣሪያዎች F1…F4 ጥቅም ላይ ይውላሉ፣ ከረጅም ጊዜ በፊት ያደረጓቸው አራት የተለያዩ ዓይነቶች እና ስለ ትክክለኛነታቸው ምንም ጥርጥር የለውም። ይሁን እንጂ ብዙዎቹ የማስታወስ ችሎታቸው ይፈስሳል እንበል። የእኛን analyzer supervision ፕሮግራማችንን ስናካሂድ ከሪፖርቱ እንደምንረዳው አንድ ማጣሪያ የተወሰነ የማህደረ ትውስታ መጠን ጠይቆ ወደ ክምር N ጊዜ አልመለሰም። የ MS_VOID_SOURCE አይነት የውስጥ ማጣሪያ ተግባራት ማጣቀሻ ይኖራል ብሎ መገመት ቀላል ነው። የእሱ ተግባር ማህደረ ትውስታን ከቁልል መውሰድ ነው. ሌሎች ማጣሪያዎች ወደዚያ መመለስ አለባቸው. እነዚያ። ፍሳሹን እናገኛለን።

ወደ ማህደረ ትውስታ መፍሰስ ምክንያት የሆነው የቧንቧ መስመር እንቅስቃሴ-አልባነት በየትኛው ክፍል ላይ እንደተከሰተ ለማወቅ ከመግቢያው መልእክት ወደ ውፅዓት በቀላሉ የሚቀይር ተጨማሪ ማጣሪያ ለማስተዋወቅ ይመከራል ፣ ግን በተመሳሳይ ጊዜ ብርሃን ያልሆነ ፣ መደበኛ ይፈጥራል። የግቤት መልእክት "ከባድ" ቅጂ፣ ከዚያም በውጤቱ ላይ የደረሰውን መልእክት ሙሉ በሙሉ ይሰርዛል። መግቢያ። እንዲህ ዓይነቱን ማጣሪያ ኢንሱሌተር ብለን እንጠራዋለን. ማጣሪያው ቀላል ስለሆነ በውስጡ ያለው ፍሳሽ አይካተትም ብለን እናምናለን። እና አንድ ተጨማሪ አወንታዊ ንብረት - በግራፍችን ውስጥ በማንኛውም ቦታ ላይ ከጨመርን, ይህ በምንም መልኩ የወረዳውን አሠራር አይጎዳውም. የኢንሱሌተር ማጣሪያውን ባለ ሁለት ኮንቱር እንደ ክብ እናሳያለን።

ከቫዮይድስ ማጣሪያ በኋላ ማግለያውን ያንቁ፡-
የ Mediastreamer2 VoIP ሞተርን ማሰስ። ክፍል 12

ፕሮግራሙን እንደገና ከተንታኙ ጋር እናካሂዳለን ፣ እናም በዚህ ጊዜ ተንታኙ ጥፋቱን በገለልተኛ ላይ እንደሚያደርግ እናያለን። ደግሞም ፣ እሱ ነው የውሂብ ብሎኮችን የፈጠረው ፣ ከዚያ በኋላ በማይታወቅ ቸልተኛ ማጣሪያ (ወይም ማጣሪያዎች) ይጠፋሉ ። ቀጣዩ ደረጃ ኢንሱሌተሩን በሰንሰለቱ በኩል ወደ ቀኝ, በአንድ ማጣሪያ ማዞር እና ትንታኔውን እንደገና መጀመር ነው. ስለዚህ, ደረጃ በደረጃ, ማግለል ወደ ቀኝ ማንቀሳቀስ, እኛ analyzer በሚቀጥለው ሪፖርት ውስጥ "ያፈሱ" ትውስታ ብሎኮች ቁጥር ይቀንሳል ጊዜ አንድ ሁኔታ ማግኘት. ይህ ማለት በዚህ ደረጃ ኢንሱሌተር ችግር ያለበት ማጣሪያ ከተፈጠረ በኋላ ወዲያውኑ በሰንሰለቱ ውስጥ አለቀ ማለት ነው. አንድ "መጥፎ" ማጣሪያ ብቻ ከነበረ፣ ፍሰቱ በአጠቃላይ ይጠፋል። ስለዚህ፣ ችግር ያለበትን ማጣሪያ (ወይም ከብዙዎች አንዱን) አካባቢያዊ አድርገነዋል። ማጣሪያውን "ቋሚ" ካደረግን በኋላ የማስታወሻ ፍሳሾቹ ሙሉ በሙሉ እስኪጠፉ ድረስ ገለልተኛውን በሰንሰለቱ በኩል ወደ ቀኝ ማንቀሳቀስ መቀጠል እንችላለን።

ገለልተኛ ማጣሪያን በመተግበር ላይ

የገለልተኛ አተገባበር ልክ እንደ መደበኛ ማጣሪያ ይመስላል። የራስጌ ፋይል፡-

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

ይህ ባህሪው ወደ ማዳን የሚመጣው ተንታኙ ማጣሪያዎቹን በጣም በሚቀንስበት ጊዜ ወረዳችን የተገነባበት ስርዓት ሥራ ሲስተጓጎል ነው። በእንደዚህ ዓይነት ሁኔታ ውስጥ ተንታኙን መተው እና የማስታወሻ ተግባራትን መተካት አለብዎት.

ቅርንጫፎችን ለሌለው ቀላል ግራፍ የእርምጃዎች ስልተ ቀመር ተመልክተናል። ግን ይህ አካሄድ በሌሎች ጉዳዮች ላይ ሊተገበር ይችላል ፣ በእርግጥ ውስብስብነት አለው ፣ ግን ሀሳቡ ተመሳሳይ ነው።

በሚቀጥለው ርዕስ ላይ የቲኬር ጭነት ግምትን ጉዳይ እና በመገናኛ ዥረቱ ውስጥ ከመጠን በላይ የኮምፒዩተር ጭነት እንዴት እንደሚፈታ እንመለከታለን.

ምንጭ: hab.com

አስተያየት ያክሉ