Windows - - - Русинович марка на Руски

Този път аз ще гледам в изпълнението на тагове, за да се намери и да обясни на съществуващите ограничения за тях. Описания - структурата на данни, които представляват основните открити случаи на системни обекти за работа, които взаимодействат със заявлението; например, файлове, ключове в регистъра, примитиви за синхронизация и споделена памет. Има две ограничения, свързани с броя на дръжки, че един процес може да създаде: максималният брой на дръжки, че системата може да се настрои за процеса, както и размера на наличната памет за съхраняване на тагове и възразява, че приложението се свързва с техните описания.

В повечето случаи тези ограничения описания са далеч от тези стойности, които обикновено се използват от приложения или система. Въпреки това, прилагането, дизайнът на който не се взема предвид тези ограничения, могат да имат достъп до своите неочаквани начини за разработчици. Най-често тези проблеми възникват от факта, че животът на ресурса трябва да се управлява приложения, както и, тъй като в случай на управление на виртуалната памет на задачи живота ресурси е един вид предизвикателство дори и за най-добрите разработчици. Приложение, което не е в състояние да освободи неизползвани ресурси, като ги кара да протекат, което в крайна сметка може да доведе до това, че ограничаването на използването на даден ресурс е достигната, което води до странно и трудно за диагностициране поведение като това, и други приложения, или на цялата система като цяло.

Характеристики, обекти

Windows - - - Русинович марка на Руски

Когато някое приложение иска да поеме контрола на един от тези ресурси, първо трябва да се обадите на подходящите за API, за да създадете или да отворите ресурса. Например, функцията CreateFile отваря или създава файл, функция RegOpenKeyEx отваря ключ на системния регистър и функция CreateSemaporeEx отваря или създава семафор. Ако тази функция е успешен, Windows разпределя манипулатор ЕВРОВОК масата за процеса на кандидатстване и връща стойността на дескриптора, че приложението се справя имплицитно, но в действителност ние говорим за индекса се върна от ЕВРОВОК в ЕВРОВОК маса.
С достъп до искания за кандидатстване на дръжката и управлява обекта, минавайки стойността на дръжката в функциите на API такива, тъй като ReadFile. SetEvent. SetThreadPriority и MapViewOfFile. Системата може да се организира търсенето на обекта, към който се отнася дескриптора от индексиране дръжка маса, за да намерите подходящия запис описание, което съдържа указател към обекта. Запис от ЕВРОВОК и съхранява информация за сделките, които са станали достъпни за този процес, тъй като той откри съоръжението, което позволява на системата да се увери, че процесът няма да бъде в състояние да изпълнява операции на обекта, който в този процес няма разрешение. Например, ако процесът е отворен успешно на файл за четене, запис на дръжката ще изглежда по следния начин:

Windows - - - Русинович марка на Руски

Ако този процес ще се опитам да напиша нещо във файла, функцията е завършил изпълнение на грешка, тъй като този вид достъп до документацията не е била предоставена, както и факта, че достъпът на кеша за четене означава, че системата не трябва да се повтаря отново по-скъпо от гледна точка на ресурсите за инспекции права за достъп.

Максималният брой на описания
За да се изследва първото ограничение, можете да използвате инструмента на Testlimit, които съм използвал в рамките на тази серия да емпирично разглежда ограниченията за системни ресурси. Тя може да бъде изтеглен от страницата на Windows Вътрешни елементи тук. За да се определи броят на описания, които могат да създават процеса на Testlimit използва с -н, който казва, че за да се създаде колкото се може повече тагове, колкото е възможно. Това се постига чрез създаване на обект събитие с помощта CreateEvent функция и последваща повтори дублиране система ЕВРОВОК върнати чрез функция DuplicateHandle. Използването на дублиране, на Testlimit избягва необходимостта от създаване на нови функции и всички ресурси, използвани от тези средства са изразходвани за вписвания дръжка маса. Ето какво се получава Testlimit работи с -h опцията система за 64-битов

Windows - - - Русинович марка на Руски

Този резултат обаче не отразява общия брой на описания, процес, може да се създаде колкото се DLL системни библиотеки отворени различни предмети по време на процеса на инициализиране. Общият брой на процеса тагове, можете да видите, като добави съответната графа в диспечера на задачите или Process Explorer. Общата цифра за Testlimit в този случай е 16'771'680:

Когато стартирате Testlimit система 32-битова, броят на описания ще бъде малко по-различно:

Общият брой на описания и друга 16744448:

Какво са причинени от тези разлики? Отговорът е, че системата за задействане, който е отговорен за масата за управление ЕВРОВОК, определя лимит за броя на описания за всеки процес, а също и от големината на записите в таблицата ЕВРОВОК. Тук имаме работа с един от онези редки случаи, когато Windows задава фиксирана горна граница за използването на ресурса, така че в този случай на изпълнителната власт, системата определя броя на 16777216 (16 * 1024 * 1024), както е максималният брой на дръжки, които могат да бъдат разпределени на процеса. Всеки процес, който е повече от десет хиляди описания едновременно във всеки един момент от време, най-вероятно няма сериозни недостатъци, извършени в рамките на конструкционните или дръжка течове. Така, че границата от 16 милиона дръжки почти недостижим и е предназначена да помогне за предотвратяване на изтичане на памет, причинени от смущения в процеса на работа от останалата част от системата. За да се разбере причината, поради която броят показва в диспечера на задачите е различен от твърдия зададена максимално, трябва да се помисли за начина, по който системата на изпълнителната власт организира справят таблици.

Запис от ЕВРОВОК маса трябва да бъде достатъчно голям, за да се съхранява маска на правата за достъп и показалеца обект. Достъп маска е 32-битов размер на показалеца, но явно зависи от това дали системата е 32-битова или 64-битова версия. Следователно влизането на дръжката е 8 байта на 32-битов Windows и 12-байта на 64-битова версия на Windows. 64-битов Windows допълва структурата на тага за запис на данни от до 64-битови граници, така че 64-битова версия на маркирани всъщност отнема 16 байта. Ето дефиницията на описания за запис на 64-битова версия на Windows, показани в дебъгер ядро ​​с команда DT (тип разтоварване) на

Windows - - - Русинович марка на Руски

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

Задействане на системата поставя маса от ЕВРОВОК в блоковете, които имат размер на страницата, която го разделя на записи от ЕВРОВОК маса. Това означава, че страницата, която заема 4096 байта на x86 системи и x64 системи, може да спести 512 записа в 32-битов Windows и 256 записа в 64-битова версия на Windows. Изпълнителният определя максималния брой страници, че тя може да разпределят рекордните описания, като се раздели строго предписана максимална (16777216) на броя ЕВРОВОК записи на страница; за 32-битов Windows, броят им е 32 768, а за 64-битови Windows - 65536. Тъй като системата на изпълнителната власт използва първия запис на всяка страница за собствена информация за идентификация, действителният брой на описания, на разположение на този процес, трябва да се получава чрез изваждане от 16,777,216 броя получени по-горе, което обяснява резултатите, получени в Testlimit започват: 16777216 - 65536 = 16711680 и 16777216 - 32768 = 16744488.

64-битова версия на Windows на горното ниво съдържа 256 указатели към страницата. Това означава по принцип, за да се настанят пълна маса от ЕВРОВОК използва 256 МВ пейджъра басейн (16777216/256 * 4096). Правилността на тези изчисления се потвърждава от данните на Testlimit пейджъра ползване басейн на 64-битови Windows:

Размер на пейджъра басейн е повече от достатъчно, за да се запазят тези структури от данни, обаче, както споменах по-рано, един процес, който създава твърде много описания почти сигурно ще свършат някаква друга ресурс, и ако се стигне броят на описания лимит за един процес тогава той не може да отвори всички други предмети.

Windows - - - Русинович марка на Руски

По подразбиране, Process Explorer показва само описания, които сочат към обекти, които имат имена, които означават, че вие ​​няма да видите всички описания на процеса, ако не и активирайте опцията "Show Неназовани Ръкохватки и на съответствия" в менюто Изглед. Ето някои анонимни дръжки командния ред маса от ЕВРОВОК:

Windows - - - Русинович марка на Руски

Както е случаят с повечето други грешки, само код разработчика, поради което има изтичане, той може да го оправи. Ако откриете теч в един процес, който се състои от няколко компонента или разширения, например Explorer, домакин услуга или Internet Explorer, основният въпрос е коя от тези части е отговорен за теча. Определяне на такъв компонент ще ви позволи да се избегне този проблем, като изключите или да извадите проблематично разширяването, да проверите за актуализации, коригиране на тази грешка, или да съобщите за това на разработчика.

За щастие, Windows включва описания проследяване инструмент, който можете да използвате, за да се установи факта на теча и да определи лицето, отговорно за изтичането на софтуера. Тя работи с всеки процес поотделно и се активира чрез системата на изпълнителната власт да записва активността на стека всеки път, когато се създава или затворена дръжка. Можете да използвате този инструмент, или да използвате помощните програми за кандидатстване проверяващия. който може да бъде изтеглен безплатно от сайта на Microsoft, или чрез използване на дебъгер Windows (WinDbg). Ако искате системата последвано дейността на дескриптора на процеса, от старта си, ще трябва да използвате приложението проверяващия. В други случаи, ще трябва да използвате за корекция на грешки, и команда! Htrace. за да видите информация за дейността на процеса.

За да се покаже проследяване на активността в действие, аз стартира WinDbg и свързан към командния ред, което стартира по-рано. За да се даде възможност за проследяване на описания, влязох в командния htrace ключ -enable !:

Оставих процесът да продължи да работи и отново се промени в директорията. След това отново превключи на WinDbg, спря изпълнението на процеса и стартира htrace не параметър, който показва списък с всички отворени и затворени сделки, които отговарят на процеса от предишния план на екипа! Htrace с параметър моментна снимка, или от датата, на която е била включена рекорда активни тагове. Това са резултатите от командата за една и съща сесия, дебъгер:

Windows - - - Русинович марка на Руски

Ако търсите само на теча, тогава ще трябва да се използва! Htrace --diff с параметър, който показва само нови дръжки от последното ниво, или от началото на дейността на старта песен. Както се очакваше, в резултат на изпълнението на този команден ние виждаме само дръжка 0x22c:

Windows - - - Русинович марка на Руски

Отличен източник на съвети за това как можете да премахнете от изтичане на описания, е интервю с инженера за техническа поддръжка за Microsoft Dzheffa Deyli (Jeff Dailey) за Канал 9.

Следващия път ще преразгледа ограниченията, установени за такива описания на базата на ресурси като GDI и потребителски обекти. Дръжки тези ресурси се управляват от Windows подсистема, която е различна от системата за изпълнение, поради което се използват и други ресурси и има и други ограничения.