Tại sao trên Linux hiện đại, kích thước ngăn xếp mặc định rất lớn - 8 MB (thậm chí 10 trên một số bản phân phối)


10

Ví dụ: trên OSX, nó thậm chí còn dưới 512k.

Có bất kỳ kích thước được đề xuất nào, trong tâm trí, ứng dụng không sử dụng đệ quy và không phân bổ nhiều biến stack ?
Tôi biết câu hỏi quá rộng và nó phụ thuộc nhiều vào cách sử dụng, nhưng vẫn muốn hỏi, vì tôi tự hỏi liệu có một số lý do ẩn / nội bộ / hệ thống đằng sau con số khổng lồ này.


Tôi đã tự hỏi, vì tôi dự định thay đổi kích thước ngăn xếp thành 512 KiB trong ứng dụng của mình - đây vẫn là một con số khổng lồ cho việc này, nhưng nó nhỏ hơn 8MiB - và sẽ làm giảm đáng kể bộ nhớ ảo của quá trình, vì tôi có rất nhiều chủ đề (I / O).

Tôi cũng biết điều này không thực sự gây tổn thương, được giải thích rõ ở đây : Kích thước ngăn xếp mặc định cho pthreads


Bạn đang sử dụng CPU 32 bit? CPU X86_64 cung cấp không gian địa chỉ ảo lên tới 128 terabyte (trong không gian người dùng), đủ cho nhiều ngăn xếp 8 MB.
Johan Myréen

@ JohanMyréen - không, x64 là vậy. Đó không phải là một vấn đề lớn, tôi chỉ tự hỏi, không có lý do thực sự để làm điều đó (vào lúc này).
Kiril Kirov

Năm 2019 và 8 MiB có nhiều bộ nhớ? Tôi không nghĩ vậy. Có kích thước ngăn xếp mặc định lớn giúp việc viết chương trình với đệ quy rất dễ dàng. Tôi đã rất ngạc nhiên khi biết kích thước ngăn xếp mặc định trên Windows chỉ là 1MiB!
oldherl

Câu trả lời:


15

Như những người khác đã nói, và như được đề cập trong liên kết mà bạn cung cấp trong câu hỏi của mình, việc có một ngăn xếp 8MiB không ảnh hưởng gì (ngoài việc tiêu thụ không gian địa chỉ - trên hệ thống 64 bit không thành vấn đề).

Linux đã sử dụng ngăn xếp 8MiB trong một thời gian rất dài; thay đổi đã được giới thiệu trong phiên bản 1.3.7 của kernel, vào tháng 7 năm 1995. Trước đó, nó được trình bày dưới dạng giới hạn, trước đây không có:

Giới hạn ngăn xếp theo một số mặc định lành mạnh: root luôn có thể tăng giới hạn này nếu cần .. 8MB có vẻ hợp lý.

Trên Linux, giới hạn ngăn xếp cũng ảnh hưởng đến kích thước của các đối số chương trình và môi trường, được giới hạn ở một phần tư giới hạn ngăn xếp ; hạt nhân thi hành tối thiểu 32 trang cho các đối số và môi trường.

Đối với các luồng, nếu giới hạn ngăn xếp ( RLIMIT_STACK) là không giới hạn, hãy pthread_createáp dụng các giới hạn của chính nó cho các ngăn xếp của các luồng mới - và trên hầu hết các kiến ​​trúc, đó là ít hơn 8MiB.


1
Ồ, thật thú vị. Tôi nghĩ rằng đã được giới thiệu gần đây. Tôi có khoảng 200 chủ đề (đó là một chủ đề dài khác, vì vậy hãy bỏ qua nó ngay bây giờ) và tophiển thị trong kết quả VIRT đáng sợ. Mặc dù, đào sâu hơn một chút, phần lớn không gian địa chỉ ảo này được lấy từ đấu trường trên mỗi luồng (không phải bộ nhớ), do đó, việc giảm kích thước ngăn xếp sẽ không làm giảm đáng kể bộ nhớ ảo. Tôi chỉ tò mò tại sao 8MiB và tại sao nhiều như vậy.
Kiril Kirov

"8 MB" chỉ có nghĩa là ngăn xếp của mỗi luồng có thể tăng lên 8 MB nếu luồng quyết định sử dụng nó. Nhưng bộ nhớ vật lý sẽ không được phân bổ cho đến khi bộ nhớ thực sự được sử dụng. Nếu 200 luồng của bạn sử dụng 512 KB mỗi luồng, bạn sẽ sử dụng ram vật lý 100 MB, không phải 1.6 GB.
Guntram Blohm hỗ trợ Monica

Nếu bạn không trao đổi, thì cột RES topcung cấp cho bạn câu trả lời tốt hơn nhiều cho "quá trình này thực sự sử dụng bộ nhớ nào" so với VIRT.
kbolino

1
@Guntram OP nhận thức rõ điều đó, xem link trong câu hỏi.
Stephen Kitt

1

8MB là kích thước ảo của ngăn xếp. Một lỗi trang sẽ xảy ra khi ứng dụng của bạn cố gắng sử dụng nhiều ngăn xếp hơn so với hiện tại được phân bổ. Trình xử lý lỗi trang của kernel sau đó sẽ phân bổ một trang vật lý và sau đó ứng dụng của bạn sẽ tiếp tục.

Xem /unix//a/280865/21212 để được giải thích đầy đủ.

Vì vậy, việc giảm kích thước ngăn xếp của bạn sẽ không có tác dụng trong việc giảm mức sử dụng bộ nhớ vật lý của ứng dụng.


1
Tôi đã liên kết câu trả lời này trong câu hỏi của tôi. Tôi cũng đã viết, rằng tôi biết điều này, nhưng điều này không thực sự trả lời câu hỏi. Dù sao cũng cảm ơn
Kiril Kirov

Tôi nghĩ bạn cần xem lại các tiền đề của câu hỏi và câu trả lời (không phải) này chỉ ra lý do tại sao. Bộ nhớ ảo không phải là bộ nhớ thực. Kích thước ngăn xếp có thể là 800 MB và nó sẽ không ảnh hưởng đến việc sử dụng bộ nhớ thực tế, trừ khi ứng dụng của bạn tạo ra các khung ngăn xếp có giá trị hơn 8 MB.
kbolino
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.