пятница, 31 июля 2015 г.

Комикс про работу программиста в потоке









Первый день использования Windows 10

Вместо предисловия

Microsoft провела большую пиар акцию связанную с бесплатным обновлением Windows 7 и Windows 8/8.1, которая должна была начаться 29 числа. Владельцы лицензионных версий получили возможность зарезервировать лицензионную версию, чтобы начать обновление как можно быстрее.

Установка обновления

Накатить обновление на сотни миллионов компьютеров в один день задача непростая. Но я верил в Microsoft, и предполагал, что замечательная утилита начнет скачивание дистрибутива заранее, скажем 20 числа. Скачает 95%, а самые важные 5% докачает в день релиза. Организовать это совсем не сложно. А защищаться от людей, которые решат из превью версий выдрать 5% и заставить это работать, на мой взгляд совсем не стоит. Но Microsoft похоже думает иначе.

Долгожданное обновление игнорировало меня до самого вечера. Лишь ближе к 23:00 система решила попробовать установить обновление, долго пыталась скачать дистрибутив и вывалилась с ошибкой.

Как оказалось, Microsoft заявила, что обновление будет выходить волнами и может вам достаться чуть позже. Причем это чуть может занимать несколько месяцев. По словам пиарщиков, это сделано потому, что часть оборудования не поддерживается новой ОС и его необходимо допилить. На мой взгляд, такая пиар компания выглядит как минимум странно. Помахать конфетой перед лицом ребенка и сказать, что получит он ее через месяц.

Что еще более удивительно, так это масштабы тестирования новой версии. Чуть ли не год назад, я устанавливал первую Preview версию. И народу было вовлечено масса. Плюс ядро системы явно не претерпело глобальных изменений, а значит и драйвера вряд ли надо глобально исправлять. Да и масса бета-тестеров должна была быстро выявить список неработающих драйверов. В общем, это их внутренняя кухня, про которую мало что понятно. Создается впечатление, что пиарщики просто решили сгладить негативную реакцию у некоторых пользователей, которые столкнуться с проблемой.

Обновление

Но вернемся к установке обновления. Утром оказалось, что Windows Update привел себя в некоторое странное состояние. Windows 10 больше не пытается скачиваться, а выдает ошибку установки обновления 0x8024002.

Поплясав пару часов с бубном, удаляя папки Windows.BT и C:\Windows\SoftwareDistribution\Download и презапуская службу обновления мне удалось исправить ошибку. Windows все-таки перекачала обновления и предложила мне начать. Я был весь в предвкушении.
При обновлении показывают симпатичный Progress Bar (без Technical Preview, конечно)

Замечу, что я ожидал от процесса обновления некоторой интерактивности, а именно – хотел сделать чистую установку новой Windows. За 2-3 года использования Windows 8 мой системный диск зарос хламом и ненужным ПО, и хотелось начать с чистого листа.
К моему сожалению, Windows не спросила у меня ничего, просто обновилась оставив все программы. Мелочь, а неприятно. Обновление процесс не быстрый. Даже с моим SSD оно заняло минут 40. Пришлось вызывать сброс системы. Все-таки хорошо, что такую штуку приделали к Windows и больше не надо создавать загрузочный диск, чтобы переустановить систему. Пришлось подождать еще минут 30-40.

Впечатления. Негатив.

И вот перед нами новая Windows 10. Я начну с негативного опыта, чтобы под конец поста сгладить этот негатив.
Самое неприятное – большие проблемы с ClearType шрифтами. У Microsoft, есть ставшая уже традиционной проблема с четкостью шрифтов, на DPI отличном от стандартного. На FullHD элементы интерфейса и подписи для меня, как человека с близорукостью, выглядят мелковато. И я со времен Windows 7 выставлял настройку на 125%. В Windows 7 и затем Windows 8, эта проблема потихоньку исправлялась. Что ж буду и тут надеяться на обновления.
Microsoft очень хочет внедрить свой единый интерфейс и внешний вид на всех устройствах. Получается пока не очень. Первая проблема это компонент настройки громкости. Смотрите скриншот.


ЭЭЭ. Неужели Microsoft считает, что это нормально\красиво? Я – нет. Вы видите здесь где заголовок формы, а где управление громкостью? Я - нет.

Система в целом, производит впечатление бета-версии. Интерфейс в новом стиле, это по факту не переписанные старые приложения, а просто Metro приложения в окнах. Но проблема не в том, как это реализовано. А в том, что большинство старых приложений никуда не делись и остались все в том же старом стиле. Выглядит весьма так себе.

Microsoft пытается нам предложить свои новые приложения для базовых функций. Таких как просмотр фото, видео и так далее. Да, эти приложения в целом лучше, чем тот же стандартный просмотр фотографий. Кому-то их вполне хватит. Мне лично – нет. Так какого ж я не могу их удалить из системы? Раздражает.

Пуск вернулся, а вместе с ним была переработана панель задач. К сожалению, не в лучшую сторону. Microsoft решила увеличить значки на этой панели и саму панель расширить. Настроить это к сожалению нельзя. Посмотрите на панель быстрого запуска на моем скриншоте.

Кажется, что тут вполне поместиться второй ряд иконок. Но нет. Не поместится.
А так выглядит новый System Tray.

Иконки стали больше. Или растягивайте сам трей в 5 раз, или прячьте сами иконки, но второго ряда вам не видать. Это конечно мелочь, и вряд ли этим активно пользуется большинство потребителей, но все равно неприятно.

Пока это всё, что мне удалось обнаружить за пару часов использования новой ОС. Попробую написать свои впечатления через два-три месяца использования системы. Возможно, что-то исправится патчами, а что-то сторонними утилитами.

Впечатления. Позитив.

Со времен Windows 7 Microsoft стала активно поглядывать в сторону конкурентов и приделывать к своей ОС лучшие идеи. Идея с окном поиска\запуска на мой взгляд, как раз из таких. В Windows 7 уже был подобный вариант, в Windows 8 фактически пропал (переключение на другой режим стола отвлекает и откровенно мешает). В Windows 10 идея реализована по новому, с дополнением – поиском в интернете и поиском по настройкам. В интернете этой штукой я в жизни не буду искать, а вот быстрый поиск по настройкам штука очень полезная. В своем Linux Mint я ей постоянно пользуюсь.

Пуск вернулся на свое законное место. В целом, хочу признаться, что я уже отвык от него. Значки часто используемых программ давно переехали на рабочий стол и запуск из меню Пуск вряд ли мне пригодится. Но для многих людей, которые до сих пор успешно используют Windows 10 это большой плюс. Это одна из причин, по которой я не стал ставить Windows 8 родителям.
Даже выключать компьютер из меню Пуск пока непривычно. Но я думаю, что через пару недель перестроюсь обратно и проблем не будет никаких.

Редизайн интерфейса мне в целом понравился. Обидно, что у Microsoft до сих пор туго с хорошими темами для рабочего стола. В Linux с ними куда веселее. Перерисованные иконки выглядят неплохо, все в одном стиле. Плюс иконки выглядят очень четко, похоже их перерисовали в высоком разрешении с перспективой на 4К мониторы. Логичный шаг.

Хоть с обновлением все прошло не идеально, но в целом весьма приемлемо. С обновлением Ubuntu на моей машине всегда было на порядок больше критичных проблем. Сама идея обновления ПО без заморочек с флешками и DVD дисками меня очень радует.


К сожалению, остальные новые плюшки оценить не удалось. Но больше всего хочется попробовать разрекламированную Cortana. Посмотреть, был ли уже добавлен русский язык и как она отреагирует на мой английский с жутким акцентом =)

Итого

В целом, я считаю обновление успешным. Новый функционал очень приятный. Ставить или не ставить? Я считаю – надо ставить. Человек ко всему привыкает и чем быстрее привыкнешь, тем лучше. К счастью, весь софт который я использую полностью совместим с новой ОС и проблем никаких не возникло. Правда по форумам встречаются люди, у которых возникли аппаратные проблемы. Надеюсь, что это единичные случаи, которые Microsoft исправит в первую очередь.

Маленькие полезности для Git

Это вторая статья, источником которой служат мои презентации для отдела разработки ПО в нашей компании в конце 2014 года. В ней я расскажу о маленьких хитростях при работе с git, которые не очень хорошо известны.

Posh-git

Posh-git это набор фантастических скриптов для работы с git в PowerShell. Многие программисты в Windows используют графический интерфейс для Git, например, TortoiseGit. А с появлением поддержки Git в Visual Studio использовать Git стало еще проще.

Я же привык пользоваться консольным клиентом git. Наверняка сказываются многие часы работы с git в linux. Раз уж я заговорил о консоли, не могу не отметить отличную работу, которую проделала Microsoft при разработке своего Powershell. Совместимость с командами linux терминала - это просто гениальная идея. Надеюсь, что в будущих версиях прикрутят работу через pipe и grep.

Вернемся к posh-git. Если вы используете Chocolatey (см. прерыдущий пост), то для установки надо просто выполнить
    cinst -y poshgit

После установки просто перезапустите PowerShell и заходите в папку с вашим репозиторием.

Posh-git показывает нам имя ветки, в которой мы находимся, а также количество новых файлов. Если мы решим добавить один файл в коммит, то увидим следующее:
А после того как сделаем сам коммит:
Как видите, цвет ветки изменился, так как мы удалились от состояния ветки на нашем remote.

И это только маленький кусочек того, что добавляет Posh-git. Все цвета настраиваются по вашему вкусу. Про их настройку можено почитать тут.

В общем, категорически рекомендую всем, кто работает с Git. Кстати, для linux тоже есть подобная штука.

Где поиграться с git

Когда в компанию приходят новые сотрудники незнакомые с git, то я всегда им предлагаю этот сайт. На мой взгляд у него есть ряд преимуществ, перед простым проделыванием тестовых заданий на знание git:
  • Отличные лабораторные работы
  • Можно сразу увидеть результат работы
  • Для работы нужен только браузер
  • На русском
Вы просто пишите нужные комманды в консоли и сразу видите ваш результат. Выглядит это так:

Alias

Alias - это просто сокращения для команд git. Штука в общем-то широко известная, оданко мало кто её настраивает. На мой взгляд создавать alias на команды типа commit это бессмысленно и беспощадно. Однако, добавить alias на git log просто необходимо.

Конечно, если вы используете различные GUI для git, то эти alias вам не нужны. Но если вы так же как и я предпочитаете работать в консоли, то они могут вам пригодиться.

Я советую вам настроить следующие:

ls = log -C --stat --decorate

Этот alias будет показывать имена веток, тагов и другую информацию рядом с хэшем коммита.

lsp = log -C --stat -p --decorate

Этот alias будет отображать нам изменения прямо в логе.

 lg = log --graph --all

 Этот alias будет отображать дерево коммитов с помощью псевдографики.


Приятные мелочи

Исправление опечаток. Тут даже пояснять ничего не надо. Просто выполните:
     $ git config --global help.autocorrect 1
И тогда $ git statu будет воспринят как git status. Мелочь, а приятно.

https://github.com/github/gitignore
Содержит 116 шаблонов для .gitinore для различных сред программирования и языков программирования.

Вот и всё на сегодня. Надеюсь будет кому-нибудь полезно.

четверг, 30 июля 2015 г.

Chocolatey

Небольшое предисловие

В конце 2014 года я готовил что-то вроде конференции одного выступающего для своих коллег в отделе разработки ПО. Для этой конференции я подготовил ряд выступлений с презентациями о различных интересных вещах, которые происходят в мире разработки ПО, о наших внутренних проблемах с проектами, а так же о различных хитростях работы Git.
Сегодня я решил поделиться этой информацией (конечно, без наших внутренних вещей) со всеми желающими. Поэтому следующие несколько постов будут основаны на моих выступлениях. И первая штука, которой я хотел бы поделиться это Chocolatey.

Что это вообще такое?

Все кто когда-либо использовали Linux-подобные системы, явно или не явно работали с пакетным менеджером в своем дистрибутиве. Debian и Ubuntu подобные дистрибутивы используют apt-get (лично я рекомендую aptitude), RHEL и OpenSuse используют yum. Если вы вообще не имеете представления, что это такое, то ознакомиться можно в wiki.
В двух словах это консольное приложение, которое позволяет автоматизировать процесс установки, обновления и удаления ПО.

Кратко для программистов =)

  • Как “apt-get”, только для Windows
  • Открытый исходный код https://github.com/chocolatey/choco
  • Абсолютно бесплатный
  • Не только менеджер, но и framework
  • NuGet для библиотек, Chocolatey для программ
  • Microsoft использует Choclatey в своем OneGet

Куча софта


Пример доступных приложени
Вам доступно куча разного ПО (2500+ пакетов). Причем радует то, что есть не только маленькие програмки, но и большие пакеты типа Visual Studio, а так же фреймворки для разработчиков, и даже сервера.

Не надо следить

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

Меньше проблем с установкой

Этот пункт почти ничего не значит для опытных пользователей ПК. Однако будет очень полезен для тех, кто не чувствует себя на 100% уверенно при работе с компьютером. Последнее время каждый второй инсталлятор, даже с официального сайта, захочет установить вам Яндекс.Бар, Яндекс.Браузер, Спутник от mail.ru, сменить домашнюю страницу и еще какую-нибудь гадость.
И так каждый раз...

Конечно, если вы внимательно смотрите, что вам предлагает инсталлятор таких проблем не возникнет. Хотя порой очень хочется на автомате ткнуть Next->Next->Next…. У самого так пару раз бывало, когда приходится удалять всякий хлам и устанавливать ПО заново. И вряд ли в ближайшем будущем что—то резко изменится в этом направлении.

Пакетный менеджер установит только ту программу, которую ты действительно хочешь установить.

Проще установить группу программ

Сценарий очень простой – вы настраивайте новый компьютер или переустановили операционную систему и вам сразу необходимо установить с десяток привычных программ. Некоторым системным администраторам приходится выполнять эту операцию чуть ли не каждый день. Причем обычно у вас в голове уже есть список из необходимых программ.

С пакетным менеджером все становится очень просто – просто вбиваем одну команду (или проставляем галочки в GUI) и идем пить кофе.

Сборка Windows vs Chocolatey

Некоторые используют сборки Windows включающие в себя ряд программ. На мой взгляд это все-таки разные вещи. Приведу здесь простую табличку, которая демонстрирует различия.

Думаю тут все просто и наглядно. Если вам надо установить любимый набор ПО там, где с интернетом туго, то сборка вас выручит. Если с интернетом проблем нету, то ваш выбор Chocolatey.

Ninite vs Chocolatey

Про Ninite можно почитать на их сайте (https://ninite.com).
Если коротко, то Ninite упрощает установку некоторых программ на компьютер. Предназначена в первую очередь для установке привычного набора программ на свеже установленную операционную систему. Вы просто заходите, выбираете галочками, что хотите установить и получаете инсталлятор, который все сделает за вас. Просто. Удобно.
Список ПО доступного в Ninite

Основная разница с Chocolatey в 2-х на мой взгляд критичных вещах – количество программ доступных для установки и обновление. Набор софта в Ninite крайне небольшой, да и обновлять программы таким образом нормально не получится.

Неприятные мелочи

Есть у Chocolatey и ряд недостатков, про которые нельзя не упомянуть:
  1.  Отсутствие простого инсталлятора. Да, установка происходит в 1 команду. Но своей маме, я не могу просто сказать – “Открой консоль от имени администратора…”. Первый раз придется устанавливать самому.
  2.  GUI далек от совершенства. А большинство все-таки предпочтет графический интерфейс.
  3.   Пакеты поддерживаются сообществом, как и весь проект. К сожалению, пару раз попадал на падение их сервера с пакетами. Надеюсь, что ребята разовьются и смогут создать полноценный аналог linux-репозиториев, которые всегда online.

Как поставить

Запустить cmd.exe от имени Администратора и выполнить:

@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin

И в завершении

Буквально вчера вышла новая Windows 10, которая содержит в себе OneGet. OneGet это пакетный менеджер от самого Microsoft, который использует внутри себя Chocolatey. Надеюсь, что Microsoft со своими ресурсами поможет решить те неприятные мелочи, про которые я написал выше. И будет всем нам счастье =)

Наши вопросы по БД и Web-технологиям

Это последняя группа вопросов, которые мы задаем некоторым кандидатам на собеседовании. Не могу сказать, что мы используем БД и Web технологии в каждом проекте, но такие проекты есть и их не мало. Поэтому знания в этих областях являются дополнительной плюшкой для кандидата.

БД

  1. Типы БД. Иерархические, Объектно-реляционная, реляционная.
  2. Таблицы и View(Представление). Назначение.
  3. Хранимые процедуры, триггеры и курсоры. Назначение и примеры использования.
  4. Нормализация. Причины, 5 основных уровней нормализации, как нормализовать базу данных по третьей нормально форме.
  5. Первичный, внешний, составной и суррогатные ключи . Причины появления ключей, выбор полей для ключей, выбор типов данных для ключей (для каждого из типов ключей).
  6. Кластерные и не кластерные индексы и их назначение.
  7. Безопасность БД. Какие объекты и как необходимо защищать.
  8. SQL запросы к БД (INSERT, UPDATE, DELETE, SELECT). Использование JOIN, UNION, INTERSECT, CONCAT.
  9. noSQL БД. Особенности.

Web

  1. HTML. Назначение. Основы построение веб страниц.
  2. Как уменьшить время загрузки веб-страницы?
  3. Javascript. Назначение. Принцип работы.
  4. Классическая модель веб-страниц и AJAX. Преимущества и недостатки.
  5. CSS. Назначение. Селекторы. Наследование. Каскадирование. Приоритеты стилей CSS.
  6. jQuery. Назначение, возможности, простейший пример использования. JQuery UI.

На этом наши вопросы заканчиваются. Теперь главное не затягивать с публикацией ответов =)

Наши вопросы по криптографии

Так как наша компания (http://ancud.ru/) занимается защитой информации, то хорошее знание криптографии никому не помешает.

Криптография

  1. Что такое симметричная и асимметричная криптография?
  2. Что такое хеш-функция? Какие хэш-функции вы знаете? Почему CRC32 не подходит? HMAC? KDF?
  3. Какие симметричные алгоритмы вы знаете? AES, 3DES, ГОСТ 28147-89, RC5, Blowfish?
  4. В чем отличие блочных шифров от поточных шифров? Сеть Фейстеля?
  5. Что такое режимы шифрования? ECB (простая замена), CBC, гаммирование, CFB (гаммирование c обратной связью).
  6. Какие асимметричные алгоритмы вы знаете? RSA, DSA, ГОСТ 34.10-2012?
  7. Причем тут односторонние функции? Дискретный логарифм и эллиптические кривые.
  8. Цифровая подпись (ЭЦП) и асимметричное шифрование.
  9. Инфраструктура открытых ключей (PKI). Зачем? Что содержит сертификат?
  10. Алгоритмы аутентификации. Как работают симметричные и асимметричные?
  11. Выработка сессионных ключей. Почему Диффи-Хелман – это не аутентификация? Что такое Forward Secrecy (прямая секретность)? Защита от MITM атак.
  12. Как часто надо менять ключи? А пароли? От чего это зависит?
  13. Чему равна криптостойкость пароля? А если его выбирает пользователь?
  14. Почему для криптографии важны случайные числа? Приведите пример атаки на ДСЧ.

Наши вопросы по программированию на языках C/C++

Следующий блок вопросов это самые важные вопросы для кандидата на позицию C/C++ программиста. Вопросы поделены на две категории - знание совсем новых плюсов не обязательно, но крайне рекомендуется. На мой взгляд если человек работает в какой-то области и не интересуется, что в ней происходит последние лет 5, то ничего хорошего в этом нет.

C/C++

  1. Зачем нужен stdafx.h? Что в него включать? Как это работает?
  2. Зачем нужен препроцессор, компилятор, ассемблер, linker?
  3. Что такое исключения? Как они работают?
  4. Для чего используется вызов throw без аргументов?
  5. Конструктор копирования, оператор присваивания. Когда они вызываются?
  6. Операторы преобразования static_cast, const_cast, reinterpret_cast, dynamic_cast, С-cast. Назначение и примеры использования.
  7. Друзья класса. Назначение и примеры применения.
  8. Что такое множественное наследование? Как оно работает и какие может создать проблемы?
  9. Виртуальные функции. Что такое vftable, vbtable и как это работает?
  10. Зачем нужен виртуальный деструктор?
  11. Какие конструкции С++ разрешается использовать в списке инициализации качестве инициализирующих выражений?
  12. Как запретить неявное преобразование типа, выполняемое конструктором инициализации?
  13. Как защитить объект от копирования?
  14. Что предпочтительней, наследование или инкапсуляция? В каких случаях и почему?
  15. Можно ли объявлять массив объектов? А массив классов?
  16. Паттеры проектирования – Singleton, Factory, Observer, Visitor. Остальные по желанию.
  17. Контейнеры в STL. Преимущества и недостатки.
  18. Итераторы и алгоритмы в STL.
  19. Специализация шаблонных классов и функций. Назначение и примеры применения. Частичная специализация шаблонных классов.
  20. Функторы.
  21. Аллокаторы и их применение.
  22. Лямбда-выражения.
  23. Умные указатели. Зачем нужны? Что такое владение?
  24. Многопоточность и примитивы синхронизации. Типы и устройство.
  25. Многопоточность и передача сообщений.
  26. Что такое IPC?

C++14

  1. Явное замещение виртуальных функций и финальность.
  2. Шаблоны с переменным числом аргументов.
  3. Статическая диагностика.
  4. constexpr-выражения.
  5. copy- и move-семантика.

Наши вопросы по сетям

Так как до публикации ответов руки почти не доходят, я решил опубликовать все наши вопросы в надежде, что их сможет найти кто-то из наших кандидатов и подготовиться =)

Вопросы по сетям

  1. Модель OSI с примерами протоколов, устройств и программ, работающих на каждом уровне (если есть)?
  2. Маршрутизация внутри сети. Как работает ARP? Зачем нужен MAC и IP?
  3. Маршрутизация между сетями. Автономные системы, OSPF и RIP, BGP?
  4. Разница между TCP и UDP? Что такое соединение и как оно создается?
  5. Как работает DHCP? Зачем он нужен?
  6. Как работает DNS? Зачем он нужен?
  7. Что такое NAT? Как он работает? NAT traversal?
  8. Зачем придумали IPv6? Какие проблемы и как именно он решает?
  9. Что такое VPN и как он работает? IPSec, PPTP, PPPoE и L2TP?
  10. Что такое SSL(TLS)?

среда, 29 июля 2015 г.

Дэвид Сирлин "Играй на победу"

О чём

Эта книга о том, как научиться играть в игры профессионально. Автор известен как киберспортсмен: несколько раз он становился чемпионом в разных дисциплинах, например, в Street Fighter. Книга «Играй на победу» — это книга о том, как эффективно тренироваться, чтобы выигрывать. Она может быть интересна не только игрокам, но и просто тем, кто любит побеждать по жизни.
Переводчики на Мосигре, предлагают в качестве девиза книги выбрать - «Бить лежачее тело нечестно, зато ЭФФЕКТИВНО и БЕЗОПАСНО».

Что интересного

Мне очень понравился эпиграф к книге, поэтому я решил привести его здесь:
Обладая уникальной способностью учиться на чужом опыте, люди делают это с известной неохотой.
— Дуглас Адамс, Последняя возможность увидеть.
Хотя книга написана о том, как выигрывать в игры, в ней очень много общих вопросов, касающихся обучения в целом, а так же о том, как достичь цели. Книга совсем небольшая, и рекомендуется к прочтению всем кто любит соревноваться с другими людьми в спорте или различных играх.

Где почитать

Пока можно почитать, только на сайте Мосигры - тут.
Представители Мосигры уверяют, что в будущем переведенная книга в pdf будет доступна на сайте автора.

Нейл Фьоре "Легкий способ перестать откладывать дела на потом". Продолжение.


Это продолжение предыдущего поста.

Продолжаем тезисы.

Глава 5

  1. Представьте себе несколько мелких дедлайнов, находящихся под вашим контролем, – паралич, вызванный попытками выполнить большой проект (с печальными последствиями в случае провала) как рукой снимет. Имея собственные дедлайны, расписанные далеко вперед, вы начинаете контролировать работу и создаете себе возможность для передышки после каждого этапа. Общий взгляд на проект позволяет вам увидеть другие методы и инструменты и сфокусироваться на том, с чего лучшее всего начать.
  2. Вам нужно делать так, чтобы волнение начало работать на вас и преобразовалось в план, который уничтожит угрозу. Это поможет вам продуктивно использовать стресс, вашу здоровую реакцию человека, борющегося за выживание, таким образом, как вы и собирались, – для самозащиты и подготовки к позитивным действиям. Как только вы используете эту энергию как следует, ваш мозг, уверенный в вашем хорошем физическом и психологическом состоянии, вернется на нормальный энергетический уровень для продуктивной работы.
  3. Вам будет сложно принять тот факт, что другие люди не придерживаются таких же высоких стандартов качества, как вы. На самом деле вы можете даже почувствовать некоторое превосходство в данном вопросе. В конце концов, наступит день, когда от вас потребуют завершенный проект и будут ждать вашего ответственного отношения к установленному дедлайну. В вы в это время будете больше заботиться о качестве, а не о том, чтобы просто завершить работу вовремя. Это абсолютно нормалько, когда вам не хватает хотя бы еще одного часа, чтобы сделать свою работу по-настоящему хорошо, а от вас требуют готовый проект уже сейчас.

Глава 6

  1. Разбейте все свои задачи на небольшие - по тридцать минут. Вы получите маленькие, осуществимые задач, за которыми следует вознаграждение. И вы не будете чувствовать себя заваленным, столкнувшись с большими, сложными и страшными проектами. Антирасписание укрепляет вашу уверенность двумя способами. Во-первых, оно подразумевает незамедлительные и частые вознаграждения, которые следуют за короткими периодами работы; вы чувствуете завершенность, даже если проект пока на самом деле не доведен до конца. Во-вторых, привычка фиксировать каждый период работы приносит визуальное вознаграждение – вы видите, как собранно и непрерывно поработали за день и за неделю. Фокус на тридцатиминутных отрезках работы ставит цель, не вызывающую страха, и даже самый робкий прокрастинатор сможет безбоязненно с ней справиться.
  2. Отслеживайте количество часов качественной работы в день и в неделю. Суммируйте показатели. Фокусируйтесь на том, чего вы добились. Это полезно само по себе, а кроме того, вырабатывает позитивную модель поведения: вы работаете, а потом получаете одобрительное похлопывание по спине. К тому же благодаря такой модели поведения вы обращаете внимание на те дни, когда вам захочется приступить пораньше к своим высокоприоритетным проектам, чтобы увеличить число часов, посвященных работе, в каждый конкретный день.
  3. Основной посыл Антирасписания:
  • не работайте над проектом больше двадцати часов в неделю;
  • не работайте над проектом больше пяти часов в день;
  • вы должны заниматься спортом, играть или хотя бы танцевать один час в день;
  • вы должны выделить хотя бы один день в неделю, когда не будете заниматься вообще никакой работой;
  • поставьте себе целью поработать качественно в течение тридцати минут;
  • работайте ради несовершенного, но при этом совершенно человеческого усилия;
  • начинайте с малого.

Глава 7

  1. Упражнение на концентрацию занимает минимум времени, так что вы сможете выполнять его в течение дня. Его легко вписать в ваше насыщенное расписание. Вы можете выполнять его, пока готовитесь обзванивать непростых клиентов, в перерывах между встречами и презентациями; оно отлично подходит, если нужно успокоиться после расстроившей вас встречи, когда вы едете на работу или домой.

Глава 8

  1. Вместо того чтобы чувствовать себя отвергнутыми, неспособными повлиять на происходящее вокруг или испытывать страх перемен, выносливые сотрудники обычно «отдаются полностью тому, чем занимаются», «верят, что хотя бы частично могут контролировать происходящее», и «рассматривают изменения как нормальный рабочий момент, ведущий к развитию». У выносливых руководителей есть план на все случаи жизни, они гибки и обладают способностью превращать события, вызывающие стресс, в возможности, смягчающие последствия проблем.
  2. Определяя источник мыслей, которые вас отвлекают, и записывая их, вы будете гораздо меньше отвлекаться. А зная, что в скором времени вы сможете разобраться с ними, почувствуете себя достаточно расслабленными, чтобы сконцентрироваться на выполнении текущей работы.
  3. Чтобы удостовериться в том, что ваш способ целеполагания помогает вам преодолеть прокрастинацию, старайтесь ориентироваться на те цели, которые вы можете охватить, и при этом отказаться от недостижимых целей и нечетко сформулированных желаний.

Глава 9

  1. Чтобы эффективно работать с прокрастинаторами (а таких людей большинство), менеджеры должны помнить о трех главных вещах: о представлении себя жертвой, об ощущении непомерности задания и боязни совершить ошибку. Успешные менеджеры стараются вызывать у подчиненных заинтересованность, а не тупую покорность; они фокусируются на достижимых целях, а не на трудновыполнимых задачах, за которые страшно взяться; и обязательно хвалят за каждый шаг, сделанный в нужном направлении, вместо того чтобы критиковать за ошибки. Сам стиль их управления направляет сотрудников к цели, заставляет сфокусироваться на каждом шаге и предполагает достаточную безопасность и соответствующие вознаграждения.
  2. Люди быстрее учатся в обстановке, где щедро хвалят за шаги, сделанные в нужном направлении, а замечания остаются в рамках конструктивной критики и направлены на ту область, которую можно улучшить. Если это возможно, похвала должна быть зафиксирована письменно, чтобы получатель чувствовал собственную значимость, а его коллеги – мотивацию. Как в нижеследующих примерах, похвала должна предварять даже самую мягкую рекомендацию по улучшению.

На этом все. В очередной раз отметил для себя позитивный эффект составления подобных тезисов, после прочтения книги. Пролистав книгу еще раз обнаружил в ней часть идей, которые при первом прочтении прошли мимо меня. Самое интересное, что удалось обнаружить мысли не связанные напрямую с управлением временем.
Книгу очень интересно читать в комплексе с материалами посвящёнными управлению людьми.

Нейл Фьоре "Легкий способ перестать откладывать дела на потом".

Новая книга по GTD

Ещё одна книга по GTD, с которой мне удалось недавно познакомиться это книга Нейла Фьоре “Легкий способ перестать откладывать дела на потом”. Что не перестает меня удивлять, так это то, что книга была написана в 1989 году, когда ритм жизни был ниже, чем сейчас. Однако, многие не читают подобной литературы даже сейчас. На мой взгляд одна из причин состоит в том, что люди просто не знают о существовании подобных книга.



Кстати, эта книга была так же мною куплена по рекомендации с Хабра. Где-то в начале этого года, я просмотрел все посты с рекомендациями книг на Хабре и составил для себя некоторый единый список книг из 3-х частей: художественные книги, книги по программированию и книги по саморазвитию. Надо будет на досуге причесать этот список и опубликовать – может кому-то будет полезно. У меня пока только положительные эмоции от тех книг, которые мне удалось прочесть.

Итак, пара слов о книге Нейла Фьоре в вкратце. Хотя эта книга по той же тематике, что и “18 минут”, написана она несколько в другом стиле. Более формально, с меньшим количеством примеров. Такой стиль изложения подталкивает вас читать не спеша и лучше продумывать смысл каждой главы. На мой взгляд она содержит чуть больше анализа причин прокрастинации. Сама книга небольшая и не займет у вас много времени.

Глава 1

  1. Наши самые строгие критики – мы сами.
  2. Все люди разные – выясните причины своих проблем. Проведите эксперимент: в течении недели просто записывайте какие мысли у вас возникают, когда вы решаете отложить какое-то дело на потом. Проанализировав этот список, вы поймете с чем надо бороться в первую очередь, а с чем можно не бороться вообще.
  3. Когда мы идентифицируем себя через работу то, естественно, очень неохотно идем на риск. Если вы считаете, что, осуждая вашу работу, люди на самом деле осуждают вас, тогда перфекционизм, самокритика и прокрастинация и становятся формами защиты. Видя вашу нерешительность, человек, контролирующий вас – зачастую из благих побуждений – начинает ободрять вас или, наоборот, давить, а то и угрожать. А когда возникает конфликт между вашими внутренними страхами допустить ошибку и внешними требованиями других людей, вы начинаете искать спасения в прокрастинации. И это может привести к разрушительному циклу.
  4. Если вы никак не можете приступить к работе – приложите максимум усилий, и тогда ни критика, ни неудача не смогут стать оценкой вашей реальной личности или ваших самых искренних стараний.

Глава 2

  1. Всем нам время от времени нужен удар по башке, который бы встряхнул нас, вырвав из привычного течения жизни, вынудил бы изменить наше отношение к проблемам и заставил задавать новые вопросы, которые могли бы привести к другим правильным ответам.
  2. Наблюдение за собой в течение нескольких дней позволит оценить то, как вы проводите свое время. Устроив ревизию всех своих обычных занятий в течение недели, вы получите общее количество часов, потраченных на телефон, чтение писем, еду, общение, работу и т. д. Это, обнажит модель поведения, которую вы, возможно, захотите поменять, а также выявит те занятия, которые вы будете поощрять или, может, захотите перенести на более раннее время в своем расписании.
  3. Очень интересно наблюдать, как часто успешные люди страдают от провалов и банкротства. Успешный человек много раз терпит неудачу, но поднимается снова; неудачник терпит крах единожды, после чего позволяет тому стать мерилом его достоинства и критерием оценки его личности. Вам нужно учиться терпеть неудачу за неудачей, снова и снова «спружинивая» от предохранительной сетки и начиная сначала, подобно наиболее успешным людям. Так вы никогда не позволите ошибкам и неудачам остановить вас, потому что не дадите им лишить вас врожденного достоинства и желания действовать.

Глава 3

  1. Не дисциплина, не сила воли или давление со стороны других людей облегчают выполнение череды сложных действий. Это скорее свобода выбора при наличии альтернативы, персональная преданность делу и готовность взять на себя ответственность за последствия своих решений, укрепляющая волю и поднимающая дух.
  2. Такие формулировки, как «Я выбираю…», «Я решаю…» или «Я хочу…», направляют энергию на единственную цель личности, заведомо берущей на себя ответственность за результат. Как только вы начнете разговаривать с собой, используя язык, фокусирующийся на результатах, а не на обвинениях, на выборе, а не на вынужденности делать что-то, на том, что есть, а не на том, как, по вашему мнению, должно быть, вы увидите, что ваш разум и тело сотрудничают, вырабатывая позитивную энергию, не отягощенную ненужной борьбой негативных сравнений прошлого и настоящего с будущим.
  3. Приняв зрелое решение относительно предстоящей задачи, вместо того чтобы сердиться из-за нее, вы, возможно, окажетесь достаточно самовнушаемы, чтобы даже сделать ее выполнение приятным для себя. И даже если шансы нулевые, вы можете применять свою силу выбора и научиться выбирать тот путь, который вам кажется лучшим. И именно потому, что вы сами приняли это решение, задание станет менее сложным, болезненным и будет выполнено быстрее. Как только вы поймете, что теряете мотивацию, вспомните безоговорочное «Ты должен…» и в тот же момент примите решение пойти своим путем – таким, каков он есть, а не таким, каким ему следовало бы быть, – или же просто отпустите ситуацию. Это ваш выбор.
  4. Сделайте намеренно первую часть своего проекта небрежно (но не показывайте своему начальству); выполните ее быстро и как бог на душу положит. Если вы работаете за компьютером, попробуйте блокнот; если вы пишете чернилами, возьмите карандаш, но постарайтесь выполнить задание с присущим человеку несовершенством. А затем посмотрите, как на сцену выходит ваша потребность в превосходном исполнении, как вы начинаете ценить талант на ранних стадиях и увлекаетесь работой, приступая к стадии полировки проекта.

Глава 4

  1. Отдых и развлечения без чувства вины – залог продуктивности.
  2. Одним из самых разрушительных последствий прокрастинации является то, что она ведет к откладыванию на потом самой жизни. Мы позволяем порочному кругу прокрастинации мешать нам получать вознаграждение за проделанную работу и наслаждаться отдыхом.
  3. Далекие и неопределенные награды, как, например, возможная работа через четыре года обучения, едва ли способны достаточно мотивировать человека на длительное выполнение сложных задач. Обещание будущих вознаграждений за тяжелую работу мало влияет на то, что мы должны делать сейчас. А вот незамедлительное и вполне определенное вознаграждение, например свободное время, встреча с друзьями, способно стать стимулом.

Я решил разбить тезисы по книге Нейла Фьоре на две части. По себе знаю, что читать длинные посты не всегда хватает терпения, они откладываются в избранный список на прочтение и так и висят там месяцами (каюсь, у самого есть такой список из более чем 300 постов). На мой взгляд лучше 2 части, каждая из которых позволяет получить полезную информацию.

Продолжение тут.

Книгу можно купить тут.

Питер Брегман "18 минут..."

О чём?

Книга Питера Брегмана стала для меня одной из первых книг, которую я прочитал про управление временем. Когда я был просто программистом, и даже когда стал рулить командой из 3 человек, меня эта тема не особо интересовала. Достаточно было расписать некоторые важные дела, чтобы не забыть.

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

Я решил выделить для себя главное из каждой части и записать сюда. Помогает быстро восстановить в голове прочитанное. Глядишь кому-то тоже пригодится.

Тезисы

Часть I

  1. Порой вы видите свою ошибку, но продолжаете двигаться в этом направлении по инерции. В таком случае полезно сделать небольшую паузу и задать себе вопрос - Стал бы я поступать точно так же, если бы имел возможность начать все с начала?
  2. Регулярные остановки на отдых полезны. Вы сможете восстановить тело и дух, сосредоточиться на приоритетах и точнее двигаться к цели.
  3. Полезно ставить под вопрос ваши базовые представления о себе. Даже такие прочные, как «кто я?» или «кто мы?». Вероятнее всего, вы обнаружите, что внутри вас живут самые разные люди, которых вы никогда толком не знали. И эти не вполне осознанные аспекты вашей личности помогут сосредоточиться на главном. Необходимо  осознавать все свои характеристики.
  4. Когда некое событие лишает вас самообладания, сделайте паузу, прежде чем реагировать. И задайте себе единственный вопрос: «Что я хочу получить?» А потом не реагируйте на событие, но думайте о результате. Иными словами, реагируйте не на прошлое, а на будущее.

Часть II

  1. Признайте ваши слабости, вместо того чтобы избегать. И в этом году организуйте работу так, чтобы они стали активом, а не препятствием.
  2. Заявите о ваших индивидуальных особенностях. Не тратьте попусту год и ваше конкурентное преимущество, пытаясь подстроиться под других.
  3. Порой ваши пристрастия трудно определить. Один из способов – заниматься тем, чем действительно хочется. Выбирая главное в этом году, обращайте меньше внимания на «надо» и больше – на «хочу».
  4. Чтобы определить любимое дело, подумайте, чему вы готовы посвятить год и не бросать, даже если покажется, что у вас не получается. 
  5. Хотите повысить собственную продуктивность? Ставьте высокие цели, чтобы шанс их добиться был равен 50–70%. Это лучший диапазон для тех, кто метит высоко. Потом, потерпев неудачу в половине случаев, проанализируйте ошибки и попытайтесь снова. Это и есть практика. Десять тысяч часов практики сделают вас экспертом в любом деле. Неважно, с чего вы начинаете.
  6. Даже если через полгода наступит конец света, по крайней мере эти месяцы можно заполнить увлекательной и осмысленной работой в дружном коллективе. Не позволяйте неопределенности вас остановить. Продолжайте движение.
  7. Время оценивать ваши успехи и провалы не приходит никогда.
  8. Вот четыре действия, которые могут стать для вас основными в следующем году:
    • По максимуму используйте ваши сильные стороны.
    • Примите ваши слабые стороны.
    • Заявите о ваших индивидуальных особенностях.
    • Займитесь тем, что вы любите.

Часть III

  1. Планируйте день заранее, чтобы промчаться весь путь, успешно
    маневрируя и приближаясь к желаемой цели.
  2. Разберите завал, распределив задачи в структурированном списке,
    который организован на основе ваших годовых приоритетов.
  3. Чтобы сделать все необходимое, надо не только составить план дел,
    но и определить, от чего придется отказаться.
  4. Если вы правда хотите что-то сделать, решите, где и когда вы этим
    займетесь.
  5. Никогда не оставляйте пункты в списке дел больше чем на три дня.
    Иначе они помешают заниматься главным. Запланируйте их на конкретный день или перенесите в список "Когда-нибудь".
  6. Найдите несколько минут вечером, чтобы подумать, чему вы научились за день и с кем надо будет связаться. Эти минуты – ключевой фактор, благодаря которому завтра может стать лучше, чем сегодня.

Часть IV

  1. Запланируйте периоды сомнения. Выделите время, чтобы поставить под вопрос свои действия. Это должен быть момент, когда минутные соблазны точно не повлияют на ваше решение. Если вы хотите нарушить диету, делайте это, когда потребность в силе воли минимальна. Перенесите решение на следующий день – когда, после здорового завтрака или упражнений, вы будете готовы придерживаться своего решения.
  2. Страх может быть полезен в качестве катализатора изменений – а удовольствие закрепляет их. Если вам нужен толчок, не выбирайте одно – или страх, или удовольствие. Сначала первое, потом второе.
  3. Всегда говорите «нет» со всей серьезностью, и вам не придется тратить время без нужды.
  4. Мы никогда не делаем несколько дел одновременно. Вместо этого мы постоянно переключаемся. Это неэффективно, а иногда даже опасно. Сопротивляйтесь такому соблазну.
  5. Представьте, что к вам обращаются с просьбой. Задайте
    себе три вопроса:
    • Подхожу ли я для этого дела?
    • Подходящее ли сейчас время, чтобы его выполнить?
    • Достаточно ли у меня информации?

Мини-отзыв

На мой взгляд у книги есть много достоинств: она небольшая, легко читается, содержит массу историй и примеров из жизни, а так же содержит реальные работающие методы. Поэтому я рекомендую её всем, кто никогда не интересовался тайм-менеджментом. Если вы уже прочитали с десяток книг на эту тему, то книга вам будет просто не интересна.

Для тех, кому лень искать - купить книгу можно тут.

четверг, 2 июля 2015 г.

Системные вещи. Ответы Часть 3.

Что такое виртуальная память?

Виртуа́льная па́мять  — технология управления памятью для многозадачных операционных систем. Позволяет увеличить эффективность использования памяти несколькими одновременно работающими программами, организовав множество независимых адресных пространств, и обеспечить защиту памяти между различными приложениями. Также позволяет программисту использовать больше памяти, чем установлено в компьютере, за счет откачки неиспользуемых страниц на вторичное хранилище.

Применение механизма виртуальной памяти позволяет:
  • упростить адресацию памяти клиентским программным обеспечением;
  • рационально управлять оперативной памятью компьютера (хранить в ней только активно используемые области памяти);
  • изолировать процессы друг от друга (процесс полагает, что монопольно владеет всей памятью).

Как работает paging?

Страничная память (paging) — способ организации виртуальной памяти, при котором единицей отображения виртуальных адресов на физические является страница. Типичный размер 4096 байт, для некоторых архитектур до 128 КБ.
Поддержка такого режима присутствует в большинстве 32битных и 64битных процессоров.

Решаемые задачи
  • поддержка изоляции процессов и защиты памяти путём создания своего собственного виртуального адресного пространства для каждого процесса
  • поддержка изоляции области ядра от кода пользовательского режима
  • поддержка памяти «только для чтения» и неисполняемой памяти
  • поддержка отгрузки давно не используемых страниц в область подкачки на диске
  • поддержка отображённых в память файлов, в том числе загрузочных модулей
  • поддержка разделяемой между процессами памяти, в том числе с копированием-по-записи для экономии физических страниц
  • поддержка системного вызова fork() в ОС семейства UNIX

Запись таблицы страниц обычно содержит в себе следующую информацию:
  • флаг «страница отображена»
  • физический адрес
  • флаг «страница доступна из режима пользователя». При неустановке данного флага страница доступна только из режима ядра.
  • флаг «страница доступна только на чтение».
  • флаг «страница недоступна на исполнение».
  • режим использования кэша для страницы. Особенно часто используется для видеопамяти и для отображенных в память регистров устройств (полное отсутствие кэширования).
Так как число записей в одной таблице ограничено и зависит от размера записи и размера страницы, используется многоуровневая организация таблиц, часто 2 или 3 уровня, иногда 4 уровня (для 64-х разрядных архитектур). В случае 2 уровней используется «директория» страниц, имеющая в себе записи, указывающие на физические адреса таблиц страниц. Таблицы содержат в себе записи, указывающие уже на страницы данных. В случае 3 уровней возникает ещё и супер-директория, содержащая в себе записи, указывающие на несколько директорий.
Старшие биты виртуального адреса указывают на номер записи в директории, средние — номер записи в таблице, младшие (адрес внутри страницы) попадают в физический адрес без трансляции.
Формат записей таблиц, их размер, размер страницы и организация таблиц зависит от типа процессора, а иногда и от режима его работы.
Исторически, x86 использует 32битные PTE, 32битные виртуальные адреса, 4KB страницы, 1024 записи в таблице, двухуровневые таблицы, старшие 10 бит виртуального адреса — номер записи в директории, следующие 10 — номер записи в таблице, младшие 12 — адрес внутри страницы.
Физический адрес директории или же супер-директории загружен в один из управляющих регистров процессора.

Если обращение к памяти не может быть оттранслировано через TLB, то микрокод процессора обращается к таблицам страниц и пытается загрузить PTE оттуда в TLB. Если и после такой попытки сохранились проблемы, то процессор исполняет специальное прерывание, называемое «отказ страницы» (page fault). Обработчик этого прерывания находится в подсистеме виртуальной памяти ядра ОС.

Причины отказа страницы (page fault):
  • не существует таблицы, отображающей данный регион
  • PTE не имеет взведённого флага «страница отображена».
  • попытка обратиться из пользовательского режима к странице «только для ядра».
  • попытка записи в страницу «только для чтения».
  • попытка исполнения кода из страницы «исполнение запрещено».
Обработчик отказов в ядре может загрузить нужную страницу из файла или же из области подкачки, может создать доступную на запись копию страницы «только для чтения», а может и возбудить исключительную ситуацию в данном процессе.
Каждый процесс имеет свой собственный набор таблиц страниц. Регистр «директория страниц» перегружается при каждом переключении контекста процесса. Также необходимо сбросить ту часть TLB, которая относится к данному процессу.
В большинстве случаев ядро ОС помещается в то же адресное пространство, что и процессы, для него резервируются верхние 1-2 гигабайта 32битного адресного пространства каждого процесса. Это делается с целью избежать переключения таблиц страниц при входе в ядро и выходе из него. Страницы ядра помечаются как недоступные для кода режима пользователя.

Так как память ядра одинакова у всех процессов, соответствующие ей TLB не нужно перегружать после переключения процесса. Для этой оптимизации x86 поддерживает флаг «глобальный» у PTE.

PAE, x64, IOMMU?

В архитектуре x86_64 возможно использовать страницы размером 4 килобайта (4096 байт), 2 мегабайта, и (в некоторых AMD64) 1 гигабайт. Организация страниц для этой архитектуры имеет 4 уровня.

Physical Address Extension (PAE) — режим работы встроенного блока управления памятью x86-совместимых процессоров, в котором используются 64-битные элементы таблиц страниц (из которых для адресации используются только 36 бит), c помощью которых процессор может адресовать 64 ГБ физической памяти (вместо 4 ГБ, адресуемых при использовании 32-разрядных таблиц), хотя каждая задача (программа) всё равно может адресовать максимум до 4 ГБ виртуальной памяти. Также, в новых моделях процессоров в PAE-режиме старший бит элемента таблицы страниц отвечает за запрет исполнения кода в странице, что затрудняет атаку по методу переполнения буфера.

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

При наличии IOMMU у аппаратуры имеется возможность проводить DMA-операции не только по физическим адресам, но и по логическим (виртуальным). Такая возможность упрощает устройства, которым больше не нужно заботиться о поддержке DMA по разрывному (с точки зрения физических адресов) региону памяти.
Недостатками использования IOMMU по сравнению с прямой физической адресацией памяти в DMA запросах являются:
  • Некоторое ухудшение производительности из-за необходимости транслирования адресов и расходов на управление, например, проход по иерархии таблицы страниц.
  • Дополнительное потребление памяти для хранения таблиц отображения. Может быть уменьшен при использовании основных таблиц трансляции адресов процессора.
IOMMU используется для прямой работы виртуализованных операционных систем с оборудованием основной системы. Наличие IOMMU для таких комбинаций позволяет повысить безопасность, производительность и упростить реализацию виртуальной машины.

Что такое прерывание? Какие они бывают?

Прерывание — сигнал, сообщающий процессору о наступлении какого-либо события. При этом выполнение текущей последовательности команд приостанавливается, и управление передаётся обработчику прерывания.
В зависимости от источника возникновения сигнала, прерывания делятся на:
  • аппаратные — события, которые исходят от внешних источников  и могут произойти в любой произвольный момент. Факт возникновения в системе такого прерывания трактуется как запрос на прерывание (IRQ);
  • внутренние — события в самом процессоре как результат нарушения каких-то условий при исполнении машинного кода: деление на ноль или переполнение стека, обращение к недопустимым адресам памяти или недопустимый код операции;
  • программные (частный случай внутреннего прерывания) — инициируются исполнением специальной инструкции в коде программы. Программные прерывания, как правило, используются для обращения к функциям встроенного программного обеспечения (firmware), драйверов и операционной системы.

Аппаратные прерывания в зависимости от возможности запрета делятся на:
  • маскируемые — прерывания, которые можно запрещать установкой соответствующих битов в регистре маскирования прерываний;
  • немаскируемые (Non-maskable interrupt, NMI) — обрабатываются всегда, независимо от запретов на другие прерывания. К примеру, такое прерывание может быть вызвано сбоем в микросхеме памяти.

Как происходит их обработка? Что со стеками?

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

До окончания обработки прерывания обычно устанавливается запрет на обработку этого типа прерывания, чтобы процессор не входил в цикл обработки одного прерывания. Все источники прерываний делятся на классы и каждому классу назначается свой уровень приоритета запроса на прерывание. Приоритеты могут обслуживаться как относительные и абсолютные.
  • Относительное обслуживание прерываний означает, что если во время обработки прерывания поступает более приоритетное прерывание, то это прерывание будет обработано только после завершения текущей процедуры обработки прерывания.
  • Абсолютное обслуживание прерываний означает, что если во время обработки прерывания поступает более приоритетное прерывание, то текущая процедура обработки прерывания вытесняется, и процессор начинает выполнять обработку вновь поступившего более приоритетного прерывания. После завершения этой процедуры процессор возвращается к выполнению вытесненной процедуры обработки прерывания.


На этом на сегодня всё, читайте продолжение в следующем посте.

среда, 1 июля 2015 г.

Системные вещи. Ответы Часть 2.

Введение

Продолжаю публиковать ответы на вопросы на наших собеседованиях. Вопрос про режимы ядра и многие последующие вопросы привязаны к той ОС, в которой вы работаете. В нашей компании активно разрабатываются проекты в Windows и Linux. Однако, так как большинство кандидатов лучше знают Windows, то и ответы будут публиковаться для Windows, если это не оговорено дополнительно. Кстати, по всем системным вещам Windows стоит обращаться к замечательной книге М. Руссинович, Д. Соломон - Внутреннее устройство Microsoft Windows. В ней даны подробные ответы на все системные вопросы нашего собеседования. Если же вам больше интересно как все работает внутри Linux, то я рекомендую обратиться к книге Таненбаум Э. - Современные операционные системы.

Что такое режим ядра и режим пользователя?

Для предотвращения доступа приложений к критически важным данным операционной системы и устранения риска их модификации Windows использует два режима доступа к процессору: пользовательский (user mode) и ядра (kernel mode). Код приложений работает в пользовательском режиме, тогда как код операционной системы (например, системные сервисы и драйверы устройств) — в режиме ядра. B режиме ядра предоставляется доступ ко всей системной памяти и разрешается выполнять любые машинные команды процессора. Предоставляя операционной системе более высокий уровень привилегий, чем прикладным программам, процессор позволяет разработчикам операционных систем реализовать такие архитектуры, которые не дают возможности сбойным приложениям нарушать стабильность работы всей системы.

Windows не предусматривает никакой защиты системной памяти от компонентов, работающих в режиме ядра. Иначе говоря, код операционной системы и драйверов устройств в режиме ядра получает полный доступ к системной памяти и может обходить средства защиты Windows для обращения к любым объектам. Поскольку основная часть кода Windows выполняется в режиме ядра, крайне важно, чтобы компоненты, работающие в этом режиме, были тщательно продуманы и протестированы.

CPL, RPL, DPL?

Существует четыре уровня привилегий (PL) сегментов (0-3). Привилегированность увеличивается с уменьшением номера. На нулевом уровне позволяется использование привилегированных инструкций.
Уровень привилегий сегмента (Descriptor Privilege Level) соответствует значению поля DPL в дескрипторе сегмента.
Текущий уровень привилегий (Current Privilege Level) соответствует уровню привилегий сегмента кода, селектор которого загружен в регистр CS (то есть уровню привилегий выполняющегося сегмента кода).
Запрашиваемый уровень привилегий (Requested Privilege Level) находится в двух младших битах селектора (задаётся программой).

Как происходит взаимодействие между режимом пользователя и ядра? SYSENTER, int2e?

  1. Вызов функции, например, CreateFile разворачивается в вызов функции из  NtDll.dll — «прослойке» между режимом пользователя и режимом ядра. В ней находится нужная нам функция ядра. Эта функция помещает в регистр EAX свой уникальный номер. Этот номер специфичен для каждой версии ОС и может измениться при установке Service Pack или другого обновления системы, которое затрагивает ядро.
  2. Далее, в EDX помещается адрес вершины стека параметров, в большинстве случаев это значение регистра ESP. Дело в том, что в режиме ядра и режиме пользователя используется разный стек, и при переходе в ядро стек будет переключен.
  3. На старых процессорах и ОС переключение выполняется с помощью прерывания 0x2e, на современных же для этого существует специальная инструкция процессора: SysEnter для Intel, SysCall для AMD. Int2e поддерживается в режиме совместимости современными процессорами.
  4. Процессор переключает EIP(RIP), на специальное значение, которое хранится в регистре MSR_SYSENTER_EIP. Этот регистр заполняется системой при загрузке.
  5. В результате происходит переход в специальную функцию - KiFastCallEntry().
  6. После завершения выполнении функции, происходит возврат из режима ядра с помощью iret или Sy
  7. Ядро, используя значение в регистре EAX, находит запись в таблице  KiServiceDescriptorTable и осуществляет вызов нужной функции ядра.
  8. sysExit/SysRet

На этом на сегодня всё, продолжение читайте в следующем посте.