คุณกำลังมองหาผู้ชายที่เลือกนั้น David Cutler และทีมของเขาเลือกหนึ่งเมกะไบต์เป็นขนาดสแต็กเริ่มต้น ไม่มีส่วนเกี่ยวข้องกับ. NET หรือ C # แต่สิ่งนี้ถูกตอกลงเมื่อสร้าง Windows NT หนึ่งเมกะไบต์คือสิ่งที่เลือกเมื่อส่วนหัว EXE ของโปรแกรมหรือการเรียก winapi ของ CreateThread () ไม่ได้ระบุขนาดสแต็กอย่างชัดเจน ซึ่งเป็นวิธีปกติโปรแกรมเมอร์เกือบทุกคนทิ้งระบบปฏิบัติการเพื่อเลือกขนาด
ทางเลือกนั้นอาจจะมีการออกแบบ Windows NT ไว้ล่วงหน้าประวัติก็มืดมนเกินไปเกี่ยวกับเรื่องนี้ คงจะดีถ้ามีดจะเขียนหนังสือเกี่ยวกับเรื่องนี้ แต่เขาไม่เคยเป็นนักเขียน เขามีอิทธิพลอย่างมากต่อการทำงานของคอมพิวเตอร์ การออกแบบระบบปฏิบัติการครั้งแรกของเขาคือ RSX-11M ซึ่งเป็นระบบปฏิบัติการ 16 บิตสำหรับคอมพิวเตอร์ DEC (Digital Equipment Corporation) มันมีอิทธิพลอย่างมากต่อ CP / M ของ Gary Kildall ซึ่งเป็นระบบปฏิบัติการที่ดีตัวแรกสำหรับไมโครโปรเซสเซอร์ 8 บิต ซึ่งมีอิทธิพลอย่างมากต่อ MS-DOS
การออกแบบต่อไปของเขาคือ VMS ซึ่งเป็นระบบปฏิบัติการสำหรับโปรเซสเซอร์ 32 บิตที่รองรับหน่วยความจำเสมือน ประสบความสำเร็จมาก DEC คนต่อไปของเขาถูกยกเลิกโดย DEC ในช่วงที่ บริษัท เริ่มสลายตัวโดยไม่สามารถแข่งขันกับฮาร์ดแวร์พีซีราคาถูกได้ คิว Microsoft พวกเขายื่นข้อเสนอที่เขาไม่สามารถปฏิเสธได้ เพื่อนร่วมงานของเขาหลายคนเข้าร่วมด้วย พวกเขาทำงานบน VMS v2 หรือที่รู้จักกันดีในชื่อ Windows NT ธ . ค. ไม่พอใจเงินเปลี่ยนมือเพื่อชำระหนี้ ไม่ว่า VMS จะเลือกหนึ่งเมกะไบต์แล้วหรือยังฉันไม่รู้ แต่ฉันรู้จัก RSX-11 ดีพอ มันไม่น่าเป็นไปได้
พอมีประวัติ. หนึ่งเมกะไบต์เป็นจำนวนมากเธรดจริงแทบจะไม่กินเนื้อที่มากกว่าสองกำมือของกิโลไบต์ เมกะไบต์จึงค่อนข้างสิ้นเปลือง แต่มันเป็นชนิดของเสียที่คุณสามารถจ่ายได้บนระบบปฏิบัติการความต้องการเพจหน่วยความจำเสมือนเมกะไบต์ที่เป็นเพียงหน่วยความจำเสมือน เพียงแค่ตัวเลขไปยังโปรเซสเซอร์แต่ละตัวสำหรับทุกๆ 4096 ไบต์ คุณไม่เคยใช้หน่วยความจำจริงแรมในเครื่องจนกว่าคุณจะจัดการกับมันจริงๆ
โปรแกรม. NET มีมากเกินไปเนื่องจากเดิมมีการเลือกขนาดหนึ่งเมกะไบต์เพื่อรองรับโปรแกรมเนทีฟ ซึ่งมักจะสร้างสแต็กเฟรมขนาดใหญ่เก็บสตริงและบัฟเฟอร์ (อาร์เรย์) บนสแตกด้วย น่าอับอายในการเป็นเวกเตอร์การโจมตีของมัลแวร์บัฟเฟอร์ล้นสามารถจัดการโปรแกรมด้วยข้อมูล ไม่ใช่วิธีการทำงานของโปรแกรม. NET สตริงและอาร์เรย์จะถูกจัดสรรบนฮีป GC และการจัดทำดัชนีจะถูกตรวจสอบ วิธีเดียวที่จะจัดสรรพื้นที่ในกองด้วย C # นั้นอยู่กับคนที่ไม่ปลอดภัยstackallocคำหลัก
การใช้งานสแต็กใน. NET ที่ไม่สำคัญเพียงอย่างเดียวคือการกระวนกระวายใจ ใช้สแต็กของเธรดของคุณเพื่อคอมไพล์ MSIL เข้ากับรหัสเครื่อง ฉันไม่เคยเห็นหรือตรวจสอบว่าต้องใช้พื้นที่เท่าใด แต่ขึ้นอยู่กับลักษณะของโค้ดและเปิดใช้งานเครื่องมือเพิ่มประสิทธิภาพหรือไม่ แต่สองสามสิบกิโลไบต์เป็นการเดาคร่าวๆ ซึ่งไม่เช่นนั้นเว็บไซต์นี้มีชื่ออย่างไรสแตกล้นในโปรแกรม. NET นั้นค่อนข้างร้ายแรง มีพื้นที่ว่างไม่เพียงพอ (น้อยกว่า 3 กิโลไบต์) ที่จะยังคง JIT โค้ดที่พยายามจับข้อยกเว้นได้อย่างน่าเชื่อถือ Kaboom ไปยังเดสก์ท็อปเป็นตัวเลือกเดียว
สุดท้าย แต่ไม่ท้ายสุดโปรแกรม. NET ทำสิ่งที่ไม่เป็นประโยชน์กับสแต็ก CLR จะคอมมิตสแต็กของเธรด นั่นเป็นคำที่มีราคาแพงซึ่งหมายความว่าไม่เพียงแค่สงวนขนาดของสแต็กเท่านั้น แต่ยังตรวจสอบให้แน่ใจว่ามีการสงวนพื้นที่ไว้ในไฟล์เพจของระบบปฏิบัติการเพื่อให้สามารถสลับสแตกได้เมื่อจำเป็น การไม่ยอมรับถือเป็นข้อผิดพลาดร้ายแรงและยุติโปรแกรมโดยไม่มีเงื่อนไข สิ่งนี้เกิดขึ้นเฉพาะกับเครื่องที่มี RAM น้อยมากซึ่งรันกระบวนการมากเกินไปโดยสิ้นเชิงเครื่องดังกล่าวจะเปลี่ยนเป็นกากน้ำตาลก่อนที่โปรแกรมจะเริ่มตาย ปัญหาที่อาจเกิดขึ้นเมื่อ 15 ปีก่อนไม่ใช่วันนี้ โปรแกรมเมอร์ที่ปรับแต่งโปรแกรมให้ทำหน้าที่เหมือนรถแข่ง F1 ใช้<disableCommitThreadStack>
องค์ประกอบในไฟล์. config
Fwiw, Cutler ไม่ได้หยุดออกแบบระบบปฏิบัติการ ภาพนั้นถูกสร้างขึ้นในขณะที่เขาทำงานกับ Azure
อัปเดตฉันสังเกตเห็นว่า. NET ไม่คอมมิตสแต็กอีกต่อไป ไม่แน่ใจว่าเกิดขึ้นเมื่อใดหรือเพราะเหตุใดฉันตรวจสอบนานเกินไปแล้ว ฉันเดาว่าการเปลี่ยนแปลงการออกแบบนี้เกิดขึ้นที่ไหนสักแห่งใน. NET 4.5 การเปลี่ยนแปลงที่สมเหตุสมผล
Thread
ตัวสร้าง แต่สิ่งนี้ทำให้เกิดคำถามว่าทำไมคุณถึงต้องการกองขนาดใหญ่?