mr.abzadeh Ответов: 5

Как измерить использование стека потоков?


Привет, ребята.
Мне нужно измерить, сколько стека используется, когда я вызываю функцию в потоке. Если я сделаю это в начальной функции thead, я получу некоторую информацию об использовании стека потока. Это помогает мне создавать потоки с соответствующим размером стека.
МР.abzadeh

Edit: почему нет respnce? а где же парни?

H.Brydon

Напишите API, который смотрит на адрес стека и принимает разницу от вызова того же API при запуске программы...

5 Ответов

Рейтинг:
30

User 59241

Я не знаю, сколько потоков вы создаете, но если бы это была постоянная проблема, Windows предоставила бы api.
Есть ли у вас какие-либо причины думать, что ваши потоки заканчиваются из стека?

Здесь есть решение: http://stackoverflow.com/questions/1740888/determining-stack-space-with-visual-studio/1747499#1747499[^]с помощью http://en.wikipedia.org/wiki/Win32_Thread_Information_Block[^]


mr.abzadeh

Моя программа не исчерпывает стек. Я хочу измерить свой стек потоков пользователя так, чтобы создавать потоки с меньшим размером стека, эффективно используя память
МР.abzadeh

[no name]

Я снова спрашиваю, почему? Если бы это была реальная проблема, то она уже была бы решена. Сколько потоков у вас есть, что вы обеспокоены использованием памяти? Если у вас их так много, что вам не хватает памяти из-за стеков потоков, то, возможно, у вас действительно есть другие проблемы. Однако мой ответ показывает способ сделать это.

mr.abzadeh

Я оказываю услугу. Я создаю поток для каждого соединения. В настоящее время моих клиентов может быть до 200, поэтому мой сервис может иметь до 200 потоков. Совместное использование потоков может повысить производительность, но я не знаю, как разбудить поток при поступлении нового пакета. Любое предложение приветствуется
МР.abzadeh

[no name]

Вы используете пул потоков?

mr.abzadeh

Спасибо. Ссылки, которые вы мне показали, великолепны и очень полезны, и теперь я могу оценить использование стека моих услуг. Я создаю потоки с размером стека 64 КБ. Я не использую пул потоков, потому что любое соединение с предоставляемой мной службой остается активным в течение нескольких часов. Теперь я думаю, что пришло время создать несколько потоков, скажем 16, и основной поток будет принимать только сокеты и передавать их рабочим потокам, снова упоминая, что моя проблема заключается в том, как основной поток будет немедленно передавать управление рабочим потокам.
МР.abzadeh

Рейтинг:
2

Member 14683465

{$IFDEF MSWINDOWS}
function currentStackUsage: NativeUInt;
//NB: Win32 uses FS, Win64 uses GS as base for Thread Information Block.
asm
  {$IFDEF WIN32}
  mov eax, fs:[4]  // TIB: base of the stack
  sub eax, esp     // compute difference in EAX (=Result)
  {$ENDIF}
  {$IFDEF WIN64}
  mov rax, gs:[8]  // TIB: base of the stack
  sub rax, rsp     // compute difference in RAX (=Result)
  {$ENDIF}
{$ENDIF}
end;


Dave Kreskowiak

Необъяснимый дамп кода и то, как его использовать, - это не ответ.

Member 14683465

Вызовите эту функцию до или внутри функции, для которой вы хотите узнать использование стека. Например, в рекурсивной функции, чтобы избежать переполнения стека.

Рейтинг:
1

mr.abzadeh

Эти ссылки очень хороши для целей измерения, но они находятся в .net, мне нужно измерить использование стека в родном C/C++
Спасибо за вашу помощь
МР.abzadeh

Рейтинг:
0

Aravindba

хай
попробуйте эту ссылку

Определение От Безделья[^]

но вам нужно кодировать язык


mr.abzadeh

Спасибо за ваш комментарий.
Ссылка, на которую вы указали, обнаруживает бездействие системных ресурсов, таких как cpu, gpu, и не помогает измерять измерение использования стека.
Мне не совсем ясно, что вы имели в виду под "языком кода"

Рейтинг:
0

nv3

Очень простой метод измерения текущего уровня стека-это взять адрес переменной, которая выделена в стеке, например:

char* GetCurrentStackLevel()
{
    char a;
    return &a;
}

Затем вызовите эту функцию до и внутри функции, из которой вы хотите измерить использование стека, и вычтите два указателя. Использование стека GetCurrentStackLevel само по себе отменит это вычитание.

Обратите внимание, что вы не можете использовать возвращаемое значение ни для чего другого! К тому времени, когда GetCurrentStackLevel вернется, возвращенный указатель будет указывать на ничейную землю. Он просто может быть использован для измерения вашего текущего уровня стека.


mr.abzadeh

Это измеряет использование стека от начала до текущей позиции, а не общее использование стека. Я не могу угадать, какая функция будет вызываться более глубоко, и системные вызовы windows api могут использовать стек, который не измеряется таким образом
МР.abzadeh

nv3

Именно это, как я думал, вас интересует, поскольку вы спросили: "сколько стека используется, когда я вызываю функцию в потоке".