Почему однопоточный процесс выполняется на нескольких процессорах / ядрах?

Скажем, я запускаю простой однопоточный процесс, подобный приведенному ниже:

public class SirCountALot {
    public static void main(String[] args) {
        int count = 0;
        while (true) {
            count++;
        }
    }
}

(Это Java, потому что это то, с чем я знаком, но я подозреваю, что на самом деле это не так имеет значение)

У меня процессор i7 (4 ядра или 8 с учетом гиперпоточности), и я использую 64-разрядную версию Windows 7, поэтому я запустил Sysinternals Process Explorer, чтобы посмотреть на использование процессора, и, как и ожидалось, я это вижу использует около 20% всего доступного процессора.

Graph showing 20% CPU usage across all cores

Но когда я переключаю опцию показа по одному графику на ЦП, я вижу, что вместо одного из 4 «ядер», загрузка ЦП распределяется по всем ядрам:

Graph showing erratic CPU usage on each core totaling around 20% usage

Вместо того, что я ожидал, это 1 ядро ​​исчерпано, но это происходит только тогда, когда я устанавливаю привязку для процесса к одному ядру.

Graph showing most of recent CPU usage to be confined to first core

Почему рабочая нагрузка разделена на отдельные ядра? Разве разделение нагрузки на несколько ядер не нарушит кэширование или не повлечет за собой другие потери производительности?

Это просто по причине предотвращения перегрева одного ядра? Или есть какая-то более глубокая причина?

Edit: Я знаю, что операционная система отвечает за планирование, но я хочу знать, почему это «беспокоит». Конечно, с наивной точки зрения, привязка (в основном *) однопоточного процесса к одному ядру - это более простой и эффективный способ?

* Я говорю в основном однопоточным, потому что здесь несколько тегов, но только 2 из них что-нибудь делают:

Screenshot showing number of threads from Eclipse Screenshot showing number of threads in Process Explorer process properties

11
задан Caspar 13 December 2011 в 08:17
поделиться