2012-03-01 17 views
7

thể trùng lặp:
Would a multithreaded Java application exploit a multi-core machine very well?Dual-core sử dụng CPU w/single chủ đề Java chạy

Tôi có một thread Java đơn giản và đơn giản như thế này chạy trên máy dual-core của tôi (Môi trường Windows XP 32 bit)

public static void main(String[] strs) { 

    long j = 0; 
    for(long i = 0; i<Long.MAX_VALUE; i++) 
     j++; 

    System.out.println(j); 
    } 

Mong đợi của tôi là nó sẽ dính vào một CP duy nhất U khai thác triệt để bộ nhớ cache tốc độ cao (vì trong vòng lặp, chúng tôi tiếp tục hoạt động với biến địa phương j, do đó một sự tiêu hao CPU sẽ là 100% và khác sẽ là khá nhàn rỗi. Để tôi ngạc nhiên cả hai CPU đang được sử dụng khoảng 40% ~ 60% sau khi bắt đầu thread và việc sử dụng một CPU cao hơn một chút so với các CPU khác.

Câu hỏi của tôi là có bất kỳ cơ chế cân bằng tải nào của hệ điều hành khởi động khi phát hiện hết số dư không? Trong trường hợp của tôi là nó có thể là hệ điều hành Windows thấy rằng một CPU là đánh gần 100% và khác là gần như nhàn rỗi vì vậy nó sắp xếp lại các chủ đề cho CPU khác định kỳ?

enter image description here

# EDIT1 Tôi đã tìm thấy một lời giải thích có thể: http://siber.cankaya.edu.tr/ozdogan/OperatingSystems/ceng328/node130.html

+0

Có, hệ điều hành sẽ trả lại chủ đề xung quanh. – Mysticial

+0

Tôi nghĩ câu hỏi này đã được trả lời http://stackoverflow.com/questions/1649402/would-a-multithreaded-java-application-exploit-a-multi-core-machine-very-well – parion

+0

Và lưu ý rằng hầu hết các chương trình Java sẽ cố gắng sử dụng một lõi và ở lại với một lõi, như tôi đã tìm ra với Minecraft. Đây là câu chuyện về một anh chàng đã tìm thấy điều này với máy tính mới của mình http://mlee888.wordpress.com/2006/03/31/java-performance-in-dual-coremultiprocessor-environment/ – parion

Trả lời

3

Khi hệ điều hành thực hiện đề, nó chạy mỗi thread cho một thời gian nhất định (chẳng hạn 10-20ms), sau đó lưu trạng thái của chủ đề, và tìm kiếm những chủ đề khác chạy.

Bây giờ, mặc dù những gì bạn có thể nghĩ khi nhìn vào biểu đồ Sử dụng CPU, hệ điều hành thực sự đang chạy nhiều chủ đề hơn so với những người từ chương trình của bạn. Có chủ đề chạy vòng lặp giao diện người dùng, chủ đề chờ đợi trên I/O, chủ đề chạy dịch vụ nền, vv Hầu hết các chủ đề dành phần lớn thời gian của họ bị chặn chờ đợi một cái gì đó.

Lý do tại sao tôi nói về điều này là giải thích rằng từ quan điểm của hệ điều hành, tình hình phức tạp hơn nó có thể nhìn. Có một chuỗi toàn bộ các luồng làm một loạt các thứ, và hệ điều hành đang cố gắng chuyển đổi giữa chúng. Giả sử rằng bạn muốn thực hiện một heuristic rằng nếu một thread sử dụng hết toàn bộ lượng tử của nó lần cuối, thì hệ điều hành sẽ cố gắng lên lịch cho cùng một lõi. Hệ điều hành cần theo dõi và xem xét thêm thông tin, và sự thành công của việc tối ưu hóa có thể phụ thuộc vào nhiều yếu tố khó dự đoán.

Ngoài ra, lợi ích của việc khởi tạo luồng vào một lõi thường không đáng kể trong thực tế, do đó hệ điều hành không cố gắng thực hiện tự động. Thay vào đó, họ vạch trần một tính năng cho phép nhà phát triển nói rõ ràng rằng một luồng cụ thể cần được tạo thành một lõi và sau đó hệ điều hành sẽ tôn trọng quyết định đó.

Điều đó có vẻ như một sự cân bằng hợp lý: nếu luồng của bạn hoạt động tốt hơn khi được tạo thành lõi, chỉ cần yêu cầu hệ điều hành làm điều đó. Tuy nhiên, hệ điều hành sẽ không bận tâm cố gắng tìm ra nó cho bạn.

1

Như bạn đề cập, hệ điều hành sẽ bị trả bài xung quanh. Mã gốc sau đây cũng như bạn đã mô tả.

int main(int argc, char** argv) 
{ 
    while(true); 
    return 0; 
} 

Nếu bạn nhìn vào quá trình này, nó liên tục ở mức 25% (sử dụng quad-core), nhưng Resource Monitor từ Windows 7 cho thấy rằng không có 4 lõi là liên tục 100%, mặc dù cốt lõi 0 đang ở mức sử dụng cao hơn những người khác.

cpu may share bộ nhớ cache giữa các lõi, vì vậy hành vi này không có nghĩa là bộ nhớ cache không được sử dụng.

+1

là có bất kỳ giải thích chính thức/tài liệu về lý do tại sao và làm thế nào hệ điều hành bị trả lại chủ đề xung quanh? – njzhxf

+0

@njzhxf - có quan trọng không? –

+0

@StephenC muốn tìm hiểu thêm một chút về nó – njzhxf