Hacker News

İlk C++ (m) tahsisi neden her zaman 72 KB?

İlk C++ bellek ayırma işleminizin neden beklenen bayt yerine 72 KB istediğini keşfedin. Açıklanan Malloc dahili bileşenlerini ve işletim sistemi bellek yönetimi katmanlarını keşfedin.

14 dk okuma

Mewayz Team

Editorial Team

Hacker News

İlk C++ Tahsisinizin Arkasındaki Gizem

Basit bir C++ programı yazıyorsunuz. Tek bir yeni int. Dört bayt. Strace'i veya en sevdiğiniz bellek profili oluşturucuyu çalıştırıyorsunuz ve işte karşınızda; işleminiz işletim sisteminden yaklaşık 72 KB talep ediyor. 4 bayt değil. 64 bayt değil. Tam 72 KB. Eğer bu sayıya bakıp kullandığınız takımların size yalan söyleyip söylemediğini merak ettiyseniz yalnız değilsiniz. Bu görünüşte tuhaf davranış, ilk kez belleğin iç kısımlarını araştıran C++ geliştiricileri arasında en sık sorulan sorulardan biridir ve yanıt, bizi kodunuz ile gerçek donanım arasında bulunan katmanlar arasında büyüleyici bir yolculuğa çıkarır.

Yeniyi aradığınızda ne olur?

72 KB rakamını anlamak için tüm tahsis zincirini takip etmeniz gerekiyor. C++ kodunuz new int'yi çalıştırdığında, derleyici bunu new operatörüne yapılan bir çağrıya çevirir; çoğu Linux sisteminde glibc'den malloc'a yetki verir. Ancak malloc doğrudan çekirdekten 4 baytlık bellek istemez. Çekirdek sayfalar halinde çalışır (genellikle x86_64'te 4 KB) ve bir sistem çağrısının maliyeti, basit bellek erişimine kıyasla çok büyüktür. Her bir tahsis için brk() veya mmap() işlevinin çağrılması, önemsiz olmayan herhangi bir programın durma noktasına gelmesine neden olur.

Bunun yerine, glibc'nin bellek ayırıcısı - kendisi de Doug Lea'nın klasik dlmalloc'undan türeyen ptmalloc2 adı verilen bir uygulama - bir aracı görevi görüyor. Çekirdekten büyük bellek bloklarını önceden talep eder, ardından bunları programınızın ihtiyacına göre daha küçük parçalara ayırır. İlk 4 baytlık tahsisinizin işletim sistemine çok daha büyük bir talebi tetiklemesinin temel nedeni budur. Tahsis eden kişi israf etmiyor. Stratejik olmaktır.

72 KB'nin İncelenmesi: Baytların Nereye Gittiği

İlk tahsis ek yükü, çalışma zamanının size tek bir baytlık kullanılabilir bellek bile verebilmesi için başlatması gereken birkaç farklı bileşenden gelir. Her bir bileşeni anlamak, sayının neden geldiği yere ulaştığını açıklar.

İlk olarak, glibc'nin malloc'u, ana iş parçacığı üzerindeki tüm tahsisleri izleyen birincil defter tutma yapısı olan ana alanı başlatır. Bu alan, yığın için meta verileri, serbest liste işaretçilerini ve farklı tahsis boyutları için kutu yapılarını içerir. Ayırıcı, program sonunu sbrk() yoluyla genişletir ve ilk uzantı, varsayılan olarak 128 KB dolguya ayarlanan M_TOP_PAD adı verilen dahili bir parametre tarafından yönetilir. Bununla birlikte, asıl ilk istek, sayfa hizalaması ve mevcut kesme konumu için ayarlanır; bu da genellikle daha küçük bir ilk istekle sonuçlanır; genellikle yeni başlatılan bir süreçte bu 72 KB rakamına yaklaşır.

İkincisi, glibc 2.26'dan bu yana, ayırıcı ilk kullanımda yerel iş parçacığı önbelleğini (tcache) başlatır. Tcache, her biri 7'ye kadar önbelleğe alınmış parçayı tutabilen 64 kutu (küçük ayırma boyutu sınıfı başına bir tane) içerir. tcache_perthread_struct'un kendisi yaklaşık 1 KB tüketir, ancak onu başlatma eylemi daha geniş arena kurulumunu tetikler. Üçüncüsü, C++ çalışma zamanı, atamaları main() çalışmadan önce zaten gerçekleştirmiştir; statik kurucular, std::cout ve arkadaşları için iostream arabellek başlatma ve yerel ayar kurulumunun tümü, bu ilk yığın ayak izine katkıda bulunur.

Arena Sistemi ve Ön Tahsis Neden Akıllıdır?

Önemli miktarda hafızayı parça parça talep etmek yerine önceden tahsis etme kararı bir uygulama kazası değildir. Bu, onlarca yıllık sistem programlama deneyimine dayanan kasıtlı bir mühendislik değiş tokuşudur. Her brk() veya mmap() çağrısı, kullanıcı alanından çekirdek alanına bir bağlam geçişini, sürecin sanal bellek eşlemelerinin değiştirilmesini ve olası sayfa tablosu güncellemelerini içerir. Modern donanımda, tek bir sistem çağrısının maliyeti yaklaşık 100-200 nanosaniyedir; bu tek başına önemsiz, ölçekte ise felakettir.

Başlatma sırasında 10.000 küçük ayırma yapan bir program düşünün. Ön tahsis olmadan bu, 10.000 sistem çağrısı anlamına gelir ve bu da yaklaşık 1-2 milisaniyelik saf ek yüke mal olur. Arena tabanlı bir tahsisatçı ile ilk tahsis tetikleyicisi

Build Your Business OS Today

From freelancers to agencies, Mewayz powers 138,000+ businesses with 207 integrated modules. Start free, upgrade when you grow.

Create Free Account →

Sıkça Sorulan Sorular

72 KB'lık bu tahsisin tam olarak kaynağı nedir?

Bu tahsis, doğrudan sizin `new` ifadenizden gelmez. C++ çalışma zamanı kütüphanesi (özellikle bellek yöneticisi), programınız çalışmaya başladığında "heap" olarak bilinen dinamik bellek havuzunu başlatır. Bu başlangıç, gelecekteki küçük tahsislerin hızlı olmasını sağlamak için işletim sisteminden önceden bir bellek bloğu (genellikle 64 KB veya 128 KB gibi) talep eder. 72 KB'lık boyut, bu ön bellek (önbellek) bloğunun başlatılması ve yönetimi için gereken ek yapılar (meta veriler) ile birlikte toplam talep edilen alanı temsil eder.

Bu durum sadece C++ için mi geçerli?

Hayır, bu davranış C++'a özgü değildir. Benzer bir bellek yönetimi stratejisini kullanan birçok dil ve çalışma zamanı ortamı (örneğin, bellek havuzu kullanan diğer diller) benzer bir davranış sergileyebilir. Temel fikir aynıdır: sık yapılan küçük tahsisler için performansı artırmak amacıyla işletim sistemi çağrılarının (örneğin, `sbrk` veya `mmap`) ek yükünden kaçınmak için belleği önceden öbekler halinde ayırmak.

Bu 72 KB'lık alan sürekli olarak kullanımda mı kalır?

Evet, programınız çalıştığı sürece bu bellek genellikle işleminize ayrılmış durumda kalır. Ancak, bu alanın tamamı sürekli "kullanılıyor" anlamına gelmez. Bu, programınızın daha sonraki `new` işlemleri için kullanabileceği ayrılmış bir ön bellektir. Programınız sonlandığında, işletim sistemi tarafından geri alınır. Bellek profili oluşturma araçları, bu tür çalışma zamanı yükünü anlamada kritik öneme sahiptir. **Mewayz** gibi platformlar, uygulamanızın gerçek bellek kullanımını analiz etmek için 207'den fazla modül sunar.

💡 BİLİYOR MUYDUNUZ?

Mewayz, 8+ iş aracını tek bir platformda değiştirir

CRM · Faturalama · İnsan Kaynakları · Projeler · Rezervasyon · e-Ticaret · POS · Analitik. Süresiz ücretsiz plan mevcut.

Ücretsiz Başla →

Bu durum bellek sızıntısı anlamına mı geliyor?

Hayır, bu bir bellek sızıntısı değildir. Bellek sızıntısı, artık ihtiyaç duyulmayan belleğin program tarafından serbest bırakılamamasıdır. Burada gördüğümüz ise, çalışma zamanı kütüphanesinin kasıtlı ve kontrollü bir davranışıdır. Performans optimizasyonu için yapılan bu "ön ödeme", programın normal ve beklenen bir parçasıdır. Bu, bir sızıntıdan ziyade, gelecekteki işlemler için yapılmış bir yatırım olarak düşünülebilir.

Sıkça Sorulan Sorular

Neden ilk tahsis tam olarak 72 KB gibi belirli bir boyutta gerçekleşiyor?

Bu boyut, bellek yöneticisinin (genellikle "heap" yöneticisi) çalışma şeklinden kaynaklanır. İşletim sistemi, bir programın küçük bellek taleplerini tek tek işlemek yerine, daha büyük ve yönetilebilir "bloklar" halinde bellek tahsis eder. 72 KB, genellikle bu ilk bellek bloğunun (heap'in başlangıç boyutu) varsayılan değeridir. Bu, gelecekteki küçük tahsis isteklerinin daha hızlı karşılanmasını sağlamak için bir ön yükleme veya "önbellek" görevi görür.

Bu 72 KB'ın tamamını ben kullanıyor muyum?

Hayır, kullanmıyorsunuz. Siz sadece 4 baytlık `int` için yer ayırttınız. Geri kalan ~71.9 KB, programınızın gelecekte yapacağı `new` veya `malloc` çağrıları için hazır bekleyen boş bellektir. Bellek yöneticisi, bir sonraki tahsis isteğinizi bu önceden ayrılmış bloktan karşılayacak, böylece her seferinde işletim sistemine yeni bir çağrı yapılmasına gerek kalmayacak ve performans artacaktır.

Sadece 4 baytlık bir tahsis için bu kadar bellek ayırmak verimli mi?

Kısa vadede ve tek bir tahsis için verimsiz görünebilir, ancak uzun vadeli performans için bir optimizasyondur. İşletim sistemi seviyesindeki bir bellek tahsisi (sistem çağrısı) nispeten yavaş bir işlemdir. Bellek yöneticisi, bu "maliyeti" ödeyip bir blok aldıktan sonra, sonraki birçok küçük tahsis çok daha hızlı bir şekilde bu blok içinden yapılabilir. Bu, tipik bir programın çalışma şekli göz önüne alındığında genellikle kazançlı bir stratejidir.

Bu davranış sadece C++'a mı özgü? Diğer dillerde de oluyor mu?

Hayır, bu sadece C++'a özgü değildir. C'nin `malloc`'unu veya benzer bellek yönetimine sahip diğer dilleri (örneğin, bellek yönetimi olmayan dillerin çalışma zamanları) kullandığınızda da benzer bir davranışla karşılaşırsınız. Temel mantık aynıdır: dilin çalışma zamanı kütüphanesi, verimlilik için işletim sisteminden daha büyük bellek blokları talep eder. Mewayz'in 207 modülü gibi araçlarla bu alt düzey davranışları izlemek, farklı ortamlarda performansı anlamanıza yardımcı olabilir.

Sıkça Sorulan Sorular

72 KB'lık bu tahsisin tam nedeni nedir?

Bu tahsis, programınızın çalışması için gerekli olan C++ çalışma zamanı kütüphanelerinin (runtime) başlatılmasından kaynaklanır. "Tek bir `int`" yazsanız bile, arka planda standart kütüphane (libstdc++ gibi) kendisi için bellek yöneticisini (allocator) ve diğer dahili veri yapılarını kurar. Bu ilk "kenar yükü" (overhead), genellikle 72 KB civarında bir bellek bloğunun işletim sisteminden talep edilmesine neden olur ve bu, sadece 4 baytlık gerçek tahsisinizden çok daha büyüktür.

Bu durum sadece C++'a mı özgü?

Hayır, benzer bir davranışı başka dillerde de görebilirsiniz. Örneğin, Java (JVM) veya Python yorumlayıcısı da başlangıçta kendi çalışma ortamını oluşturmak için önemli miktarda bellek tahsis eder. Ancak, 72 KB gibi spesifik bir değer, genellikle C++'ın bellek yönetimi için kullandığı "arena" veya "heap"'in başlangıç boyutuyla ilgilidir ve bu, C++ standart kütüphanesinin bir uygulama detayıdır.

Bu durum performansı veya programın doğruluğunu etkiler mi?

Genellikle hayır. Bu tek seferlik bir başlangıç maliyetidir ve modern sistemlerde önemsiz düzeydedir. Programınız çalışmaya devam ettikçe yapılan sonraki tahsisler beklediğiniz boyutlarda olacaktır. Performans kritik uygulamalar geliştiriyorsanız, bellek profili oluşturucu kullanmak çok daha önemli hale gelir. Mewayz'in 207 modüllük paketi, bu tür detaylı bellek analizleri için kapsamlı araçlar sunarak performans darboğazlarınızı anlamanıza yardımcı olabilir.

Bu tahsis edilen 72 KB'lık alanın tamamını kullanabilir miyim?

Evet, dolaylı olarak kullanırsınız. Bu blok, çalışma zamanı tarafından bir "hafıza havuzu" olarak ayrılır. Sonraki küçük bellek tahsisleriniz (örneğin, daha fazla `new` veya `malloc` çağrıları), işletim sistemine yeni bir çağrı yapmak yerine genellikle bu önceden ayrılmış 72 KB'lık bloktan karşılanır. Bu, sık ve küçük tahsislerin maliyetini azaltan bir optimizasyondur. Blok tükendiğinde, yeni ve daha büyük bir blok tahsis edilir.

# C++ Bellek Tahsisi Hakkında SSS

Sıkça Sorulan Sorular

Neden basit bir C++ programı 72 KB bellek kullanır?

C++ programları çalıştırıldığında, işletim sistemi programın temel ihtiyaçları için bir miktar bellek ayırır. Bu 72 KB'lık alan, standart kütüphanelerin yüklenmesi, çalışma zamanı ortamının hazırlanması ve diğer sistem kaynaklarının tahsis edilmesi için kullanılır. Bu, programınızın sadece kodunuzu değil, aynı zamanda C++'ın temel altyapısını da içerdiğini gösterir.

Bu bellek kullanımı performansı etkiler mi?

Modern bilgisayarlarda 72 KB bellek kullanımı performans üzerinde ölçülebilir bir etki yaratmaz. Ancak bu temel tahsisin önemi, programınız büyüdükçe ve daha karmaşık hale geldikçe artar. Bellek yönetimi optimizasyonu için Mewayz gibi araçlar kullanarak daha detaylı analiz yapabilirsiniz.

Bu bellek tahsisi nasıl optimize edilebilir?

Optimizasyon için öncelikle programınızın bellek kullanım profilini çıkarmanız gerekir. Mewayz gibi araçlar bu konuda size yardımcı olabilir. Standart kütüphanelerin alternatiflerini kullanmak veya sadece ihtiyaç duyduğunuz modülleri içe aktarmak da bellek kullanımını azaltmaya yardımcı olabilir.

Bu durum tüm C++ derleyicileri için geçerli mi?

Evet, bu temel bellek tahsisi durumu genellikle tüm modern C++ derleyicileri için geçerlidir. Ancak tahsis edilen bellek miktarı işletim sistemine, derleyiciye ve kullanılan kütüphanelere göre küçük farklılıklar gösterebilir. Bu durum C++ dilinin doğasında bulunan bir özelliktir.

Frequently Asked Questions

72 KB'lık bu tahsisin tam açıklaması nedir?

Bu 72 KB'lık alan, programınızın çalışması için gerekli olan C++ çalışma zamanının (runtime) başlatılması sırasında ayrılır. "Yığın" (heap) olarak bilinen dinamik bellek havuzunun başlatılması, ön belleğe alma mekanizmalarının (allocation caches) kurulması ve çeşitli dahili kitaplık verileri için kullanılır. Kısacası, bu tahsis sadece sizin `new` operatörünüz için değil, tüm gelecek bellek işlemleriniz için bir altyapı oluşturur ve tek seferlik bir maliyettir.

Bu miktar neden tam olarak 72 KB? Bu sabit bir değer mi?

72 KB sabit bir değer değildir; kullandığınız standart kitaplık uygulamasına (örneğin glibc'nin malloc'i), işletim sistemine ve platforma bağlı olarak değişiklik gösterebilir. 72 KB, glibc'nin belirli versiyonlarında "main arena" adı verilen ve birden fazla küçük tahsis için önbellek görevi gören bir bellek havuzunun başlangıç boyutudur. Farklı bir sistemde 64 KB veya 128 KB gibi bir değer görmeniz mümkündür.

Bu bellek tahsisini nasıl doğrulayabilirim veya detaylarını nasıl görebilirim?

Bu tahsisin ayrıntılarını görmenin en basit yolu, programınızı `strace` aracılığıyla çalıştırmak ve `brk` veya `mmap` sistem çağrılarını incelemektir. Daha detaylı bellek profili oluşturma için, Mewayz gibi araçlar (207'den fazla modül ve aylık 19$ başlangıç fiyatıyla) size tahsis edilen belleğin tam olarak nereye gittiğini, yığın ayrıntılarını ve potansiyel sızıntıları görselleştirme imkanı sunar.

Bu 72 KB'lık tahsis performansı olumsuz etkiler mi ve bundan kaçınabilir miyim?

Tek seferlik bu başlangıç maliyeti, modern sistemlerde genellikle önemsizdir ve performansı gözle görülür şekilde etkilemez. Bu, dinamik bellek yönetiminin kaçınılmaz bir parçasıdır. Bu tahsisten "kaçınmak" pratik değildir çünkü programınız `new` veya `malloc` kullanıyorsa bu altyapıya ihtiyaç duyar. Ancak, Mewayz gibi bir profil oluşturucu kullanarak genel bellek kullanımınızı optimize ederek bu sabit maliyeti telafi edebilirsiniz.

Mewayz'ı Ücretsiz Deneyin

CRM, faturalama, projeler, İK ve daha fazlası için tümü bir arada platform. Kredi kartı gerekmez.

İşinizi daha akıllı yönetmeye bugün başlayın

30,000+ işletmeye katılın. Sonsuza kadar ücretsiz plan · Kredi kartı gerekmez.

Bunu yararlı buldunuz mu? Paylaş.

Hazır mısınız bunu pratiğe dökmeye?

Mewayz kullanan 30,000+ işletmeye katılın. Süresiz ücretsiz plan — kredi kartı gerekmez.

Ücretsiz Denemeyi Başlat →

Harekete geçmeye hazır mısınız?

Mewayz ücretsiz denemenizi bugün başlatın

Hepsi bir arada iş platformu. Kredi kartı gerekmez.

Ücretsiz Başla →

14 günlük ücretsiz deneme · Kredi kartı yok · İstediğiniz zaman iptal edin