Недобровольные переключения контекста: как я могу их предотвратить? - PullRequest
11 голосов
/ 13 декабря 2010

У меня есть небольшое приложение, которое я запускал прямо сейчас, и я хотел проверить, нет ли в нем утечек памяти, поэтому я вставил этот фрагмент кода:

for (unsigned int i = 0; i<10000; i++) {
    for (unsigned int j = 0; j<10000; j++) {
        std::ifstream &a = s->fhandle->open("test");
        char temp[30];
        a.getline(temp, 30);
        s->fhandle->close("test");
    }
}

Когда я запустил приложение, я cat 'ed / proc // статус, чтобы увидеть, увеличивается ли память.Примерно через 2 минуты работы выдается следующее:

Name:   origin-test
State:  R (running)
Tgid:   7267
Pid:    7267
PPid:   6619
TracerPid:  0
Uid:    1000    1000    1000    1000
Gid:    1000    1000    1000    1000
FDSize: 256
Groups: 4 20 24 46 110 111 119 122 1000 
VmPeak:   183848 kB
VmSize:   118308 kB
VmLck:         0 kB
VmHWM:      5116 kB
VmRSS:      5116 kB
VmData:     9560 kB
VmStk:       136 kB
VmExe:        28 kB
VmLib:     11496 kB
VmPTE:       240 kB
VmSwap:        0 kB
Threads:    2
SigQ:   0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000002004
SigCgt: 00000001800044c2
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed:   3f
Cpus_allowed_list:  0-5
Mems_allowed:   00000000,00000001
Mems_allowed_list:  0
voluntary_ctxt_switches:    120
nonvoluntary_ctxt_switches: 26475

Ни одно из значений не изменилось, кроме последнего, так значит ли это, что нет утечек памяти?

Но чтоболее важно и что я хотел бы знать, если плохо, что последнее значение быстро увеличивается (около 26475 переключается за 2 минуты!).

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

  1. Firefox: около 200
  2. Gdm: 2
  3. Netbeans: 19

Тогда я гуглил ивыяснил кое-что, но это для меня техническое.Что я получил от этого, что это происходит, когда приложение переключает процессор или что-то?(У меня есть 6-ядерный процессор Amd между прочим).

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

Заранее спасибоРобин.

Ответы [ 3 ]

20 голосов
/ 13 декабря 2010

Добровольное переключение контекста происходит, когда ваше приложение блокируется системным вызовом, и ядро ​​решает передать свой временной интервал другому процессу.

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

В вашем случае, поскольку вы открываете, закрываете и читаете из одного и того же файла, он, вероятно, остается в кэше виртуальной файловой системы в течение всего выполнения процесса, и ваша программа вытесняется ядром в том виде, как оно есть. не блокируется (из-за системных или библиотечных кэшей). С другой стороны, Firefox, Gdm и Netbeans в основном ожидают ввода от пользователя или от сети и не должны быть прерваны ядром.

Эти переключатели контекста не являются вредными. Напротив, он позволяет вашему процессору справедливо использоваться всеми приложениями, даже когда одно из них ожидает некоторого ресурса. *

И, кстати, для обнаружения утечек памяти лучшим решением было бы использование специального инструмента, такого как valgrind .

3 голосов
/ 13 декабря 2010

Чтобы добавить к информации @ Sylvain, есть хорошая справочная статья о планировании Linux здесь: "Внутри планировщика Linux" (developerWorks, июнь 2006 г.) .

1 голос
/ 13 декабря 2010

Чтобы найти утечку памяти, гораздо лучше установить и использовать valgrind, http://www.valgrind.org/. Он будет определять утечки памяти в условиях кучи и ошибок памяти (с использованием неинициализированной памяти, множества других проблем).Я использую его почти каждый день.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...