DLLs, размещение в ОЗУ, базовый адрес, использование памяти и.NET?

Я предполагаю, что ваша проблема в том, что вы не активировали свой корневой CA из консоли.

попробуйте это вместо:

sudo wget -O root.ca.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem

[ 114] попробуйте сделать это непосредственно в вашем каталоге сертификатов, а затем перезапустите ваш демон.

10
задан Community 23 May 2017 в 12:09
поделиться

3 ответа

Это для вопроса 1)

Код jitted помещается в специальную "кучу". Можно осмотреть эту "кучу" с помощью !eeheap команда в WinDbg + SoS. Таким образом каждый процесс будет иметь свою собственную копию кода jitted. Команда также покажет Вам общий размер "кучи" кода.

Сообщите мне, хотите ли Вы дополнительные детали о получении этой информации от WinDbg.

Это для вопроса 2)

По словам книжного Эксперта.NET 2.0 блока IL .reloc часть чистого-IL файла PE содержит только одну fixup запись для тупика запуска CLR. Таким образом, сумма fixups, необходимого для управляемого DLL во время перебазирования, справедливо ограничена.

Однако при списке какого-либо данного организованного процесса Вы заметите, что Microsoft повторно основывала объем (или возможно все) их управляемого DLLs. Должно ли это быть просмотрено как причина перебазирования или не ваше дело.

6
ответ дан 4 December 2019 в 01:58
поделиться

Я думаю, что Вы запутываетесь о совместно используемых сборках и dlls и пространстве памяти процесса.

И.NET и стандартный Win32 код доли DLL среди другого процесса с помощью них. В случае.NET это только верно для DLLs с той же подписью версии так, чтобы две различных версии того же dll могли быть загружены в памяти одновременно.

Вещь, похоже, что Вы ожидаете, что память, выделенная вызовами библиотеки, будет совместно использована также, хорошо которого никогда (почти) не происходит. Когда функция в Вашей библиотеке выделяет память, и я предполагаю, что это происходит много для DLL ORM, та память выделяется в пространстве памяти обработки вызовов, каждого процесса, имеющего уникальные экземпляры данных.

Таким образом да, на самом деле код DLL загружается однажды и общий для вызывающие стороны, но инструкции по коду (и поэтому выделения) происходят отдельно в пространство обработки вызовов.

Править: Хорошо, Давайте посмотрим, как JIT работает с блоками.NET.

Когда мы говорим о JITing код, процесс относительно прост. Внутренне существует структура, названная Таблицей виртуальных методов, которая в основном содержит виртуальный адрес, который будет вызван во время вызова. В.NET JIT работает, в основном редактируя ту таблицу так, чтобы каждый вызов перенаправил к JIT-компилятору. Тем путем любое время, мы называем метод JIT, вступает и компилирует код в фактические машинные команды (следовательно Как раз вовремя), после того как это было сделано, JIT возвращается к VMT и заменяет старой записью, которая вызвала его для указания на сгенерированный низкоуровневый код. Тем путем все последующие вызовы будут перенаправлены к скомпилированному коду (таким образом, мы просто скомпилируем однажды). Таким образом, JIT не вызывается, каждый раз и все последующие вызовы перенаправят к тому же скомпилированному коду. Для DLLs процесс, вероятно, будет тем же (хотя я не могу полностью уверить Вас, что это).

0
ответ дан 4 December 2019 в 01:58
поделиться

Я не уверен как точный следующий infomrationis с более новыми версиями.NET и/или версий Windows. MS, возможно, решил некоторые проблемы загрузки/совместного использования DLL с первых лет.NET. Но я полагаю, что так большая часть следующих все еще применяется.

С блоками.NET исчезает большое преимущество страницы, совместно использующей между процессами (и между сессиями Терминального сервера), потому что JIT должен написать собственный код на лету - нет никакого файла изображения для резервного копирования собственного кода. Таким образом, каждый процесс получает свои собственные, отдельные страницы памяти для кода jitted.

Это подобно проблемам, которые вызываются при наличии DLLs, неправильно базирующегося - если ОС должна выполнить fixups на стандартном Win32 DLL, когда это загружается, страницы памяти для согласованных частей не могут быть совместно использованы.

Однако, даже если код jitted не может быть совместно использован, существует преимущество для перебазирования.NET DLLs, потому что DLL все еще загружается для метаданных (и IL) - и тот материал может быть совместно использован, если никакие fixups не требуются.

Возможно помочь совместно использовать страницы памяти с блоком.NET при помощи ngen., но это взяло с собой его собственный набор проблем.

Посмотрите это старое сообщение в блоге Jason Zander для некоторых деталей:

http://blogs.msdn.com/jasonz/archive/2003/09/24/53574.aspx

У Larry Osterman есть достойная статья блога о совместном использовании страницы DLL и эффекте fixups:

http://blogs.msdn.com/larryosterman/archive/2004/07/06/174516.aspx

3
ответ дан 4 December 2019 в 01:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: