Bạn đang nhìn vào anh chàng đã đưa ra lựa chọn đó. David Cutler và nhóm của ông đã chọn một megabyte làm kích thước ngăn xếp mặc định. Không có gì để làm với .NET hoặc C #, điều này đã được đóng đinh khi họ tạo Windows NT. Một megabyte là những gì nó chọn khi tiêu đề EXE của một chương trình hoặc lệnh gọi CreateThread () winapi không chỉ định kích thước ngăn xếp một cách rõ ràng. Đó là cách bình thường, hầu như bất kỳ lập trình viên nào để hệ điều hành chọn kích thước.
Sự lựa chọn đó có lẽ đã có từ trước khi thiết kế Windows NT, lịch sử quá mờ mịt về điều này. Sẽ rất tuyệt nếu Cutler viết một cuốn sách về nó, nhưng anh ấy chưa bao giờ là một nhà văn. Anh ấy có ảnh hưởng cực kỳ lớn đến cách máy tính hoạt động. Thiết kế hệ điều hành đầu tiên của ông là RSX-11M, một hệ điều hành 16 bit dành cho máy tính DEC (Digital Equipment Corporation). Nó ảnh hưởng nặng nề đến CP / M của Gary Kildall, hệ điều hành tốt đầu tiên dành cho vi xử lý 8-bit. Ảnh hưởng nặng nề đến MS-DOS.
Thiết kế tiếp theo của ông là VMS, một hệ điều hành dành cho bộ vi xử lý 32-bit có hỗ trợ bộ nhớ ảo. Rất thành công. Chiếc tiếp theo của anh đã bị DEC hủy bỏ vào khoảng thời gian công ty bắt đầu tan rã, không thể cạnh tranh với phần cứng PC giá rẻ. Cue Microsoft, họ đã đưa cho anh một lời đề nghị mà anh không thể từ chối. Nhiều đồng nghiệp của anh ấy cũng tham gia. Họ đã làm việc trên VMS v2, hay còn gọi là Windows NT. DEC đã thất vọng về điều đó, tiền đã được thay thế để giải quyết nó. Tôi không biết VMS đã chọn một megabyte hay chưa, tôi chỉ biết RSX-11 là đủ. Nó không khó.
Lịch sử đủ rồi. Một megabyte là rất nhiều , một luồng thực hiếm khi tiêu thụ nhiều hơn một vài kilobyte. Vì vậy, một megabyte thực sự khá lãng phí. Tuy nhiên, đó là loại lãng phí bạn có thể mua được trên hệ điều hành bộ nhớ ảo phân trang theo yêu cầu, megabyte chỉ là bộ nhớ ảo . Chỉ số cho bộ xử lý, mỗi số cho mỗi 4096 byte. Bạn không bao giờ thực sự sử dụng bộ nhớ vật lý, RAM trong máy, cho đến khi bạn thực sự xử lý nó.
Nó quá thừa trong chương trình .NET vì kích thước một megabyte ban đầu được chọn để chứa các chương trình gốc. Có xu hướng tạo các khung ngăn xếp lớn, lưu trữ các chuỗi và bộ đệm (mảng) trên ngăn xếp. Nổi tiếng là vectơ tấn công phần mềm độc hại, lỗi tràn bộ đệm có thể thao túng chương trình bằng dữ liệu. Không phải cách các chương trình .NET hoạt động, các chuỗi và mảng được phân bổ trên GC heap và việc lập chỉ mục được kiểm tra. Cách duy nhất để phân bổ không gian trên ngăn xếp với C # là sử dụng từ khóa stackalloc không an toàn .
Cách sử dụng không tầm thường duy nhất của ngăn xếp trong .NET là do jitter. Nó sử dụng ngăn xếp luồng của bạn để biên dịch MSIL thành mã máy trong thời gian ngắn. Tôi chưa bao giờ thấy hoặc kiểm tra xem nó yêu cầu bao nhiêu dung lượng, nó phụ thuộc vào bản chất của mã và liệu trình tối ưu hóa có được bật hay không, nhưng vài chục kilobyte là một phỏng đoán sơ bộ. Đó là cách khác mà trang web này có tên như vậy, tràn ngăn xếp trong chương trình .NET là khá nghiêm trọng. Không còn đủ dung lượng (ít hơn 3 kilobyte) để vẫn JIT một cách đáng tin cậy bất kỳ mã nào cố gắng bắt ngoại lệ. Kaboom cho máy tính để bàn là lựa chọn duy nhất.
Cuối cùng nhưng không kém phần quan trọng, một chương trình .NET thực hiện một điều gì đó khá kém hiệu quả với ngăn xếp. CLR sẽ cam kết ngăn xếp của một luồng. Đó là một từ đắt có nghĩa là nó không chỉ bảo lưu kích thước của ngăn xếp mà còn đảm bảo rằng không gian được dành riêng trong tệp hoán trang của hệ điều hành để ngăn xếp luôn có thể được hoán đổi khi cần thiết. Không thực hiện là một lỗi nghiêm trọng và chấm dứt chương trình vô điều kiện. Điều đó chỉ xảy ra trên máy có rất ít RAM chạy hoàn toàn quá nhiều quy trình, một máy như vậy sẽ chuyển sang trạng thái nóng trước khi các chương trình bắt đầu chết. Một vấn đề có thể xảy ra cách đây hơn 15 năm, không phải ngày nay. Các lập trình viên điều chỉnh chương trình của họ để hoạt động giống như một chiếc xe đua F1 sử dụng <disableCommitThreadStack>
phần tử trong tệp .config của họ.
Fwiw, Cutler không ngừng thiết kế hệ điều hành. Bức ảnh đó được thực hiện khi anh ấy làm việc trên Azure.
Cập nhật, tôi nhận thấy rằng .NET không còn cam kết ngăn xếp. Không chắc chính xác khi nào hoặc tại sao điều này xảy ra, đã quá lâu tôi không kiểm tra. Tôi đoán rằng thay đổi thiết kế này đã xảy ra ở đâu đó xung quanh .NET 4.5. Thay đổi khá hợp lý.
Thread
tạo. NHƯNG, điều này đặt ra câu hỏi, tại sao bạn cần một ngăn xếp lớn hơn?