Главная /
Common Intermediate Language и системное программирование в Microsoft .NET
Common Intermediate Language и системное программирование в Microsoft .NET - ответы на тесты Интуит
Описаны основы архитектуры платформы .NET и промежуточный язык этой платформы - Common Intermediate Language (CIL). Подробно рассмотрен прием программирования, называемый динамической генерацией кода. Дано введение в многозадачность и описаны подходы к разработке параллельных приложений на базе платформы .NET. Адресовано всем изучающим вопросы создания метаинструментария и разработки компиляторов для различных операционных систем.
Список вопросов:
- # Платформа .NET разработана:
- # Разработка платформы .NET началась в:
- # Рабочим названием платформы .NET было:
- # Какой организацией стандартизована спецификация основной части платформы .NET?
- # Для чего используются метаинструменты?
- # Какая составляющая современного компилятора осуществляет лексический и синтаксический анализ программы и переводит программу в некоторое промежуточное представление?
- # К предшественникам платформы .NET можно отнести:
- # Операционная система UCSD p-System была разработана в:
- # Для принципов выполнения программ в UCSD p-System и .NET верно:
- # Две разнесенные во времени и пространстве фазы процесса компиляции программ технологии ANDF - это?
- # Для формата ANDF верно:
- # Для платформы Java верно:
- # Из каких компонентов состоит платформа .NET?
- # На основе спецификации CLI, разрабатываются следующие ее реализации:
- # Составными частями спецификации CLI являются:
- # Программа ngen представляет собой:
- # Укажите типичные ошибки при управлении памятью:
- # С точки зрения обеспечения безопасности в классификацию CIL-кода можно включить:
- # Абстрагировавшись от конкретных особенностей .NET, можно сказать, что основная цель системы типов заключается в:
- # Все ошибки в программах можно разделить на две категории:
- # В качестве примеров перехватываемых ошибок можно привести:
- # Неперехватываемые ошибки возникают:
- # Для программы, написанной на языке со строгой проверкой, справедливы следующие утверждения:
- # Какие пути существуют для диагностики запрещенных ошибок:
- # Ядро общей системы типов .NET состоит из следующих категорий:
- # Тип bool будет иметь следующее имя в .NET Framework Class Library:
- # Классы могут содержать следующие элементы:
- # Интерфейсы могут рассматриваться как чисто абстрактные классы, содержащие только следующие элементы:
- # Общая система типов не допускает присваивание ячейке несовместимого с ее типом:
- # Для объектных ссылок и значений типов-значений вводятся следующие отношения:
- # Дополнительными элементами системы типов .NET являются:
- # Одной из основных причин ухудшения производительности Java-программ является медленная работа сборщика мусора, вызванная:
- # Все структуры неявно наследуют от библиотечного класса:
- # В .NET имеются категории указателей:
- # Для того чтобы программы оставались безопасными, на использование управляемых указателей наложен целый ряд следующих ограничений:
- # Выберите верные утверждения для упакованных типов-значений:
- # Прием программирования, заключающийся в том, что фрагменты кода порождаются и запускаются непосредственно во время выполнения программы - это:
- # Целью динамической генерации кода является использование информации, доступной только во время выполнения программы, для:
- # При динамической генерации кода тип процессора - эта та часть информации, которая становится известной:
- # Применение динамической генерации оправдано, если:
- # В .NET доступны следующие способы организации динамической генерации кода:
- # Программно вычисление численного интегрирования функции можно выполнять следующими способами:
- # Идеальным вариантом представления функции, которое бы не зависело от конкретного способа вычисления значения функции является:
- # Имея какой класс мы можем записать обобщенный алгоритм интегрирования методом прямоугольников:
- # Для проверки работоспособности алгоритма следующего алгоритма:static double Integrate(Function f, double a, double b, int n) { double h = (b-a)/n, sum = 0.0; for (int i = 0; i < n; i++) sum += h*f.Eval((i+0.5)*h); return sum; }можно объявить тестовый класс TestFunction, реализующий вычисление функции f(x) = x * sin(x) следующим образом:
- # В данном примере: public abstract class Expression { public abstract string GenerateCS(); public abstract void GenerateCIL(ILGenerator il); public abstract double Evaluate(double x); } метод GenerateCIL:
- # В данном примере: public abstract class Expression { public abstract string GenerateCS(); public abstract void GenerateCIL(ILGenerator il); public abstract double Evaluate(double x); } метод GenerateCS:
- # В данном примере: public abstract class Expression { public abstract string GenerateCS(); public abstract void GenerateCIL(ILGenerator il); public abstract double Evaluate(double x); } метод Evaluate:
- # Порождение текста C#-программы и компиляция этой программы с помощью компилятора C#, доступного через библиотеку классов .NET является:
- # Классы, отвечающие за компиляцию исходного кода, относятся:
- # Метод CreateCompiler класса CSharpCodeProvider может создавать экземпляр компилятора C#, к которому можно обращаться через интерфейс:
- # При трансляции выражений в CIL метод начинается:
- # Вызывая метод DefineDynamicAssembly домена приложений мы можем получить:
- # Компилятор C# создает конструкторы:
- # При генерации динамической сборки через классы пространства имен System.Reflection.Emit конструкторы:
- # При каком способе вычисления значения функции на динамическую сборку будет затрачено 547 мс, на компьютере с процессором Intel Pentium 4 с тактовой частотой 3000 МГц и 1 Гб оперативной памяти:
- # Результаты измерений эффективности трех способов вычисления выражений, проведенных на компьютере с процессором Intel Pentium 4 с тактовой частотой 3000 МГц и 1 Гб оперативной памяти показывают, что динамическая генерация кода может:
- # Линейными участками можно называть участки кода:
- # Правило Expr ::= local x assign Expr можно описать так:
- # Определим набор функций, отображающих различные деревья абстрактного синтаксиса в соответствующие им последовательности инструкций CIL, можно считать, что каждая функция принимает в качестве параметра:
- # Разделить фаз генерации и оптимизации кода позволяет
- # Алгоритм peephole-оптимизации использует понятие:
- # Для peephole-оптимизации CIL-кода вместо:stloc(starg) x ldloc(Ldarg) хможно использовать:
- # Использование каких структурных конструкций позволяет существенно упростить генерацию развилок:
- # Следующее правило:LogExpr ::= LogExpr ComparisonOp LogExprможно описать так:
- # Функции какого набора отображают деревья абстрактного синтаксиса, соответствующие логическим выражениям, в CIL:
- # При записи абстрактного синтаксиса управляющих конструкций используется нетерминал LogExpr для представления:
- # Правило Statement ::= Statement StatementList можно описать так:
- # Функций какого набора транслируют деревья абстрактного синтаксиса в последовательности инструкций:
- # Для обнаружения избыточных инструкций сохранения значений выполняется анализ использования переменной, состоящий из следующих фаз:
- # При удалении псевдонима Y переменной X осуществляются следующие действия:
- # При воспроизведении константы C, являющейся значением переменной Y осуществляются следующие действия:
- # Для современных операционных систем и для различных систем программирования в современном мире поддержка разработки и реализация:
- # Очень сильно зависит от того, какая вычислительная система и какие аспекты работы этой системы рассматриваются с точки зрения многозадачности:
- # Способом реализации многозадачности могут быть:
- # Современные операционные системы, как правило, поддерживают:
- # Использование нескольких процессоров для одновременного выполнения задач - это:
- # Одновременное выполнение нескольких задач на одном или нескольких процессорах:
- # В современных компьютерах одновременно сосуществует несколько различных реализаций мультипроцессирования, но практически всегда применяются следующие функционально различные устройства:
- # В каких компьютерах несколько процессоров подключены к общей оперативной памяти и имеют к ней равноправный и конкурентный доступ:
- # Для каких систем критической становится среда передачи данных:
- # Для cc-NUMA архитектуры верно:
- # На многопроцессорных системах при реальной возможности распараллеливания задач по разным процессорам, обычно используют механизм разделения времени:
- # В случае невытесняющей многозадачности решение о переключении принимает:
- # Большинство современных операционных систем используют комбинированные планировщики, одновременно применяющие:
- # Типичными причинами коррекции приоритета являются:
- # Для процесса верны следующие утверждения:
- # Поток является объектом планирования:
- # Термин "fiber" может переводиться так:
- # Дескриптор должен содержать:
- # В современных полновесных реализациях Windows планировщик ядра выделяет процессорное время:
- # В Windows управление волокнами возложено на:
- # Фактически для волокон реализуется (в операционной системы Windows):
- # В Windows определен следующий список событий, которые приводят к перепланированию потоков:
- # При переходе из состояния "ожидание" в "готовность": если ожидание было долгим, то стек потока может быть выгружен:
- # При выборе потока для выполнения учитываются приоритеты потоков (абсолютные приоритеты) - система начинает выполнять:
- # Процесс выбора потока для выполнения усложняется в случае SMP систем, когда помимо приоритета готового к исполнению потока учитывается:
- # Процессор, на котором запускается приложение в первый раз:
- # Диспетчер памяти Windows при выделении памяти для запускаемого процесса старается учитывать доступность памяти для назначенного процессора в случае:
- # Если на одном из процессоров в многопроцессорной системе работает поток с меньшим приоритетом, то последний вытесняется:
- # Планировщик Windows динамически изменяет:
- # Администратор системы может в некоторой степени изменить поведение системы при:
- # Квантование потоков осуществляется:
- # Какой параметр реестра предназначен для управления квантованием:
- # Фиксированная длительность короткого кванта со значением 1 равна:
- # Сколько уровней приоритетов выделяется в Windows?
- # Какие приоритеты соответствуют динамическим уровням приоритетов:
- # Планировщик операционной системы может корректировать уровень приоритета в случае пробуждении GUI потоков:
- # Используемые в операционной системе средства реализации многозадачности можно разделить на следующие группы:
- # Наиболее типичным примером относительно универсальных средств взаимодействия с устройствами являются средства:
- # Когда процесс запускается, операционная система в нем самостоятельно создает:
- # Гибрид средств управления потоками и асинхронного ввода-вывода в Windows называется:
- # Потоки, работающие в рамках одного процесса, имеют возможность взаимодействовать друг с другом:
- # Взаимодействие потоков, работающие в рамках одного процесса может:
- # При взаимодействие между процессами одного компьютера диспетчер памяти операционной системы должен предусмотреть средства организации:
- # Многие операционные системы предоставляют дополнительные средства межпроцессного взаимодействия, многие из них являются:
- # В общем случае память разных компьютеров можно рассматривать как:
- # Обычные операции ввода-вывода происходят:
- # Эффективность использования процессора можно было бы повысить, если бы существовала возможность выполнять код программы:
- # В Windows для реализации асинхронного ввода-вывода предусмотрены функции типа:
- # В Windows для реализации асинхронного ввода-вывода предусмотрена следующая специальня структура:
- # Специальная структура OVERLAPPED используется для:
- # Выяснить состояние асинхронной операции, дождаться ее завершения или отменить ее, не дожидаясь завершения можно с помощью следующего набора функций:
- # Какой способ может обеспечить самую быструю реакцию на завершение операции ввода-вывода, но ценой более высокой загрузки процессора:
- # В данном случае:ov.Offset = 12345; if ( WriteFile( fh, buffer, sizeof(buffer), &dwWritten, &ov ) || GetLastError() == ERROR_IO_PENDING ) { while (!GetOverlappedResult(fh, &ov, &dwWritten, FALSE)){} } else { }Функция GetOverlappedResult проверяет:
- # В данном случае:ov.Offset = 12345; ov.hEvent = CreateEvent((LPSECURITY_ATTRIBUTES)NULL, TRUE, FALSE, 0); if ( WriteFile( fh, buffer, sizeof(buffer), &dwWritten, &ov ) || GetLastError() == ERROR_IO_PENDING ) { GetOverlappedResult( fh, &ov, &dwWritten, TRUE ); } else { }функция GetOverlappedResult проверяет состояние операции и, если она еще не завершена, вызывает функцию:
- # Alertable waiting как состояние потока - это:
- # Для реализации асинхронного ввода-вывода в операционной системе предусмотрен специальный механизм, основанный на:
- # Для реализации APC операционная система ведет:
- # Для перевода потока в состояние ожидания оповещения Win32 API предусматривает специальный набор функций:
- # Обычно APC используются самой системой для реализации:
- # С помощью какой функции можно ставить в APC очередь запросы для вызова собственных функций:
- # Объектами ядра являются:
- # Дескриптор безопасности (Security Descriptor) содержит информацию:
- # Для того, чтобы процесс или поток мог ссылаться на объекты ядра, созданные другим процессом или потоком предусмотрены следующие механизмы:
- # В Windows для идентификации процессов и потоков используют их:
- # С помощью каких функций можно узнать идентификаторы текущего процесса и потока:
- # Какая функция превращает псевдоописатель процесса в настоящий описатель, действующий только в текущем процессе:
- # Какие функции Win32 API предоставляет для изменения класса приоритета для процесса:
- # В случае Visual Studio многопоточные версии библиотек выбираются ключами:
- # Windows предоставляет следующие способы измерения интервалов:
- # Если стандартное разрешение мультимедийного таймера на данном компьютере хуже 5-10 мс, то у функции timeBeginPeriod есть побочный эффект - улучшение разрешения повлияет на работу:
- # Планировать исполнение исполнение волокон можно с помощью:
- # Целевая функция FiberProc эпизодически вызывает следующую функцию для переключения выполняемого волокна:
- # При разработке параллельных приложений необходимо обеспечить:
- # Разработка серверов, обслуживающих асинхронно поступающие запросы является:
- # Реализация однопоточного сервера для обслуживания асинхронно поступающие запросы нецелесообразна по следующим причинам:
- # Для реализации пула потоков необходимо создание:
- # При использовании пула потоков имеет смысл ограничивать общее число рабочих потоков:
- # Если при использовании пула потоков последние занимаются исключительно вычислительной работой, то их число не должно превышать:
- # В Windows поддержка пула потоков реализована в виде:
- # В Windows порта завершения ввода-вывода берет на себя функциональность, необходимую для организации:
- # Что касается порта завершения ввода-вывода в Windows, то с точки зрения разработчика приложения необходимо:
- # Порт завершения создается с помощью функции:
- # Типичными формами применения функции CreateIoCompletionPort являются:
- # Создавать новый порт завершения ввода-вывода с помощью функции CreateIoCompletionPort можно так:
- # При простом создании порта завершения ввода-вывода достаточно указать только:
- # Ассоциирование порта с файлом можно осуществить так:
- # С помощью функции PostQueuedCompletionStatus можно помещать в очередь порта запросы:
- # Число потоков в пуле обычно превышает число:
- # Чтобы порт завершения ввода-вывода не связывать с файлами, для размещения запроса можно воспользоваться функцией:
- # В общем виде поток в пуле реализует цикл с выбором запросов из очереди с помощью функции:
- # В современных реализациях Windows с помощью функции:BOOL QueueUserWorkItem( LPTHREAD_START_ROUTINE QueryFunction, PVOID pContext, ULONG Flags );предусмотрена возможность:
- # С помощью флага WT_EXECUTEDEFAULT запрос будет направлен:
- # Флаг WT_EXECUTEINIOTHREAD заставит систему обрабатывать запрос в потоке, который находится:
- # При разработке многопоточных приложений возникает необходимость обеспечивать не только параллельное исполнение кода потоков, но также их взаимодействие:
- # Поскольку все потоки разделяют общее адресное пространство процесса, то все они имеют общий и равноправный доступ:
- # Очень часто для изоляции данных достаточно их размещать:
- # Thread Local Storage - это:
- # Выберите утверждения верные для TLS памяти:
- # Сколько функций предоставляет ОС Windows необходимых для работы с локальной для потока памятью:
- # Какая функция выделяет в ассоциированной с потоком памяти двойное слово, индекс которого возвращается вызвавшей процедуре:
- # Для доступа к данным зарезервированной ячейки используется функция:
- # Какая функция изменяет значение в соответствующей ячейке:
- # В Visual Studio работа с локальной для потока памятью может быть упрощена при использовании:
- # При использовании _declspec(thread) при описании переменных компилятор будет размещать эти переменные:
- # Следует внимательно следить за выделением и освобождением данных, указатели на которые:
- # Аналогично TLS памяти, Windows поддерживает память, локальную для волокон:
- # В данном случае:DWORD FlsAlloc( PFLS_CALLBACK_FUNCTION lpCallback ); VOID WINAPI FlsCallback( PVOID lpFlsData ) { ... }происходит:
- # Маска, назначаемая потоку, должна быть:
- # Существует проблема одновременного конкурирующего доступа нескольких потоков к общим разделяемым данным при реализации:
- # В каких приложения особенно актуальна проблема одновременного конкурирующего доступа нескольких потоков к общим разделяемым данным:
- # В данном примере:#include <stdio.h> #include <process.h> #include <windows.h> #define THREADS 10 #define ASIZE 10000000 static LONG array[ASIZE]; unsigned __stdcall ThreadProc( void *param ) { int i; for ( i = 0; i < ASIZE; i++ ) array[i]++; return 0; } int main( void ) { HANDLE hThread[THREADS]; unsigned dwThread; int i, errs; for ( i = 0; i < THREADS; i++ ) hThread[i] = (HANDLE)_beginthreadex( NULL, 0, ThreadProc, NULL, 0, &dwThread ); WaitForMultipleObjects( THREADS, hThread, TRUE, INFINITE ); for ( i = 0; i < THREADS; i++ ) CloseHandle( hThread[i] ); for ( errs=i=0; i<ASIZE; i++ ) if ( array[i] != THREADS ) errs++; if ( errs ) printf("Detected %d errors!\n", errs ); return 0; }несколько потоков увеличивают значение элементов общего массива на:
- # Операция увеличения на 1 элемента массива требует:
- # Какие существуют в Windows способы решения проблем, возникающих при осуществлении одновременного доступа разных потоков к общим данным:
- # В достаточно частых случаях необходимо обеспечить конкурентный доступ к какой-либо целочисленной переменной, являющейся счетчиком. Тогда бывает достаточно просто обеспечить:
- # Атомарные операции обычно имеют более-менее близкое соответствие:
- # В командах процессора операции с блокировкой шины имеют префикс:
- # Для увеличения значения целочисленных переменных ОС Windows предоставляет следующие функции:
- # Для уменьшения значения целочисленных переменных ОС Windows предоставляет следующие функции:
- # Какая функция подготавливает начальный указатель на LIFO список:
- # Некоторый фрагмент кода, который должен выполняться в исключительном режиме - никакие другие потоки и процессы не должны выполнять этот же фрагмент в то же время называется:
- # В Windows предусмотрен специальный тип данных, предназначенный для реализации критических секций, который называет:
- # Работа с критическими секциями сводится к следующим основным функциям:
- # Какая функция позволяет при необходимости не входить в секцию, если она занята:
- # С точки зрения операционной системы объекты ядра, поддерживающие интерфейс синхронизируемых объектов, могут находиться в следующих состояниях:
- # Функции проверяют состояние ожидаемого объекта или ожидаемых объектов и продолжают выполнение, только если:
- # Функция WaitForSingleObject осуществляет ожидание:
- # Некоторый объект, который может находиться в одном из двух состояний: занятом или свободном - это:
- # Для ограничения числа потоков, имеющих одновременный доступ к какому-либо ресурсу предназначены:
- # Для захвата мьютекса используется функция:
- # Какие объекты предназначены для выполнения операций через заданные промежутки времени или в заданное время:
- # Таймеры могут:
- # При необходимости точно планировать время выполнения надо использовать следующие функции:
- # Процессы в Windows определяют адресное пространство, которое будет использоваться:
- # Основные механизмы взаимодействия процессов могут быть разделены на следующие группы:
- # Надстройка, использующая проецирование для реальной передачи данных - это:
- # Для создания процессов используются функции:
- # Для управления адресным пространством предназначены функции:
- # Для проецирования файла или его части в память предназначены функции:
- # Проецирование файлов используется:
- # Для явного сброса данных из оперативной памяти в файл можно использовать следующую функцию:
- # Механизм проецирования файлов является базовым средством для передачи данных:
- # Работа с разделяемыми данными посредством проецирования файлов связана:
- # В случае работы с разделяемыми данными посредством проецирования файлов связана с объявлением специальных разделяемых сегментов в приложении, которые:
- # Какие директивы для объявления разделяемого сегмента и помещаемых в него данных можно использовать в Microsoft Visual C++:
- # Аналогично средствам операционной системы средства .NET Framework могут быть разделены на следующие группы:
- # К организации многопоточных приложений можно отнести:
- # При запуске .NET приложения автоматически создается:
- # Для облегчения процесса переноса .NET на другие платформы в архитектуру CLR включен специальный уровень адаптации к платформе:
- # Platform Adaptation Layer является прослойкой между основными механизмами CLR и:
- # В случае платформы Windows PAL должен предоставить для CLR функциональность, аналогичную:
- # В случае платформ, не поддерживающих многопоточные приложения, PAL должен:
- # Потоки в .NET не предусматривают средств:
- # Основные классы для реализации многопоточных приложений определены в пространстве имен:
- # Для .NET верно:
- # Если начальные значения всех элементов матриц равны 1, то результирующая матрица должна быть заполнена числами, равными:
- # Поток в .NET может находиться в одном из следующих состояний:
- # Текущее состояние потока можно определить с помощью свойства:
- # Для выполнения задержек в ходе выполнения потока предназначены следующие методы:
- # Для получения и задания приоритета потока используется свойство:
- # Для реализации асинхронного ввода-вывода в .NET предназначен абстрактный класс:
- # Какой потомок абстрактного класса Stream в .NET Framework предоставляет возможность использования байтового массива в качестве источника или получателя данных:
- # Какой потомок абстрактного класса Stream в .NET Framework обеспечивает буферизацию запросов чтения и записи:
- # Класс ThreadPool предлагает следующие способы для вызова асинхронных процедур:
- # .NET позволяет осуществлять асинхронные вызовы любых процедур с помощью метода:
- # Какой метод ставит вызов указанной процедуры в очередь для обработки:
- # В случае с использованием объектов, производных от класса System.Threading.WaitHandle вызов асинхронной процедуры связывается с переводом объекта:
- # Когда определяется какой-либо делегат функции, для него будут определены методы:
- # Какой метод содержит все выходные параметры:
- # Какой метод позволяет узнать результат завершения процедуры:
- # Использование BeginInvoke позволяет связать с завершением обработки асинхронной процедуры:
- # Метод EndInvoke служит для ожидания:
- # .NET предоставляет следующий набор средств взаимодействия потоков и их взаимной синхронизации:
- # Какие методы платформы .NET позволяют осуществлять операции над целыми числами, которые могут выполняться атомарно:
- # Самое начало процедуры потока, там, где определяется номер полосы:public static void ThreadProc() { int i,j,k, from, to; from = ( m_stripused++ ) * m_stripsize; to = from + m_stripsize; ...с помощью атомарных операций можно переписать так:
- # Средствами взаимной синхронизации потоков в .NET являются:
- # Мониторы в .NET являются аналогами:
- # Какой базовый класс предоставляет .NET, служащий для описания объекта, который находится в одном из двух состояний: занятом или свободном:
- # При синхронизации потоков исключительный доступ единственного потока, вносящего в объект изменения можно назвать так:
- # В следующем примере:class SomeData { [ThreadStatic] public static double xxx; ...поле класса SomeData.xxx будет размещено:
- # Таймеры в .NET могут быть описаны в следующих пространствах имен:
- # Virtual Execution System - это:
- # Абстрактная виртуальная машина способна выполнять:
- # В реализациях CLI вместо интерпретатора CIL-кода используется:
- # VES является значительно более абстрактной моделью, чем:
- # В чем причина того, что VES является более абстрактной моделью, чем JVM?
- # Изучение работы виртуальной машины CLI заключается в том, чтобы понять:
- # Виртуальная машина может выполнять сразу несколько:
- # Нити (threads) могут:
- # Состояние виртуальной машины является совокупностью состояний:
- # Состояние нити представляет собой односвязный список состояний:
- # Если активный метод закончит свою работу, то его состояние будет:
- # Состояние кучи определяется состояниями содержащихся в ней:
- # Элементы состояния метода можно условно разделить на следующие группы:
- # Изменяемые данные доступны из тела метода для:
- # Для неизменяемых данных верно:
- # Элементами состояния метода, входящими в группу изменяемых данных являются:
- # Что из изменяемых данных содержит адрес следующей инструкции в теле метода, которая будет выполнена системой выполнения:
- # В группу неизменяемых данных входят следующие элементы состояния метода:
- # В виртуальной системе выполнения вместо регистров применяется:
- # Глубина стека в VES задается:
- # Тип F представляет собой:
- # Беззнаковый тип unsigned int32 при загрузке на стек вычислений становится:
- # Слоты, из которых состоят массивы переменных и параметров:
- # Память из области локальных данных может быть явно выделена с помощью инструкции:
- # Одной из основных особенностей платформы .NET, делающих ее привлекательной для разработки приложений, является механизм:
- # По спецификации CLI память для объектов, используемых в программе, выделяется в:
- # Работает на основе построения графа достижимости объектов:
- # Специальный указатель HeapPtr содержит адрес, по которому будет выделена память:
- # Для некоторых объектов определены методы Finalize, выполняющие некие действия:
- # Функция malloc выполняет следующие действия:
- # Что такое корень (root)
- # Запуск сборщика мусора осуществляется в тот момент, когда совокупный размер объектов в куче:
- # Дефрагментация заключается в сдвиге достижимых объектов:
- # Все объекты делятся на следующие категории:
- # Одним из способов увеличения производительности сборщика мусора является:
- # Большими считаются объекты, размер которых превышает:
- # Файл, который может быть загружен в память загрузчиком операционной системы и затем исполнен - это:
- # В операционной системе Windows исполняемые файлы, как правило, имеют расширения:
- # Основным форматом для хранения исполняемых файлов в операционной системе Windows является:
- # Смысл раздельной компиляции заключается в том, что части программы (модули) компилируются независимо в объектные файлы, которые затем связываются:
- # В ".NET Framework Glossary" утверждается, что:
- # Управление памятью в Windows NT/2k/XP/2k3 осуществляет:
- # Менеджер виртуальной памяти использует страничную схему управления памятью, при которой вся физическая память делится на одинаковые отрезки размером в:
- # Каждый процесс в Windows запускается в своем виртуальном адресном пространстве размером в:
- # Для memory-mapped files верно:
- # Разность виртуального адреса данного элемента и базового адреса, по которому PE-файл загружен в память - это:
- # Секция в PE-файле представляет:
- # Как правило, все exe-файлы содержат в поле ImageBase значение:
- # Какая секция описывает функции, которые PE-файл импортирует из динамических библиотек?
- # Информация об экспортируемых функциях хранится внутри PE-файла в специальной секции:
- # Сразу после заголовка MS-DOS следует сигнатура PE-файла, состоящая из четырех байт:
- # Заголовок PE-файла состоит из следующих полей:
- # Поля дополнительного заголовка можно разделить на следующие группы:
- # В дополнительном заголовке PE-файла поле longCodeSize; - это:
- # Cекция содержит исполняемый код в следующем случае:
- # Структура Hint/Name состоит из следующих полей:
- # Внесение исправления в 32-разрядное значение, которое находится по адресу FixupAddress, выполняется так:
- # В заголовоке CLI поле "long Cb;":
- # Какие поля в заголовоке CLI содержат информацию о версии CLR, для которой предназначена данная сборка:
- # Описывает свойства сборки следующее поле заголовока CLI:
- # Токен метаданных, указывающий на точку входа в сборку для заголовока CLI - это:
- # В каком поле заголовка CLI указываются RVA и размер в байтах ресурсов сборки:
- # Какое поле заголовка CLI не используется и всегда заполнено нулями:
- # Программа pegen написана на языке:
- # В данном примере: void make_file (FILE* file, PINPUT_PARAMETERS inP) { make_headers (file, inP); make_text_section (file, inP); make_cli_section (file, inP); make_reloc_section (file, inP); }; функция make_file вызывает:
- # Блок входных параметров описывается структурой:
- # Можно выделить следующие этапы выполнения программы:
- # В следующей форме в программе находится CIL-код методов:
- # Сообщением об успешной генерации сборки hello.exe будет:
- # Метаданные служат для:
- # Метаданные хранятся:
- # Для хранения метаданных используется:
- # Для формата исполняемых файлов .NET верно:
- # Расположение метаданных задается:
- # Метаданные и CIL-код практически не зависят от остальных элементов:
- # Метаданные начинаются с заголовка, называемого:
- # Корень метаданных начинается с 32-разрядной сигнатуры:
- # Если каждый байт начальной сигнатуры корня метаданных рассматривать в виде ASCII-кода, то получится строка:
- # Основными разработчиками .NET Framework являются:
- # Корень метаданных заканчивается:
- # В заголовке потока метаданных полем с размером этого потока в байтах является:
- # Представляет собой последовательность 128-битных глобальных идентификаторов следующий поток метаданных:
- # Поток таблицы метаданных имеет следующее имя потока:
- # Имя "#Blob" имеет следующий поток:
- # К таблицам метаданных можно отнести:
- # Различные биты какого поля заголовка таблиц метаданных задают размеры индексов, используемых для адресации куч метаданных:
- # В каком поле таблицы членов импортируемых типов специальным образом закодированная информация об импортируемом типе:
- # В качестве примера компонентный подход к разработке программного обеспечения можно привести:
- # Преимущества компонентного подхода перевешивают:
- # Взаимодействие компонентов, написанных на разных языках:
- # Отсутствие удовлетворительной технологии взаимодействия компонентов приводит к следующим негативным явлениям:
- # В компонентной системе можно выделить следующие виды взаимодействия компонентов:
- # Организация компонентного программирования на базе библиотек подпрограмм обладает следующими недостатками:
- # Для открытых исходных текстов верны утверждения:
- # Технология COM поддерживает следующие виды взаимодействия компонентов:
- # В терминах CORBA информационная магистраль называется:
- # Какие особенности платформы .NET позволяют среде выполнения автоматически обеспечивать взаимодействие компонентов вне зависимости от того, на каком языке они написаны:
- # При взаимодействия двух объектов на платформе .NET, объекты Client и Server находятся в разных компонентах, работающих:
- # Компоненты на платформе .NET представляют собой:
- # Флаг видимости для типов NestedAssembly имеет следующее значение:
- # Флаг доступа для членов типа, имеющий значение 0x00000002 - это:
- # Флаг доступа для членов типа Public имеет следующее значение:
- # В данном примере:Default Public ReadOnly Property Array (ByVal Index As Integer) As Integer Get Return Arr(Index) End Get End Property Public ReadOnly Property Count() As Integer Get Return Arr.Length End Get End Propertyдля доступа к отсортированному массиву используются свойства:
- # Класс InsertSortedArray:using VBLib; public class InsertSortedArray: SortedArray { protected override void Sort() { for (int i = 0; i < Arr.Length-1; i++) { int max = i; for (int j = i+1; j < Arr.Length; j++) if (Arr[j] > Arr[max]) max = j; int tmp = Arr[i]; Arr[i] = Arr[max]; Arr[max] = tmp; } } public InsertSortedArray(int[] A): base(A) { } }переопределяет абстрактный метод:
- # Основными правилами Common Language Specification являются:
- # Язык Common Intermediate Language является независимым от аппаратной платформы:
- # Инструкции CIL можно разделить на следующие основные группы:
- # Инструкция call, вызывающая метод, имеет встроенный операнд, задающий:
- # Операнд none имеет размер в байтах равный:
- # Операнд int64 имеет размер в байтах равный:
- # Операнд token имеет размер в байтах равный:
- # Какая инструкция загружает на стек вычислений значение первого аргумента метода:
- # В каком случае будет произведена динамическая проверка типа объекта на стеке вычислений:
- # В каком случае на стек вычислений будет загружен специальный описатель массива переменных параметров метода:
- # Если инструкция, следующая за инструкцией br, имеет абсолютный адрес next_addr, то адрес перехода rel_addr вычисляется так:
- # Ограничениями на последовательности инструкций, введеными для упрощение JIT-компилятора являются следующие:
- # Когда JIT-компилятор доходит до инструкции ldc.0, расположенной непосредственно после инструкции безусловного перехода br L2, он:
- # Какие инструкции языка CIL, служат для организации вычислений:
- # Для обмена значениями между стеком вычислений и памятью предназначены следующие инструкции:
- # Инструкция ldnull имеет следующий код:
- # Сколько существует вариантов инструкций для работы с переменными и параметрами:
- # Код 0xDF соответствует инструкции:
- # Инструкция pop имеет следующий код:
- # Арифметические инструкции можно разделить на следующие категории:
- # Среди базовых бинарных операций сложением является инструкция:
- # Какие инструкции выполняют унарные арифмитические операции:
- # Инструкция ckfinite имеет код:
- # Какая инструкция интерпретирует целое значение, лежащее на вершине стека, как не имеющее знака и преобразует его к вещественному типу:
- # Инструкция conv.ovf.u8.un имеет следующий код:
- # Инструкции для организации передачи управления можно разделить на следующие категории:
- # Сколько существует инструкций безусловного перехода?
- # Безусловными инструкциями являются:
- # Какие инструкции потребляют со стека вычислений один операнд и, в зависимости от его значения, осуществляют или не осуществляют переход по указанному во встроенном операнде относительному адресу:
- # Диаграмма стека для базовых инструкций условного перехода выглядит следующим образом:
- # Инструкция beq имеет следующий код:
- # Какая инструкция имеет следующее описание: ceq; brtrue.s?
- # Какая инструкция имеет следующее описание: clt.un; brtrue.s?
- # Какая инструкция имеет код 0x42?
- # Какая иструкция выполняет вызов метода:
- # Какая инструкция имеет код 0x2A?
- # Осуществляет возврат из метода следующая инструкция:
- # Язык CIL содержит богатый набор инструкций, предназначенных для поддержки объектной модели, который можно на следующие основные категории:
- # Диаграмма стека для инструкции newobj:
- # Какая инструкция имеет код 0x74:
- # Какая инструкция загружает значение поля объекта:
- # Загружает адрес статического поля объекта следующая инструкция:
- # Диаграмма стека для инструкции callvirt:
- # Инструкция callvirt имеет следующий код:
- # Какая инстукция создает на вершине стека объект-строку:
- # Диаграмма стека для инструкции ldstr:
- # Инструкция newarr выделяет память под одномерный массив, индексируемый:
- # Диаграмма стека для инструкции newarr:
- # Какая инструкция загружает размер одномерного массива на стек вычислений:
- # Инструкции ldelem предназначены для загрузки значения элемента:
- # Инструкция ldelem.u2 имеет код:
- # Диаграмма стека для инструкций ldelem выглядит так:
- # Диаграмма стека для инструкции ldelema выглядит следующим образом:
- # Диаграмма стека для инструкций stelem:
- # Инструкция stelem.i8 имеет код:
- # Инструкция initobj потребляет со стека вычислений адрес значения:
- # Какая инструкция заполняет все поля значения нулями:
- # Какая инструкция загружает на стек размер значения указанного типа:
- # Диаграмма стека для инструкций sizeof:
- # Диаграмма стека для инструкций stobj:
- # Какая инструкция имеет следующую диаграмму стека: ..., obj ->..., ptr?
- # Какая инструкция имеет следующую диаграмму стека: ..., value ->..., obj?
- # Какая инструкция применяется для работы с библиотекой рефлексии:
- # Инструкция ldtoken имеет код:
- # Типизированные ссылки в системе типов .NET реализованы исключительно для поддержки некоторых особенностей синтаксиса и семантики языка:
- # Сколько инструкций CIL предусмотрено для работы с типизированными ссылками:
- # Инструкция mkrefany предназначена для:
- # Инструкция mkrefany имеет код:
- # Диаграмма стека для инструкций mkrefany:
- # Загружает токен, хранящийся в типизированной ссылке следующая инструкция:
- # Диаграмма стека для инструкций refanytype:
- # Инструкция refanyval имеет код:
- # Диаграмма стека для инструкций refanyval:
- # Какие существуют способы перехвата ошибок, возникающих в процессе работы программы:
- # Каждое предложение обработки исключений представляет собой структуру, состоящую из нескольких полей, в которых записаны координаты следующих областей:
- # Поле предложения обработки исключений в случае короткого формата ClassToken имеет смещение равное:
- # Полe предложения обработки исключений в случае длинного формата Flags имеет размер равный:
- # Какие допустимые значения имеет поле Flags предложения обработки исключений:
- # Возможны следующие типы обработчиков исключений:
- # Какая инструкция генерирует исключение, включая тем самым механизм обработки исключений:
- # Какая инструкция разрешена только внутри обработчика исключений с фильтрацией по типу и предназначена для генерации того же самого исключения, которое было поймано обработчиком:
- # Встроенный операнд int32 имеют следующие инструкции:
- # Диаграмма стека для инструкции leave:
- # Диаграмма стека для инструкции endfinally:
- # Диаграмма стека для инструкции endfilter:
- # В общем случае, предложение обработки исключений определяет в коде метода:
- # Какие существуют правила для расположения областей, которые определяет предложение обработки исключений в коде метода?
- # Передача управления внутрь защищенных областей, из них и между ними и их обработчиками регламентирована следующими правилами:
- # Для выхода из защищенной области, из области фильтра или из области обработчика существуют только следующие возможности:
- # Пусть в некотором методе инструкция, расположенная по некоторому адресу, породила исключение. Система выполнения обрабатывает это исключение:
- # Система выполнения для обработки сгенерированного исключения на втором этапе:
- # В составе .NET Framework SDK поставляется ассемблер:
- # Ассемблер, входящий в составе .NET Framework SDK позволяет компилировать:
- # IL-формат - это формат файлов, поддерживаемый:
- # Программы в IL-формате состоят из следующих лексических элементов:
- # Идентификаторы и метки чаще всего представляют последовательности символов, начинающиеся с латинской буквы (или с символов "_", "$", "@" и "?"), за которой следуют:
- # В каком случае в идентификаторы будут включены символы Unicode:
- # Несколько идентификаторов могут будут объединены в один идентификатор в следующем примере:
- # В вещественных константах для разделения целой и дробной части используется:
- # Комментарии в IL-программах записываются так:
- # К элементам IL-программы можно отнести:
- # В каком примере диектива заголовка задает имя сборки:
- # В каком примере происходит объявление неэкспортируемого интерфейса:
- # Атрибутами полей являются:
- # В каком примере происходит объявление поля x типа массив:
- # Объявление конструктора с двумя параметрами происходит в следующем случае:
- # Директивами тела метода являются:
- # В следующем примере:.class public SampleClass { .method public static void Demo() { .entrypoint .maxstack 3 ldc.r8 0.0 ldc.r8 0.0 newobj void Point::.ctor(float64,float64) ldc.r8 1.0 ldc.r8 1.0 newobj void Point::.ctor(float64,float64) call float64 Point::Distance(valuetype Point, valuetype Point) call void [mscorlib]System.Console::WriteLine (float64) ret } }метод Demo будет вычислять расстояние между точками:
- # Сборка успешно прошла верификацию в следующем случае:
- # Код метода в сборке .NET представляет собой:
- # Представленный в теле метода алгоритм в общем случае:
- # Существуют следующие механизмы передачи управления между инструкциями:
- # В каком примере метод find выполняет поиск элемента k в массиве X:
- # При использовании метода find для поиска элемента в массиве, в случае если элемент не найден возвращается:
- # При использовании метода find для поиска элемента в массиве, в случае если элемент найден возвращается:
- # Какая схема представления кода является наиболее компактной?
- # Какие метаинструменты, выполняющие только анализ CIL-кода, могут непосредственно работать с линейной последовательностью инструкций:
- # Для метаинструментов, которые выполняют преобразование CIL-кода удобно использовать его представление:
- # Дуги графа потока управления изображают:
- # Количество дуг, исходящих из узла графа, зависит от:
- # Номер дуги должен задавать ее:
- # Блоки обработки исключений в CIL реализованы в виде:
- # Главный блок графа, в который непосредственно или транзитивно входят все остальные узлы графа - это:
- # Какой блок прикреплен к защищенному блоку и может получить управление при выходе из этого защищенного блока:
- # Блок обработки исключений:
- # Блок обработки исключений в графе потока управления имеет:
- # Выход из блока обработки исключений в графе потока управления может осуществляться через:
- # Каждый защищенный блок имеет ссылки на соответствующие:
- # Обработка исключений требует введения в граф особых дуг, которые отражают:
- # Какой блок имеет более сложную структуру, чем другие блоки обработки исключений:
- # Когда выполнение некоторой инструкции в линейной последовательности инструкций порождает исключение, всегда можно легко определить защищенный блок, которому:
- # Чтобы определить, в какой блок входит некоторая инструкция графа, мы должны каким-то образом пройти от этой инструкции по дугам графа:
- # К чему сводится операция поиска блока, в который входит инструкция, на графе, включающем дерево блоков:
- # Дан массив инструкций P размера N и массив предложений обработки исключений EH размера M, какое поле задает тип обработчика исключений:
- # Дан массив инструкций P размера N и массив предложений обработки исключений EH размера M, какое поле является количество инструкций, входящих в защищенную область:
- # В процессе преобразования линейной последовательности инструкций в граф потока управления, на первом этапе, для каждой инструкции, входящей в массив P размера N:
- # В процессе преобразования линейной последовательности инструкций в граф потока управления, на первом этапе, для каждой инструкции, входящей в массив P, мы создаем соответствующий ей узел графа, в который записываются все данные об инструкции, кроме информации о:
- # Дан массив инструкций P размера N и массив предложений обработки исключений EH размера M. Этап создания узелов графа для каждой инструкции и формирования из созданных узлов массива на C#-подобном псевдоязыке можно записать так:
- # Дан массив инструкций B размера G и массив предложений обработки исключений OP размера Z. На входе этапа создания дерева блоков мы имеем:
- # Дан массив инструкций B размера G и массив предложений обработки исключений OP размера Z. На выходе этапа создания дерева блоков мы получаем:
- # Дан массив инструкций B размера G и массив предложений обработки исключений OP размера Z. На выходе этапа создания дерева блоков мы получаем вспомогательный массив T, каждый элемент которого состоит из следующих полей:
- # Дан массив инструкций B размера G и массив предложений обработки исключений OP размера Z. На выходе этапа создания дерева блоков их минимальное количество в массиве T равно:
- # Преобразование линейной последовательности инструкций в граф потока управления происходит в ходе следующих этапов:
- # В процессе преобразования линейной последовательности инструкций в граф потока управления, на третьем этапе, во время первой итерации цикла родителем всех узлов становится:
- # На четвертом этапе процесса преобразования линейной последовательности инструкций в граф потока управления в последний добавляются:
- # Код программ не разрушает память, если эти программы, будучи запущенными в одном адресном пространстве:
- # Процесс автоматического доказательства того, что этот код не разрушает память - это:
- # Алгоритмы верификации являются:
- # Алгоритмы верификации в общем случае имеют следующие проблемы:
- # Алгоритмы, работающие неизвестно сколько времени и потребляющие неизвестно какое количество ресурсов, представляют скорее:
- # Сколько известно подходов для алгоритмов верификации кода, позволяющие снизить их сложность и добиться терминируемости:
- # Сколько существует подходов для ограничения задачи для верификаторов?
- # Верификаторы, предназначенные для выявления определенного класса ошибок в программах, используются при разработке программ на этапе:
- # Верификаторы, способные доказать, что программа, принадлежащая некоторому классу программ, не разрушает память, служат:
- # Верификатор кода .NET может доказать, что сборки, генерируемые компиляторами C#, J# и Visual Basic .NET:
- # Отметьте верные утверждения, касающиеся разрушающего память кода:
- # Верификатор .NET предназначен:
- # Код, для которого верификатор может доказать, что он не разрушает память:
- # Код, для которого верификатор доказал, что он не разрушает память:
- # Алгоритм верификации представляет собой вариант:
- # Правилами совместимости типов S и T будут следующие:
- # Данные о количестве слотов на стеке и типы значений, лежащих в этих слотах - это:
- # Алгоритм верификации работает со следующими данным:
- # Программы, рассматривающие сборки .NET в качестве объектов анализа, генерации или преобразования - это:
- # Генерация новой сборки .NET осуществляется:
- # В составе .NET Framework SDK поставляются следующие библиотеки:
- # При использовании Metadata Unmanaged API метаинструмент работает:
- # Для того чтобы использовать Metadata Unmanaged API из программы, написанной на Visual C++, необходимо включить в программу следующие строки:
- # Взаимодействие с Metadata Unmanaged API осуществляется через набор:
- # С помощью данного кода:CoInitialize(NULL); IMetaDataDispenser *dispenser; HRESULT h = CoCreateInstance( CLSID_CorMetaDataDispenser, NULL, CLSCTX_INPROC_SERVER, IID_IMetaDataDispenserEx, (void **)&dispenser ); if (h) printf("Error");осуществляется:
- # При завершении работы с Metadata Unmanaged API необходимо освободить указатели на полученные интерфейсы следующим образом:
- # Генерация метаданных осуществляется через методы интерфейса IMetadataEmit, которые можно условно разделить на следующие группы:
- # Библиотека рефлексии содержит классы для работы с метаданными на высоком уровне, которые располагаются в пространствах имен:
- # Метаинструмент, использующий библиотеку рефлексии, получает доступ к метаданным сборки через экземпляр класса:
- # Класс Module, позволяет получить набор экземпляров класса:
- # Библиотека рефлексии спроектирована таким образом, что создание объектов рефлексии, соответствующих элементам метаданных, осуществляется:
- # Информацию о любом элементе метаданных можно прочитать из свойств соответствующего ему:
- # Если нас интересует текущая работающая сборка, то экземпляр класса Assembly можно получить так:
- # Кроме чтения метаданных, библиотека рефлексии позволяет:
- # Для генерации метаданных и CIL-кода в библиотеке рефлексии предназначены классы:
- # Библиотеки Reflection API и Metadata Unmanaged API не имеет следующих возможностей: