Meneroka sebab saiz tindanan lalai 1MB dalam C#
Dalam era memori fizikal yang berlimpah hari ini, adalah membingungkan mengapa saiz tindanan lalai C# (1MB untuk proses 32-bit dan 4MB untuk proses 64-bit) adalah sangat kecil. Pemahaman yang lebih mendalam tentang latar belakang sejarah dan pertimbangan seni binanya boleh menjawab soalan yang kelihatan ketinggalan zaman ini.
Asal usul sejarah
Keputusan untuk menggunakan 1MB sebagai saiz tindanan lalai berasal daripada pertimbangan David Cutler dan pasukannya semasa mereka bentuk Windows NT. Jangkaan adalah bahawa program asli biasanya akan memperuntukkan bingkai tindanan yang besar untuk rentetan dan penimbal, menghasilkan penggunaan sumber yang besar. Saiz tradisional ini masih digunakan hari ini, walaupun mekanisme pengurusan memori C# telah banyak dipertingkatkan.
Mekanisme ingatan maya
Dalam persekitaran memori maya dengan halaman permintaan, had saiz tindanan mempunyai kesan yang kurang. Memori maya memberikan ilusi ruang tindanan tanpa had, dan memori fizikal hanya digunakan apabila ia benar-benar diakses. Oleh itu, memperuntukkan 1MB memori tindanan maya tidak akan menduduki sumber sistem dengan ketara.
Kesan pengecualian limpahan tindanan
Dalam program .NET, tujuan utama timbunan ialah kompilasi tepat dalam masa semasa penyusunan JIT. Bergantung pada kerumitan kod dan tetapan pengoptimuman, ruang tindanan yang diperlukan untuk penyusunan JIT kadangkala mencecah puluhan ribu bait. Walau bagaimanapun, had 1MB memastikan bahawa terdapat ruang kosong yang mencukupi untuk operasi JIT untuk mengelakkan kehabisan memori dan mencetuskan pengecualian limpahan tindanan yang membawa maut.
Timbunan komited dan tidak komited
Secara sejarah, CLR akan menyerahkan timbunan benang ke fail paging sistem pengendalian, menempah ruang memori maya dan fizikal. Proses ini mungkin dikenakan penalti prestasi. Walau bagaimanapun, versi .NET terkini menggunakan pendekatan tindanan tanpa komitmen, yang hanya menyimpan ruang memori maya dan memperuntukkan memori fizikal hanya apabila ia benar-benar diakses. Perubahan ini mengurangkan overhed prestasi yang dikenakan oleh komit tindanan.
Ringkasan
Walaupun saiz tindanan lalai C# mungkin kelihatan tidak mencukupi memandangkan keupayaan perkakasan hari ini, latar belakang sejarahnya, mekanisme memori maya, pengendalian pengecualian limpahan tindanan dan pertimbangan seni bina semuanya bergabung untuk mewajarkan keputusan ini. Saiz tindanan 1MB (atau 4MB) kekal sebagai kompromi praktikal antara prestasi, penggunaan memori dan kebolehpercayaan dalam ekosistem C#.
Atas ialah kandungan terperinci Mengapa C# Mengekalkan Saiz Tindanan Lalai yang Agak Kecil?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!