Опубликован: 31.08.2009 | Уровень: специалист | Доступ: платный
Курс обсуждает несколько тем, связанных с прикладным программированием – параллельное программирование на разделяемой памяти (многопоточные программы), технические и технологические основы объектно-ориентированного программирования, общие вопросы оформления и написания текста программ, использование структур данных в параллельном окружении, безопасность программного обеспечения и применение криптографии, системы виртуализации.
Курс представляет собой завершающую часть полного фундаментального цикла по информатике, занимающего в МФТИ 4 семестра. Он ориентирован на студентов технических ВУЗов, специализирующихся на информатике, и соединяет в себе теоретическую и практическую информацию. Он не является «систематическим изложением базовых основ программирования», представляя собой дополнение к обычным курсам программирования.
В него вошли несколько тем, знание которых, как представляется автору, необходимо современному программисту.
Цель: Предоставить возможность слушателю ознакомиться с "техническими" компонентами, связанными с созданием современных программ. Делается акцент на понятиях, которыми пользуются профессиональные программисты, и причинах их появления. В результате слушатель должен научиться принимать технические решения на базе своего понимания устройства различных систем и компонент, с которым ему приходится иметь дело.
Необходимые знания: Предполагается знакомство с программированием на языке С, с устройством операционных систем, общая информация об архитектуре Intel x86. Слушатели курса должны обладать базовыми знаниями в области программирования и некоторым опытом написания программ на стандартных алгоритмических языках.
Дополнительные курсы |
План занятий
Занятие | Заголовок << | Дата изучения |
---|---|---|
- | ||
Лекция 1 | Обзор задач
Дается обзор курса, рассматриваемые проблемы, возникающие при программировании и их решения. Также рассматриваются требования к заданиям и к курсовой работе, которые необходимо сделать в процессе работы над курсом.
Детально рассказываются некоторые задачи, которые можно использовать как курсовые проекты (индивидуальные или коллективные) – например, задачи о триангуляции.
| - |
Лекция 2 | История создания программ
Продолжается обзор задач, которые можно использовать в качестве курсовых проектов.
Написание программ, комментарии, сопровождение, жизненный цикл программ.
Краткий экскурс в историю создания программ. Оформление текста программ, требования к нему и откуда они берутся.
| - |
Лекция 3 | Оформление текста программ и основные структуры
Оформление текста программ – написание комментариев, их типы и разновидности, содержание.
Несколько слов о правах на программу, копирайтах, откуда берутся права, отличия в законодательстве России и США.
Хорошая и плохая практика написания текста программ – выбор имен для переменных, использование препроцессора и тд.
Структуры данных, и их выбор для задач. Типовые элементы структур данных и связанных с ними алгоритмов, итераторы. Проблемы использования структур данных в параллельном окружении на примере односвязного списка.
| - |
Тест 136 минут | - | |
Лекция 4 | Структуры данных
Что такое "структуры данных" в общем, типовые элементы и понятия, итераторы.
Односвязный список и его использование в куче (heap) рантайма (библиотеке периода исполнения) языка С, в функциях malloc/free. Проблемы создания программ, использующих односвязные списки, в том числе в параллельном окружении. Двусвязные списки и очереди на их основе. Стек, его использование в программах на языке С, поддержка рекурсии на его основе. Расположение данных в памяти. Использование структур памяти в параллельном окружении, операции синхронизации. Графы, деревья, использование их для компрессии данных.
| - |
Лекция 5 | Параллельное программирование и безопасность программного обеспечения
Хеш таблица и ее параллельное использование.
Хорошая и плохая практика написания параллельных программ.
Безопасность программного обеспечение. Типовые проблемы, откуда они берутся.
Оглавление
| - |
Тест 236 минут | - | |
Лекция 6 | Техника кодирования и основы криптографии
Безопасность ПО. Написание программ без "дырок". Техника кодирования защищенных программ и типичные ошибки. Переполнение буфера, определение уровня доступа, работа с минимально возможными привилегиями, криптография и ее корректное применение, предохранение секретных данных, работа с входными данными, проблемы разных путей доступа к одним и тем же данным, запросов к базам данных и веб-страницам, а также проблемы поддержки интернационального ПО.
Основные понятия криптографии, история. Симметричная и ассиметричная криптография, использование ее для безопасной почты. Безопасные и небезопасные алгоритмы (является ли секретный алгоритм безопасным?), генераторы случайных чисел. Устройство цифровой подписи.
Как правильно применять криптографию для обеспечения безопасности.
Способы взлома программ.
Оглавление
| - |
Лекция 7 | Моделирование угроз. Эволюция аппаратного обеспечения
Моделирование угроз. Классификация опасностеий STRIDE – Spoofing (подмена данных), Tampering (подделка и изменение содержания данных), Repudiation (незаконныий отказ от проведенноий операции), Information disclosure (разглашение информации), Denial of service (отказ в обслуживании), Elevation of privilege (незаконное поднятие привилегиий). Методика оценки риска DREAD - Damage potential (что может быть сломано), Reproducibility (повторяемость), Exploitability (пригодность угрозы для использования), Affected users (на каких пользователеий повлияет), Discoverability (возможно ли детектировать факт использования).
Эволюция современного аппаратного обеспечения и ее влияние на программное обеспечение. Гипертредовые (многопоточные) и многоядерные процессоры, универсальные графические (GPU) процессоры и новые возможности по их использованию.
Оглавление
| - |
Тест 336 минут | - | |
Лекция 8 | Параллельное программирование
Параллельное программирование. Параллельные программы – от работы с разделяемоий памятью, использования массивнопараллельных компьютеров и до распределенных расчетов на многих физических компьютерах. Декомпозиция задач на параллельные куски. Закон Амдала. Геометрическая декомпозиция. Параллелизм данных, параллелизм кода. Паттерны параллельного программирования: параллелизм на уровне задач – декомпозиция задачи, "разделяий и властвуй" - декомпозиция задач и данных, геометрическая декомпозиция – декомпозиция данных, конвеиерное исполнение – декомпозиция потока данных, "фронт волны" - декомпозиция данных c "многомерными" зависимостями. Пример типового шаблона программирования – пул нитей.
Оглавление
| - |
Лекция 9 | Технические аспекты написания параллельных программ
Технические аспекты написания параллельных программ на разделяемой памяти. Многопоточные программы. Работа с разделяемоий памятью. Атомарность операций. Синхронизационные примитивы (низкоуровневые атомарные команды, критические секции, взаимоисключающая блокировка - mutex, рекурсивная блокировка - lock, блокировка чтения-записи – read/write lock, многопроцессорная блокировка - spin-lock, семафоры, барьеры). Принятие во внимание особенностей аппаратной платформы, например, последовательности операций записи в память и т.д. Тупики и взаимные блокировки. Неблокирующая синхронизация.
Реализация одних примитивов через другие, относительная "мощность" примитивов. Задача о консенсусе как способ оценки примитивов.
| - |
Тест 436 минут | - | |
Лекция 10 | Объектно ориентированное программирование
Объектно ориентированное программирование с понятийной точки зрения. Экскурс в историю появления, возникновение понятий. Объекты как способ моделирования "параллельного внешнего мира" и формализации понятий. Объект как совокупность методов и данных, классы объектов, мета объекты. Объектная модель. Жизненный цикл объектов. Статические и динамические объекты.
Раннее и позднее связывание, постоянно существующие объекты.
Инкапсуляция и полиморфизм как базовые понятия ООП. Наследование и агрегирование как способы создания новых, более сложных, объектов, их достоинства и недостатки (на примере С++ и COM).
Технические способы создания объектов в языках типа С++, представление их в компьютере.
Оглавление
| - |
Лекция 11 | Техническая реализация ООП в языке программирования С++
Техническая реализация ООП в языке программирования С++ - конструкторы и деструкторы, представление методов через функции, расположение данных в памяти. Реализация понятия полиморфизма через таблицы виртуальных функций. НАследование и его реализация, связь с виртуальными функциями, абстрактные типы данных. Исключения, их техническая реализация и особенности применения в языке и ОС Windows.
Оглавление
| - |
Лекция 12 | Поддержка ООП в различных системах и средах. Технологии виртуализации
Поддержка ООП в языке и системе программирования ObjectiveC, категории, сообщения и методы. Поддержка ООП в ОС Windows, отличия от поддержки ООП в языке программирования. Реализация основных понятий ООП в этих системах.
Использование подходов ООП в разных условиях.
Технологии виртуализации. Почему они стали в последнее время столь широко распространены, их типы – виртуализация ОС и виртуализация оборудования.
Преимущества и недостатки разных виртуализационных подходов с точки зрения потребителя. Технические основы виртуализации уровня ОС, контейнеры, уровни изоляции.
Оглавление
| - |
Тест 536 минут | - | |
Лекция 13 | Технология аппаратной виртуализации и виртуальные машины
Технология аппаратной виртуализации. Особенности работы кода прикладных программ внутри виртуальных машин. Новые возможности, предоставляемые виртуальными машинами и контейнерами – миграция, универсальность конфигурации, быстрота развертывания и обновления, удобства управления.
Технические принципы организации виртуальных машин. Монитор виртуальных машин, аппаратная поддержка виртуализации, бинарная трансляция и другие подходы. Накладные расходы в реализации поддержки системы виртуальных машин. Паравиртуализация.
Какие типы виртуализации следует применять в разных условиях.
Оглавление
| - |
Тест 636 минут | - | |
5 часов | - |