2015-02-16 14 views
5

Đố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

+0

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. –

+0

@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 –

+1

Mỗi thread có stack riêng của mình. – user3386109

Trả lời

4

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); 
    ... 

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.

+0

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. –

+0

@Ngày cảm ơn, đã khắc phục –

1

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 đó.

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