Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Системное програмное обеспечение (Ляхманов)

.docx
Скачиваний:
22
Добавлен:
28.03.2015
Размер:
136.17 Кб
Скачать

Ляхманов Дмитрий Александрович

СПО

Этапы развития:

-Ассемблерное программирование - "железная" среда

-Функциональное программирование - нету кроссплатформености. Серьезные проблемы переноса кода

между машинами. Скомпилив на 1, на другой может ничего не работать. Нет единых имен функций.

- Модульная архитектура - есть соглашения на то, как будут писаться и вызываться модули.

Способы написания библиотек основаны на соглашениях. Это позволило использовать библиотеки на

разных машинах

- COM - это стандартизированное соглашение о том, как пишутся модули и как распространяются.

Дала возможность переноса компонентов между приложениями, людьми. Обеспечила возможность и

надежность поставки кода, без возможности его раскрытия. Обеспечивала языковую

независимость, независимость от расположения (локальные, серверные и т.д.)

-DOT.net и виртуальная машина JAVA - пытались обеспечить железную независимость

JVM - опиралась на сервисы ОС. Выпускается под разные ОС. Низкая скорость работы по

сравнению с DOT net (~ на 40% ниже)

DOT net - опиралась на оборудование, высокая скорость работы, поддержка многих платформ,

работа только под винду. Введено понятие управляемость кода ( между процессом выполнения

программы и процессором стоит посредник (SLR проверяет код, потом компилирует и пропускает

процесс через себя - обеспечивает его устойчивость и безопасность)

DOT net (.net) - это программная платформа исполнения кода на основе первичной интерпретации

(программный код компилится только 1 раз).

Достоинства:

1. Единая программная модель.

2. Отсутствие проблем с версиями - если данные повреждаются - либо происходит откат, либо

поврежденная программа не запускается.

3. Переносимость между железными платформами

4. Интеграция языков программирования - большое количество языков.

5. Упрощение повторного использование кода.

6. Сборка мусора - способ удаления неиспользуемых объектов (без ведома программиста).

7. Решение проблем безопасности - если один тип фигурирует в 2 языках - они полностью

совместимы

8. Развитая модель отладки - можно отлаживать события разных градаций

9. Единый принцип обработки ошибок - try блоки использовать можно, за счет высокой скорости

10. Взаимодействие с неуправляемым кодом

№2

Структура и принцип работы .net:

cостоит из 3 частей:

1. CLR (common language runtime) - среда исполнения - основная часть .net. Это динамическая

библиотека которая тиражируется при вызове процесса. (работает быстрее за счет разовой компиляции)

2. FCL(Framework class library) - содержит более 1500 классов. Набор классов.

3. CTS (common time system) - набор правил и договоренностей. Закрепляет типы и их

структуру. Формирует интерпретацию (обращение происходит в процессе взаимодействия).

Основной принцип .net : Jit-компиляция

MSIL – объектно-ориентированный ассемблер

DIL – переводит MSIL в читаемый вид? Есть высокоуровневые операции, которые переводят код на высоком уровне и синхронизируют его для дальнейшей работы

Jit - стартует при запуске программы, переводит метод main \\ будет позже

\* Nearjmp – нижний слой компиляции, можно сказать аналог GOTO

В управляемом коде сохраняется структуру обьекта и экземпяра ( в отличии от массива функций в низком уровне)

Физическое устройство CLR

Одна dll: MsCoreEE.dll : чтение метаданных -> поиск DLL -> компиляция

В этой dll есть функция MSCorExeMain: функция которая ищет main и запускает Jit компилятор

_IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR – ключ реестра ( в разных версиях в разных местах) если 1, то стоит. Находится в папке VersionXX, где XX – версия. Это самый простой способ узнать версию CLR.

Принцип Jit компиляции – срабатывает впервые когда срабатывает метод main. Основной элемент – таблица методов

M GUID – 128 bit число, которое генерируется из id проца, видеокарты и пользователя. Вероятность совпадения GUID на 2 разных машинах крайне мала.

При старте программы, таблица пустая, CLR пробегает метаданные (миниатюрная БД в файле – попытка отойти от реестра и сделать исполняемый файл самодостаточным) и собирает ID методов, заполняя таблицу, далее заполняются адреса ( на таблице - 2 колонка). После этого СLR вызывает метод main по его адресу. После сборки main – он помещает в ОЗУ скомпиленый код (нативный) и передает управление по этому адресу. Далее методы вызываются по тому же принципу.

Cборки в SLR:

Сборка – группа файлов (логически разделенных), представляющая собой или одно приложение, или один домен приложения. Базируется на файлах. Сборка – единица управления

Достоинства сборки:

  1. Повторное использование типов и исполняемого кода

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

  3. Возможность привязки защитной информации (прав доступа) для сборки используются права доступа отдельного ресурса (ранее отдельного файла)

Дополнительные достоинства:

  1. Распределение типов по разным файлам (логическое разделение)

  2. Выделение ресурсов в отдельный файл

  3. Сборки можно создавать на разных языках (и их элементы тоже – отд. Файлы)

\\ внутри CLR есть ключ CodeBase, говорит что сборка распределена, внутри манифеста прописан сетевой URL вместо отсутствующего файла. Таким образом сборка заставляет скачать URL для активации программы например. Если нету флага кэширования – программа каждый раз при запуске будет скачивать.

Метаданные – маленькая БД, записанная в начале сборки. Расширенные метаданные записываются в 1 файл (называется держателем манифеста), но маленькие могут по разным файлам.

Reflector – анализатор(позволяет вытащить метаданные), запускатор, дизассемблер.

AssemblyDet – определяет сборку целиком, имеет 1 строку.

Поля AssemblyDet:

1. AssemblyName,

2. Version (полное версионное число сборки x.y.z.w. :

x- главное версионное число – номер версии продукта – изменяется при обновлении продукта более чем на 60%

y – младшее версионное число – при изменении алгоритма (логическое изменение)

z – номер релиза (в случае выпуска пакета баг фиксов)

w – номер сборки (увеличивается каждый раз при сборке продукта )

3. RegStandart (формат данных времени) – облегчение локализации

4. HashAssembly – обычный хэш, собирающийся с основного файла, входящего в манифест

FileDef – каждая запись определяет 1 файл входящий в сборку

Поля:

  1. FileName

  2. FileHash

  3. Flags (не включается корневой файл)

ManifestResourse – определяет ресурсы, входящие в сборку (класс, картинка любая единица данных)

Поля:

  1. ResourseName

  2. Flags

  3. FileDefId (FileName в FileDef

  4. ResOffset (ресурсное смещение, относительно начала файла)

AssemblyRef (сокращение от Reference)

Поля:

  1. AssemblyName –имя сборки

  2. OpenKey – используется при верификации, подтверждения авторских прав и целостности продукта

  3. HashOK (скоращенная форма open key для идентефикации сборки на верхнем уровне)

  4. Version

  5. RegStandart (поля 4 и 5 в файле AssemblyRef и AssemblyDef должны совпадать)

Идентификация сборки:

Поля:

Name

Version

RegStandart

Token (токен ключа – хэш открытого ключа)

Это используется на уровне файловой системы:

1. Для отсутствия конфликтов между сборками.

2. Для отсутствия конфликтов при запуске.

№3 Развертивание сборов и глобальный хэш.

Развертывание – установка программного продукта.

Установка существует в единственном экземпляре – программа ставится на компьютер.

Типы развертывания (их 2) есть только в .net ( можно по частям, т.е. гибридное):

1.Закрытое – все сервисы .net отключаются (элементарное копирование – portable), уязвим в плане безопасности, оптимален для мелких продуктов

2.Открытое – задействование аутинтефикации и верификации в .net. Обычно устанавливаются компоненты каких то программ. (подразумевается совместное использование). Отделение от пути расположения.(программа сама найдет компоненты).

3.Гибридное

GAC - глобальное хранилище сборов различных версий для обеспечения совместного их использования. Прежде всего необходим для доступа к разделяемым сборкам и урегулирования конфликта между ними.

Структура GAC

Состоит из 2 директорий

C:\windows\assembly – основная директория gac

С:\windows\Microsoft.NET\assembly

Связаны между собой, одна директория копирует другую (зеркало короче)

На ней стоит железный драйвер (сигналы к оборудованию)

Для того, чтобы зайти в скрытую explorerom папку нужно юзать Total commander или ему подобные

Nam\version\token – внутри папок с именем лежат папки опр еделеннуюверсию, внутри – хэш теги от ключа или токены.

Таким образом GAC разруливает конфликты между именами

Внутри С:\windows\Microsoft.NET\assembly существует еще 1 структура. Внутри этой директории будут:

GAC32

GAC64 (если х86 – работает эмуляция

Ms_GAC

За развертывание отвечает инструмент GACUTIL

Ключи: (рассмотри только 2)

1.Install (\i)

2.Uninstall (\u)

MSIExec – консольный инструмент поддерживает оба ключа

ShFusion – инструмент для развертывания сборок. Если открыть папку assembly, откроется окно shfusion , заменяющее explorer

Структурирование сборок.

Ключ регистрируется в microsoft

Подписывание сборок

RSA – асиметричное шифрование – используется 2 ключа (открытый и закрытый) – шифруются закрытым, а расшифровываются открытым.. Используется во время подписывание. На основании подписи можно сказать какая сборка:

Строгая – имеет подпись правообладатеся

Нестрогая – не имеет

Для подписи используются метаданные

Сборка мусора. Garbage Collector – программа для реструктуризации кучи. Управляемая куча – область памяти с древовидной структурой, управляемая CLR. Ревизор – часть CLR, управляющая кучей. Созданный объект загружается в память, отдельно под методы и отдельно под данные. Для следующего такого же объекта память выделяется лишь под данные. При удалении объектов память из-под методов высвобождается только при удалении всех объектов данного типа. После создания объекта он помещается в структуру, которая называется графом достижимости. Порог дефрагментации – момент времени, в который не получается разместить в памяти объект определенного размера. Сборщик мусора включается либо потому, что: 1. Не хватает пространства 2. Производится оптимизация времени работы 3. Производится уплотнение памяти Граф достижимости. Базируется на понятии корней, где корень – экземпляр рабочего объекта. Построение графа достижимости не работает в режиме отладки Алгоритм: 1. Отводится память под объекты, формируется управляющая структура 2. Формируется нулевое кольцо объектов (объекты первого поколения) 3. На основе нулевого кольца объектов формируется первый граф достижимости 4. Запускается на выполнение рабочий код, после чего СМ засыпает 5. СМ запускается, начиная сравнивать таблицу объектов с графом достижимости 6. СМ сравнивает спецификаторы порогов, выбирая момент для запуска дефрагментации 7. После проверки при запуске СМ происходит следующее: 7.1. См видит помеченный объект 7.2. Ищет его адрес в таблице объектов 7.3. Находит начало объекта в памяти 7.4. Ищет объект в графе достижимости 7.5. Удаляет объект из графа 7.6. Удаляет принадлежащее объекту поддерево 7.7. После удаления объекта в памяти появляется дырка, которую нужно заполнить 7.8. Производится проверка состояния систем, порогов дефрагментации 7.9. Запускается (либо нет) дефрагментации В C деструктор запускается после выхода из блока кода, в C# может либо запуститься, либо нет, потому вместо деструкторов лучше использовать finalize.

Механизм поколений

Картинка

Всего их 3: 0,1,2.

Допущения garbage collector:

 Объекты с 0 поколением живут меньше всех.

 Объекты со 2м поколением живут максимально долго.

 Все объекты очень компактны.

Для каждого поколения сборщик мусора выбирает пределы памяти (пороги заполнения памяти).

0 –L0 (256 Кб)

1 –L1 (2 Мб)

3 – L2 (10 Мб)

()- по дефолту

При превышении лимита какого-то конкретого поколения он будет проверять только объекты

этого поколения.

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

же нет, то увеличиваем лимит в 2 раза.

Что-то про еще одну куяу.

Завершение

Заполнение в поколение 0 (удаление после нового покаоления)

Переаполнение или удаление объектов 2го поколения.

Если ты в 1мо, то полпадаегь в специальную область и потом ждет.

Завершение работы

Выгрузка домена

Удаление различных типов обхектов

Не инализированные

Кратинка

ARK212

Память помечается как пустая (очиска диска)

Финадиизированные

Помещаются в еще 1 список (список завершения)

Это отдельная структура. Которая содержит ссылки на обхъекты и содержит объектв

необходимиы для завершения.

Freachable – структура похажая на кучу, но не подчиняющая сборщику. Выкидывает финальне из

списка заверщения и помеаю тих сюда.

Финализируемые оъеты удаляются за 2 захода.

Ошибки метода finalize:

Вызвать метод родителя.

Выпадения эксепшена

Воскрешение объетов

TreadPool

CLR хостинг 17.10

CLRCOM компонент (DLL)

Домен - область памяти, которая полностью изолирована, но имеет все компоненты (сборщик мусора и тд). Изолированный блок приложения.

Достоинство – процесс внутри процесса (высоконагруженный сервер ). Все домены реализованы в виде COM серверов. Iunknown – базовый интерфейс всех компонентов. Можно создать путем неуправляемой реализации.

За создание отвечает CoCreateInstance:

В промежутке между методом main.

Создает экземпляр CLR(интерфейс), ищется реализация ICorDind (CorBindRuntimeEx), загружается ОШЕ-компилятор

В первую очередь Inproc Com компонент

Домен позволяет добраться до Низа CLR

IcorDing – интерфейс, используемый для неуправляемого приложения

Достоинства домена

1.Изоляция сущности внутри домена (все свое)

2. Возможность быстрой выгрузки (понимает, что все, что находится в домене – мусор)

3.Собственный набор политик безопасности и конфигураций.

4.Наличие отдельно управляемого cookie

5.Наличие отдельного набора сборок (cуществуют доменонезависимые сборки)

Дрейф обьектов – передача обьекта из 1 домена в другой

Когда:

1.обьект из 1 домена исп. В другом домене

2. Уничтожается домен, но обьект в этом домене является критичным (поток GUI).

Сингл тред – приложения с 1 потоком

Мульти тред – приложения с неск. Потоками

2 типа компонентов

STA – почти все граф компоненты (может изменять только 1 поток-владелец)

MPA

Явная – 1 домен уничтожает другой, перед этим главный поток уничтоженного домена переходит в первый домен.

Явный переход – через сериализацию(упаковка обьекта для его дальнейшей передачи)

(Конвертация бинарного обьекта в форму, пригодную для передачи)

Текстовая(символы) или бинарная или XML сериализация – очень много времени, используется только при перекидивании обьекта из 1 домена в другой

Маршалиговая система передачи -

Маршлинг – запрос упаковки одного процесса и передача результата другого.

COM:

1.In-proc dll

2.Out-proc exe Отдельный процесс на машине – механиз общения - маршлинг

3.R-out-proc exe

Пространство имен FCL (библиотека классов более 2.5к классов).

Название namespace

Описание

System

Базовые классы, присутствующие во всех языках, которые поддерживает FCL

Базовые типы (int32, int64, byte, string etc.)

Базовые импорты – набор библиотек, необходимый для корректной работы приложений (System.Application)

System,Activity WPF(построение приложений с граф интерфейсом), WCF(для клиент-серверов приложений), WWF (для работы с документами.

System.AddIn

Экспортирует классы для создания аадонов (доп модулей программы)

System.Collections

Содержит информацию для работу с коллекциями

System.Data

Все интерфейсы и базовые классы для работы с БД и адаптерами (любая сущность, экспортируемая данные). ORM – из БД в обьектно-ориентируемую систему.

System.Deployment

Компоненты, необходимые для создания пакетов и развертывания приложений.

System,Diagnostics

Классы и интерфейсы для работы с показателями эффективности работы системы

System,Drawing

Работа с изображжением и графикой

System.Globalisation

Средства конверторов, локализации, региональные стандарты etc.

System.IdentutyMode

Для построения систем авторизаций и аутентификация.

System.IO

Input output базовый класс – Stream

System,Linq

Поддержка лямбда выражений

System.Media

Набор классов и интерфейсов для работ с видео и звуком

System,Messaging

Протоколы передачи сообщений (системных и поьзовательских)

System.NET

Классы и интерфейсы для работы с сетью

System.Printing

Доступ к принтерам, их свойствам, управление печатью

System.Reflection

2 способа линковки (статическая(на этапе компиляции) и динамическая(в процессе выполнения)) все способы работы с динамической линковкой.

System.Security

Для работы с политикой безопасности CASPol (права доступа)

System.Speech

Библиотека распознования голоса.

System.Text

Один из самых больших namespace

System.Threating

Работа с обычными потоками

System.Timers

Всякого рода таймеры. Много

System.Web

Веб информация (xml, php, etc.) AJAX – механизм для обмена информацией с сервером (онлайн обновление страницы на лету). Реализация работы с аджаксом, с dom (структура странички), ASP.NET (серверная генерация страниц)

System.windows

Базовые классы для работы с данной WPF(тот же forms, только в висте/7) (содержит формы, элементы(кнопки листы и т.д.)) и Forms (WindowsForms) (отрисовка градиентов окон).

System.Xaml

Копилятор xaml – по сути это среда для создания графики в винде

System.XML

Все для xml.

Microsoft.Built

MSBuild – инструментарий для сборки и управления сборкой программы

Microsoft.Cshart

Парсер исходного кода

Microsoft.VisualBasic

Microsoft.VisualC

Microsoft.IE

Все для IE

Microsoft.SqlServer

Все для SQL

Microsoft.win32

System – програмная область

Microsoft – для работы с компиляторами и языками

Делегат – сущность хранящая метод, передается как объект.

Компиляция приложения

Csc helloworldconsole.cs

Ключи компилятора:

/out – имя сборки (.exe, .dll)

/target:exe – консольное приложение (library – dll c манифестом, module – dll без манифестa, winexe – Граф. Приложение

/r:System.Windows.Forms.dll , … - ссылка на внешние сборки

Особенности:

  1. Все объекты распределены между классами (определение класса неотделимо от реализации

  2. Для семантической группировки элементов приложении (классаов, интерфейсов, структур) используются пространства имен

Namespace <имя_пространства_имен>

Namespace 123

{

Namespace 321

{

}

Namespace 213

{

}

}

Namespace 123.321 – аналог того, что вверху

Namespace 123.213 - /

Явное указаие точки входа:

Csc /main:<className>

Директива using

1.Импорт типов из пространств имен

2. Определение псевдонимов (aliases) для классов

3.Контроль времени жизни обьектов.