Hacker News

ولې لومړی C++ (m) تخصیص تل 72 KB وي؟

تبصرې

1 min read Via joelsiks.com

Mewayz Team

Editorial Team

Hacker News

ستاسو د لومړي C++ تخصیص ترشا راز

تاسو یو ساده C++ پروګرام ولیکئ. یو واحد نوی انټ. څلور بایټس. تاسو سټریس یا ستاسو د خوښې حافظې پروفایلر لرې کړئ ، او دا شتون لري - ستاسو پروسې یوازې د عملیاتي سیسټم څخه شاوخوا 72 KB غوښتنه کړې. نه 4 بایټ. نه 64 بایټ. یو بشپړ 72 KB. که تاسو کله هم دې شمیرې ته کتلي وي او حیران یاست چې ایا ستاسو وسیله تاسو ته دروغ وایی ، تاسو یوازې نه یاست. دا ښکاري عجیب چلند د لومړي ځل لپاره د C++ پراختیا کونکو تر مینځ ترټولو ډیری پوښتل شوي پوښتنې دي چې د لومړي ځل لپاره د حافظې داخلي ته کیندل کیږي ، او ځواب موږ ته د هغه پرتونو له لارې په زړه پورې سفر ته رسوي چې ستاسو د کوډ او ریښتیني هارډویر ترمینځ ناست دي.

څه پیښیږي کله چې تاسو نوی

ته زنګ ووهئ

د 72 KB ارقام د پوهیدو لپاره، تاسو اړتیا لرئ د بشپړ تخصیص سلسله تعقیب کړئ. کله چې ستاسو C++ کوډ نوی int اجرا کوي، کمپیلر دا د operator new ته په زنګ کې ژباړي، کوم چې په ډیری لینکس سیسټمونو کې د glibc څخه malloc ته استوي. مګر malloc په مستقیم ډول د 4 بایټ حافظې لپاره کرنل نه غوښتنه کوي. کرنل په مخونو کې کار کوي - معمولا په x86_64 کې 4 KB - او د سیسټم کال لګښت د ساده حافظې لاسرسي سره خورا لوی دی. د هر انفرادي تخصیص لپاره brk() یا mmap() ته زنګ وهل به هر غیر معمولي برنامه ودروي.

د دې پر ځای، د glibc د حافظې تخصیص کوونکی - یو تطبیق چې د ptmalloc2 په نوم یادیږي، پخپله د Doug Lea د کلاسیک dlmalloc څخه راوتلی - د منځګړی په توګه کار کوي. دا د کرنل مخکښې څخه د حافظې لوی بلاکونو غوښتنه کوي ، بیا یې په کوچنیو ټوټو بدلوي ځکه چې ستاسو برنامه ورته اړتیا لري. دا بنسټیز دلیل دی چې ستاسو لومړی 4-بایټ تخصیص عملیاتي سیسټم ته خورا لوی غوښتنه رامینځته کوي. تخصیص کونکی ضایع نه کیږي. دا ستراتیژیک دی.

د 72 KB جلا کول: چیرته چې بایټس ځي

لومړني تخصیص سرته رسول د څو جلا برخو څخه راځي چې د رن ټایم باید پیل شي مخکې لدې چې تاسو ته د کارولو وړ حافظې یو بایټ درکړي. د هرې برخې درک کول تشریح کوي چې ولې شمیره په کوم ځای کې راځي.

لومړی، د glibc malloc اصلي میدان پیلوي - د کتاب ساتلو لومړنی جوړښت چې په اصلي تار کې ټولې تخصیصات تعقیبوي. پدې ډګر کې د هپ لپاره میټاډاټا شامل دي، د وړیا لیست پوائنټرونه، او د مختلف تخصیص اندازې لپاره بن جوړښتونه. تخصیص کونکی د پروګرام وقفه د sbrk() له لارې غزوي، او ابتدايي توسیع د M_TOP_PAD په نوم د داخلي پیرامیټر لخوا اداره کیږي، کوم چې د 128 KB پیډینګ ته ډیفالټ کیږي. په هرصورت، اصلي لومړنۍ غوښتنه د پاڼې د سمون او موجوده وقفې موقعیت لپاره تنظیم شوې، چې ډیری وختونه د یوې کوچنۍ لومړنۍ غوښتنې پایله لري - معمولا په یوه تازه پیل شوي پروسې کې د 72 KB ارقام ته نږدې راځي.

دوهم، د glibc 2.26 راهیسې، تخصیص کوونکی د لومړي کارونې په وخت کې د thread-local cache (tcache) پیل کوي. tcache 64 ډنډونه لري (یو د هر کوچني تخصیص اندازې ټولګي)، هر یو د 7 زیرمو ټوټو ساتلو توان لري. د tcache_perthread_struct پخپله شاوخوا 1 KB مصرفوي، مګر د دې پیل کولو عمل د پراخه ډګر تنظیم پیلوي. دریم، د C++ رن ټایم ستاسو د main() حتی د چلولو دمخه تخصیصات ترسره کړي دي — جامد جوړونکي، د std::cout او ملګرو لپاره د iostream بفر ابتکار، او د ځای ترتیب ټول د دې ابتدايي هپ فوټپرنټ کې مرسته کوي.

د ارینا سیسټم او ولې مخکې تخصیص سمارټ دی

پریکړه چې د حافظې د پام وړ برخه مخکې له مخکې تخصیص کړي د دې پر ځای چې د هغې د ټوټې ټوټې غوښتنه وکړي د پلي کیدو حادثه نه ده. دا د عمدي انجینرۍ تجارت دی چې د لسیزو سیسټمونو برنامې تجربې کې ریښې لري. brk() یا mmap() ته هر کال د کارن له ځای څخه د کرنل ځای ته د شرایطو سویچ، د پروسې د مجازی حافظې نقشه بدلول، او د احتمالي پاڼې میز تازه کول شامل دي. په عصري هارډویر کې، د یو واحد سیسټم کال نږدې 100-200 نانو ثانوي لګښت لري - په انزوا کې کوچني، په پیمانه ناورین.

یو پروګرام ته پام وکړئ چې د پیل کولو پرمهال 10,000 کوچنۍ تخصیص کوي. د مخکینۍ تخصیص پرته، دا به د 10,000 سیسټم زنګونو معنی ولري، چې نږدې 1-2 ملی ثانوي خالص سر لګښت لري. د ارینا میشته تخصیص کونکي سره ، لومړی تخصیص د واحد سیسټم کال پیلوي ، او ورپسې 9,999 تخصیصونه په بشپړ ډول د کارونکي ځای کې د پوائنټر ریاضی او لینک شوي لیست عملیاتو له لارې خدمت کیږي - هر یو نږدې 10-50 نانو ثانیه اخلي. ریاضی مبهم دی: د مخکینۍ تخصیص د اندازې په حکم سره ګټل کیږي.

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

مجازی حافظه بمقابله فزیکي حافظه: ولې دا مهمه نده

د پراختیا کونکو ترمنځ یوه عامه اندیښنه چې د لومړي ځل لپاره له دې چلند سره مخ کیږي د سرچینو ضایع کول دي. که زه یوازې 4 بایټ ته اړتیا لرم، ولې زما برنامه 72 KB مصرفوي؟ مهم بصیرت دا دی چې مجازی حافظه فزیکي حافظه نه ده. کله چې glibc د برنامه بریک تر 72 KB پورې وغځوي، کرنل د پروسې مجازی حافظې نقشه تازه کوي، مګر دا سمدستي هغه پاڼې د فزیکي RAM سره بیرته نه کوي. حقیقي فزیکي پاڼې د غوښتنې سره سم د صفحې نیمګړتیاو له لارې تخصیص کیږي — یوازې هغه وخت چې ستاسو برنامه یو ځانګړي پته ته لیکي د کرنل د حافظې ریښتیني پاڼه ورته ورکوي.

💡 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 KB لخوا زیاتیږي، د هغې د اوسیدونکي سیټ اندازه (RSS) - د فزیکي RAM مقدار چې په حقیقت کې مصرف شوي - یوازې د هغو پاڼو لخوا زیاتیږي چې تاسو واقعیا لمس کوئ. د یو واحد نوي انټ لپاره، دا عموما یو 4 KB پاڼه ده، او هر هغه پاڼې چې د ارینا میټاډاټا قبضه کوي. پاتې مجازی ځای هلته ناست دی، د کارونې لپاره چمتو دی، د پتې ځای پرته بل هیڅ لګښت نلري - چې تاسو په 64-bit لینکس سیسټم کې 128 TB لرئ.

دا توپیر مهم دی کله چې د تولید غوښتنلیکونو پروفایل کول او نظارت کول. که تاسو داسې سافټویر رامینځته کوئ چې د ریښتیني سرچینو مصرف تعقیب کولو ته اړتیا لري - ایا دا د SaaS بیکینډ ، مایکرو سرویس ، یا تحلیلي پایپ لاین دی لکه هغه چې په پلیټونو لکه Mewayz د سوداګرۍ عملیاتو لپاره پرمخ ځي - تاسو باید تل د مجازی اندازې پرځای RSS وڅارئ. وسیلې لکه /proc/[pid]/smaps، valgrind --tool=massif، او pmap کولی شي تاسو ته د مجازی حافظې د ګمراه کولو پر ځای د فزیکي حافظې دقیقې نښې درکړي.

څنګه مختلف تخصیص کونکي لومړی تخصیص اداره کوي

د 72 KB اندازه د glibc ptmalloc2 لپاره ځانګړې ده. نور تخصیص کونکي مختلف تجارتونه کوي، او ابتدايي تخصیص سر له مخې توپیر لري. د دې توپیرونو پوهیدل ارزښتناکه دي کله چې د فعالیت حساس غوښتنلیکونو لپاره تخصیص غوره کړئ.

  • jemalloc (د فیسبوک، FreeBSD لخوا کارول کیږي) - د موضوع - ځایی کیچونو سره ډیر دانه ایرینا جوړښت کاروي. ابتدايي سر یې لوړ وي (اکثرا 200+ KB) مګر د کم شوي تالاشۍ له امله غوره څو-تریډ شوي فعالیت وړاندې کوي.
  • tcmalloc (د ګوګل د Thread-Caching Malloc) — د مخکینۍ مخکینۍ تخصیص سره، په ډیفالټ ډول د هر تاریډ کیچ تقریبا 2 MB تخصیص کوي. ابتدايي سر لوړ دی، مګر وروسته کوچني تخصیص خورا چټک دي.
  • musl libc's malloc — د ټولو تخصیصونو لپاره د mmap پر بنسټ خورا ساده ډیزاین کاروي. ابتدايي سر ټیټ دی (اکثرا په هر تخصیص کې یوازې 4 KB)، مګر د هر ډول تخصیص لګښت لوړ دی ځکه چې د ډیرو مکرر سیسټم تلیفونونو له امله.
  • mimalloc (Microsoft) — د 64 MB برخو سره د برخې پر بنسټ تخصیص کاروي. لومړی تخصیص د 64 MB مجازی ریزرویشن (لږترلږه فزیکي ژمنې سره)، د استثنایي ځای او ټرپټ لپاره د سوداګرۍ پته ځای رامینځته کوي.

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

د ابتدايي تخصیص چلند تنظیم کول

که د ډیفالټ 72 KB ابتدايي سر په ریښتیا سره ستاسو د کارونې قضیې لپاره ستونزمن وي - شاید تاسو په زرګونو لنډ مهاله پروسې رامینځته کوئ، چې هر یو یوازې یو څو تخصیصات جوړوي - glibc د mallopt() او MALLOC_ د چاپیریال د کورنۍ له لارې څو ټونبلونه چمتو کوي.

M_TOP_PAD پیرامیټر کنټرولوي چې څومره اضافي حافظه تخصیص کونکي غوښتنه کوي د هغه څه څخه هاخوا چې سمدستي ورته اړتیا وي. د mallopt(M_TOP_PAD, 0) سره 0 ته تنظیم کول تخصیص کونکي ته وايي چې یوازې د هغه څه غوښتنه وکړي چې اړتیا ورته وي ، د پام وړ لومړني سرې کموي. د M_MMAP_THRESHOLD پیرامیټر پورته اندازه کنټرولوي کوم چې تخصیص د میدان پرځای mmap کاروي. M_TRIM_THRESHOLD کنټرولوي کله چې وړیا حافظه OS ته راستانه شي. او د glibc 2.26 راهیسې، glibc.malloc.tcache_count او glibc.malloc.tcache_max تونبلونه تاسو ته اجازه درکوي د تار کیچ چلند کنټرول کړي.

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

دا موږ ته د سیسټمونو پروګرام کولو په اړه څه زده کوي

د 72 KB د لومړي تخصیص اسرار، په اصل کې، د د تجرید پرتونو په اړه یو درس دی. C++ تاسو ته هغه فریب درکوي چې نوی انټ 4 بایټ تخصیص کوي. د ژبې معیار ورته وايي. ستاسو ذهني ماډل داسې وايي. مګر ستاسو د کوډ او هارډویر تر مینځ د پیچلي سیسټمونو سټک شتون لري - د C++ د چلولو وخت، د C کتابتون تخصیص کوونکی، د کرنل د مجازی حافظې فرعي سیسټم، او د هارډویر MMU او TLB - هر یو خپل چلند، اصلاح کول، او سر اضافه کوي.

دا کومه نیمګړتیا نه ده. دا د سیسټم سافټویر ټوله نقطه ده. هر پرت د یوې ریښتینې ستونزې حل کولو لپاره شتون لري: تخصیص کونکی شتون لري نو تاسو اړتیا نلرئ د هرې تخصیص لپاره سیسټم زنګ ووهئ. د مجازی حافظې سیسټم شتون لري نو تاسو اړتیا نلرئ مستقیم فزیکي حافظه اداره کړئ. د پاڼې غلطی سمبالونکی شتون لري نو حافظه په سست او اغیزمنه توګه ترسره کیږي. هر پرت د لوی مقدار فعالیت او اسانتیا لپاره لږ مقدار شفافیت تجارت کوي.

هغه پرمختگپالونکي چې تر ټولو د باور وړ، لوړ فعالیت کولو سیسټمونه جوړوي هغه څوک دي چې دا پرتونه پوهیږي — نه دا چې دوی د دوی په اړه په دوامداره توګه فکر کولو ته اړتیا لري، مګر دا چې کله یو څه ناڅاپي پیښیږي (لکه پراسرار 72 KB تخصیص)، دوی ذهني ماډل لري چې پوه شي ولې. که تاسو د ریښتیني وخت سوداګرۍ سیسټم رامینځته کوئ ، د لوبې انجن ، یا د سوداګرۍ پلیټ فارم چې په زرګونو کاروونکو ته خدمت کوي ، د دې په اړه د دلیل وړتیا چې ستاسو کوډ واقعیا د سیسټم په کچه څه کوي هغه څه دي چې وړ پراختیا کونکي له استثنایی څخه جلا کوي. 72 KB کومه ستونزه نه ده. دا ستاسو تخصیص کونکی دی چې خپله دنده په ښه توګه ترسره کوي.

نن خپل سوداګریز OS جوړ کړئ

له آزادو کسانو څخه تر ادارو پورې، Mewayz د 207 مدغم ماډلونو سره 138,000+ سوداګرۍ ته واک ورکوي. وړیا پیل کړئ، کله چې تاسو وده کوئ نو لوړ کړئ.

وړيا اکاونټ جوړ کړئ →

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