2013-03-11 9 views
9

Như tên của tiểu bang: Có bất kỳ "quy tắc chung" nào về kích thước của ngăn xếp hay không. Tôi đoán kích thước sẽ khác nhau tùy thuộc vào hệ điều hành, kiến ​​trúc, kích thước của bộ nhớ cache (s), bao nhiêu RAM có sẵn, v.v.Bộ nhớ ngăn xếp lớn như thế nào đối với một chương trình nhất định và có bất kỳ cờ trình biên dịch nào có thể đặt nó không?

Tuy nhiên, có thể nói chung hoặc có cách nào để tìm hiểu xem có bao nhiêu ngăn xếp, chương trình này được phép sử dụng ?. Như một câu hỏi tiền thưởng là có cách nào (với cờ biên dịch vv (suy nghĩ chủ yếu là C/C++ ở đây, nhưng cũng chung chung hơn)) rằng kích thước của ngăn xếp có thể được thiết lập để một kích thước cố định bởi người sử dụng?

Btw, tôi yêu cầu nghiêm túc về sự tò mò, tôi không gặp phải tình trạng tràn ngăn xếp. :)

+0

Số lượng ngăn xếp của một chương trình cụ thể sẽ sử dụng, nói chung là không thể xác định được (nó tương đương với [vấn đề dừng] (http://en.wikipedia.org/wiki/Halting_problem)). Bạn đang hỏi làm thế nào bạn có thể buộc một cách rõ ràng một kích thước ngăn xếp hạn chế? –

+0

Câu hỏi này có thể được bạn quan tâm http://stackoverflow.com/questions/156510/increase-stack-size-on-windows-gcc – Ganesh

+0

Trước hết cảm ơn! Nhưng tại sao điều này không thể xác định và tương đương với vấn đề dừng lại? – Andersnk

Trả lời

3

Có, bạn có thể đặt kích thước ngăn xếp, thường là cờ liên kết và tùy thuộc vào chuỗi công cụ của bạn (thường được gọi bằng tên trình biên dịch).

Bạn cũng sẽ tìm thấy một số câu hỏi hiện ở đây trên StackOverflow.

+0

'--stack' trong GCC/GNU-ld là dành riêng cho Windows. Nó không được sử dụng trên các mục tiêu khác. –

+0

@R ..: Tùy chọn có được viết khác biệt ('-stack_size') hay bạn nghĩ không có tùy chọn? –

+1

Không có tùy chọn. Trên các hệ thống unix, kích thước stack tối đa cho thread ban đầu được xác định bởi lệnh 'ulimit' /' setrlimit', nhưng trên Linux, kích thước stack dành riêng/cam kết được cố định ở khoảng 128k cộng thêm một chút phụ thuộc vào môi trường (132k hoặc 136k là tổng số điển hình). Nếu chương trình cố gắng phát triển ngăn xếp vượt ra ngoài đó, và có bộ nhớ trống, nó có thể tăng lên đến giới hạn được đặt bởi 'ulimit' /' setrlimit', nhưng không có cách nào để dự trữ hơn ~ 128k tại thời điểm 'exec' mất địa điểm. –

5

Trong Windows ngăn xếp mặc định kích thước cho một sợi là một triệu byte, bất kể hệ điều hành vv

Trong mã quản lý (C#, VB, vv), bạn có thể buộc một thread mới để có một chồng khác nhau kích thước với ctor này:

http://msdn.microsoft.com/en-us/library/5cykbwz4.aspx

Để thay đổi kích thước đống thread mặc định của chương trình Windows, cho dù đó là quản lý hay không, bạn có thể sử dụng tiện ích editbin:

http://msdn.microsoft.com/en-us/library/xd3shwhf.aspx

+1

Trên thực tế, kích thước mặc định (nếu bạn vượt qua 0 đến 'CreateThread') cũng giống như kích thước ngăn xếp của chuỗi khởi động (như được chỉ định trong tiêu đề PE). –

+0

@BenVoigt: Tôi không biết điều đó, nhưng điều đó có ý nghĩa hoàn hảo. Cảm ơn! –

+0

Chỉ cần thêm thông tin: API để tạo chủ đề gốc (cho phép chỉ định kích thước ngăn xếp) là ['CreateThread'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453.aspx) –

Các vấn đề liên quan