የመጀመሪያው C++ (m) ድልድል ሁል ጊዜ 72 ኪባ የሆነው ለምንድነው? | Mewayz Blog Skip to main content
Hacker News

የመጀመሪያው C++ (m) ድልድል ሁል ጊዜ 72 ኪባ የሆነው ለምንድነው?

አስተያየቶች

1 min read Via joelsiks.com

Mewayz Team

Editorial Team

Hacker News

ከመጀመሪያው የC++ ምደባዎ በስተጀርባ ያለው ምስጢር

ቀላል የC++ ፕሮግራም ትጽፋለህ። ነጠላአዲስ int። አራት ባይት. straceን ወይም የሚወዱትን የማስታወሻ ፕሮፋይል ያቃጥላሉ፣ እና ይሄ ነው - የእርስዎ ሂደት ከኦፕሬቲንግ ሲስተሙ በግምት 72 ኪባ ጠይቋል። 4 ባይት አይደለም። 64 ባይት አይደለም። ሙሉ 72 ኪ.ባ. ያንን ቁጥር አፍጥጠህ ካየህ እና መሳሪያህ እየዋሸህ እንደሆነ ካሰብክ ብቻህን አይደለህም። ይህ እንግዳ የሚመስለው ባህሪ ለመጀመሪያ ጊዜ የማህደረ ትውስታ ውስጣዊ ክፍሎችን በሚቆፍሩ የC++ ገንቢዎች መካከል በጣም በተደጋጋሚ ከሚጠየቁ ጥያቄዎች ውስጥ አንዱ ሲሆን መልሱ በኮድዎ እና በእውነተኛ ሃርድዌር መካከል በተቀመጡት ንብርብሮች ውስጥ አስደናቂ ጉዞ እንድናደርግ ያደርገናል።

አዲስ

ሲደውሉ ምን ይከሰታል

72 ኪባ አሃዙን ለመረዳት ሙሉውን የምደባ ሰንሰለት መፈለግ ያስፈልግዎታል። የእርስዎ C++ ኮድ አዲስ intን ሲሰራ፣ አቀናባሪው ያንን ወደ ኦፕሬተር አዲስ ጥሪ ይተረጉመዋል፣ ይህም በአብዛኛዎቹ የሊኑክስ ስርዓቶች ከ glibc ወደ malloc ይወክላል። ግን ማልሎክከርነሉን 4 ባይት የማስታወስ ችሎታን በቀጥታ አይጠይቅም። ኮርነሉ በገጾች -በተለምዶ 4 ኪባ በ x86_64 ላይ ይሰራል - እና የስርዓት ጥሪ ዋጋ ከቀላል የማህደረ ትውስታ መዳረሻ አንፃር በጣም ትልቅ ነው። ለእያንዳንዱ የግል ድልድል brk()ወይምካርታ()ን መጥራት ማንኛውንም ቀላል ያልሆነ ፕሮግራም እንዲቆም ያደርገዋል።

በምትኩ፣ የ glibc ማህደረ ትውስታ አከፋፋይ - የptmalloc2የሚባል አተገባበር፣ እራሱ ከዳግ ሊያ ክላሲክ dlmalloc የወረደ - እንደ ደላላ ሆኖ ይሰራል። ከፊት ለፊት ከከርነል ትላልቅ የማስታወሻ ጡቦችን ይጠይቃል፣ ከዚያም ፕሮግራምዎ እንደሚያስፈልጋቸው ወደ ትናንሽ ቁርጥራጮች ይቀርጻቸዋል። የመጀመሪያው ባለ 4-ባይት ምደባዎ ለስርዓተ ክወናው በጣም ትልቅ ጥያቄን የሚያነሳሳበት ዋናው ምክንያት ይህ ነው። አመዳደብ አባካኝ አይደለም. ስልታዊ ነው።

72 ኪባውን በመበተን ላይ፡ ባይት የሚሄዱበት

የመጀመሪያው ድልድል ከበርካታ የተለያዩ ክፍሎች የሚመጣ ሲሆን ይህም አንድ ነጠላ ባይት ጥቅም ላይ የሚውል ማህደረ ትውስታን እንኳን ከመስጠትዎ በፊት የሩጫ ጊዜው መጀመር አለበት። እያንዳንዱን አካል መረዳት ቁጥሩ የት እንደሚያርፍ ያብራራል።

በመጀመሪያ የ glibc malloc የዋናው መድረክን ያስጀምራል - በዋናው ክር ላይ ሁሉንም ምደባዎች የሚከታተል ዋናው የሂሳብ አያያዝ መዋቅር። ይህ መድረክ ለተለያዩ የምደባ መጠኖች ለክምር ሜታዳታ፣ ነጻ ዝርዝር ጠቋሚዎች እና የቢን አወቃቀሮችን ያካትታል። አከፋፋዩ የፕሮግራም እረፍቱን በsbrk() በኩል ያራዝመዋል፣ እና የመነሻ ማራዘሚያው የሚተዳደረው በM_TOP_PADውስጥ ግቤት ነው፣ እሱም ነባሪው 128 ኪባ ፓዲንግ ነው። ነገር ግን ትክክለኛው የመነሻ ጥያቄ ለገጽ አሰላለፍ እና ለነባር መግቻ ቦታ ተስተካክሏል፣ይህም ብዙውን ጊዜ አነስተኛ የመጀመሪያ ጥያቄን ያስከትላል - ብዙውን ጊዜ አዲስ በተጀመረ ሂደት ወደ 72 ኪባ አሃዝ አጠገብ ያርፋል።

ሁለተኛ፣ ከglibc 2.26 ጀምሮ፣ አመዳጁ በመጀመሪያ ጥቅም ላይ ሲውል ክር-አካባቢያዊ መሸጎጫ(tcache) ይጀምራል። tcache እያንዳንዱ እስከ 7 የተሸጎጡ ቁርጥራጮችን መያዝ የሚችል 64 ቢን (በአነስተኛ ምደባ መጠን አንድ አንድ) ይይዛል። የtcache_perthread_struct ራሱ 1 ኪባ አካባቢ ይበላል፣ ነገር ግን የማስጀመር ተግባር ሰፋ ያለ የአረና ዝግጅትን ያነሳሳል። ሦስተኛ፣ የC++ አሂድ ሰዓቱ ከዋና ()አካሄዳችሁ በፊት ምደባዎችን አከናውኗል — የማይንቀሳቀሱ ገንቢዎች፣ iostream buffer initialization forstd::coutእና ጓደኞች እና የአካባቢ ማዋቀር ሁሉም ለዚያ የመጀመሪያ ክምር አሻራ አስተዋፅዖ ያደርጋሉ።

የአረና ስርዓት እና ለምን ቅድመ-መመደብ ብልህ ነው

ትልቅ የማህደረ ትውስታ ክፍልን ከመጠየቅ ይልቅ አስቀድሞ ለመመደብ የተደረገው ውሳኔ የአፈጻጸም ድንገተኛ አይደለም። በስርዓተ-ፕሮግራም አወጣጥ ልምድ ውስጥ ሆን ተብሎ የተደረገ የምህንድስና ንግድ ነው። እያንዳንዱ ጥሪ ወደbrk()ወይምካርታ()ከተጠቃሚ ቦታ ወደ ከርነል ቦታ የአውድ መቀየር፣ የሂደቱን ምናባዊ ማህደረ ትውስታ ካርታዎች እና እምቅ የገጽ ሰንጠረዥ ማሻሻያዎችን ያካትታል። በዘመናዊ ሃርድዌር፣ የአንድ ነጠላ የሥርዓት ጥሪ ከ100-200 ናኖሴኮንዶች ዋጋ ያስከፍላል - በገለልተኛ ደረጃ ቀላል ያልሆነ፣ በመጠን መጠኑ ከባድ ነው።

በጅማሬው ወቅት 10,000 ትንንሽ ምደባዎችን የሚያደርገውን ፕሮግራም አስቡበት። ያለ ቅድመ-ምደባ፣ ይህ ማለት በግምት 1-2 ሚሊሰከንድ ንጹህ በላይ ወጪ 10,000 የስርዓት ጥሪዎች ማለት ነው። በአረና ላይ በተመሰረተ አከፋፋይ፣ የመጀመሪያው ድልድል የአንድ ነጠላ የስርዓት ጥሪን ያስነሳል፣ እና ተከታዩ 9,999 ምደባዎች ሙሉ በሙሉ በተጠቃሚ ቦታ በጠቋሚ ሂሳብ እና በተያያዙ ዝርዝር ስራዎች አገልግሎት ይሰጣሉ - እያንዳንዳቸው ከ10-50 nanoseconds ይወስዳል። ሒሳቡ የማያሻማ ነው፡ ቅድመ-ምደባ በትልቅ ትዕዛዝ ያሸንፋል።

በመጀመሪያ ድልድልዎ ላይ የሚያዩት 72 ኪባ የሚባክን ማህደረ ትውስታ አይደለም - የአፈጻጸም ኢንቨስትመንት ነው። አከፋፋዩ ፕሮግራምዎ በቅርቡ ብዙ ምደባዎችን እንደሚያደርግ እየተወራረደ ነው፣ እና በሁሉም የገሃዱ አለም ሁኔታዎች ያ ውርርድ ጥሩ ውጤት ያስገኛል። ጥቅም ላይ ያልዋለ የቨርቹዋል አድራሻ ቦታ ዋጋ በዘመናዊ ባለ 64-ቢት ስርዓቶች ላይ ዜሮ ነው።

ምናባዊ ማህደረ ትውስታ ከአካላዊ ማህደረ ትውስታ፡ ለምን ለውጥ የለውም

ይህን ባህሪ ለመጀመሪያ ጊዜ ባጋጠማቸው ገንቢዎች ዘንድ የተለመደ አሳሳቢ ጉዳይ የሀብት ብክነት ነው። 4 ባይት ብቻ የሚያስፈልገኝ ከሆነ ለምንድነው ፕሮግራሜ 72 ኪባ የሚበላው? ወሳኝ ግንዛቤውምናባዊ ማህደረ ትውስታ አካላዊ ትውስታ አይደለም. glibc የፕሮግራሙን መቋረጥ በ72 ኪባ ሲያራዝም፣ ከርነል የሂደቱን ምናባዊ ማህደረ ትውስታ ካርታዎችን ያሻሽላል፣ ነገር ግን ወዲያውኑ እነዚያን ገጾች በአካል ራም አይመልስም። ትክክለኛዎቹ አካላዊ ገፆች በፍላጎት በገጽ ጥፋቶች ይመደባሉ - ፕሮግራምህ ለአንድ የተወሰነ አድራሻ ሲጽፍ ብቻ ከርነል እውነተኛ የማስታወሻ ገጽ ይመድባል።

💡 DID YOU KNOW?

Mewayz replaces 8+ business tools in one platform

CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.

Start Free →

ይህ ማለት የሂደቱ ምናባዊ መጠን በ72 ኪባ ቢጨምርም የነዋሪው ስብስብ መጠን(RSS) - በትክክል የሚፈጀው የአካላዊ ራም መጠን - በእውነቱ በተነካካቸው ገፆች ብቻ ይጨምራል። ለአንድ ነጠላአዲስ ኢንት፣ ያ በተለምዶ አንድ ባለ 4 ኪባ ገጽ ነው፣ እና የትኛውንም ገፆች የአረና ሜታዳታ ይይዛል። የቀረው ምናባዊ ቦታ እዚያ ተቀምጧል፣ ለአገልግሎት ዝግጁ የሆነ፣ ከአድራሻ ቦታ በስተቀር ምንም ወጪ አይጠይቅም - ከዚህ ውስጥ 128 ቲቢ በ64-ቢት ሊኑክስ ሲስተም አለዎት።

ይህ ልዩነት የምርት አፕሊኬሽኖችን ሲገለፅ እና ሲቆጣጠር ወሳኝ ነው። እውነተኛ የሀብት ፍጆታን ለመከታተል የሚያስፈልጉትን ሶፍትዌሮች እየገነቡ ከሆነ - የSaaS backend፣ ማይክሮ አገልግሎት ወይም የትንታኔ ቧንቧ መስመር እንደMewayzእንደ መድረኮች ለንግድ ስራዎች የሚሰሩት - ሁልጊዜ ከምናባዊ መጠን ይልቅ RSS መከታተል አለብዎት። እንደ /proc/[pid]/smapsvalgrind --tool=massif እና pmap ያሉ መሳሪያዎች ምናባዊ ማህደረ ትውስታ አሃዞችን ከማሳሳት ይልቅ ትክክለኛ የአካላዊ ማህደረ ትውስታ ዱካዎችን ይሰጡዎታል።

የመጀመሪያውን ድልድል ምን ያህል የተለያዩ አመዳደብ እንደሚይዙ

የ72 ኪባ ምስል ለglibc ptmalloc2 የተወሰነ ነው። ሌሎች አከፋፋዮች የተለያዩ ግብይቶችን ያደርጋሉ፣ እና የመነሻ ክፍያው በዚህ መሰረት ይለያያል። አፈጻጸምን ለሚነኩ አፕሊኬሽኖች አመዳደብ ሲመርጡ እነዚህን ልዩነቶች መረዳት ጠቃሚ ነው።

  • jemalloc (በፌስቡክ፣ ፍሪቢኤስዲ ጥቅም ላይ የዋለ) — ይበልጥ ክብ ቅርጽ ያለው የአረና መዋቅር በክር-አካባቢያዊ መሸጎጫዎች ይጠቀማል። የመነሻ ክፍያው ከፍ ያለ ነው (ብዙውን ጊዜ 200+ ኪባ) ነገር ግን በተቀነሰ የመቆለፊያ ክርክር ምክንያት የተሻለ ባለ ብዙ ክር አፈጻጸምን ያቀርባል።
  • tcmalloc (የጉግል ክር መሸጎጫ ማልሎክ) — በነባሪ 2 ሜባ የሚጠጋ የያንዳንዱ-ክር መሸጎጫ ከከባድ ቅድመ-መመደብ ጋር ይመድባል። የመነሻ ክፍያው ከፍ ያለ ነው፣ ነገር ግን ተከታዩ አነስተኛ ምደባዎች እጅግ በጣም ፈጣን ናቸው።
  • musl libc's malloc — ለሁሉም ምደባዎች በካርታ ላይ የተመሰረተ በጣም ቀላል ንድፍ ይጠቀማል። የመነሻ ክፍያ አነስተኛ ነው (ብዙውን ጊዜ በአንድ ምድብ 4 ኪባ ብቻ)፣ ነገር ግን በተደጋጋሚ የስርዓት ጥሪዎች ምክንያት የምደባ ዋጋ ከፍ ያለ ነው።
  • ሚማሎክ (ማይክሮሶፍት) — ከ64 ሜባ ክፍሎች ጋር በክፍል ላይ የተመሰረተ ድልድልን ይጠቀማል። የመጀመሪያው ድልድል 64 ሜባ ምናባዊ ቦታ ማስያዝ (በአነስተኛ አካላዊ ቁርጠኝነት)፣ የግብይት አድራሻ ቦታ ለየት ያለ አካባቢ እና ግብአት ያስነሳል።

በእነዚህ አከፋፋዮች መካከል ያለው ምርጫ ሙሉ በሙሉ በእርስዎ የስራ ጫና ላይ የተመሰረተ ነው። ለረጂም ጊዜ የአገልጋይ አፕሊኬሽኖች ከከባድ ባለ ብዙ ክሮች ምደባ ጋር፣ jemalloc ወይም tcmalloc በተለምዶ የglibcን ነባሪ ይበልጣል። የማህደረ ትውስታ-የተገደቡ የተከተቱ ስርዓቶች፣ የሙስሊሙ ቀለል ያለ አሰራር ዝቅተኛ የውጤት መጠን ቢኖረውም ተመራጭ ሊሆን ይችላል። ለአብዛኛዎቹ አጠቃላይ ዓላማ የዴስክቶፕ እና የአገልጋይ አፕሊኬሽኖች፣ የptmalloc2 72 ኪባ የመጀመሪያ ክፍያ ሳይስተካከል በደንብ የሚሰራ ምክንያታዊ ነባሪ ይወክላል።

የመጀመሪያውን ድልድል ባህሪ ማስተካከል

ነባሪው 72 ኪባ የመጀመሪያ ክፍያ ለአጠቃቀም ጉዳይዎ በእውነት ችግር ያለበት ከሆነ - ምናልባት በሺዎች የሚቆጠሩ የአጭር ጊዜ ሂደቶችን እየፈጠሩ ነው፣ እያንዳንዱም በጣት የሚቆጠሩ ምደባዎችን ብቻ ነው የሚሰራው — glibc በmallopt()እና በMALLOC_የአካባቢ ተለዋዋጮች ቤተሰብ በኩል በርካታ ማስተካከያዎችን ያቀርባል።

M_TOP_PAD መለኪያው ወዲያውኑ ከሚያስፈልገው በላይ ምን ያህል ተጨማሪ ማህደረ ትውስታ እንደሚጠይቅ ይቆጣጠራል። በmallopt(M_TOP_PAD, 0) ወደ 0 ማዋቀር አመዳደብ የሚያስፈልገውን ብቻ እንዲጠይቅ ይነግረዋል፣ ይህም የመነሻ ክፍያን በእጅጉ ይቀንሳል። የM_MMAP_THRESHOLD መለኪያው ከመድረኩ ይልቅ ምደባዎች ካርታ የሚጠቀሙትን መጠን ይቆጣጠራል። የM_TRIM_THRESHOLDየነጻ ማህደረ ትውስታ ወደ ስርዓተ ክወናው ሲመለስ ይቆጣጠራል። እና ከglibc 2.26 ጀምሮ የglibc.malloc.tcache_countእናglibc.malloc.tcache_max tunables የክር መሸጎጫ ባህሪን እንድትቆጣጠር ያስችልሃል።

ነገር ግን ጥንቃቄ የተሞላበት ቃል፡ እነዚህን መመዘኛዎች ያለ ጥንቃቄ ቤንችማርክ ማስተካከል ሁልጊዜ ማለት ይቻላል ነገሮችን ያባብሳል። ነባሪው የተመረጡት በሰፊው የገሃዱ ዓለም መገለጫ ላይ በመመስረት ነው፣ እና ለብዙዎቹ የስራ ጫናዎች ጣፋጭ ቦታን ይወክላሉ። የማሎክ በላይ ማነቆ እንደሆነ ከምርት ፕሮፋይል ጠንከር ያለ ማስረጃ እስካልተገኘዎት ድረስ - እና የለውጦቻችሁን ተጽእኖ ካልለኩ - ነባሪዎችን ይተዉ። የምደባውን ያለጊዜው ማመቻቸት በተለይ ለቁጥር የሚታክቱ የምህንድስና ሰአቶችን በቸልተኝነት የፈጀ የያክ መላጨት ዘዴ ነው።

ስለ ሲስተምስ ፕሮግራሚንግ ምን ያስተምረናል

የ72 ኪባ የመጀመሪያ ድልድል ሚስጢር በመሰረቱ ስለabstraction layers ትምህርት ነው። C++ አዲስ ኢንት4 ባይት ይመድባል የሚል ቅዠት ይሰጥሃል። የቋንቋ ደረጃው እንዲህ ይላል። የእርስዎ የአዕምሮ ሞዴል እንዲህ ይላል። ነገር ግን በኮድዎ እና በሃርድዌሩ መካከል የተራቀቁ ሲስተሞች ተደራርበው ተቀምጠዋል - የC++ Runtime፣ የC ላይብረሪ አከፋፋይ፣ የከርነል ቨርቹዋል ማህደረ ትውስታ ንዑስ ስርዓት እና የሃርድዌር ኤምኤምዩ እና ቲኤልቢ - እያንዳንዳቸው የየራሳቸውን ባህሪ፣ ማሻሻያዎች እና ከራስ በላይ ይጨምራሉ።

ይህ ጉድለት አይደለም። እሱ የስርዓቶች ሶፍትዌር አጠቃላይ ነጥብ ነው። እያንዳንዱ ሽፋን እውነተኛውን ችግር ለመፍታት አለ፡ አከፋፋዩ አለ ስለዚህ ለእያንዳንዱ ምደባ የስርዓት ጥሪዎችን ማድረግ አያስፈልግዎትም። የቨርቹዋል ማህደረ ትውስታ ስርዓቱ ስላለ አካላዊ ማህደረ ትውስታን በቀጥታ ማስተዳደር የለብዎትም። የገጽ ጥፋት ተቆጣጣሪው ስላለ ማህደረ ትውስታ በሰነፍ እና በብቃት ይከናወናል። እያንዳንዱ ንብርብር ለትልቅ አፈጻጸም እና ምቾት ትንሽ መጠን ያለው ግልጽነት ይገበያያል።

በጣም አስተማማኝ እና ከፍተኛ አፈጻጸም ያላቸውን ስርዓቶች የሚገነቡ ገንቢዎች እነዚህን ንብርብሮች የተገነዘቡ ናቸው - ስለእነሱ ያለማቋረጥ ማሰብ ስለሚያስፈልጋቸው ሳይሆን አንድ ያልተጠበቀ ነገር ሲከሰት (እንደ ሚስጥራዊ የ 72 KB ምደባ) ምክንያቱን ለመረዳት የአዕምሮ ሞዴል አላቸው. የእውነተኛ ጊዜ የግብይት ስርዓት እየገነቡም ይሁኑ የጨዋታ ሞተር ወይም የንግድ መድረክ በሺዎች የሚቆጠሩ ተጠቃሚዎችን የሚያገለግል፣ ኮድዎ በስርዓት ደረጃ ምን እንደሚሰራ የማመዛዘን ችሎታ ብቃት ያላቸውን ገንቢዎች ልዩ ከሆኑ የሚለየው ነው። 72 ኪባ ስህተት አይደለም. ስራውን በግሩም ሁኔታ የሚሰራው የእርስዎ አከፋፋይ ነው።

የንግድ ስራዎን ዛሬ ይገንቡ

ከፍሪላንስ እስከ ኤጀንሲዎች ሜዌይዝ 138,000+ ቢዝነሶችን በ207 የተቀናጁ ሞጁሎች ያግዛል። በነጻ ጀምር፣ ስታድግ አሻሽል።

ነጻ መለያ ፍጠር →

Start managing your business smarter today

Join 30,000+ businesses. Free forever plan · No credit card required.

Ready to put this into practice?

Join 30,000+ businesses using Mewayz. Free forever plan — no credit card required.

Start Free Trial →

Ready to take action?

Start your free Mewayz trial today

All-in-one business platform. No credit card required.

Start Free →

14-day free trial · No credit card · Cancel anytime