Nói rằng tôi chạy một quá trình đơn luồng đơn giản như hình dưới đây:Tại sao một tiến trình luồng đơn thực thi trên một số bộ xử lý/lõi?
public class SirCountALot {
public static void main(String[] args) {
int count = 0;
while (true) {
count++;
}
}
}
(Đây là Java bởi vì đó là những gì tôi đang quen thuộc với, nhưng tôi nghi ngờ nó không thực sự quan trọng)
Tôi có một bộ xử lý i7 (4 lõi, hoặc 8 đếm siêu phân luồng), và tôi đang chạy Windows 7 64-bit vì vậy tôi đã kích hoạt Sysinternals Process Explorer để xem xét việc sử dụng CPU, và như mong đợi tôi thấy nó đang sử dụng khoảng 20% của tất cả CPU có sẵn.
Nhưng khi tôi chuyển đổi các tuỳ chọn hiển thị 1 biểu đồ cho mỗi CPU, tôi thấy rằng thay vì 1 trong 4 "lõi" được sử dụng, sử dụng CPU được lan truyền trên tất cả các lõi:
Thay vào đó những gì tôi mong đợi là 1 lõi tối đa, nhưng điều này chỉ xảy ra khi tôi đặt ái lực cho quy trình thành một lõi đơn.
Tại sao khối lượng công việc được phân chia trên các lõi riêng biệt? Sẽ không chia nhỏ khối lượng công việc trên một số lõi lộn xộn với bộ nhớ đệm hoặc phải chịu các hình phạt hiệu suất khác?
Có phải vì lý do đơn giản là ngăn ngừa quá nóng của một lõi không? Hoặc là có một số lý do sâu sắc hơn?
Chỉnh sửa: Tôi biết rằng hệ điều hành có trách nhiệm lên lịch, nhưng tôi muốn biết tại sao nó "phiền". Chắc chắn từ một quan điểm ngây thơ, gắn bó một (chủ yếu *) quá trình đơn luồng đến 1 lõi là đơn giản hơn cách & hiệu quả hơn để đi?
* Tôi nói chủ yếu là đơn luồng bởi vì có nhiều theads ở đây, nhưng chỉ có 2 trong số họ đang làm bất cứ điều gì:
nitpick nhỏ; nói rằng đây là một quá trình đơn luồng sẽ không chính xác. JVM nội bộ sinh ra nhiều luồng cho các mục đích dọn dẹp như finalizers, garbage collectors vv. Hoàn toàn có thể để có được công việc thực hiện bởi mỗi thread, các chủ đề JVM được ánh xạ tới các chủ đề h/w thực, một lần nữa có thể giải thích sự lây lan. –
Tôi đoán Caspar có nghĩa là các chủ đề _non-daemon_. – Santosh
@ SanjayT.Sharma Vâng, tôi đã đơn giản hóa một chút và có lẽ đã đưa ra một chương trình mẫu bằng ngôn ngữ không được quản lý;) Tuy nhiên, như tôi đã nói, tôi nghi ngờ không phải JVM đang làm điều này (và nếu nó là ánh xạ JVM -> HW chủ đề và đó là trách nhiệm, tại sao các bản đồ liên tục thay đổi?) – Caspar