Pull to refresh
30
0
Фофанов Илья @EngineerSpock

Ответственный программист

Send message

Анатомия программы в памяти

Reading time6 min
Views85K
Управление памятью – одна из главных задач ОС. Она критична как для программирования, так и для системного администрирования. Я постараюсь объяснить, как ОС работает с памятью. Концепции будут общего характера, а примеры я возьму из Linux и Windows на 32-bit x86. Сначала я опишу, как программы располагаются в памяти.

Каждый процесс в многозадачной ОС работает в своей «песочнице» в памяти. Это виртуальное адресное пространство, которое в 32-битном режиме представляет собою 4Гб блок адресов. Эти виртуальные адреса ставятся в соответствие (mapping) физической памяти таблицами страниц, которые поддерживает ядро ОС. У каждого процесса есть свой набор таблиц. Но если мы начинаем использовать виртуальную адресацию, приходится использовать её для всех программ, работающих на компьютере – включая и само ядро. Поэтому часть пространства виртуальных адресов необходимо резервировать под ядро.

image

Это не значит, что ядро использует так много физической памяти – просто у него в распоряжении находится часть адресного пространства, которое можно поставить в соответствие необходимому количеству физической памяти. Пространство памяти для ядра отмечено в таблицах страниц как эксклюзивно используемое привилегированным кодом, поэтому если какая-то программа пытается получить в него доступ, случается page fault. В Linux пространство памяти для ядра присутствует постоянно, и ставит в соответствие одну и ту же часть физической памяти у всех процессов. Код ядра и данные всегда имеют адреса, и готовы обрабатывать прерывания и системные вызовы в любой момент. Для пользовательских программ, напротив, соответствие виртуальных адресов реальной памяти меняется, когда происходит переключение процессов:
Читать дальше →
Total votes 62: ↑61 and ↓1+60
Comments24

Экзамен 70-485 Advanced Windows Store App Development Using C#

Reading time19 min
Views8.3K

Пока все прогрессивные разработчики предвкушают выход Windows 10 и готовятся разрабатывать приложения под нее, я, после сдачи теста 70-485, хочу поделиться с вами углубленными возможностями разработки приложений под Windows 8 и 8.1. Благо, у разработки по 10 и под 8.1 очень много общего. Эта статья по задумке должна помочь вам сдать экзамен 70-485, но может быть интересна в любом случае, если вы разрабатываете приложения Windows Store. Она содержит в себе некоторые must know сниппеты, описание возможностей и классов WinRT, а также некоторые моменты, по которым могут быть заданы каверзные вопросы.
Под катом обо всем понемногу. Так как все охватить невозможно, получилась своеобразная памятка.
Читать дальше →
Total votes 15: ↑13 and ↓2+11
Comments3

.NET Native – что это означает для разработчиков под универсальную Windows-платформу (UWP)?

Reading time7 min
Views46K
В Windows 10 универсальные Windows-приложения на управляемых языках (C#, VB) проходят в магазине процедуру компиляции в машинный код с использованием .NET Native. В данной статье мы предлагаем вам познакомиться подробнее с тем, как это работает и как это влияет на процесс разработки приложений. Ниже вы найдете видео-интервью с представителем команды разработки .NET Native и перевод соответствующей статьи.




Что такое .NET Native?


.NET Native – это технология предварительной компиляции, используемая при создании универсальных Windows-приложений в Visual Studio 2015. Инструменты .NET Native компилируются ваши IL-библиотеки с управляемым кодом в нативные библиотеки. Каждое управляемое (C# или VB) универсальное Windows-приложение использует данную технологию. Приложения автоматически компилируются в нативный код прежде, чем они попадут на конечное устройство. Если вы хотите погрузиться глубже в то, как это работает, рекомендуем статью “Компиляция приложений с помощью машинного кода .NET”.
Читать дальше →
Total votes 22: ↑20 and ↓2+18
Comments14

Введение в .NET Core

Reading time19 min
Views191K


На конференции connect(), мы объявили, что .NET Core будет выпущен полностью как программное обеспечение с открытым исходным кодом. В этой статье мы сделаем обзор .NET Core, расскажем, как мы собираемся его выпускать, как он соотносится с .NET Framework и что это все означает для кросс-платформенной разработки и разработки с открытым кодом.
Читать дальше →
Total votes 58: ↑52 and ↓6+46
Comments12

Подводные камни WPF

Reading time20 min
Views81K
Каждый, кто достаточно долгое время разрабатывал приложения с использованием WPF, наверное, замечал, что этот фреймворк далеко не так прост в использовании, как может показаться на первый взгляд. В этой статье я попытался собрать некоторые наиболее типовые проблемы и способы их решения.
Читать дальше →
Total votes 45: ↑44 and ↓1+43
Comments21

Создание тестового DB-контекста в тестах с использованием xUnit

Reading time5 min
Views10K
В случаях, когда ваше приложение имеет нетривиальную схему данных (люди, продукты, заказы, цены, объемы, состояния, зависящие от кучи параметров и т.д.) бывает проще иметь некоторый дамп данных, воссозданный на тестовом окружении, или взятый с продакшна, и использовать его для тестов. В этом случае, может понадобиться несколько дампов данных, для каждого из случаев, которые автоматические тесты должны уметь накатывать и откатывать на тестовое окружение. В этой статье я попытаюсь показать, как это можно сделать, используя fixtures и collections фреймворка xUnit. Все решение построена на базе xUnit версии 2.0 от 16 марта 2015 года.
Читать дальше →
Total votes 8: ↑8 and ↓0+8
Comments0

Задачи вступительного экзамена в ШАД 2014

Reading time14 min
Views64K


При поступлении в ШАД проверяются знания в рамках общей программы, включающей базовые разделы высшей алгебры, математического анализа, комбинаторики, теории вероятностей, а также основы программирования. Под катом подробно разобраны задачи вступительного экзамена в ШАД 2014 года. Внимание! Пост довольно объёмный, поэтому устраивайтесь поудобнее, вооружайтесь карандашом, если нужно, доставайте чай с печеньем. Убедитесь, что сделали все дела на вечер! Велика вероятность, что рассматриваемые ниже задачи поглотят ваш разум на несколько часов, а кому-то помешают вовремя лечь спать. Во всяком случае сегодняшний вечер обещает быть интересным. Добро пожаловать под кат
Читать дальше →
Total votes 34: ↑31 and ↓3+28
Comments16

Прошлое и настоящее SSL-сертификатов

Reading time9 min
Views38K


Появление SSL


SSL (Secure Sockets Layer), семейство транспортных криптографических протоколов, известно примерно с 1994 года (первые работы по использованию средств криптографии в качестве транспорта для уже известных протоколов проводились и раньше).

Последний протокол семейства, SSL v3, в июне 2015 года в RFC7568 объявлен устаревшим. Взамен него надлежит использовать новые версии семейства SSL, протоколы TLS (Transport Layer Security) версии 1.2 или старше (на момент написания этого текста).

Оба протокола используют так называемый сертификат открытого ключа стандарта X.509, который не вполне корректно принято называть сейчас SSL-сертификатом. Стандарт известен с 1988 года. Сертификат открытого ключа, успешно использовавшийся на протяжении всего прошедшего времени, успел продемонстрировать свои сильные и слабые стороны (о них сказано ниже).
Читать дальше →
Total votes 18: ↑16 and ↓2+14
Comments6

Многофакторный LastPass

Reading time4 min
Views14K


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

Впрочем, LastPass предоставляет своим пользователем возможность обеспечить дополнительную защиту в виде многофакторной аутентификации различных видов. Используя несколько факторов для доступа к сохраненным паролям, можно обезопасить себя от утечек мастер-паролей с сервера разработчика.

В этой статье я хотел бы описать настройку и использование многофакторной аутентификации в менеджере паролей LastPass.
Читать дальше →
Total votes 17: ↑15 and ↓2+13
Comments15

Азбука электронщика: увлекательная теория, занимательная практика и полезные решения для начинающих

Reading time4 min
Views57K
Я слушаю и забываю,
я вижу и запоминаю,
я делаю и понимаю.
Конфуций

Замечали ли вы, что интерес к электронике, радиотехнике, конструированию радиоэлектронных приборов в последнее время заметно возрос?

Учебные заведения все чаще обращают свой взор в сторону подготовки инженеров в области радиотехники и электроники. Многие специалисты, достигшие определенных успехов в своей профессии, с удовольствием делятся своими знаниями на просторах всемирной паутины. Но есть проблема – отрыв теории от практики. Одно дело знать из школьного курса закон Ома, а совсем другое – спалить транзистор или микросхему, подав неверное напряжение. Как начинающему разобраться, понять причину и навсегда запомнить этот закон и этот примечательный случай?



Понимая это, Мастер Кит начал выпуск серии наборов «Азбука электронщика».
Читать дальше →
Total votes 16: ↑12 and ↓4+8
Comments15

Знакомство с внутренним устройством .NET Framework. Посмотрим, как CLR создаёт объекты

Reading time27 min
Views57K
Вниманию читателей «Хабрахабра» представляется перевод статьи Хану Коммалапати и Тома Кристиана об внутреннем устройстве .NET. Существует альтернативный вариант перевода на сайте Microsoft.

В статье рассматривается:

  • Системный домен (SystemDomain), Домен общего доступа (SharedDomain) и домен по умолчанию (DefaultDomain)
  • Представление объекта и другие особенности организации памяти
  • Представление таблицы методов
  • Распределение методов

Используемые технологии: .NET Framework, C#

Содержание


  1. Домены создаваемые начальным загрузчиком
  2. Системный домен
  3. Домен общего доступа (разделяемый)
  4. Дефолтный домен
  5. Загрузчик куч
  6. Основы типов
  7. Экземпляр объекта
  8. Таблица методов
  9. Размер базового экземпляра
  10. Таблица слотов метода
  11. Описатель метода
  12. Карта таблиц виртуальных методов интерфейсов и карта интерфейса
  13. Виртуальное распределение
  14. Статические переменные
  15. EEClass
  16. Заключение

Читать дальше →
Total votes 24: ↑23 and ↓1+22
Comments5

Как красиво оформить публикацию на Хабре

Reading time7 min
Views45K
Публикация – основная единица связи автора с читателем. Практика показывает, что на Хабре можно разместить почти любой формат: небольшой анонс и лонгрид-обзор, интервью, фотоотчёт, трансляцию события, урок и многое-многое другое. Нередко успех публикации зависит и от её оформления – приятно оформленный материал читать одно удовольствие. В этой статье мы постараемся предоставить вам много полезных советов по хорошему оформлению материала.

И первый лайфхак – кликабельная картинка до ката, которая ведёт сразу внутрь публикации:


Читать дальше →
Total votes 140: ↑121 and ↓19+102
Comments112

О собеседованиях (от Эрика Липперта)

Reading time8 min
Views33K
От переводчика
Эрик Липперт — прежде всего известен как ведущий разработчик языка C# (в прошлом), и многие наверняка читали его блог Fabulous adventures in coding. Ранее в MSDN публиковался даже официальный перевод этого блога, что прекратилось после ухода Липперта из Microsoft. Конечно же, нет ничего лучше чтения оригинала, но я решил для разнообразия перевести что-нибудь из недавних постов Эрика. Надеюсь, будет интересно.

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

Вот мои главные цели:
  • не нанимать плохих работников;
  • нанимать хороших работников;
  • оставить кандидата с положительным впечатлением о компании.

Читать дальше →
Total votes 33: ↑32 and ↓1+31
Comments35

Некоторые полезные атрибуты о которых вы могли не знать

Reading time4 min
Views19K
Здравствуйте, я хотел бы вам рассказать о некоторых редко используемых, но весьма полезных атрибутах из мира .NET.

Итак, поговорим о:

Читать дальше →
Total votes 40: ↑35 and ↓5+30
Comments14

Детектор блокировок UI в WPF c нотификацией

Reading time3 min
Views14K


Приветствую!

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

Подробности под катом.
Читать дальше →
Total votes 20: ↑19 and ↓1+18
Comments29

5 практических советов по эксплуатации литий-ионных аккумуляторов

Reading time3 min
Views1.2M
Литий-ионные аккумуляторы не столь «привередливы», как их никель-металл-гидридные собратья, но все равно требуют определенного ухода. Придерживаясь пяти простых правил, можно не только продлить жизненный цикл литий-ионных аккумуляторных батарей, но и повысить время работы мобильных устройств без подзарядки.

Не допускайте полного разряда. У литий-ионных аккумуляторов отсутствует так называемый эффект памяти, поэтому их можно и, более того, нужно заряжать, не дожидаясь разрядки до нуля. Многие производители рассчитывают срок жизни литий-ионного аккумулятора количеством циклов полного разряда (до 0%). Для качественных аккумуляторов это 400-600 циклов. Чтобы увеличить срок службы вашего литий-ионного аккумулятора, чаще заряжаете свой телефон. Оптимально, как только показатель заряда батареи опустится ниже отметки 10-20 процентов, можете ставить телефон на зарядку. Это увеличит количество циклов разряда до 1000-1100.
Данный процесс специалисты описывают таким показателем как Глубина Разряда (Depth Of Discharge). Если ваш телефон разряжен до 20%, то Глубина Разряда составляет 80%. В нижеприведенной таблице показана зависимость количества циклов разряда литий-ионного аккумулятора от Глубины Разряда:
image

Разряжайте раз в 3 месяца. Полный заряд на протяжении длительного времени также же вреден для литий-ионных аккумуляторов, как и постоянная разрядка до нуля.
Читать дальше →
Total votes 23: ↑21 and ↓2+19
Comments34

Храним 300 миллионов объектов в CLR процессе

Reading time5 min
Views35K

Камень преткновения — GC


Все managed языки такие как Java или C# имеют один существенный недостаток — безусловное автоматическое управление паматью. Казалось бы, именно это и является преимуществом managed языков. Помните, как мы барахтались с dandling-указателями, не понимая, куда утекают драгоценные 10KB в час, заставляя рестартать наш любимый сервер раз в сутки? Конечно, Java и C# (и иже с ними) на первый взгляд разруливают ситуацию в 99% случаев.

Так-то оно так, только вот есть одна проблемка: как быть с большим кол-вом объектов, ведь в том же .Net никакой магии нет. CLR должен сканировать огромный set объектов и их взаимных ссылок. Это проблема частично решается путём введения поколений. Исходя из того, что большинство объектов живёт недолго, мы высвобождаем их быстрее и поэтому не надо каждый раз ходить по всем объектам хипа.

Но проблема всё равно есть в тех случаях, когда объекты должны жить долго. Например, кэш. В нём должны находиться миллионы объектов. Особенно, учитывая возрастание объемов оперативки на типичном современном серваке. Получается, что в кэше потенциально можно хранить сотни миллионов бизнес-объектов (например, Person с дюжиной полей) на машине с 64GB памяти.

Однако на практике это сделать не удаётся. Как только мы добавляем первые 10 миллионов объектов и они “устаревают” из первого поколения во второе, то очередной полный GC-scan “завешивает” процесс на 8-12 секунд, причём эта пауза неизбежна, т.е. мы уже находимся в режиме background server GC и это только время “stop-the-world”. Это приводит к тому, что серверная апликуха просто “умирает” на 10 секунд. Более того, предсказать момент “клинической смерти” практически невозможно.
Что же делать? Не хранить много объектов долго?

Зачем


Но мне НУЖНО хранить очень много объектов долго в конкретной задаче. Вот например, я храню network из 200 миллионов улиц и их взаимосвязей. После загрузки из flat файла моё приложение должно просчитать коэффициенты вероятностей. Это занимает время. Поэтому я это делаю сразу по мере загрузки данных с диска в память. После этого мне нужно иметь object-graph, который уже прекалькулирован и готов “к труду и обороне”. Короче, мне нужно хранить резидентно около 48GB данных в течении нескольких недель при этом отвечаю на сотни запросов в секунду.

Вот другая задача. Кэширование социальных данных, которых скапливаются сотни миллионов за 2-3 недели, а обслуживать необходимо десятки тысяч read-запросов в секунду.
Читать дальше →
Total votes 50: ↑44 and ↓6+38
Comments81

Смайлы при общении с клиентами

Reading time3 min
Views15K


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

Совсем иначе дела обстоят при общении онлайн, ведь собеседники зачастую не только не видят друг друга, но и не слышат. В этом случае уловить смысл и тон сообщения намного сложнее, поэтому обеим сторонам важно предпринимать дополнительные усилия для их передачи. Один из способов улучшить ситуацию — использовать смайлы и знаки препинания.
Читать дальше →
Total votes 20: ↑18 and ↓2+16
Comments12

О бедной рекурсии замолвите слово, или всё, что вы не знали и не хотите о ней знать

Reading time8 min
Views77K
Рекурсия: см. рекурсия.

Все программисты делятся на 112 категорий: кто не понимает рекурсию, кто уже понял, и кто научился ею пользоваться. В общем, гурилка из меня исключительно картонный, так что постигать Дао Рекурсии тебе, читатель, всё равно придётся самостоятельно, я лишь постараюсь выдать несколько волшебных пенделей в нужном направлении.

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

— Как она сложена?
— Превосходно! Только рука немного торчит из чемодана.

Именно пытаясь разместить стройную теорию алгоритма в жесткий рюкзак реальных ресурсов и приходится постоянно кроить по живому, перепаковывать, и вместо красивых и стройных определений Фибоначчи:

  def fib(n):
    if n<0: raise Exception("fib(n) defined for n>=0")
    if n>1: return fib(n-1) + fib(n-2)
    return n

приходится городить всевозможные грязные хаки, начиная от:

  @memoized
  def fib(n):
    if n<0: raise Exception("fib(n) defined for n>=0")
    if n>1: return fib(n-1) + fib(n-2)
    return n

И заканчивая вообще:

  def fib(n):
    if n<0: raise Exception("fib(n) defined for n>=0")
    n0 = 0
    n1 = 1
    for k in range(n):
      n0, n1 = n1, n0+n1
    return n0

Читать дальше →
Total votes 55: ↑44 and ↓11+33
Comments63

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Works in
Date of birth
Registered
Activity