Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: fghjОтветов: 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
  • Что вы имеете в виду под 1) Почему форк qt5 ?? peppe 08.07.2013
  • lineedit - это простое примерное приложение, предоставляемое qt. он НЕ использует qprocess и подобные вещи. Но вместо одного qt5_lineedit я вижу два процесса qt5_lineedit, очевидно это означает, что где-то в qt5 был вызван форк. Но по какой причине? fghj 08.07.2013
  • Вы уверены, что это два отдельных процесса, а не два потока одного и того же процесса? peppe 08.07.2013
  • Да, вы правы, я думал, что с тех пор, как pthreads имеет ntpl внутри, разные PID означают разные процессы. fghj 08.07.2013

c++linuxqt5

Ответы

Ответ 1 · рейтинг 4 · peppe

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

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

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

Ответ 2 · рейтинг 1 · Zaiborg

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

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

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

так долго зай

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы