2017-05-02 36 views
11

Tôi không thể tìm thấy một nguồn toàn diện có thể giải thích khái niệm một cách rõ ràng. Sự hiểu biết của tôi là một sợi được đưa ra một số đoạn bộ nhớ trong eden, nơi nó phân bổ các đối tượng mới. Một chủ đề cạnh tranh sẽ kết thúc có một đoạn hơi liên tục của eden. Điều gì sẽ xảy ra nếu luồng đầu tiên chạy ra khỏi khu vực miễn phí trong TLAB của nó? Nó sẽ yêu cầu một đoạn mới của eden?TLAB (Bộ đệm phân bổ địa phương chủ đề) là gì?

+0

Về câu hỏi cuối cùng của bạn, tôi đoán rằng TLAB mới được phân bổ cho chuỗi. Hãy suy nghĩ về việc phân bổ TLAB thay vì các mẩu bộ nhớ nhỏ như một sự tối ưu hóa đơn giản làm cho luồng công việc thường xuyên cục bộ thay vì yêu cầu khóa. – maaartinus

Trả lời

15

Ý tưởng về TLAB là giảm nhu cầu đồng bộ hóa giữa các chuỗi. Sử dụng TLABs, nhu cầu này được giảm khi bất kỳ luồng nào có một vùng mà nó có thể sử dụng và mong đợi rằng nó là luồng chỉ sử dụng vùng này. Giả sử rằng một TLAB có thể chứa 100 đối tượng, một luồng chỉ cần có một khóa để yêu cầu thêm bộ nhớ khi phân bổ đối tượng 101. Nếu không có TLAB, điều này sẽ được yêu cầu cho mọi đối tượng. Nhược điểm của khóa học là bạn có khả năng lãng phí không gian.

Các đối tượng lớn thường được phân bổ bên ngoài TLAB vì chúng làm mất hiệu lực của việc giảm tần suất cấp phát bộ nhớ đồng bộ. Một số đối tượng có thể thậm chí không vừa với một TLAB.

Bạn có thể đặt kích thước của TLAB bằng cờ -XX:TLABSize nhưng nói chung tôi không khuyên bạn nên gây rối với các cài đặt này trừ khi bạn thực sự phát hiện ra sự cố mà bạn có thể giải quyết.

+0

Cảm ơn. 1) Khi một thread phân bổ một TLAB nó vẫn phải có được một khóa để một thread cạnh tranh sẽ không phân bổ một TLAB tại cùng một khu vực mà thread đầu tiên đã làm. Giả định đó có đúng không? 2) Việc phân bổ một đối tượng bên ngoài TLAB luôn đắt tiền vì phải có khóa để phân bổ mỗi đối tượng mới không phù hợp với TLAB? – user1745356

+1

Hãy suy nghĩ về chủ đề 1 tuyên bố một TLABfrom bù đắp 0 đến 99 và thread 2 tuyên bố một từ offsets 100-199. Hợp đồng nói rằng một khi tuyên bố, thread 2 không thể phân bổ trong 0-99 và thread 1 không thể phân bổ trong 100-199. Không có luồng nào có thể yêu cầu không gian này làm bộ đệm phân bổ tương lai của nó. Bằng cách này, mỗi thread có thể phân bổ 100 đối tượng mà không cần đồng bộ hóa nếu mỗi đối tượng có một trong các khe giả định. Phân bổ bên ngoài một TLAB không phải là rất tốn kém nhưng nó rõ ràng là đắt hơn trong một TLAB vì nó đòi hỏi phải giao tiếp với các chủ đề khác mà có thể chạy concurrenctly. –

+0

Xin lỗi, nếu câu hỏi của tôi không rõ ràng, tôi sẽ cố gắng đặt nó theo một cách khác - nếu hai chủ đề cạnh tranh muốn cấp phát bộ nhớ cho 100 đối tượng tiếp theo và địa chỉ bộ nhớ sẵn có tiếp theo bắt đầu ở 100 thì người đầu tiên mua lại khóa sẽ nhận địa chỉ từ 100 đến 199 và chuỗi thứ hai sẽ nhận được 200 - 299. Đây có phải là chính xác không? – user1745356