2010-09-24 3 views
2

Когда я запустил этот код с помощью GCC,Почему при запуске этого C-кода возникает переход в ядро ​​процессора?

$ cat eatup.c 
#include<stdio.h> 
#include<stdlib.h> 

int main() { 
    int i = 0; 
    while(1) { 
     i++; 
    } 
} 
$ 

график CPU пошел, как это:

alt text

Я не знаю, почему есть крест в использовании ядра процессора.

  • Я начал работать на подъем слева от 40 знака, то первоначально core2 использования выросло до 100%, но через некоторое время было переключатель и Core1 использование пошло на 100%.

  • Любые последующие прогоны не воспроизвели ситуацию. Все, что я получаю одной Возвышение alt text

Это может быть немного ОС зависимую (планирование процессов на ядрах), но есть что-нибудь, что могло бы объяснить, почему переключатель произошло (как показано в первой Скриншот)? Какие-нибудь догадки?


Оказывается, эти переключатели не так редко. Вот скриншот System Monitor только после загрузки (Ubuntu 10,04)

Full Size

alt text

ответ

3

Что могло произойти, это то, что операционная система имела два других процессов, которые необходимы для запуска. Первому было дано второе ядро ​​(потому что вы были на первом). Второй вызвал вашу программу для потери ядра процессора. Затем первый поток выпустил его ядро, и ваша программа была назначена ему.

Я не гуру linux, но обычно можно сказать ОС, что у вас есть предпочтительное ядро, на котором вы хотите работать.

+2

Это правильно. Обратите внимание, что большинство планировщиков ОС будут пытаться поддерживать процесс на одном и том же ядре, когда это возможно, чтобы использовать кеши, связанные с одним ядром. Вот почему в вашем первом графике он переключается и остается включенным. Но, с другой стороны, планировщик должен быть готов переместить процесс в другое ядро. Рассмотрим процессы с интенсивным использованием процессора A, B, C, работающие на ядрах 1, 2, 1. Если процесс B заканчивается, вы определенно хотите, чтобы планировщик переместил один из A или C на ядро ​​2. –

+1

За пределами контрольных точек очень мало случаи, когда ограничение того, какие ядра используются, является хорошей идеей. Я бы просто не сделал этого, не будучи уверенным, что это необходимо. Даже тогда я бы сравнил с этим оба пути, чтобы убедиться, что неожиданных побочных эффектов не было. – RBerteig

+0

@RBerteig: Мне никогда не приходилось делать это в реальной жизни. Может быть, просто для того, чтобы проницательно относиться к другим тем, что процесс эффективно однопоточный. – 2010-09-26 20:47:33

0

Это зависит от ОС, но, как правило, ни одна ОС никогда не дает вам гарантий, что ваш поток будет работать на одном ядре все время, если только вы не предпримете определенные шаги, чтобы сделать это так.

Хотя есть некоторые очевидные преимущества в поддержании потока, связанного с одним и тем же ядром, нет ничего необычного в том, что он время от времени переназначается другому ядру. Вы даже можете увидеть, что его бросают от ядра к ядру каждый раз, когда он запускается (или почти каждый раз). Фактически, то, что вы видите в своих тестах, выглядит довольно хорошо в этом отношении.

+0

Да, я понимаю, что нет никакой гарантии, но то, что могло бы заставить поток быть перенесенным в другое ядро, - это то, что я хотел знать. – Lazer

+0

@Lazer: ОК. Я бы предположил, что для OS было бы разумно время от времени делать это без какой-либо конкретной причины, чтобы распределить тепловую нагрузку более равномерно по процессору. – AnT

+0

С десятками процессов, запущенных в системе, чередующихся между вычислительными вещами и ожиданием ввода-вывода, всегда найдутся вполне разумные причины, по которым планировщик может перемещать поток от одного ядра к другому, задолго до того, как он рассмотрит тепловую нагрузку. –