Kích thước ngăn xếp mặc định cho pthreads


24

Theo tôi hiểu, kích thước ngăn xếp mặc định cho pthread trên Linux là 16K. Tôi nhận được kết quả lạ khi cài đặt Ubuntu 64 bit.

$ ulimit -s
8192

Cũng thế:

pthread_attr_init(&attr);
pthread_attr_getstacksize(&attr, &stacksize);
printf("Thread stack size = %d bytes \n", stacksize);

Prints
    Thread stack size = 8388608 bytes

Tôi khá chắc chắn rằng kích thước ngăn xếp không phải là "8388608". Điều gì có thể sai?


7
Tôi nghĩ 8388608 / 1024 = 8192.
cuonglm

6
Bạn đang nghĩ về 16k cho mỗi ngăn xếp kernel . Vấn đề hoàn toàn riêng biệt từ bộ nhớ ngăn xếp không gian người dùng. ngăn xếp hạt nhân rất nhỏ vì chúng không thể được phân trang, hoặc được phân bổ lười biếng và phải là các trang liền kề trong bộ nhớ vật lý. elinux.org/Kernel_Small_Stacks . Có số lượng chủ đề rất lớn có thể là một vấn đề đối với i386, trong đó không gian địa chỉ bị giới hạn, đặc biệt là với các ngăn xếp 8k theo mặc định cho 32 bit.
Peter Cordes

Câu trả lời:


21
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

Các stacksizethuộc tính sẽ xác định kích thước tối thiểu ngăn xếp (theo byte) được phân bổ cho các chủ đề chồng tạo ra.

Trong ví dụ của bạn, kích thước ngăn xếp được đặt thành 8388608 byte tương ứng với 8MB, như được trả về bởi lệnh ulimit -s So khớp.

Từ pthread_create()mô tả:

Trên Linux / x86-32 , kích thước ngăn xếp mặc định cho một luồng mới là 2 megabyte . Trong triển khai luồng NPTL, nếu giới hạn tài nguyên mềm RLIMIT_STACK tại thời điểm chương trình bắt đầu có bất kỳ giá trị nào ngoài "không giới hạn", thì nó sẽ xác định kích thước ngăn xếp mặc định của các luồng mới. Sử dụng pthread_attr_setstacksize (3), thuộc tính kích thước ngăn xếp có thể được đặt rõ ràng trong đối số attr được sử dụng để tạo một luồng, để có được kích thước ngăn xếp khác với mặc định.

Vì vậy, kích thước ngăn xếp luồng có thể được đặt thông qua chức năng đặt ở trên hoặc thuộc tính ulimithệ thống. Đối với 16k bạn đang đề cập, không rõ bạn đã thấy nền tảng nào và / hoặc nếu có bất kỳ giới hạn hệ thống nào được đặt cho việc này.

Xem trang pthread_createở đây để biết một số ví dụ thú vị về điều này.


47

Trên thực tế, kích thước ngăn xếp ảo của bạn 8388608 byte (8 MB). Tất nhiên, thật tự nhiên khi kết luận rằng điều này không thể đúng, bởi vì đó là một lượng lớn bộ nhớ cho mỗi luồng tiêu thụ cho ngăn xếp của nó khi 99% thời gian một vài KB có lẽ là tất cả những gì họ cần.

Tin tốt là chủ đề của bạn chỉ sử dụng lượng bộ nhớ vật lý mà nó thực sự cần. Đây là một trong những sức mạnh kỳ diệu mà HĐH của bạn có được từ việc sử dụng Bộ quản lý bộ nhớ phần cứng (MMU) trong bộ xử lý của bạn. Đây là những gì xảy ra:

  1. HĐH phân bổ 8 MB bộ nhớ ảo cho ngăn xếp của bạn bằng cách thiết lập các bảng trang của MMU cho luồng của bạn. Điều này đòi hỏi rất ít RAM để chỉ giữ các mục trong bảng trang.

  2. Khi luồng của bạn chạy và cố gắng truy cập một địa chỉ ảo trên ngăn xếp chưa có trang vật lý được gán cho nó, một ngoại lệ phần cứng được gọi là "lỗi trang" được MMU kích hoạt.

  3. Lõi CPU đáp ứng với ngoại lệ lỗi trang bằng cách chuyển sang chế độ thực thi đặc quyền (có ngăn xếp riêng) và gọi hàm xử lý ngoại lệ lỗi trang bên trong kernel.

  4. Nhân phân bổ một trang RAM vật lý cho trang bộ nhớ ảo đó và quay trở lại luồng không gian người dùng.

Các luồng không gian người dùng không thấy công việc đó. Từ quan điểm của nó, nó chỉ sử dụng ngăn xếp như thể bộ nhớ ở đó cùng. Trong khi đó, ngăn xếp tự động phát triển (hoặc không) để đáp ứng nhu cầu của luồng.

MMU là một phần quan trọng trong phần cứng của các hệ thống máy tính ngày nay. Đặc biệt, nó chịu trách nhiệm cho rất nhiều "ma thuật" trong hệ thống, vì vậy tôi khuyên bạn nên tìm hiểu thêm về những gì MMU làm và về bộ nhớ ảo nói chung. Ngoài ra, nếu ứng dụng của bạn nhạy cảm với hiệu suất và xử lý một lượng dữ liệu đáng kể, bạn nên hiểu cách thức hoạt động của TLB (bộ đệm bảng trang của MMU) và cách bạn có thể cơ cấu lại dữ liệu hoặc thuật toán của mình để tối đa hóa tốc độ truy cập TLB.

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.