qt5: почему 2 процесса и использование памяти?

Я использую 64 linux со свежей установкой qt 5.1.0.

Я беру пример приложения qtbase/examples/widgets/widgets/lineedits и запускаю, назовем его qt5_lineedit, также я беру аналогичное приложение из исходников qt4, собираю его с библиотекой qt4 и запускаю.

И в htop я вижу, что есть два qt5_lineedit (я запускаю только один, поэтому он использовал 2 потока) и использование памяти: VIRT 223M RES 18268.

Пока для qt4_lineedit существует только один процесс и он жрет: VIRT 126M RES 15848.

So,

  1. Почему qt5 по умолчанию использует два потока?
  2. Почему такая большая разница в размере виртуальной памяти?

Обновлять.

Несмотря на то, что qt5_lineedit использует 2 pid, это не процессы, а потоки. Итак, информация о qt4_lineedit выглядит так:

VmPeak:   130936 kB
VmSize:   130932 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:     17140 kB
VmRSS:     17140 kB
VmData:     4524 kB
VmStk:       136 kB
VmExe:        28 kB
VmLib:     48232 kB
VmPTE:       220 kB
VmSwap:        0 kB
Threads:        1

Информация о qt5_lineedit выглядит так:

VmPeak:   278020 kB
VmSize:   228584 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:     18268 kB
VmRSS:     18268 kB
VmData:    77468 kB
VmStk:       136 kB
VmExe:        28 kB
VmLib:     50056 kB
VmPTE:       288 kB
VmSwap:        0 kB
Threads:        2

person fghj    schedule 08.07.2013    source источник
comment
Что вы имеете в виду под 1) Почему форк qt5 ??   -  person peppe    schedule 08.07.2013
comment
lineedit — это простое примерное приложение, предоставляемое qt. он НЕ использует qprocess и подобные вещи. Но вместо одного qt5_lineedit я вижу два процесса qt5_lineedit, очевидно это означает, что где-то в qt5 был вызван форк. Но по какой причине?   -  person fghj    schedule 08.07.2013
comment
Вы уверены, что это два отдельных процесса, а не два потока одного и того же процесса?   -  person peppe    schedule 08.07.2013
comment
Да, вы правы, я думал, что с тех пор, как pthreads имеет ntpl внутри, разные PID означают разные процессы.   -  person fghj    schedule 08.07.2013


Ответы (2)


Второй поток (не процесс) исходит из подключаемого модуля XCB QPA, который запускает поток для опроса событий XCB. (Я не знаю, предназначено ли это для обхода ошибок XCB, XCB API или чего-то еще.)

Как правило, вы не можете сравнить использование памяти двумя процессами, просматривая сводки ВМ. Вам необходимо правильно проанализировать карты памяти процессов (/proc/pid/maps) и выяснить, сколько памяти было выделено и где, а также распределяется ли она между другими процессами или это реальное использование для каждого процесса. Более того, если вы видите разницу в динамически выделяемой памяти, вам нужен дополнительный анализ использования для каждого процесса с помощью профилировщика кучи (например, массива valgrind).

Кто сказал, что профилирование использования памяти было легкой задачей? :)

person peppe    schedule 13.07.2013
comment
Да, я нашел в git commit, который вводит использование потоков в плагин xcb. Это обходной путь для ошибки xcb. - person fghj; 16.07.2013

Я нашел кое-что о нескольких потоках в простом приложении, которое может быть интересным: http://qt-project.org/forums/viewthread/10656

Я сам могу думать о том, что (мы все можем знать) QCoreApplication запускает свою собственную очередь событий. И для этого потребуется независимый поток, чтобы не блокировать выполнение основного потока.

Об использовании памяти у меня нет конкретной подсказки, но, возможно, это вызвано изменениями в том, как Qt рисует свои виджеты.

так долго зай

person Zaiborg    schedule 10.07.2013
comment
О ссылке рассказывается о конкретных вещах Windows, в Linux, я полагаю, нет потоков, которые имеют дело с объектами COM +. - person fghj; 10.07.2013
comment
О QCoreApplication и цикле событий. Как вы видите, Qt4 использует один поток, и этот вопрос о разнице между Qt4 и Qt5. Другими словами, если в Qt5 нам нужен еще один поток для работы с событиями, то почему в Qt4 вы используете только один и все работает нормально. - person fghj; 10.07.2013
comment
@ user1034749 в Windows, если вы запустите пустое консольное приложение с использованием qt4.8.3, вы получите 2 потока. К сожалению, я не могу сказать, как это выглядит в Linux. - person Zaiborg; 10.07.2013