· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Максимальный номер Thread ID

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Янв 20, 2004 15:39:50

Видимо не умею я по докам искать, приходиться опять спрашивать. Сколько вообще тредов может быть в WinNT ну соответственно какой может быть максимальный номер ID?


Дата: Янв 20, 2004 18:27:34

Точной цифры я не знаю, но думаю практический предел будет достигнут значительно раньше теоритичемского.


Дата: Янв 20, 2004 20:07:10

Мне просто надо выделить блок памяти и адресоваться по ID. Как тогда лучше всего это сделать? Может тогда данные в свободном месте структуры CONTEXT хранить?


Дата: Янв 20, 2004 20:08:44

Мне просто надо выделить блок памяти и адресоваться по ID.

Прочитал два раза. Ничего не понял :(


Дата: Янв 20, 2004 20:18:29

Ну надо мне для каждого треда в системе хранить некоторую информацию. Вот я и спрашиваю, как лучше - выделять память для этого или в свободном месте структуры context этого треда всё это хранить?


Дата: Янв 20, 2004 20:25:23

Я не очень понимаю саму формулировку. Как ты найдешь этот CONTEXT? Ты в ядре, или в юзер-моде?
Вообще, это очень плохая практика - хранить что-то в системных областях данных. Отводи свою память и храни все там. В чужие программы не лезь, они и без тебя упадут :)


Дата: Янв 20, 2004 20:38:49

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

В context есть дополнительные регистры как бы занимают 512 байт. Но 8 регистров mmx и 8 xmm занимают только 192б, значит 320 байт свободно, вот там хранить и можно, всё равно же эта память не используется. А выделять неизвестно сколько надо, но в context тоже лезть не особо хочеться.


Дата: Янв 20, 2004 20:47:15

Да, совершенно верно, в контексте вызвавшего потока. А ты знаешь, по какому адресу в памяти у данного потока располагается структура CONTEXT?
Заведи свою память! Заведи свой двусвязный список с узлом вида:
struct _node
{
int pid;
char what_you_need[512];
struct _node *next;
struct _node *prev;
} 


Расход памяти не будет безумным.


Дата: Янв 20, 2004 21:03:34

Ну вот я и хотел узнать, сколько этой памяти выделять.

Раз так, в процедуре инициализации придёться организовавыть перечисление всех тредов в системе, и ловить функции _NtCreateThread и _NtTerminateThread... И в общем если будут постоянно создаваться и уничтожаться треды, список не проконтроллировать будет и расход памяти будет увеличиваться, да и тормозить то как будет, ведь поиск по списку не быстрый.

Я хотел выделить память размером (sizeof _node) * (макс. число тредов в системе), и адресоваться произвольным доступом, используя номер ID. Но размер структуры - 32 байта, а это макс. число тоже не маленькое, вот и какой расход памяти то будет...

Если же хранить в структуре CONTEXT, то лишняя память расходоваться не будет, всё равно она уже выделена, но с совместимостью проблемы будут, ведь в Athlon64 уже 16 регистров XMM. Только если с конца структуры смещение отсчитать и записывать туда. Вот и думай тут...


Дата: Янв 20, 2004 21:06:41

Бля, да что тут думать. Не нравится двусвязный список - заведи себе дерево! Скорость поиска будет чудовищной. Заведи себе хеш таблицу - отсортированный массив и добавляй туда элементы по мере необходимости, через realloc. Ищи бинарным поисков.
В списке на каждый узел потеря 8 байт (два поинтера). Если это критично - то в хеш таблице потери не будет вообще. А скорость по сравнению с деревом уменьшится незначительно. Деревья начинают выигрывать при очень больших числах. Винде такие числа не грозят.


Дата: Янв 20, 2004 21:07:54

Да, среднее число процессов в моей системе - до 100. Можно предположить, что у какого-нибудь психа их будет до 300. Расход считай сам - он смешной!


Дата: Янв 20, 2004 21:13:12

Ладно, я лучше делать пойду. Если эта хреновина будет работать, может её в раздел инструментов положить можно будет...


Дата: Янв 20, 2004 22:01:19

Как пошёл, так и пришёл :)

Вот решил я выделить 1mb памяти, а чем выделить то? Во всём DDK нашёл функцию MmAllocateNonCachedMemory, но эта выделяет неподкачиваемую память, я читал, что эта память дорогая слишком, в смысле что её мало. Как тогда обычную то выделить?


Дата: Янв 20, 2004 22:03:49

Ох не умеешь ты по докам искать :(
ExAllocatePoolWithTag - кстати, пример использования тоже в форуме.


Дата: Янв 20, 2004 22:12:02 · Поправил: dragon

Ну вот, а я в Mmxxx искал. Я набрал поиск по форуму и нашёл только свой пост, вот так я всё ищу :)

invoke ExAllocatePool, PagedPoolCacheAligned, 100000h
mov mem_block, eax
;для выделения

invoke ExFreePool, mem_block
;для освобождения

Может так сойдёт?

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.088