Đối với một cuộc gọi hàm bình thường, khung ngăn xếp được tạo và được lưu trữ trong ngăn xếp. Nhưng
Cách phân bổ bộ nhớ cho hai luồng trong một quy trình và cách xử lý khung ngăn xếp khi chuỗi gọi chức năng khác.Cách ngăn xếp hoặc bộ nhớ được phân bổ cho các luồng theo cùng một quy trình trong Linux
Trả lời
Khái niệm 'thread' hiện tại trong Linux là NPTL. NPTL sử dụng clone()
, bao bọc sys_clone()
. Phân bổ một ngăn xếp cho một 'thread' mới được xử lý trong không gian người dùng (ví dụ: libc), không phải trong hạt nhân (ví dụ: Linux). Một thư viện có thể cấp phát một ngăn xếp bằng cách sử dụng phân bổ lựa chọn (ví dụ: malloc) và sau đó gọi clone() chuyển địa chỉ này làm ngăn xếp (tất nhiên, cần phải vượt qua đầu của vùng được phân bổ, vì ngăn xếp phát triển xuống dưới nền tảng):
Không giống như fork (2), clone() cho phép quá trình con để chia sẻ các phần bối cảnh thực hiện của nó với quá trình gọi điện thoại, chẳng hạn như không gian bộ nhớ, bảng mô tả tập tin, và các bảng xử lý tín hiệu. ...
Việc sử dụng chính clone() là thực hiện các luồng: nhiều luồng điều khiển trong một chương trình chạy đồng thời trong không gian bộ nhớ dùng chung.
Khi quá trình con được tạo ra với clone(), nó thực hiện các chức năng fn (arg) ...
Đối số child_stack xác định vị trí của ngăn xếp được sử dụng bởi các tiến trình con ...
Nếu bạn muốn tìm hiểu thêm chi tiết cụ thể, hãy mở nguồn của bản phân phối của bạn pthread_create
triển khai và đọc.
Ví dụ pthread_create.c
:
int
__pthread_create_2_1 (newthread, attr, start_routine, arg)
...
struct pthread *pd = NULL;
int err = ALLOCATE_STACK (iattr, &pd);
...
và allocatestack.c:
# define ALLOCATE_STACK(attr, pd) allocate_stack (attr, pd, &stackaddr)
static int
allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
ALLOCATE_STACK_PARMS)
...
Bạn sẽ thấy rằng phân bổ chồng có một số còi và chuông, như bộ nhớ đệm và tái sử dụng các khu vực chồng, guard pages, nhưng trong cuối cùng chỉ là vùng bộ nhớ được cấp phát trong không gian người dùng.
Ok, không thể chỉnh sửa câu trả lời này, NPTL của nó và không phải NTPL. –
@Ngày cảm ơn, đã khắc phục –
Khi ai đó nhận xét mỗi chuỗi có ngăn xếp riêng. Khi hàm được gọi từ luồng đó, khung ngăn xếp mới được tạo trong ngăn xếp đó.
- 1. Cách tăng phân bổ bộ nhớ cho chương trình
- 2. C++ Phân bổ bộ nhớ trên heap và ngăn xếp?
- 3. Phân bổ bộ nhớ heap và phân vùng bộ nhớ ngăn xếp
- 4. Phân bổ bộ nhớ trong khi khởi động Linux?
- 5. theo dõi phân bổ bộ nhớ C++
- 6. Khi nào là không gian ngăn xếp được phân bổ cho các biến cục bộ?
- 7. phân bổ bộ nhớ cho con trỏ
- 8. Theo dõi các đối tượng (xếp chồng được phân bổ)
- 9. Phân bổ ngăn xếp trong C
- 10. Phân bổ bộ nhớ được sắp xếp là gì?
- 11. Làm cách nào để truy vấn lượng bộ nhớ được phân bổ trên Linux (và OSX)?
- 12. Phân bổ ngăn xếp cho chủ đề màu xanh lá cây C++
- 13. phân bổ bộ nhớ động java?
- 14. Phân bổ bộ nhớ lắp ráp
- 15. Có một không gian ngăn xếp cho mỗi luồng không?
- 16. Trường hợp được phân bổ tham chiếu biến, trong ngăn xếp hoặc trong heap?
- 17. Sử dụng phân bổ bộ nhớ động cho các mảng
- 18. Phân bổ, đệm và căn chỉnh ngăn xếp
- 19. phân bổ động của bộ nhớ
- 20. Tại sao bạn muốn phân bổ bộ nhớ trên heap thay vì ngăn xếp?
- 21. Làm thế nào để ngăn chặn lưu lượng tensorflow phân bổ toàn bộ bộ nhớ GPU?
- 22. Nhận backtrace ngăn xếp của một quy trình đang chạy
- 23. Cách mảng lớn phân bổ bộ nhớ?
- 24. C++ phân bổ đối tượng dựa trên ngăn xếp
- 25. Phân bổ bộ nhớ cho các trường công cộng và riêng tư - Cách GCC
- 26. ngăn xếp hạt nhân cho quá trình linux
- 27. zlib, deflate: Bộ nhớ phân bổ bao nhiêu bộ nhớ?
- 28. Phân bổ bộ nhớ cho một véc tơ
- 29. như thế nào một chương trình chạy trong bộ nhớ và cách bộ nhớ được xử lý bởi hệ thống
- 30. Phân bổ hơn 1.000 MB bộ nhớ trong quy trình .NET 32 bit
Không phải là câu hỏi không đúng, nhưng bạn có thể tìm kiếm câu trả lời bằng tìm kiếm của Google. –
@pranit Kothari tôi đã cố gắng nhưng dint có được answer.Like thỏa đáng nếu chúng ta tạo ra một thread, làm thế nào thread chính và lốp chia sẻ cùng chồng mới hoặc họ sử dụng hai ngăn xếp khác nhau ..etc –
Mỗi thread có stack riêng của mình. – user3386109