Ви дивитесь на хлопця, який зробив цей вибір. Девід Катлер та його команда вибрали один мегабайт як розмір стека за замовчуванням. Нічого спільного з .NET або C #, це було прибито під час створення Windows NT. Один мегабайт - це те, що він вибирається, коли заголовок EXE програми або виклик CreateThread () winapi не вказує чітко розмір стека. Це нормальний спосіб, майже будь-який програміст залишає його в ОС, щоб вибрати розмір.
Цей вибір, мабуть, заздалегідь датується дизайном Windows NT, історія надто мутна щодо цього. Було б добре, якби Катлер написав про це книгу, але він ніколи не був письменником. Він надзвичайно впливає на роботу комп'ютерів. Першим його дизайном ОС була RSX-11M, 16-бітна операційна система для комп'ютерів DEC (Digital Equipment Corporation). Це сильно вплинуло на CP / M Gary Kildall, першу гідну ОС для 8-бітних мікропроцесорів. Що сильно вплинуло на MS-DOS.
Наступним його дизайном став VMS, операційна система для 32-бітних процесорів з підтримкою віртуальної пам'яті. Дуже вдало. Наступний його проект був скасований DEC приблизно в той час, коли компанія почала розпадатися, не маючи можливості конкурувати з дешевим обладнанням для ПК. Cue Microsoft, вони зробили йому пропозицію, від якої він не міг відмовити. Багато його співробітників теж приєдналися. Вони працювали над VMS v2, більш відомим як Windows NT. ОВК засмутилася з цього приводу, гроші змінили руки, щоб його врегулювати. Чи вибрано VMS вже один мегабайт, я не знаю, я знаю лише RSX-11 досить добре. Це малоймовірно.
Досить історії. Один мегабайт - це багато , справжня нитка рідко споживає більше ніж пару жменьків кілобайт. Тож мегабайт насправді досить марнотратний. Однак мегабайт - це лише віртуальна пам'ять . Просто числа в процесор, по одному на кожні 4096 байт. Ви ніколи фактично не використовуєте фізичну пам'ять, оперативну пам’ять в апараті, поки ви фактично не вирішите це питання.
Це дуже надмірно в програмі .NET, оскільки розмір одного мегабайти спочатку був підібраний для розміщення нативних програм. Які, як правило, створюють великі кадри стека, зберігаючи також рядки та буфери (масиви). Ганебний тим, що є атакою зловмисного програмного забезпечення, переповнення буфера може маніпулювати програмою даними. Не спосіб роботи програм .NET, рядки та масиви розподіляються на купі GC і перевіряється індексація. Єдиний спосіб виділити простір у стеці за допомогою C # - це за допомогою небезпечного ключового слова stackalloc .
Єдине нетривіальне використання стека в .NET - це тремтіння. Він використовує стек вашого потоку, щоб вчасно скласти MSIL в машинний код. Я ніколи не бачив і не перевіряв, скільки місця йому потрібно, це скоріше залежить від характеру коду та того, чи включений оптимізатор чи ні, але пара десятків кілобайт - це груба здогадка. Інакше, як цей веб-сайт отримав свою назву, переповнення стека в програмі .NET цілком фатально. Не вистачає місця (менше ніж 3 кілобайт), щоб все-таки надійно JIT будь-який код, який намагається зловити виняток. Kaboom на робочий стіл - єдиний варіант.
І останнє, але не менш важливе, програма .NET робить щось досить непродуктивне зі стеком. CLR буде здійснювати стек потоку. Це дороге слово, яке означає, що воно не просто резервує розмір стека, але також гарантує, що простір зарезервовано у файлі підключення операційної системи, щоб стек завжди можна було замінити, коли це необхідно. Невиконання - це фатальна помилка і безумовно припиняє програму. Це відбувається лише на машині з дуже малою оперативною пам’яттю, яка запускає надто багато процесів, така машина перетвориться на патоку, перш ніж програми почнуть вмирати. Можлива проблема 15+ років тому, а не сьогодні. Програмісти, які налаштовують свою програму, щоб діяти як гоночний автомобіль F1, використовують <disableCommitThreadStack>
елемент у файлі .config.
Fwiw, Cutler не припиняли проектувати операційні системи. Це фото було зроблено, коли він працював на Azure.
Оновлення, я помітив, що .NET більше не здійснює стек. Не зовсім впевнений, коли або чому це сталося, пройшло вже дуже давно, як я перевірив. Я здогадуюсь, що ця зміна дизайну сталася десь біля .NET 4.5. Досить розумна зміна.
Thread
конструктора. АЛЕ, це ставить питання, навіщо вам більший стек?