Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

Нахождение методов в памяти

#c_sharp #net #clr


Есть переменные (объекты) которые могут храниться как в куче так и в стеке. Есть
реализации методов у какого-то класса. (Речь не будет идти о виртуальных методах и VTable)

Где хранятся реализации методов в памяти, если они там хранятся? И как программа
знает как (или по какому адресу) выполнять эти методы?
    


Ответы

Ответ 1



В .NET реализация методов находится в памяти в 2 экземплярах: MSIL-коде, и в машинном коде. При компиляции MSIL-кода JIT создает в памяти функции на машинном коде. При этом JIT знает соответствия между .NET методами, и адресами функций на машинном коде. В итоге при генерации машинного кода JIT просто подставляет адреса этих функций. Они не будут меняться (перемещаться в памяти), так что волноваться не о чем. Пример. C# код: Console.ReadKey(); Console.ReadKey(); Console.ReadKey(); Debugger.Break(); Сгенерированный машинный код: lea rcx,[rsp+48h] xor edx,edx call 000007FEF1820C00 // Console.ReadKey lea rcx,[rsp+38h] xor edx,edx call 000007FEF1820C00 // Console.ReadKey lea rcx,[rsp+28h] xor edx,edx call 000007FEF1820C00 // Console.ReadKey call 000007FEF181E870 // Debugger.Break Как видно, в рантайме никто не ищет методы, иначе все бы работало намного медленнее. CLR держит в памяти структуры, называемыми Method Table Structure. Для каждого класса и каждого метода CLR помнит, есть ли скомпилированная в машинный код версия метода, и если есть, то где находится ее адрес. Для каждого типа CLR создает структуру, которая описывает его. В этой структуре находится таблица методов (включая информацию по виртуальным методам). Все эти CLR-структуры находятся в отдельной области памяти, которой управляет CLR. Область памяти с экземплярами .NET-классов (Managed Heap) находиться отдельно, и она управляется сборщиком мусора.

Ответ 2



как программа знает как (или по какому адресу) выполнять эти методы? Каждая программа работает с памятью не напрямую с физической, а с виртуальной памятью, думая, что она владеет полностью всей памяти и никто(другой процесс) не может ей мешать, хотя по факту часть программы может вообще находится не в ОЗУ, а быть выгруженной на диск, но для программы это прозрачно и она видит непрерывное адресное пространство. Как следствие, компилятор на стадии компиляции может указать, что такой то метод находится по такому-то адресу, а такой то по такому не вычисляя ничего в рантайме. Далее ОС используя виртуальные таблицы преобразует виртуальную память в физическую и обращается к физическим ячейкам. Рихетр "Операционные системы"

Комментариев нет:

Отправить комментарий