Русский
Русский
English
Статистика
Реклама

Память

Перевод Управление памятью в JavaScript

03.11.2020 12:06:29 | Автор: admin


Доброго времени суток, друзья!

В подавляющем большинстве случаев нам, как JavaScript-разработчикам, не нужно беспокоиться о работе с памятью. Движок это делает за нас.

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

В этой статье я расскажу о том, как работает выделение памяти (memory allocation) и сборка мусора (garbage collection), а также о том, как избежать некоторых распространенных проблем, связанных с утечкой памяти.

Жизненный цикл памяти


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

Выделение памяти это процесс резервирования определенного пространства в памяти, а освобождение памяти это освобождение данного пространства, чтобы оно могло быть использовано для других целей.

Каждый раз при создании переменной или функции память проходит через следующие стадии:



  • Выделение памяти движок автоматически выделяет память для создаваемого объекта
  • Использование памяти чтение и запись данных в память есть не что иное как запись и чтение данных из переменной
  • Освобождение памяти данный шаг также автоматически выполняется движком. Как только память освобождена, она может быть использована для других целей

Куча и стек


Следующий вопрос: что значит память? Где на самом деле хранятся данные?

Движок имеет два таких места: кучу (heap) и стек (stack). Куча и стек структуры данных, которые используются движком для разных целей.

Стек: статическое выделение памяти




Все данные в примере сохраняются в стеке, поскольку являются примитивами

Стек это структура данных, используемая для хранения статических данных. Статические данные это данные, размер которых известен движку на стадии компиляции кода. В JavaScript такими данными являются примитивы (строки, числа, логические значения, undefined и null) и ссылки, указывающие на объекты и функции.

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

Куча: динамическое выделение памяти


Куча предназначена для хранения объектов и функций. В отличие от стека, движок не выделяет фиксированный размер памяти для объектов. Память выделяется по необходимости. Такое выделение памяти называется динамическим. Вот небольшая сравнительная таблица:

Стек Куча
Примитивные значения и ссылки Объекты и функции
Размер известен во время компиляции Размер известен во время выполнения
Выделяется фиксированный размер памяти Размер памяти для каждого объекта не ограничен

Примеры


Рассмотрим парочку примеров.

  const person = {    name: "John",    age: 24,  };

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

  const hobbies = ["hiking", "reading"];

Массивы это объекты, так что они хранятся в куче

  let name = "John";  const age = 24;  name = "John Doe";  const firstName = name.slice(0, 4);

Примитивы иммутабельны. Это означает, что вместо изменения оригинального значения, JavaScript создает новое

Ссылки


Все переменные хранятся в стеке. В случае с не примитивными значениями, в стеке хранятся ссылки на объект в куче. Память в куче неупорядоченна. Вот почему нам нужны ссылки в стеке. Вы можете думать о ссылках как об адресах, а об объектах как о домах, находящихся по определенному адресу.



На изображении выше мы можем видеть как хранятся различные значения. Обратите внимание, что person и newPerson указывают на один и тот же объект

Примеры


  const person = {    name: "John",    age: 24,  };

Это создает новый объект в куче и ссылку на него в стеке

Сборка мусора


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

На самом деле проблема освобождения неиспользуемой памяти является неразрешимой: идеального алгоритма для ее решения не существует.

В данной статье мы рассмотрим два алгоритма, которые предлагают наилучшее на сегодняшний день решения: сборка мусора методом подсчета ссылок (reference counting) и алгоритм пометки и очистки (mark and sweep).

Сборка мусора посредством подсчета ссылок


Тут все просто из памяти удаляются объекты, на которые не указывает ни одна ссылка. Рассмотрим пример. Линии обозначают ссылки.



Обратите внимание, что в куче остается только объект hobbies, поскольку только на него имеется ссылка в стеке.

Циклические ссылки


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

  const son = {    name: "John",  };  const dad = {    name: "Johnson",  };  son.dad = dad;  dad.son = son;  son = null;  dad = null;



Поскольку объекты son и dad ссылаются друг на друга, алгоритм подсчета ссылок не сможет освободить память. Однако, эти объекты больше недоступны для внешнего кода

Алгоритм пометки и очистки


Данный алгоритм решает проблему циклических ссылок. Вместо подсчета ссылок, указывающих на объект, он определяет доступность объекта из корневого объекта. Корневым объектом является объект window в браузере или global в Node.js.



Алгоритм помечает объекты как недостижимые и удаляет их. Таким образом, циклические ссылки больше не являются проблемой. В приведенном примере объекты dad и son являются недостижимыми из корневого объекта. Они будут помечены как мусор и удалены. Рассматриваемый алгоритм реализован во всех современных браузерах, начиная с 2012 года. Улучшения, произведенные с тех пор, касаются особенностей реализации и повышения производительности, но не ключевой идеи алгоритма.

Компромиссы


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

Использование памяти


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

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

Производительность


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

Утечки памяти


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

Глобальные переменные


Если объявить переменную без использования одного из ключевых слов (var, let или const), такая переменная станет свойством глобального объекта.

  users = getUsers();

Выполнение кода в строгом режиме позволяет этого избежать.

Порой мы объявляем глобальные переменные намеренно. В этом случае для того, чтобы освободить память, занимаемую такой переменной, необходимо присвоить ей значение null:

  window.users = null;

Забытые таймеры и функции обратного вызова


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

Забытые таймеры


  const object = {};  const intervalId = setInterval(function () {    // все, что здесь находится, не может быть удалено сборщиком мусора,    // до тех пор, пока таймер не будет остановлен    doSomething(object);  }, 2000);

Приведенный выше код запускает функцию каждые 2 секунды. Если таймер вам больше не нужен, его следует отменить посредством:

  clearInterval(intervalId);

Это особенно важно для SPA. Даже при переходе на другую страницу, где таймер не используется, он будет работать в фоновом режиме.

Забытые колбэки


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

  const element = document.getElementById("button");  const onClick = () => alert("hi");  element.addEventListener("click", onClick);  element.removeEventListener("click", onClick);  element.parentNode.removeChild(element);

Ссылки за пределами DOM


Эта утечка памяти аналогична предыдущим, она возникает при хранении элементов DOM в JavaScript:

  const elements = [];  const element = document.getElementById("button");  elements.push(element);  function removeAllElements() {    elements.forEach((item) => {      document.body.removeChild(document.getElementById(item.id));    });  }

При удалении любого из этих элементов, следует также удалить его из массива. В противном случае, такие элементы не могут быть удалены сборщиком мусора:

  const elements = [];  const element = document.getElementById("button");  elements.push(element);  function removeAllElements() {    elements.forEach((item, index) => {      document.body.removeChild(document.getElementById(item.id));      elements.splice(index, 1);    });  }

Надеюсь, вы нашли для себя что-нибудь интересное. Благодарю за внимание.
Подробнее..

Рецепт квантовой памяти

08.09.2020 20:05:54 | Автор: admin


Ты никогда не сможешь забыть то, что хочешь забыть больше всего.


Однажды в студенческие годы мне попалась на глаза новость о прошедшем в Лондоне чемпионате мира по памяти. На нем люди разных возрастов запоминали тысячезначные числа, десятки колод карт и сотни номеров телефонов. Меня, как человека иногда путающего пин-код от карты, это очень заинтересовало. Я сцепил пальцы в замок и подумал, "Такая память всегда будет хорошим доводом". И углубился в тему, а вскоре смог запоминать и воспроизводить стозначные числа и порядок карт в колоде. Так каков же он, рецепт хорошей памяти? Сейчас расскажу.


Метод против феномена


Доминик О'Брайен


Говоря о памяти, нельзя обойти стороной этого британского мнемониста. Он выиграл восемь из первых десяти чемпионатов мира по памяти и написал замечательную книгу "Квантовая память" ("Quantum Memory Power"), на основе которой мы и будем строить нашу систему.


Соломон Шерешевский


Так же очень рекомендую "Маленькую книжку о большой памяти" советского психолога Александра Лурии. В течение нескольких десятилетий он наблюдал удивительного человека, способного запомнить буквально все, объем и длительность для него не играли никакой роли. Этим человеком был журналист и мнемонист Соломон Шерешевский.


И если феномен Шерешевского, подробно описанный в книге, нам перенести на себя вряд ли удастся, то методы О'Брайена довольно просты и известны с давних времен, надо только настроить их под себя. Этим мы и займемся. Начнем с запоминания чисел (номера телефонов, пин-коды, дни рождения, число пи...).


Цифры плюс буквы



Для начала переведем в ассоциации цифры. Главный принцип такой, они должны быть простыми (для вас) и первыми приходить на ум (именно вам). Ассоциации могут быть по форме самой цифры, по порядковому номеру и вообще любые личные ассоциации (если второго числа у вас день рождения, то можете представить торт). Еще хорошо, если это будут какие-то осязаемые предметы разного размера, веса и цвета, но не люди (это важно).


У меня, например, они такие:


цифра ассоциация
0 шар для боулинга
1 свечка
2 лебедь
3 наручники
4 флаг
5 уницикл
6 слон
7 коса
8 снеговик
9 воздушный шарик

Можете взять мои ассоциации и частично заменить на свои. Запомнить их не дожно составить труда, если они именно ваши.


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


цифра буква как запомнить
0 о по форме
1 а первая буква алфавита
2 д (д)ва
3 т (т)ри
4 ч (ч)етыре
5 п (п)ять
6 е шестая буква алфавита
7 с (с)емь
8 в (в)осемь
9 р по форме

Сейчас важный момент, не запоминайте шестерку как Ш (!), дальше станет понятно почему. Также отметьте, что буквы не повторяются. К такой системе я пришел где-то через месяц после начала, поэтому лучше возьмите как есть.


Следующий этап самый креативный и важный.


Числа от 0 до 99



О'Брайен говорит нам о том, что за счет нашей реакции на людей, на множество приятных и неприятных ассоциаций с ними, воспоминаний и постоянного повторения, они крепко откладываются в нашей долговременной памяти в отличие от чисел, которые в общем случае у нас ни с чем не ассоциируются. Например, что вы представляете при виде числа 7564391153?


Поэтому мы будем переводить числа в людей.


Трудности перевода


Подбирать людей будем по сопоставлению их инициалов с числами а также по общим и личным ассоциациям. Далее мои примеры.


По инициалам


число инициалы личность
10 А.О. Александр Овечкин
11 А.А. Айзек Азимов
15 А.П. Александр Пушкин
19 А.Р. Александр Розенбаум
22 Д.Д. Дональд Дрейпер
23 Д.Т. Дональд Трамп
24 Д.Ч. Джеки Чан
29 Д.Р. Джеффри Рихтер
37 Т.С. Том Сойер
38 Т.В. Тайгер Вудз
39 Т.Р. Тим Рот
41 Ч.А. Чет Аткинс
44 Ч.Ч. Чарли Чаплин
52 П.Д. Патрик Джейн
55 П.П. Пабло Пикассо
66 Е.Е. Евгений Евстигнеев
72 С.Д. Сальвадор Дали
76 С.Е. Сергей Есенин
82 В.Д. Вин Дизель
84 В.Ч. Василий Чапаев
85 В.П. Владимир Путин
87 В.С. Вильгельм Стейниц
88 В.В. Владимир Высоцкий
89 В.Р. Вильгельм Рентген
95 Р.П. Рафаэль Пуаре
97 Р.С. Рождер Стерлинг
99 Р.Р. Родион Раскольников

Общие ассоцации


Попробуйте отгадать логику, ответы пишите в комментариях.


число личность
00 Это'О
01 Юрий Гагарин
03 Доктор Хаус
07 Джеймс Бонд
09 Роналдо
33 Хитман
34 Пелевин
42 Зафод Библброкс
60 Шерлок Холмс
67 Джим Керри

Личные ассоциации


Так как мои личные ассоциации работают только для меня, то приводить конкретных примеров смысла нет. Для вас это могут быть друзья, родственники, вы сами, какой-то литературный или кино-герой, что угодно. Для меня личные и общие ассоциации составляют примерно половину ото всех, вторая половина подобрана по инициалам. Подбирать можно не строго по инициалам, например, 47 я запоминаю как ЧеСтер (Честер Беннигтон, солист Linkin Park). В таком случае важно, чтобы фамилия начиналась на букву, которой нет в нашем сопоставлении (здесь буква "Б"), чтобы не было шанса перепутать.


Повторяем, инвертируемся, повторяем


Первоначальная таблица заняла у меня около месяца, впоследствии я не раз заменял числа более удачными ассоциациями. Первой моей ошибкой было то, что для шестерки я взял букву "ш" и пару недель пытался набрать необходимое количество людей с этой буквой в инициалах.


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


Дворец памяти и чертоги разума



Многие приемы и техники запоминания традиционно связывают с Симонидом Кеосским (5 в. до н.э.), который считается основателем "искусства памяти". Так называемый "метод локусов" основан на привязывании объекта запоминания к какому-то обстоятельству, например, к месту. Если вы смотрели сериал Шерлок, то помните как герой Камбербэтча закрывает глаза и погружается в "чертоги разума", идеально известное ему место, в котором все важные для него данные упорядочены. Патрик Джейн из сериала "Менталист" называл этот трюк более традиционно "дворец памяти".


Давайте создадим свой дворец, ну или хотя бы шалаш, шалаш разума.


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


Пример


место
-> Спальня
-> Кухня
-> Коридор
-> Лифт
-> Автобусная остановка (по пути в метро)
-> Магазин (по пути в метро)
-> Вестибюль метро
-> Эскалатор
-> Вагон метро
-> Станция Спортивная
-> Выход из метро
-> Ларек с цветами (по пути на работу)
-> Макдональдс (по пути на работу)
-> Вход в офис
-> Лифт
-> Кафетерий
-> Переговорка
-> Рабочее место коллеги
-> Ваше рабочее место

Объем


Зависит от ваших потребностей, в длинном маршруте может что-то перепутаться, в короткий не поместится много людей. Можно придумать несколько путей разной длины, для разных целей. Свой маршрут я строил по мотивам службы в армии, он начинается от КПП, проходит через плац, КП, казарму, штаб и заканчивается вокзалом. Всего 52 локации.


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


Как вы поняли, система состоит в том, чтобы быстро переводить безликие числа в людей и размещать их на маршруте. Так, число 76891537 превращается в Сергея Есенина, который лежит в вас в спальне в стогу сена, затем на вашей кухне вам делает рентген ноги сам Вильгельм Рентген, вы выходите в коридор, там Пушкин пишет нецензурные стихи маркером на стене, а лифте вас встречает Джеки Чан и вы общаетесь с ним на китайском. Такое бы забыть теперь.


Можно переводить и тройки чисел, 441 "Чарли Чаплин со свечкой", 663 "Евстигнеев в наручниках" (видимо, украл картину), 117 "Айзек Азимов" с косой и т.д. Представьте теперь, что часть ассоциаций это ваши друзья и все они вперемешку с актерами и писателями участвуют в какой-то истории по пути к вам на работу!


We Need To Go Deeper



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


число инициалы личность действие
10 А.О. Александр Овечкин выплёвывает зуб
11 А.А. Айзек Азимов конструирует робота
15 А.П. Александр Пушкин пишет пером
19 А.Р. Александр Розенбаум поет под гитару
22 Д.Д. Дональд Дрейпер курит сигарету
23 Д.Т. Дональд Трамп строит небоскрёб
24 Д.Ч. Джеки Чан полирует доспехи
29 Д.Р. Джеффри Рихтер играет на ударных
37 Т.С. Том Сойер красит забор
38 Т.В. Тайгер Вудз играет в гольф

Примеры


число мнемоника
2437 Джеки Чан красит забор белой краской
1529 Пушкин играет на ударных
2319 Дональд Трамп поет под гитару блатные песни

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


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


До встречи в чертогах!

Подробнее..

Перевод Как воспоминания переживают ампутацию, метаморфозы, и передаются через инъекции

04.11.2020 14:09:33 | Автор: admin

Если безголовый червь может заново отрастить память, тогда где же она хранится? А если память может восстанавливаться, можно ли её перенести?

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

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

Возможно. Шведский нейробиолог Хольгер Хюден в 1960-е предположил, что память хранится в клетках нейронов, а конкретно в РНК вспомогательной молекуле, получающей инструкции от ДНК и связывающей рибосомы вместе для создания белков строительных кирпичиков жизни. Макконнел, заинтересовавшись работами Хюдена, попытался установить наличие гипотетической молекулы, которую он назвал РНК памяти, прививая части тел обученных планарий на тела необученных. Он пытался передать РНК от одного червя к другому, но столкнулся с трудностями с приживанием привитых частей. В результате он перешёл к более зрелищному типу передачи тканей проглатыванию. Планарии удачно оказались каннибалами, поэтому Макконнелу оставалось лишь размалывать обученных червей и скармливать их необученным. У планарий нет кислот и ферментов, полностью разрушающих еду, поэтому он надеялся, что некоторые РНК смогут интегрироваться в едоков.

Невероятно, но Макконнел сообщил, что поглощение обученных червей приводило к появлению новых знаний у необученных. В других экспериментах он обучал планарий проходить через лабиринты, и даже разработал технологию извлечения РКН у обученных червей, чтобы вводить её в необученных для передачи воспоминаний от одного животного к другому. В 1988 году Макконнел ушёл на пенсию, и постепенно пропал с радаров, а его работы были преданы забвению, и сохраняются где-то на полях учебников в качестве забавной поучительной истории. Многие учёные просто предположили, что беспозвоночных типа планарий обучать нельзя, и отмахнулись от работ Макконнела. Некоторые работы Макконнел публиковал в собственном журнале Worm Runners Digest [что-то типа Вестника гоночного червя, при том, что слово digest переводится и как сборник, вестник, и как переваривать пищу / прим. перев.] вместе с научно-фантастическим юмором и комиксами. В итоге особого интереса к воспроизведению его экспериментов не наблюдалось.

Тем не менее, в последнее время работы Макконнела начали активно оживать. Их подхватывают инновационные учёные например, Майкл Левин, биолог из университета Тафтса, специализирующийся на регенерации конечностей. Он воспроизвёл эксперименты по обучению планарий поиска выхода из лабиринта в модернизированном и автоматизированном варианте. Планарии тоже обрели новую популярность после того, как Левин отрезал у червя хвост и подал на срез биоэлектрический ток, в результате чего червь отрастил вместо хвоста ещё одну голову. Левин впоследствии получил за это забавное прозвище молодой Франкенштейн. Также Левин отправлял 15 кусочков червя в космос, один из которых неожиданно вернулся с двумя головами. Левин с коллегами писали: удивительно, что после повторного разрезания этого червя в воде он вновь дал фенотип с двумя головами.

Дэвид Гланцман, нейробиолог из Калифорнийского университета в Лос-Анджелесе, ведёт ещё одну многообещающую исследовательскую программу. Недавно она живо напомнила эксперименты Макконнела с памятью хотя вместо планарий Гланцман использовал аплизий, моллюсков, любимых нейробиологами из-за относительно простой нервной системы. Аплизии, которых также называют морскими зайцами это гигантские морские слизняки, выбрасывающие чернильную жидкость, и плавающие при помощи кружевных волнообразных крыльев.

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

Синаптические связи, появившиеся в результате обучения, исчезли, а на их месте выросли новые, и совершенно другие. Гланцман подумал: если память сохранилась после такого изменения в синапсах, то, возможно, память вообще хранится не в них. Эксперимент напомнил сюжет из фильма "Вечное сияние чистого разума", где бывшие любовники в попытке забыть друг друга проходят через сомнительную процедуру стирания памяти, но оказывается, что она исчезает не бесследно. Где-то в глубине сознания они хранят план: встретиться в Монтоке. Фильм как бы говорит, что память никогда не исчезает бесследно, что всегда можно вернуться назад, даже к вроде бы уже забытым людям и местам.


Несмотря на причудливо карикатурное изображение науки, связанной с памятью, фильм Вечное сияние, возможно, наткнулся на правильную гипотезу

Но если воспоминания не хранятся в синаптических связях, где они хранятся? Непопулярная гипотеза Гланцмана состоит в том, что они могут храниться в ядрах нейронов, где последовательности ДНК и РНК составляют инструкции жизненным процессам. Последовательности ДНК фиксированы и не меняются, поэтому большая часть адаптируемости организма заключена в гибких эпигенетических механизмах. Это процессы, управляющие экспрессией генов в ответ на стимулы окружающей среды иногда с участием РНК. Если представить ДНК в виде нотных тетрадей, то эпигенетические механизмы, идущие посредством РНК это импровизационные вставки и аранжировки; именно они могут заниматься обучением и запоминанием.

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

Теперь Гланцман считает, что синапсы нужны для активации памяти, но сама она кодируется в ядре нейрона посредством эпигенетических изменений. Это как пианист без рук, говорит Гланцман. Он знает, как играть Шопена, но для реализации этих воспоминаний ему нужны руки.

Ту же картину рисует работа Дугласа Блакистона, учёного из Алленовского центра открытий при университете Тафтса, изучавший память у насекомых. Ему хотелось узнать, сможет ли бабочка вспомнить что-либо из своей жизни в виде гусеницы, поэтому он подвергал их воздействию этилацетата, за которым следовал удар током. Приобретя отвращение к этилацетату, гусеницы окуклились, и после вылупления взрослых бабочек через несколько недель их проверили на наличие памяти. Удивительно, но взрослые бабочки вспомнили всё но как? Ведь гусеница, перед тем, как превратиться в бабочку, становится супом из цитоплазмы. Преображение получается катастрофическим, говорит Блакистон. Ведь мы переходим от ползающей машины к летающей. Не только тело, но и весь мозг перестраивается.

Довольно сложно изучать, какие именно процессы идут в организме во время окукливания. Однако подмножество нейронов гусеницы может сохраняться в т.н. грибовидных телах паре структур, отвечающих за обоняние, которые у многих насекомых располагаются рядом с антеннами. Иначе говоря, часть структуры сохраняется. Это не суп, говорит Блакистон. Ну, в принципе, суп, но с кусочками. Во время окукливания нейроны почти полностью удаляются, а оставшиеся полностью отрезаются от всех остальных. Синаптические связи рассасываются, а потом соединяются с другими нейронами во время преобразования в мозг бабочки. Блакистон, как и Гланцман, приводит аналогию с руками: Будто бы нейроны из небольшой группы держались за руки, а потом отпустили друг друга и начали двигаться, после чего соединились с другими нейронами в новом мозге. Если память где и хранилась, то Блакистон считает, что она хранилась в подмножестве нейронов, расположенном в грибовидных телах единственный из известных материалов, передаваемых от гусеницы к бабочке.

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

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

18.04.2021 16:05:03 | Автор: admin

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

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

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

Ну чтож, данная методика была предложена аж 1930-х годах советскими психологами. История подлинного авторства покрыта тайной, Биренбаум Г.В. в своей публикации приписывает авторство Лурии А.Р., сам же Лурия, причем гораздо позже (1964), отдал пальму первенства Л.С.Выготскому.

Методика достаточно проста в проведении. Этапы выполнения следующие:

  1. Исследуемому дается примерно следующая инструкция: Следующий тест будет на проверку Вашей памяти. Я буду называть слова или выражения, которые необходимо запомнить. Для того чтобы облегчить запоминание, на каждое слово нужно нарисовать рисунок, все равно какой, но так, чтобы он помог Вам вспомнить названное слово. Качество рисунка не имеет никакого значения, важно лишь, чтобы он помог Вам при запоминании. Слова и буквы не пишите. Также можно было бы обозначить, что рисунок должен быть именно "пиктограммой", то есть схематичным изображением, содержащим ключевые признаки понятия (на взгляд исследуемого). Иногда это нужно, что бы дифференцировать гиперпродуктивность в деятельности (в данном случае, в рисовании). Ведь если когда исследуемый, который "понял" инструкцию, приступая к заданию начинает рисовать "джоконду в гроте" на 30мин, есть повод задуматься о том, все ли хорошо с критичностью мышления. Набор стимулов обычно такой: веселый праздник, тяжелая работа, вкусный ужин, болезнь, печаль, счастье, любовь, развитие, разлука, обман, победа, подвиг, вражда, справедливость, сомнение, дружба.

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

Среди однозначных достоинств данной методики можно отметить:

  • то, что методика, представляет для исследователя широкий диапазон данных, среди которых:

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

    2) Характеристики опосредованного запоминания (что очень важно в дифференциальной диагностике расстройств памяти, знать какие виды памяти еще сохранны, а какие нарушены),

    3) Динамические характеристики мышления под "когнитивной нагрузкой" (то каким образом видоизменяются характеристики мышления с точки зрения временных характеристик, это тоже важно)

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

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

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

  • Отсутствие единого понимания и стандарта анализа и интерпретации результатов. Разговаривая с коллегами, в большинстве случаев, все сводится к мистической "парампаре", когда говорят "ну, меня так научили". Ну, а если попробовать проанализировать, все , на мой взгляд, сводится к двум условным методам:

    1) "Формально-феноменологический"(лол), отдающий почести историческим связям с клинико-психопатологическим (психиатрическим) методом, который представляет собой, по сути, попытку подгонки ответов испытуемого под известные виды нарушения мыслительных процессов, при условии, что конкретный ответ специалисту показался "неадекватным". При чем "адекватность", иногда понимается как "что то здесь мне показалось необычным/странным, я бы так не подумал", без учета индивидуальной значимости данного стимула для исследуемого и прочих важных параметров. В использовании этого "метода", все сводится к объему личного опыта специалиста и способности сопоставлять те "образы" людей имеющих психические заболевания с тем, что он видит перед собой. Однако, на мой взгляд, при всех минусах, данный метод наиболее близко сочетается с изначальными целями патопсихологического обследования, то есть выделение психологических коррелятов "нездоровой психики" и сопоставление этих данных с знакомыми нозологическими категориями.

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

Резюмируя вышесказанное, хотелось бы обозначить актуальное представление большинства думающих и практически-ориентированных специалистов что все таки с этим делать. Однозначно, есть ряд принципов, обозначающих, в некоторой степени "нормативное" выполнение этой методики. Цитируя того же Б.Г.Херсонского:

  1. Здоровые исследуемые способны подобрать образы на все понятия, представленные в стандартном наборе стимулов.

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

  3. У здоровых исследуемых высокая продуктивность запоминания в этой методике.

  4. У здоровых исследуемых минимальное количество "шоковых реакций", "отказов".

  5. Большую часть образов здоровых исследуемых можно обозначить как "атрибутивные" и "конкретные", количество индивидуально-значимых и латентных образов минимально.

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

Спасибо за внимание.

Приложение. Здесь, ради интереса и для затравки, хотелось бы представить части рисунков. На первом фото рисунки человека, имеющего Личностно-аномальный патопсихологический симптомокомплекс с выраженным истерическим радикалом, характерный демонстративный жест, вырванная часть листа - реакция на стимул "счастье"("счастья нет"). На втором рисунки человека с шизофреническим симптомокомплексом (Шизотипическим расстройством).

11
Подробнее..

Что скрывает мозг или Как появляются ложные воспоминания

13.05.2021 18:23:09 | Автор: admin

Часто мозг играет с нами очень злую шутку. Два человека пережили одно событие, но их рассказы различаются. Что это амнезия или простая ложь? Однако всё не так просто, как кажется. Воспоминания имеют свойства искажаться. Например, заменять одни события другими. В науке эту проблему называют конфабуляцией, или парамнезией, когда у человека кроме основных воспоминаний появляются ложные. В результате отличить правду от вымысла очень тяжело. Давайте в этом посте разберёмся, в чём же тут дело.


Как формируются воспоминания

Наша память это ответная реакция определённой группы нейронов на какие-то раздражители. Они формируются за счёт постоянных изменений и связей между собой. Таким образом, с самого рождения наш мозг никогда не перестаёт работать. Нейроны кочуют от образа к образу и создают определённые мысли.

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

Память делится на две категории:

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

  2. Долговременная. Отвечает за продолжительные воспоминания.

Долговременная память, в свою очередь, делится на процедурную, которая отвечает за действия, и декларативную, отвечающую за осознанный вызов информации.

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

Декларативная память делится на следующие категории:

  1. Семантическая. Оперирует значениями и понятиями. Например, что такое компьютер или мяч.

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

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

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

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

Основные причины ложной памяти

Исследованиями ложной памяти занялись недавно. Основателями этого направления были, как ни странно, гипнотизёры Пьер Жане, Рихард Крайфт-Эбинг и другие. Причём последний демонстрировал такое явление, как возрастная регрессия. Он погружал человека в гипноз, и тот воспроизводил своё детство.

Учёные сразу разделились на два лагеря. Одни считали, что гипнотизируемый действительно воспроизводит воспоминания своего детства. Однако были те, кто считал, что он просто играл какую-то роль, то есть хотел, чтобы так всё было. Именно работы Крайфта-Эбинга дали начало противоречивым дискуссиям.

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

Врачи выделяют следующие причины возникновения ложных воспоминаний:

  • черепно-мозговые травмы с корсаковским синдромом в период обострения;

  • нарушение мозгового кровообращения (ишемия, геморрагические инсульты с поражением сосудов);

  • синдром Корсакова (как результат острая нехватка витамина В1 при нездоровом образе жизни или образовании злокачественных опухолей);

  • амнестический церебральный атеросклероз (последствия дезориентация и нарушение памяти);

  • сосудистая деменция (возникает в результате единичных инфарктов головного мозга);

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

  • параноидальный психоз с бредом преследования, сопровождающийся галлюцинациями;

  • тяжёлая форма отравления алкоголем, наркотическими веществами, ядами, угарным газом;

  • абсцессы и опухоли в мозге.

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

Профессор когнитивной психологии Элизабет Лофтус проводила исследования, пытаясь выяснить пластичность человеческих воспоминаний. Она показывала ролики катастроф длительностью 530 секунд и просила заполнить отчёт. Вопрос звучал так: Как быстро двигались автомобили на видео в тот момент, когда они врезались друг в друга? Однако для отдельных групп вопрос составлялся по-разному. Например, заменяли слово врезались на соприкоснулись, ударились, разбились, стукнулись.

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

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

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

Разновидности фальшивых воспоминаний

Некоторые фальшивые воспоминания мы придумываем самостоятельно. Иногда нам их навязывают. Однако вся искажённая реальность имеет свои нюансы.

Например, псевдореминисценция (одна из разновидностей ложной памяти) отличается от контабуляции (неправдоподобные рассказы). Хотя симптоматика очень похожа. Если в первом случае человек, давно переживший травму или обиду, начинает о ней вспоминать так, как будто бы она случилась совсем недавно. Во втором случае флэшбэки украшаются придуманными историями. Эти фантазии свойственны алкоголикам, наркоманам или пациентам с диагнозом шизофрения. В результате ложную память разбивают на несколько категорий.

По причинам происхождения:

  • бредовые ложные воспоминания, которые не связаны с нарушениями психики и характеризуются навязчивыми идеями самого человека;

  • внушённые появляются после определённых подсказок или наводящих вопросов;

  • мнестические замещают определённые пробелы в памяти прошлого или настоящего;

  • онейрические возникают на почве интоксикации организма или поражения головного мозга;

  • экспансивные связаны с бредом величия (например, человек искренне верит, что он Наполеон Бонапарт).

По провоцирующим факторам:

  • спонтанная (первичная) парамнезия. Возникает сама по себе. Чаще всего идёт параллельно с деменцией, а все воспоминания выдуманные;

  • спровоцированная (вторичная) конфабуляция. Ответная реакция на нарушение памяти.

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

По содержанию:

  • амнестические человек теряет ощущение реальности и относит себя к прошлому (например, пациент может думать, что ему до сих пор 12 лет);

  • мнемонические ложные воспоминания о нынешних событиях (они могут касаться быта или профессиональной деятельности);

  • фантастические содержат многочисленные нереальные, придуманные истории, похожие на детективные истории или фантастические фильмы.

В своё время игра разума сыграла злую шутку с некоторыми знаменитостями. Мэрилин Монро утверждала, что в 7 лет её изнасиловали. Однако в разных интервью называла новые имена насильника.

Марлен Дитрих считала, что её изнасиловал учитель музыки. Полиция взялась за расследование и выяснила, что такой человек существовал в реальности и он действительно преподавал музыку. К его счастью, когда Марлен было 16, педагог проживал в другом городе.

Таким образом, врачи пытаются вначале выяснить причину и тип воспоминания и только потом начинают работать с пациентом.

Принципы в нейробиологии

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

Расположение гиппокампа в человеческом мозгеРасположение гиппокампа в человеческом мозге

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

Если испытуемый начинает искренне верить в навязчивую идею, он будет настаивать на ней в любой ситуации. То есть исходное воспоминание исчезло, а вместо него появилось новое. Этот феномен заинтересовал нейробиологов из Великобритании и Израиля (источник). С помощью фМРТ они решили выяснить, какие участки мозга задействованы в искажении памяти.

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

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

В результате правильно ответили в среднем 69 % человек (средняя и высокая степень уверенности). Когда испытуемые указывали эту степень, среди них оказались правы 80 %.

Через четыре дня эксперимент повторили. Однако теперь испытуемых сканировали на фМРТ и следили за изменениями в коре головного мозга. Вопросы повторялись, однако теперь участниками пытались манипулировать. Им разрешили опираться на общественное мнение. То есть иногда показывали, как ответили другие испытуемые.

Вопросы поделили на три группы, на которые испытуемый отвечал правильно и уверенно.

  1. Манипуляция. 80 вопросов были сфабрикованы. Ему показывали 2,5-секундный вопрос с двумя вариантами (верно/неверно), а затем фотографии людей и их ответы, а потом пустой экран и предыдущую фотографию.

  2. Отсутствие манипуляции. 25 вопросов были без мнения других людей и отмечены крестиками.

  3. Улучшение доверия. Остальные вопросы сопровождались правильными ответами других испытуемых либо комбинацией правильных и неправильных мнений.

Самой эффективной оказалась манипуляция. Около 68,3 % испытуемых под влиянием чужого мнения искажали собственную действительность. Это была не амнезия, не забывание, так как только в 15,5 % случаев при отсутствии манипуляции ответы были неверными.

В третьем эксперименте, который проводили через неделю, испытуемым задавали те же вопросы. Однако на этот раз всем сказали, что прошлые ответы были случайно сгенерированы на компьютере. На этот раз 59,2 % вернулись к первоначальному варианту. Однако 40,2 % по-прежнему отвечали так же, как и во втором тестировании. То есть устойчивый конформизм полностью заместил воспоминания испытуемых.

фМРТ позволяет фиксировать участки мозга, которые активно работают в определённый момент и поэтому нуждаются в дополнительном притоке кислорода.

Снимки показали, что активно мозг работает в следующих ситуациях:

  1. Нонконформизм. Когда человек отвечает правильно независимо от мнения других.

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

  3. Устойчивая ошибка. Воспоминания замещаются ложными.

  4. Контроль. Нет манипуляций.

Что по этому поводу думает психотерапия

В отличие от нейробиологии в психологии всё происходит немного иначе. Основным механизмом ложных воспоминаний является когнитивный диссонанс, когда мы любую информацию воспринимаем и анализируем на основании предыдущего опыта. Здесь подразумевается вся психология в целом: ценности, убеждения, мораль, характер и т. д. Проще говоря, если что-то с чем-то не сходится, человек сам себе пытается объяснить произошедшее другими словами.

Например, при исследовании сект выяснились некоторые факты. Когда обещанный апокалипсис не происходил, одна половина поняла, что их обманули. Другая половина продолжала верить в идею, несмотря на ложь.

В 1990-е годы Мавроди напрямую сказал с телеэкранов, что он всех обманул. Однако многие не хотели этого признавать. У некоторых людей продолжал висеть портрет великого комбинатора.

То есть человек не хочет и не может принять правду. Воспоминания хранятся в нашей памяти в виде определённых схем-образов. Они постоянно меняются и подгоняются под новую информацию.

Таким образом, можно описать каждый механизм ложных воспоминаний:

  1. Инфляция воображения. Человек запоминает выдуманное событие как реальное.

  2. Интерференция. Отсортированные воспоминания смешиваются в кучу, и часто люди становятся жертвами стереотипов. Например, в США первое подозрение падает на чернокожего. В начале 1990-х под влиянием американских и китайских боевиков наши соотечественники думали, что все азиаты владеют приёмами карате.

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

  4. Ложное чувство знания или некритичное восприятие информации. То есть в голове всплывает какой-то образ, но кто или что это тяжело вспомнить. Таким образом, СМИ, эзотерики и недопсихологи манипулируют сознанием. Они много раз повторяют одну и ту же информацию, пока человек не начинает в неё верить.

  5. Конформизм памяти. Изменение памяти под влиянием социума.

  6. Эмоциональное искажение. Реальные события, которые окрашиваются новыми красками под влиянием эмоций или стресса. Например, у психолога Ф. Шапиро был случай, когда клиентка искренне верила, что её изнасиловал дьявол. Однако оказалось, что её реально изнасиловали, но это был знакомый отца, надевший шапку с рогами.

Как ложные воспоминания сказываются на работе

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

Этот феномен объясняет парадокс Алле, названный в честь экономиста и Нобелевского лауреата Мориса Алле.

Испытуемых ставят перед выбором вероятность получить деньги и конечная сумма.

Ситуация

Вероятность 1

Вероятность 2

Вероятность 3

А

100 %, 1 млн.

-

-

В

10 %, 2,5 млн.

89 %, 1 млн.

1 %, ничего

С*

10 %, 5 млн.

90 %, ничего

-

D

11 %, 1 млн.

89 %, ничего.

-

* Варианты C и D предлагают, если испытуемый выбирал категорию А.

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

Пример парадокса Алле в фильме "Матрица"Пример парадокса Алле в фильме "Матрица"

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

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

Прогрессирование болезни может привести к следующим осложнениям:

  • нарушение чувствительности;

  • частичный или полный паралич;

  • развитие деменции;

  • полная потеря памяти;

  • инвалидность.

Как отличить ложные воспоминания от реальных

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

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

Сканирование мозга с помощью МРТ или УЗИ может показать физические повреждения. Однако обман не имеет материальных воплощений. Поэтому единственный способ это дифференциальная диагностика.

Для этого применяют умышленные подмены воспоминаний:

  1. Парадигма Диз Родригер Макдермот. Дают послушать запись, на которой есть несколько списков слов, связанных тематически. Если испытуемый называет слово, которого там нет, это признак конфабуляции.

  2. Задачи распознавания и воспоминания. Психотерапевт показывает картинки несколько раз. Некоторые появляются только единожды. Потом просят выбрать изображения, которые показывали тестируемому. Если он выбирает картинки, которых не было или их показывали один раз, это свидетельствует о ложных воспоминаниях.

  3. Задачи воспоминания. Необходимо рассказать знаменитые сказки. Если имеются разногласия с исходником, значит, имеется вероятность подмены воспоминаний.

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

Лечение в клиниках

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

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

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

Профилактика

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

Врачи в этом случае рекомендуют:

  • отказаться или снизить потребление алкоголя, табака;

  • следить за давлением, чтобы избежать инсульта;

  • осторожно заниматься спортом, чтобы избежать травм головы;

  • регулярно проходить обследование у невролога и лечить появившиеся болезни;

  • правильно питаться (с использованием сбалансированного количества витаминов и минералов).

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

Заключение

Ложные воспоминания это малоизученный феномен. Поэтому многие гадалки, СМИ и эзотерики пользуются этой брешью, навязывая своё мнение. Однако фальшивая память может возникнуть из-за болезни, травмы или стрессовой ситуации. Поэтому нужно следить за своим здоровьем, отказываться от прямых внушений и перепроверять источники. Полностью избавиться от искажённых фактов не получится, однако многие истинные воспоминания останутся. Берегите себя и свой рассудок.

Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

Внедрение DDR5 будет молниеносным к 2026 году новая память займет 90 рынка

16.06.2021 12:16:05 | Автор: admin
Согласно последнему отчету Yole Developments, внедрение новой памяти DDR5 будет происходить, по меркам сегмента, практически молниеносно. Аналитики компании считают, что уже к 2023 году сумма поставки модулей памяти нового поколения превысят $200 млрд, а к 2026 году новая память займет 90% мирового компьютерного и серверного рынка, вытеснив актуальный сейчас стандарт DDR4.



Такой взрывной рост DDR5 связывают с несколькими аспектами.

Первое почти все основные производители памяти закончили разработку своих продуктов и уже представили модули широкой общественности. Некоторые из них уже запустили производство и в скором времени начнется активная отгрузка памяти DDR5 всем желающим.

Второе доминирующее положение DDR5 относительно DDR4. Согласно спецификациям, которые были разработаны ассоциацией твердотельных технологий JEDEC, стартовая частота новой памяти составляет 4800 Mhz сейчас это верхнее значение для DDR4. В перспективе нормальной рабочей частотой модуля на широком старте технологии DDR5 будет 5500-6500 Mhz, вплоть до 8400 Mhz в стоке.

Повсеместное внедрение DDR5 начнется после выпуска производителями соответствующих материнских плат и процессоров, которые будут способны работать с новым стандартом оборудования.

Спецификации JEDEC были опубликованы чуть менее, чем год назад 14 июля 2020 года. Согласно тогдашнему анонсу JEDEC, спецификация DDR5, по сравнению с DDR4, поддерживает вдвое больший реальный канал, вплоть до 6,4 Гбит/c у DDR5 против имеющихся 3,2 Гбит/c у DDR4.

Одним из лидеров данного направления является корейская компания SK Hynix один из старейших и крупнейших производителей чипов оперативной памяти в мире. Еще в конце 2020 года корейцы представили первые тестовые модули памяти публике и уже тогда характеристики впечатляли. Тогда новая память показала скорость передачи данных в 4,8-5,6 Гбит/c на контакт. Это 1,8 раза больше, чем базовые показатели памяти предыдущего поколения DDR4. Вся эта скорость сопровождается снижением базового напряжения на планке памяти с 1,2 V до 1,1 V.

В новой памяти все так же будет 288 пинов, то есть в это плане DDR5 является преемником стандарта DDR4, но сама распиновка по модулю будет другой.



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

Но только серверным сегментом все не ограничится. Скорее всего, массовый старт DDR5 произойдет в рамках одного года как в бизнес, так и в потребительском сегменте. Еще при выходе последних пользовательских процессоров Ryzen 5ххх, представители AMD заявляли, что следующая линейка процессоров Ryzen 6xxx под кодовым названием Rembrandt на 6 нм архитектуре Zen 3 Refresh выйдет с поддержкой памяти DDR5. В крайнем случае, это произойдет чуть позже, после выхода архитектуры Zen 4.

Учитывая то, что как минимум в России процессоры Ryzen последний год стабильно доминируют в топах продаж (первые 4 из 5 строчек на Яндекс.Маркете по популярности почти всегда заняты процессорами AMD), можно ожидать и массового перехода пользователей как на Ryzen 6xxx, так и на новую память.



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

Intel тоже не собирается сдавать позиции. Ранее планировалось, что процессоры синих с поддержкой DDR5 появятся на рынке в 2021 году вместе с семейством Tiger Lake-H, однако релиз был перенесен на год: первые камни, способные работать с DDR5, будут выпущены на архитектуре Alder Lake в 2022 году.

Важны и объемы новых модулей. Минимальный размер планки нового стандарта 16 Gb, что должно удовлетворить спрос на все больший и больший объем памяти не только в серверном, но и пользовательском сегменте. Сейчас именно 16 Gb является приемлемым минимумом для домашних станций или мощных ноутбуков. Максимальный объем планки памяти DDR5 согласно спецификации JEDEC, будет составлять 256 Gb.

Апгрейд серверной инфраструктуры процесс не самый быстрый. Однако на фоне роста потребности в мощностях дата-центров и развития облачных технологий, прогноз аналитиков Yole Developments может оказаться правдивым. Считается, что рынок ЦОДов сейчас находится на пике своего развития. Главная тройка игроков этого рынка в лице Amazon, Google и Microsoft активно вкладывает деньги в развитие своих облачных технологий, не отстают от них и частные дата-центры, которые предоставляют бизнесу услуги хостинга.

В 2021 году наметился и новый тренд дата-центры от компании Nvidia для осуществления облачных вычислений. Согласно плану Nvidia, их центры обработки данных будут включать графические процессоры, блоки обработки данных (DPU) и процессоры, причем каждая линейка продуктов будет получать обновленную архитектуру каждые два года. На рынке наблюдается рост популярности новых процессоров и уход от старых лошадок Intel к новому оборудованию, в том числе и появление доли рынка у новых AMD EPYC. Всему этому хозяйству потребуется новая быстрая память.

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



На правах рекламы


Наша компания предлагает серверы в аренду с современными процессорами от Intel и AMD под самые разнообразные задачи. Максимальная конфигурация 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe. Создайте свой собственный тариф самостоятельно в пару кликов!

Подписывайтесь на наш чат в Telegram.

Подробнее..

Как работает память в Python

03.12.2020 12:07:50 | Автор: admin

Что такое память и зачем она нужна?

Ни одна компьютерная программа не может работать без данных. А данные, чтобы программа имела к ним доступ, должны располагаться в оперативной памяти вашего компьютера. Но что такое оперативная память на самом деле? Когда произносишь это словосочетание, многие сразу представляют железную плашку, вставленную в материнскую плату, на которой написано что-то типа 16Gb DDR4 2666MHz. И они, разумеется, правы это действительно физический блок оперативной памяти, в котором, в итоге, все данные и оказываются. Но прежде, чем стать доступной внутри вашей программы, на память (как и на всё остальное аппаратное обеспечение) накладывается куча абстракций.

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

Во-вторых, внутри операционной системы, есть абстракция, называемая процесс, которая, в том числе, предназначена для изоляции и упрощения работы с ресурсами отдельными программами. Именно процесс делает вид, что независимо от количества запущенных программ и объема установленной в компьютер оперативной памяти, вашей программе доступно 4 ГБ RAM (на 32-разрядных системах) или сильно больше (на 64-разрядных).

Долгое время, компьютерным программам, хватало этого набора абстракций. Вам нужны данные, вы хотите с ними поработать? Всё просто:

  1. Попросите у процесса (ОС) выделить вам немного (одну или несколько страниц) оперативной памяти.

  2. Поработайте с ней.

  3. Верните ее в операционную систему.

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

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

Механизм памяти в Python

Python это язык с управляемой памятью. Причем для управления ею он использует несколько механизмов. Я постараюсь коротко осветить основные из них. Для зануд сразу подчеркну, что под Pythonом я понимаю конкретную реализацию CPython, а не какие-то другие версии, в которых всё может работать по-другому :)

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

Оставшаяся свободная виртуальная память может использоваться для хранения информации об объектах Pythonа. Для управления этой памятью в CPython используется специальный механизм, который называется аллокатор. Он используется каждый раз, когда вам нужно создать новый объект.

Обычно мы в своих программах не оперируем большими объектами. Большая часть наших данных это числа, строки и т.п., они занимают не такой уж большой объем в расчёте на одно значение. Но зато мы создаем их достаточно часто. И это приводило бы к проблемам, если бы Python абсолютно все такие вызовы транслировал в операционную систему. Системный вызов на выделение памяти штука трудозатратная, зачастую связанная с переходом в контекст ядра операционной системы и т.п. Поэтому одна из главных задач аллокатора Python оптимизация количества системных вызовов.

Ремарка. Для больших объектов (больше 512 байт) Python выделяет память напрямую у ОС. Обычно таких объектов не очень много в рамках программы, и создаются они нечасто. Поэтому накладные расходы на создание таких объектов напрямую в RAM не так высоки.

Как же устроен аллокатор внутри? Он состоит из частей трёх видов:

  • Арена большой непрерывный кусок памяти (обычно 256 килобайт), содержит несколько страниц виртуальной памяти операционной системы.

  • Пул одна страница виртуальной памяти (обычно 4 килобайта).

  • Блок маленький кусочек памяти, используемый для хранения одного объекта.

Давайте поговорим о них подробнее. Когда Pythonу нужно расположить какой-то объект в оперативной памяти он ищет подходящую арену. Если такой нету, он запрашивает новую арену у операционной системы. Что значит подходящую? Арены организованы в двусвязный список и отсортированы от самой заполненной к самой свободной. Для добавления нового объекта выбирается САМАЯ ЗАПОЛНЕННАЯ арена. Почему такая странная логика? Это связано с политикой освобождения памяти. Арены единственное место, в котором происходит запрос и освобождение памяти в Python. Если какая-то арена полностью освобождается от объектов, она возвращается назад операционной системе и память освобождается. Таким образом, чем компактнее живут объекты в рамках арен, тем ниже общее потребление оперативной памяти программой.

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

Каждый пул может быть в одном из трех состояний used, full и empty. Full означает, что пул полностью занят и не может принять новые объекты. Empty что пул полностью пустой и может быть использован для хранения новых объектов (при этом пустой пул может быть использован для хранения объектов любого размера). Used это пул, который используется для хранения объектов, но при этом еще не заполнен полностью.

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

Внутри пула живут блоки. Каждый блок предназначен для хранения одного объекта. В целях унификации размеры блоков фиксированы. Они могут быть размером 8, 16, 24, 32 . 512 байт. Если Вам нужно 44 байта для хранения объекта, то он будет расположен в блоке на 48 байт. Каждый пул содержит список свободных и занятых блоков (на самом деле, есть еще untouched-блоки, в которых никогда не жили данные, но по сценариям использования они похожи на free-блоки, поэтому не будем на них останавливаться подробно). Когда вы хотите разместить новый объект, берется первый свободный блок, и объект располагается в нем. Когда объект удаляется, его блок помещается в список свободных.

Время жизни объекта и причем тут GIL

Поговорив о том, как происходит выделение и освобождение памяти в Python, стоит отдельно поговорить о том, а как язык управляет временем жизни. Для этого в Python реализовано два механизма:

  • Счетчик ссылок.

  • Механизм сборки мусора.

Каждый объект в Python это, в первую очередь, объект, унаследованный от базового класса PyObject. Этот самый PyObject содержит всего два поля: ob_refcnt количество ссылок, и ob_type указатель на другой объект, тип данного объекта.

Нас интересует первое поле ob_refcnt. Это счетчик ссылок на конкретный экземпляр данного класса. Каждый раз, когда мы сохраняем объект в новой переменной, массиве и т.п. (то есть когда мы сохраняем где-то ссылку на объект), мы увеличиваем счетчик ссылок на единицу. Каждый раз, когда мы перестаем использовать переменную, удаляем объект из массива и т.п. (то есть когда ссылка на объект удаляется), мы уменьшаем счетчик ссылок на единицу. Когда он доходит до 0 объект больше никем не используется и Python его удаляет (в том числе помещая блок, в котором располагался объект, в список пустых).

К сожалению, счетчик ссылок подвержен проблемам в многопоточной среде. Состояния гонки могут приводит к некорректности обновления этого счетчика из разных потоков. Чтобы этого избежать CPython использует GIL Global Interpreter Lock. Каждый раз, когда происходит работа с памятью, GIL как глобальная блокировка препятствует выполнению этих действий одновременно из двух потоков. Он гарантирует, что сначала отработает один, потом другой.

Второй механизм очистки памяти это сборщик мусора (garbage collector), основанный на идее поколений. Зачем он нам нужен, если есть счетчик ссылок? Дело в том, что счетчик ссылок не позволяет отслеживать ситуации с кольцевыми зависимостями, когда объект A содержит ссылку на B, а B на A. В таком случае, даже если никто больше не ссылается на объекты A и B, их счетчик всё равно никогда не станет равным нулю и они никогда не удалятся через механизм счетчика ссылок. Для борьбы с такими зависимостями и появился второй механизм (как модуль gc, начиная с версии Python 1.5).

Работает он следующим образом: GC отслеживает объекты (объекты-контейнеры, которые могут содержать ссылки на другие объекты) и смотрит, доступны ли они из основного кода на Python. Если нет, то сборщик их удаляет. Если да оставляет.

В отличие от счетчика ссылок, механизм сборки мусора не работает постоянно. Он запускается от случая к случаю на основе эвристик. GC разделяет объекты на три поколения. Каждый новый объект начинает свой путь с первого поколения. Если объект переживает раунд сборки мусора, он переходит к более старому поколению. В младших поколениях сборка происходит чаще, чем в старших. Эта практика является стандартной для такого рода сборщиков мусора и снижает частоту и объем очищаемых данных. Идея простая: чем дольше живет объект, тем с большей вероятностью он проживет еще. То есть новые объекты удаляются гораздо чаще, чем те, которые уже просуществовали достаточно долго.

Каждое поколение имеет индивидуальный счётчик и порог. Счетчик хранит количество созданных минус количество удаленных объектов с момента последнего сбора. Каждый раз, когда вы создаете новый объект, Python проверяет, не превысил ли счетчик поколения пороговое значение. Если это так, Python инициирует процесс сборки мусора.

Итоги

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

Что осталось за рамками статьи?

Мы не поговорили еще о многих вещах:

Оставлю эти вопросы заделом на следующие статьи :)

Подробнее..

Представляем Owlcat Mono Profiler для Unity

04.12.2020 12:06:11 | Автор: admin

Официальная часть мероприятия

Добрый день. Я работаю программистом в компании Owlcat Games, которая выпустила одну из самых успешных российских компьютерных RPG Pathfinder: Kingmaker и сейчас работает над её продолжением, Pathfinder: Wrath of the Righteous. В ходе портирования первой игры нашей студии на консоли, мы столкнулись с проблемой поиска утечек памяти. Штатные инструменты движка Unity и целевых платформ оказались по разным причинам не слишком удобны для борьбы с утечками, и поэтому мы решили написать свой инструмент, о котором я и расскажу ниже.

Owlcat Mono Profiler предназначен для исследования использования памяти Mono в играх на движке Unity. Он доступен всем желающим в виде собранных бинарных файлов (под Windows) и исходного кода на Github. В отличие от встроенного профайлера Unity, а также пакета Memory Profiler, он не требует снятия снимков состояния памяти, а производит постоянный мониторинг Mono-кучи, что позволяет выявлять не только утечки, но и пики аллокаций, и избыточные повторяющиеся аллокации. По сравнению с платформо-специфичными инструментами, такими как Memory Analyzer для PS4, он корректно отображает события, происходящие с памятью, управляемой сборщиком мусора.

На этом покончим с формальностями, и перейдём к cool story.

Фатальный недостаток всех прочих инструментов

Началось всё с того, что мы выяснили, что память в нашей игре подтекает. На PC это не было проблемой, поскольку течёт она не то чтобы водопадом, да и памяти даже на слабых машинах в наше время будет поболее, чем у PlayStation 4 или XBox One. Плюс, Windows, когда кончается память, начинает скидывать лишнее в своп, а консоли - просто убивают твоё приложение, и иди, разбирайся, где накосячил.

Встроенные инструменты Unity пришлось отмести практически сразу: в Unity 2018.4 они с нашей игрой фактически не работали (снятие одного снимка состояния памяти могло занять 8+ часов, а на PlayStation мне ни разу не удалось его дождаться в принципе). В 2019.x стало сильно лучше, но перейти на неё мы не могли - смена мажорной версии движка в Unity ломает слишком многое.

В комплект инструментов для PlayStation 4 входит совершенно потрясающий Memory Analyzer. Серьёзно, это один из лучших инструментов для анализа потребление памяти, какие я только видел (хотя и не лишённый некоторых мелких недостатков). Уже одна только возможность помечать любые функции с подходящей сигнатурой как alloc/realloc/free делает его невероятно полезным для любой игры, использующей собственные аллокаторы, memory pool'ы и т.п.

Но есть проблема. Дело в том, что Mono, в том виде, в каком его используют в Юнити, содержит в себе видавший виды сборщик мусора BoehmGC. Это проверенный временем проект, но к сожалению он написан таким образом, что во многом представляет из себя помесь чёрного ящика и чёрной дыры, в которую можно что-то засунуть, но нельзя достать. В частности, он не предоставляет никакого способа узнать о моменте удаления объекта.

Почему сложно написать профайлер памяти для Unity

А теперь давайте сделаем шаг назад и посмотрим, как вообще работает сборщик мусора. Я до поступления в команду Owlcat Games работал, в основном, с C++, поэтому чисто теоретически про сборку мусора что-то знал, но на практике с ней не сталкивался, и имел, как потом выяснилось, в корне неверные представления о том, как этот зверь устроен. Если вы в этой области собаку съели, то дальнейшие мои объяснения вам покажутся чересчур упрощёнными и может быть даже в чём-то ошибочными, но надеюсь они подойдут для объяснения той простой мысли, что написать профайлер памяти для языка с GC - это вам не два байта переслать.

Итак, что делает сборщик мусора? Он берёт себе у системы кусок памяти И никогда его не возвращает (во всяком случае, именно так ведёт себя BoehmGC на PS4). В этом куске памяти, он по запросу пользователя выделяет маленькие кусочки под конкретные объекты - там тоже не всё так просто, но это не важно. Важно что факт аллокации памяти отследить очень просто - есть несколько функций, которые прямо так и называются, gc_malloc_что_нибудь. А вот факт деаллокации памяти отследить слегка сложнее. Это в C++ кто-то должен сказать объекту "умри". Тут же про него просто "забывают", то есть, перестают на него ссылаться. Конечно, сборщик мусора не следит за всеми записями в память, чтобы заметить, что последняя ссылка на объект протухла. Вместо этого, раз-в-сколько-то времени (на самом деле - обычно когда для очередной аллокации не хватает памяти) он говорит "так, всем стоять, сейчас я разберусь, кто тут живой, а кто мёртвый", и отправляется шерстить всю выделенную памяти в поисках ссылок на объекты. В конце этого процесса, если есть какие-то объекты, на которые он ссылок не нашёл, их-то он и удаляет, а точнее - помечает их память как свободную и доступную для выделения.

Всё выше сказанное плюс особенности BoehmGC означает две вещи: во-первых, факт смерти объекта неплохо так (порой на десятки секунд) удалён от момента потери последней ссылки на него, и во-вторых, хрен нам, а не событие "объект удалён". Сколько я не пялился в код BoehmGC, так мне и не удалось в моём скудоумии прозреть, где же, собственно, тот волшебный момент, куда можно было бы вставить какую-то закладку, которая бы сообщила наружу, что память, которую занимал объект X, более ему не принадлежит, то есть, он мёртв. Впрочем, даже если бы я его нашёл, вряд ли бы мне это помогло, потому что по условиям задачи менять код BoehmGC у нас возможности не было - на PlayStation его просто невозможно скомпилировать самому, да и на остальных платформах это то ещё приключение (потому что компилировать придётся не только сам BoehmGC, но и Mono).

Бьёмся головой в стену.

Следующей мыслью, пришедшей мне в голову, было добавить всем вообще аллоцируемым объектам финалайзеры. Финалайзер - это такая функция, которая как раз обязательно вызывается, когда объект удаляется, вроде деструктора в C++. Но и на этом пути меня не ждала победа: да, в рамках il2cpp, имеющего открытый исходный код, я мог вставить свой костыль, но это нельзя было делать оголтело, ведь у объекта УЖЕ мог быть финалайзер, а значит надо было его как-то извлекать, запоминать и подменять своим Наверное, если копать в этом направлении дольше, может что-то и получилось бы, но сама идея менять исходный код кусков Unity мне не нравилась, не говоря уже о том, что это решение не заработало бы на PC, где мы не используем il2cpp во имя лёгкости моддинга игры.

Дальше я отправился в Гугл, искать, а как вообще люди профилируют память в Mono? Ответ нашёлся на первой странице Гугла, в официальной документации. Вот только в версии Mono, используемой Unity, описанный там встроенный профайлер был благополучно выпилен. Кроме того, поиск так же показал, что почти все средства анализа логов, снятых при помощи встроенного профайлера, заброшены, устарели или недописаны, так что особой надежды на них не было, даже если бы мне удалось как-то вернуть эту функциональность (например, пересобрав Mono для Unity - что, правда, не сработало бы на PlayStation!).

Мы пойдём другим путём!

Однако, бродя по дебрям сети, я наткнулся на Heap-Prof, давно неактуальный и заброшенный профайлер памяти для Mono, из которого, однако, мне удалось почерпнуть интересную идею. Идея заключалась в том, чтобы тупо повторять всю работу, которую делает реальный сборщик мусора:

  • Регистрировать аллокации, когда они происходят, создавать событие "объект создан".

  • Ловить события сборки мусора (типа "сборка мусора завершена") и в этот момент проверять, какие из наших объектов всё ещё живы. Для всех, кто не жив - создавать событие "объект удалён".

Довольно быстро, я перенёс и осовременил код heap-prof в dll, которую подгрузил плагином к Юнити, достал при помощи GetProcAddress функции Mono, позволяющие всё это проделать, и И игра упала. В функции mono_object_is_alive. Попытки понять, от чего такое происходит, и как вообще эта функция работает, привели меня к письму одного из авторов Mono, Massimiliano Mantione, опубликованному в почтовой рассылке Mono-dev в 2009 году. Во сием послании, он в точности описывал мои проблемы с heap-prof, и в частности писал, "The problem is that this is not reliable: "mono_object_is_alive" was not meant to be a public function. And in fact sometimes the heap snapshots are wrong (or the profiler crashes).". К сожалению, в качестве решения он предлагал улучшить API для профайлера в НОВОМ сборщике мусора, SGen, на который Unity в своей версии Mono так никогда и не перешли

Тогда суровые русские программисты (в лице меня) глубоко задумались, и решили: хорошо, на mono_object_is_alive для определения живости объекта полагаться нельзя. Но как-то же сам сборщик мусора знает, жив у него объект, или нет?! Надо просто скопировать его подход, и тогда мы должны будем получить тот же результат (и без падений).

Тут надо сделать очередное небольшое отступление, и рассказать о том, как рассуждал Шульц как сборщик мусора, собственно, ищет ссылки на объекты. Опять же, в ОЧЕНЬ упрощённом виде. Ищет он их тупо - берёт память какого-нибудь объекта, и прямо по ней идёт и смотрит - вот это значение похоже на адрес в куче? Есть у нас объект с таким адресом вообще? Если на оба вопроса "да" - то это ссылка на объект, и этот объект смело можно помечать как живой. Острые умом подметят, что если эдак пройтись по всей куче итеративно несколько раз - не останется ни одного объекта (например, если в куче всего два объекта, A и B, A ссылается на B, то мы сначала удалим A - потому что на него никто не ссылается, а на следующей итерации удалим и B, потому что теперь на него тоже никто не ссылается). Для этого у сборщика мусора есть корневые объекты, которые удалять обычным образом нельзя, и вот от них уже идут ссылки на всех остальных.

BoehmGC, к сожалению, представляет собой упомянутую чёрную дыру - зарегистрировать в нём корневые объекты можно, а вот спросить у него, какие корни зарегистрированы - никак нельзя. Но Mono решает эту проблему за нас, и вызывает коллбэки каждый раз, когда регистрирует или удаляет корневые объекты. А я-то уж было приготовился лезть в переменную с адресами корневых объектов по отступу в памяти Ладно, прячем шашку в штаны и продолжаем наши экзерсисы.

"Я вас настиг! Какой я молодец"

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

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

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

Помимо прочих достоинств, наш профайлер умеет профайлить релизные билды игры, и даже без необходимости заранее встраивать плагин в сборку (можно и чужие игры профайлить, если у вас возникло желание помочь авторам). Достаточно только иметь PDB файл от нужной версии Unity Player: он нужен для того, чтобы достать адреса некоторых функций, которые нужно перехватить, в частности, для того, чтобы вовремя запустить профайлер, а также для получения событий об окончании кадра (события для удобства группируются по кадрам, а не по времени). К сожалению, Unity не предоставляет даже графическим плагинам возможности узнать о конце кадра другим способом, так что пришлось взять в руки Microsoft Detours и лезть в недра.

Есть у выбранного подхода и недостатки. Профайлер довольно заметно замедляет игру, процентов на 20 в обычных кадрах, а в момент сборки мусора может подвесить её даже на 5-10 секунд (в зависимости от количества объектов). Также, для профайлера требуется довольно много памяти на той машине, где, собственно, запущена игра: на ~2 миллиона аллокаций нужно ~200Mb памяти. Для базы клиента/UI, может потребоваться до нескольких гигабайт памяти, что представляется несущественным ограничением, так как в крайнем случае, можно запускать клиент/UI профайлера на другой машине (он соединяется с самим профайлером по сети).

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

Текущая версия профайлера имеет интерфейс, написанный на Qt5, и теоретически должна быть относительно легко портируема на другие операционные системы (это в наших планах, но не в приоритете, так как основная часть разработчиков игр, всё-таки, работает под операционной системой Microsoft). В качестве БД для хранения событий, используется SQLite с временными (частично находящимися в памяти) базами, но есть идеи о переходе на memory mapped database для ещё большей скорости. Я обдумывал возможность интеграции профайлера в саму Unity, но это представляется не идеальным решением, так как иногда хочется попрофайлить игру в редакторе, не собирая билдов (когда пробуешь разные варианты исправлений, например), а в этом случае, профайлер, встроенный в редактор и потому также производящий аллокации managed памяти - очень плохая идея.

Дальнейшие планы

Профайлер открыт для свободного использования всеми желающими. Я надеюсь, что он окажется полезным кому-то кроме нашей компании. Несомненно, найдутся в нём и ошибки, которые надо исправлять, и возможные улучшения интерфейса и функционала. Жду ваших предложений (и пулл-риквестов!) на Гитхабе. Я надеюсь, что эта программа станет первой частью нашего инструментария для отладки игр на Unity, Owlcat Grooming Toolkit. В отдалённых планах есть так же CPU профайлер с открытым исходным кодом, который мог бы стать бесплатной альтернативой dotTrace, которую можно было бы раздавать игрокам для диагностики без зазрения совести.

Подробнее..

Вспомнить всё. Разбираемся в полупроводниковой памяти

29.12.2020 18:11:47 | Автор: admin

Когда я писал в начале года статью Кто есть кто в мировой микроэлектронике, меня удивило, что в десятке самых больших полупроводниковых компаний пять занимаются производством памяти, в том числе две только производством памяти. Общий объем мирового рынка полупроводниковой памяти оценивается в 110 миллиардов долларов и является постоянной головной болью участников и инвесторов, потому что, несмотря на долгосрочный рост вместе со всей индустрией микроэлектроники, локально рынок памяти очень сильно лихорадит 130 миллиардов в 2017 году, 163 в 2018, 110 в 2019 и 110 же ожидается по итогам 2020 года.

Топ-10 мировых микроэлектронных компаний, производители памяти выделены красным.Топ-10 мировых микроэлектронных компаний, производители памяти выделены красным.

Объем рынка памяти близок к трети всей микроэлектроники, а в десятке самых больших компаний памятью занимается половина. Так чем же полупроводниковая память такая особенная? Давайте разбираться.

Особую важность памяти придает то, что ее всегда нужно много. Я бы даже сказал, что ее всегда нужно больше, чем есть. Билл Гейтс, которого вы наверняка сейчас вспомнили, на самом деле никогда ничего не говорил про 640 Кб, примерно как Мария-Антуанетта ничего не говорила про пирожные. Впрочем, в начале восьмидесятых 640 КБ были огромной цифрой. И что с того, что памяти нужно много? спросите вы. Очень просто большие тиражи позволяют разработчикам концентрироваться на одном продукте и оптимизировать не только дизайн, но и технологию производства. Сейчас в большинстве случаев чипы памяти производятся на фабриках, специально предназначенных для чипов памяти и принадлежащих производителям памяти. Это принципиальное отличие от всех остальных типов микросхем, где пути разработчиков и производителей давным-давно разошлись, и бал правят контрактные фабрики типа TSMC.

Начнем, собственно, с определения и классификации. Точнее, с классификаций, потому что типов памяти очень много, и различных применений тоже. Классическое разделение памяти по применению на кэш-память, оперативную память и память хранения данных. Оно же примерно соответствует делению на статическую (SRAM), динамическую память (DRAM) и диски (HDD и SSD).

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

Диаграмма иерархии памяти в вычислительных системах, с относительными объемами памяти и задержками обращения.Диаграмма иерархии памяти в вычислительных системах, с относительными объемами памяти и задержками обращения.

Кэш-память

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

Электрическая схема 6T-ячейки SRAMЭлектрическая схема 6T-ячейки SRAM

Шесть транзисторов это очень много, особенно в сравнении с DRAM или флэш-памятью, где для хранения одного бита информации требуется два, а то и всего один элемент. Тем не менее, скорость работы сделала свое дело, и в большинстве современных цифровых микросхем статическая память занимает десятки процентов площади. Этот факт, кстати, сделал ячейку SRAM точкой опоры в определении проектных норм производства чипов: когда маркетинговые цифры те самые пресловутые 28, 7 или 5 нм отвязались от физических размеров элементов на кристалле, улучшение плотности упаковки стали считать как соотношение площади ячейки SRAM на старом и новом техпроцессах. Если в новой технологии ячейка стала в два раза меньше, значит проектные нормы уменьшились в корень из двух раз.

Разные варианты топологии шеститранзисторной ячейки статической памяти. Источник G. Apostolidis et. al., Design and Simulation of 6T SRAM Cell Architectures in 32nm Technology, Journal of Engineering Science and Technology Review, 2016Разные варианты топологии шеститранзисторной ячейки статической памяти. Источник G. Apostolidis et. al., Design and Simulation of 6T SRAM Cell Architectures in 32nm Technology, Journal of Engineering Science and Technology Review, 2016

Отдельные чипы SRAM были популярны в составе многокристалльных микропроцессоров, таких как девайсы, построенные на базе серии Am2900 или советской 581 серии. При этом, как только появилась возможность поместить достаточно транзисторов на один чип, кэш-память стали размещать на том же кристалле, что и вычислитель, чтобы сэкономить мощность и увеличив скорость работы, избавившись от медленных и громоздких соединений между чипами. В современных микропроцессорах на одном кристалле помещается многоуровневый набор блоков кэш-памяти объемом в несколько Мегабайт. Это, кстати, привело к тому, что рынок SRAM как отдельного продукта практически перестал существовать: его объем оценивается всего в 420 миллионов долларов, то есть в 0.3% от всего рынка полупроводниковой памяти, и продолжает сокращаться. Последние из остающихся могикан чипы для тяжелых условий эксплуатации, вроде космоса, высокотемпературных промышленных установок или медицинской техники, где нельзя свободно применять обычные коммерческие микросхемы и где из-за этого микроэлектронный прогресс несколько отстает. Есть некоторые перспективы роста в автомобильной электронике и в интернете вещей, где для постоянно включенных устройств не играет роли главный недостаток SRAM неспособность хранить информацию после отключения питания. Только хранить, а не обрабатывать SRAM может с минимальным энергопотреблением, так что это может быть интересным вариантов. Впрочем, в этой конкретной нише, кроме флэш-памяти, есть еще активно развивающиеся новые виды памяти, такие как MRAM, так что перспективы на самом деле весьма туманны, а производители один за одним уходят из стагнирующего сегмента, что позволило Cypress получить больше половины рынка повторюсь, крошечного по мировым меркам.

Оперативная память и динамическая память

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

Схемы ячейки динамической и статической памятиСхемы ячейки динамической и статической памяти

Намного более простая ячейка позволяет существенно увеличить количество памяти на кристалле. Уже самый первый серийный кристалл DRAM (Intel 1103) в 1970 году содержал 1024 бита, а современные чипы умещают уже 16 Гигабит! Это стало возможным благодаря постоянному прогрессу технологии производства, а именно разнообразным улучшениям конструкции интегрального конденсатора. Если в самых первых чипах использовалась просто МОП-емкость, крайне похожая по конструкции на транзистор, в современных чипах DRAM конденсатор для экономии площади располагается не горизонтально, а вертикально, под или над транзистором.

Условная схема прогресса технологии производства DRAM.Условная схема прогресса технологии производства DRAM.

То, что технологический прогресс в области DRAM сосредоточен на конденсаторе, и обусловило обособление отрасли и появление компаний, специализирующихся на разработке памяти и больше ни на чем.

Небольшой исторический экскурс, про Intel

Компания Intel была основана в 1968 году с прицелом на рынок памяти. Основатели фирмы считали, что относительно новые тогда интегральные схемы имеют потенциал вытеснить с рынка вычислительных машин память на магнитных сердечниках. Первыми продуктами Intel были чипы биполярной статической памяти, почти сразу же за ними последовала серия крайне успешных чипов DRAM, а вот заказы на разработку микропроцессоров очень долго рассматривались как что-то временное и побочное до середины восьмидесятых, когда серьезная конкуренция со стороны японских производителей DRAM, таких как Toshiba, вынудила компанию уйти с рынка памяти.

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

Общий объем мирового рынка DRAM оценивается в 60-80 миллиардов долларов и составляет чуть больше половины мирового рынка памяти. Оставшуюся часть почти целиком занимает NAND Flash, а на долю всего остального разнообразия приходится не более трех процентов рынка. Производство чипов DRAM держится на трех китах корейских Samsung и SK Hynix, а также американской компании Micron. Все три в пятерке крупнейших полупроводниковых компаний мира, причем если Samsung чем только не занимается, то Micron и SK Hynix производят только памяти, DRAM и Flash. Три гиганта занимают без малого 95% рынка, а остатки рынка почти полностью разделены между несколькими тайваньскими компаниями.

Основные рыночные ниши это потребительская электроника, включая смартфоны (40-50%), а также персональные компьютеры (15-20% ), серверное и телекоммуникационное оборудование (20-25%). Самые большие перспективы роста при этом ожидаются в автомобильном секторе, благодаря разного рода автопилотам и другим системам помощи водителю, а также в вычислениях, связанных с искусственным интеллектом.

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

Внутренности корпуса графического ускорителя AMD Fiji. Центральный кристалл собственно вычислитель, по обеим сторонам упакованные в несколько слоев чипы HBM DRAM.Внутренности корпуса графического ускорителя AMD Fiji. Центральный кристалл собственно вычислитель, по обеим сторонам упакованные в несколько слоев чипы HBM DRAM.

Впрочем, и планки памяти тоже никуда не денутся в обозримом будущем, и спрос на них стабильно растет стараниями не только геймеров, но и производителей серверов. Объем рынка модулей памяти составляет приблизительно 16 миллиардов долларов, и он выглядит как Гулливер в окружении лилипутов рыночная доля Kingston Technology превышает 80%, против 2-3% у ближайших конкурентов. При этом сами чипы Kingston закупают у двух из трех больших производителей Micron и SK Hynix. Samsung не привлекается, видимо, в силу того, что большинство их чипов DRAM предназначено для мобильных телефонов.

Еще один небольшой исторический экскурс, про Kingston

Kingston американская компания, основанная в 1987 году, стала одним из пионеров внедрения SIMM-модулей как удобной альтернативы прямому поверхностному монтажу микросхем памяти. Быстро развиваясь на фоне роста рынка персональных компьютеров, Kingston стали единорогом с миллиардной капитализацией уже к 1995 году, и с тех пор выросли еще на порядок, увеличив долю на рынке модулей DRAM c 25% до 80% и расширившись на производство других продуктов, таких как SSD, где Kingston тоже является мировым лидером, правда с более скромными 26% мирового рынка против 8% и 6% у ближайших конкурентов.

Модуль оперативной памяти Kingston. Обратите внимание на плотность упаковки чипов на плате.Модуль оперативной памяти Kingston. Обратите внимание на плотность упаковки чипов на плате.

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

А что же японцы, правившие бал в восьмидесятых и вытеснившие с рынка DRAM Intel? В 1999 году профильные подразделения Hitachi и NEC объединились в компанию Elpida, которая позже поглотила DRAM-бизнес Mitshibishi. В двухтысячных компания активно развивалась, много вкладывала в перспективные производства и была поставщиком, например, для Apple.Но финансовый кризис 2009 года очень сильно подкосил Elpida, и в 2012 году она была вынуждена подать на банкротство, после чего была куплена Micron.

На этой печальной ноте давайте заканчивать с DRAM и переходить к flash-памяти, где все еще есть по крайней мере одна успешная японская компания.

Флэш-память и системы хранения данных

Главный недостаток как SRAM, так и DRAM то, что информация в них пропадает в случае, если им отключить питание. Но, сами понимаете, никогда не отключать питание довольно затруднительно, поэтому всю историю вычислительной техники использовались какие-нибудь системы для постоянного хранения данных начиная от перфокарт. Большую часть времени в качестве систем постоянного хранения данных использовались магнитные носители лента или жесткий диск. Жесткие диски сложные электромеханические системы, которые прошли огромный путь от первого образца IBM размером с небольшой холодильник, до 2.5-дюймовых HDD для ноутбуков. Тем не менее, прогресс в микроэлектронной технологии был быстрее, и сейчас мы с вами наблюдаем процесс практически полного замещения жестких дисков полупроводниковыми SSD. Последним годом денежного роста для рынка HDD был 2012, и сейчас он составляет уже не более трети от рынка флэш-памяти.

Разные поколения жестких дисков.Разные поколения жестких дисков.

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

Структура ячейки флэш-памятиСтруктура ячейки флэш-памяти

Чтение из флэш-памяти происходит следующим образом: на сток транзистора подается напряжение, после чего измеряется ток через транзистор. Если ток есть, значит на одном из двух затворов есть напряжение, если тока нет на обоих затворах ноль.

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

Сравнение архитектур NOR Flash и NAND FlashСравнение архитектур NOR Flash и NAND Flash

Чтение из NOR Flash происходит ровно так, как описано выше, и позволяет удобно добраться до любого интересующего нас куска памяти. Чтение из NAND Flash несколько более занятно: для того, чтобы узнать значение интересующего нас бита в последовательно включенном стеке, нужно открыть управляющие затворы всех остальных транзисторов тогда на состояние выхода будет влиять только интересующий нас бит. Согласитесь, заряжать-разряжать множество управляющих затворов ради того, чтобы узнать значение только одного бита это как-то чересчур расточительно? Особенно с учетом того, что мы должны открыть управляющие затворы всех транзисторов не только в интересующем нас стеке, но и во всех соседних стеках, подключенных к тем же word line. Именно поэтому на практике NAND Flash читается не побитно, а целыми страницами. Это может показаться неудобным, ведь мы, по сути, делаем нашу память не совсем random-access.

Любые рассуждения на тему того, что лучше NAND Flash или NOR Flash, неизбежно натыкаются на мнение рынка, сделавшего однозначный выбор: объем рынка NAND 40-60 миллиардов долларов, а NOR около четырех. Почему же побеждает менее удобная память? Дело на самом деле не в удобстве или неудобстве, а в целевых приложениях и в стоимости. NOR Flash удобнее и быстрее читается, но очень медленно записывается, зато ячейка NAND Flash в два с лишним раза меньше, что, разумеется, критично в ситуации, когда вам нужно БОЛЬШЕ ПАМЯТИ.

Кроме того, если немного подумать над главным недостатком NAND Flash чтением только большими кусками, то в обычной вычислительной системе чтение из долгосрочной памяти в любом случае происходит большими кусками чтобы оптимизировать работу кэш-памяти и минимизировать число кэш-промахов. То есть этот недостаток на самом деле и не недостаток вовсе. Так что по факту единственное настоящее преимущество NOR Flash быстрота чтения, и ее основные применения так раз те, где требуется быстрое чтение, но не нужна частая и быстрая запись. Например, прошивки разнообразных embedded девайсов, где NOR Flash активно заменяет другие виды EEPROM.

Небольшое отступление: PROM

И, раз уж я упомянул EEPROM, нелишне обсудить и экстремальный случай когда память только читается, но не перезаписывается то есть Read-Only Memory или ROM. Такая память гораздо чаще используется в промышленных применениях и для разнообразных прошивок. Такая память может быть запрограммирована на этапе производства с помощью наличия или отсутствия металлических соединений (или транзисторов, как это было сделано в Intel 8086. Но что, если раз-другой записать память все-таки нужно, причем уже после того, как чип произведен? На этот случай существует довольно много разновидностей PROM (P programmable), довольно часто встраиваемых на кристалл вычислительной системы, например, микроконтроллера, но продолжающих активно использоваться и в качестве отдельных чипов.

Самый простой вариант это однократно программируемая память типа Antifuse, она же память на пережигаемых перемычках. Идея очень проста: у нас есть структура (транзистор или резистор), которая может быть необратимо разрушена, превратившись в короткое замыкание или разрыв цепи. Чтение такой памяти выглядит как проверка на наличие замыкания или разрыва, а запись возможна только один раз, потому что изменение структуры необратимо.

Внешний вид памяти на пережигаемых перемычкахВнешний вид памяти на пережигаемых перемычках

В случае, если может быть нужно записывать память несколько раз, например изредка обновлять прошивку, в дело вступают разные варианты EPROM (E erasable) и EEPROM (EE electrically erasable). Технологически они базируются на транзисторах с плавающим затвором и являются примитивной разновидностью флэш-памяти. Сейчас под термином EEPROM обычно подразумевают NOR Flash c возможностью побайтной записи и удаления данных.

NAND Flash

Что же касается NAND Flash, то ее стоимость за бит уже давно снизилась настолько, что этот вид памяти стремительно завоевывает рынок памяти для хранения информации, один за одним забивая гвозди в крышку гроба HDD и, например, дав на возможность иметь много памяти в крошечных мобильных телефонах. Ключевые производители чипов NAND Flash Samsung (33% и почти половина накопителей для телефонов), Kioxia (бывшая Toshiba, 20% рынка), Western Digital (14%), SK Hynix (11%), Micron (10%), Intel (8%).

Из этого списка, впрочем, надо исключить Intel, которые недавно объявили о переходе своей доли в совместном с Micron производстве к последним и об уходе с рынка флэш-памяти. Еще один интересный игрок Western Digital, один из гигантов HDD, ныне стремительно переориентирующийся на твердотельные диски и ставший для этго уникальным зверем fabless-производителем памяти. WD выкупили для этого больше трети производственных мощностей Kioxia, которые делают одни и те же чипы для себя и для клиента. Еще одно неожиданное последствие переориентации WD они стали одним из наиболее заметных участников коммьюнити RISC-V, активно внедряя эту систему команд в свои контроллеры накопителей.

И в завершение рассказа про NAND Flash, надо непременно рассказать о произошедшей в последние годы технологической революции. Флэш-память, как и обычная микроэлектроника, уже уперлась в технологический предел миниатюризации транзисторов, и если в вычислительных системах можно хотя попробовать отыграть что-то за счет архитектуры, то в памяти плотность упаковки это главное и единственное, что по-настоящему волнует. Поэтому, пока разговоры о переходе обычных КМОП-микросхем в третье измерение все еще остаются разговорами, 3D NAND уже четыре года как массово присутствует на рынке, позволяя разместить на кристалле в десятки, а то и в сотни раз больше ячеек памяти, чем обычное планарное решение.

Схематичный разрез двухмерной и трехмерной NAND Flash памятиСхематичный разрез двухмерной и трехмерной NAND Flash памяти

На электрической схеме выше транзисторы размещены последовательно, сверху вниз, тогда как в планарном варианте изготовления они расположены на плоскости, занимая ценную площадь на кристалле. Однако простая и монотонная структура позволила реализовать самое логичное, что можно сделать сквозной вертикальный канал транзистора, выглядящий примерно так же, как и электрическая схема (и показанный на схеме справ желтым, идущим сквозь зеленые затворы). Разумеется, оно только звучит логично и просто, а на практике создание глубокого отверстия с вертикальными стенками это одна из самых сложных операций, возможных в микроэлектронной технологии. Тем не менее, инженерные задачи были решены, и сейчас такие этажерки, как на рисунке выше, включают в себя уже до 128 транзисторов в серийно производимых чипах и до 192 слоев в девайсах, ожидаемых через год-два. Проектные нормы производства современной флэш-памяти примерно соответствуют уровню 15-20 нм, так что такая плотность упаковки это эквивалент норм 0.1-0.2 нм! В обычном КМОП повторить этот фокус в точности не удастся, но свежие исследования по GAAFET предполагают упаковку нескольких горизонтальных каналов друг поверх друга. Samsung рассчитывают таким образом выйти на уровень 1 нм, а то и чуть меньше.

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

Новые типы энергонезависимой памяти

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

Три наиболее зрелых технологии такого рода это MRAM (магнитная RAM), FRAM (ферроэлектрическая или сегнетоэлектрическая RAM) и PCM (phase-change memory).

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

Разные варианты MRAM используют несколько физических эффектов, позволяющих манипулировать спином магнитных материалов и посредством него, на их электрические свойства. По сути, мы говорим о физической реализации концепции мемристора резистора, сопротивление которого зависит от его предыдущего состояния. Первые серийные чипы MRAM появились еще в 2004, но проиграли технологическую войну флэш-памяти. Тем не менее, технология продолжает активно развиваться, подогреваемая тем, что у MRAM потенциально на несколько порядков большее количество циклов перезаписи, чем у флэш, а значит ее можно использовать как гибрид кэша и памяти долгосрочного хранения. Считается, что такое сочетание может быть востребовано в малопотребляющих микросхемах интернета вещей, и сейчас встраиваемые блоки MRAM предлагают такие именитые фабрики, как Samsung и GlobalFoundries.

PCM класс памяти, основанной на изменении фазового состояния некоторых веществ, например с кристаллического в аморфное, под действием внешних факторов типа высокого напряжения или кратковременного нагрева (обычно проводимого при помощи пропускания большого тока через запоминающий элемент). Потенциальные преимущества PCM примерно такие же, как у MRAM быстрое чтение и большое количество циклов перезаписи, что в теории может позволить заменить даже все три типа памяти одним унифицированным решением. На практике же изначальное внедрение PCM обернулось грандиозным провалом: в 2012 году Micron с помпой представили серийную линейку для применения в мобильных телефонах, однако уже к 2014 году все эти продукты были отозваны с рынка. Их вторая попытка стала более успешной совместно с Intel в 2017 году была представлена память 3D Xpoint и линейка SSD Optane (Intel) X100 (Micron). Продажи пока что невелики, но отзывы потребителей довольно хорошие. Посмотрим, выдержит ли новая технология проверку времени и сможет ли действительно потеснить традиционные SSD на основе NAND Flash.

Традиционная невеселая рубрика А что в России?

И, конечно же, мой рассказ был бы неполон без упоминания о том, что происходит в России. К сожалению, хорошего можно рассказать немного. Производство памяти это именно что производство, а с микроэлектронными заводами у россии довольно печальная ситуация. Соответственно, речи о собственных чипах DRAM и flash-памяти нет и в обозримом будущем не предвидится. А что есть?

Во-первых, есть какое-то количество микросхем SRAM. Самый технологически продвинутый продукт микросхема 1663РУ1, представляющая собой 16 Мбит статической памяти по нормам 90 нм, производства завода Микрон. Кроме этого чипа, есть и другие, в основном предназначенные для аэрокосмических применений.

Кроме статической памяти, есть еще одно производство Крокус-наноэлектроника, производящая MRAM. Расположенная в Москве фабрика КНЭ единственная в России, умеющая работать с пластинами диаметром 300 мм. Правда, Крокус-нано не обладает полным циклом производства, а может делать только металлизацию и совмещенные с ней магнитные слои, формирующие ячейку MRAM. Транзисторная часть при этом должна быть изготовлена на другой фабрике (иностранной, потому что в России с пластинами 300 мм работать некому). На сайте КНЭ заявлена доступность микросхем объемом от 1 до 4 Мбит, скоростью считывания 35 нс и записи 35/90/120/150 нс. Еще немного света на функционирование и происхождение этих чипов проливают также заявленные в качестве продуктов на официальном сайте сложнофункциональные блоки MRAM, совместимые с техпроцессами китайской фабрики SMIC и израильской TowerJazz. Вероятно, именно эти производители являются технологическими партнерами и при производстве собственных чипов КНЭ.

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

Подробнее..

Искусственный интеллект для обывателя

15.01.2021 12:16:15 | Автор: admin

Сразу стоит сделать замечание: я, тот самый обыватель, которому интересно и непонятно. Моя профессиональная деятельность, связана с конструированием оборудования для нефтегазового комплекса. К нейронным сетям или машинному обучению, отношения не имею. Мой предел, научно-популярные статьи и ролики популяризаторов. Но в этом есть и преимущество. Я могу посмотреть на проблему другими глазами, и попытаться разобраться, в понятной для обывателя форме.

Ниже, описание того, как выглядит Искусственный Интеллект, для такого обывателя как я, выросшего на научной фантастике. Хотелось бы понять, насколько я близок, к правильному представлению специалистов.

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

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

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

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

Следовательно, интеллект это показатель эффективности развития памяти, за счёт самостоятельного обучения. И является признаком памяти.

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

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

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

Чтобы представить, как устроена структура памяти, обратимся к примеру сенсорной системы, содержащей сенсоры, объединенные в единое сенсорное пространство. Сенсоры, в данном случае, могут принимать значение, ноль, или единица. Для каждого сенсора, с частотой на которой способна работать вся система, записывается его текущая активность. Таким образом, формируется запись о активности сенсора за всё время его работы.

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

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

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

Для моделирования процесса забывания, предположим, что воздействие одного и того же события на сенсорное пространство, со временем изменяется. Маска, сохраняя свою актуальность, так же должна изменяться вслед за событием. Такое изменение масок, возможно благодаря тому, что активность маски близкая к единице, говорит о схожести воздействия на сенсорное пространство, и хранящегося в маске представления о событии. Это позволяет оценить возможность дополнения списка отображающего суммарную активность каждого сенсора в выбранном интервале времени, текущим значением сенсоров. Так с определенной инерцией, свойственной системе, происходит плавное изменение ранее сохраненной информации. Инерция такой системы, будет зависеть от количества накопленных примеров активности сенсорного пространства. Чем больше таких примеров, тем система устойчивее к изменениям.

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

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

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

P.S. Текст писался под ролик. Отработанный способ по основной работе - если можешь сделать презентацию по теме, значит что-то понимаешь. И обратное, хочешь понять - сделай презентацию. Художественные качества у ролика так себе, но для наглядности нормально.

Подробнее..

Обывательская реализация Искусственного Интеллекта

29.01.2021 16:08:57 | Автор: admin

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

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

Но прежде, необходимо оговорить ряд важных моментов:

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

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

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

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

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

Теперь можно перейти к самой модели. Класс Harmoshka.

Блок схема описывающая модель

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

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

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

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

Такой подход к формированию масок позволяет хранить в маске информацию о целом событии. Например, если сенсоры зафиксировали попугая, в маске сохраняется полученная информация о попугае. И в дальнейшем при поступлении новой информации, она оценивается исходя из того, насколько вновь поступившая информация похожа на попугая. Чем точнее совпадение, тем выше активность маски.

В свою очередь, группы масок могут формировать более сложное представление о событии, опираясь на информацию хранящуюся в масках. Предположим, что удав похож на 1 удава, 0,5 слоника, 0,125 мартышки и 0,0208 попугая. Теперь, если есть группа масок, содержащая маски представляющие удава, слоника, мартышку и попугая, можно с определённой долей уверенности, исходя из активность этих масок, предполагать наличие перед нами удава. Если для такого состояния группы масок, нет результирующей маски, она формируется, фиксируя состояние для группы. Если маска есть, то она дообучается.

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

В качестве заключения можно сказать следующие:

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

Подробнее..

Раскрашиваем таможенную статистику. Или сколько и каких микросхем ввозят в Россию? (3)

28.05.2021 16:10:14 | Автор: admin

Продолжим анализировать какие иностранные микросхемы используются в России на основании таможенной статистики. Как мы это делаем ? Из данных ФТС выбираем записи в которых указан номинал ввезенной микросхемы, и используя внутреннюю базу данных дополняем эту запись основными параметрами микросхемы, начиная от производителя, разрядностями, диапазонами питания и заканчивая типом корпуса, упаковки и так далее. В данной части посмотрим микросхемы памяти.
Часть 1. Общий анализ
Часть 2. АЦП/ЦАП и Микроконтроллеры

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

Все микросхемы мы можем разделить на энергонезависимые EERPOM, FLASH, FRAM, т.е. сохраняют информацию при отсутствии питания, энергозависимые динамические ОЗУ (DRAM) и статические (SRAM) и остальные, например конфигурационные Flash, используемые для хранения "прошивок" FPGA и NVSRAM - это статическая ОЗУ, но с батарейкой, за счет которой она превращается в энергонезависимую. Это очень древнее решение, но до сих пор кто то их использует, хотя на смену уже пришли FRAM.

Как и ожидалось самыми массовыми являются микросхемы энергонезависимой памяти (суммарно более 116К), вслед за ними идет динамическая память (13К). Остальная память в очень малых объемах. Для начала рассмотрим поподробней динамическую память.

Динамическая память

Наибольшей популярностью пользуются микросхем DDR3. Но и предыдущие поколения потребляются достаточно массово.

Лидером среди производителей является Micron (к сожалению не наш). Самой популярной микросхемой является MT41K128М - DDR3-1600, Объемом 2 Гбит от Micron, по цене примерно 3$.

Энергонезависимая память

Для энергонезависимой памяти все привыкли к USB флешкам или карточкам памяти с объемом измеряемым десятками Гигабайт.

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

Безоговорочным лидером в EERPOM является STM.

На рынке Flash памяти представлено гораздо больше производителей, а вот рынок FRAM практически весь принадлежит Fujitsu.

У EEPROM памяти наиболее популярный интерфейс I2C

Но в Flash памяти I2C вообще не встречается, и основным является SPI.

Какой корпус наиболее популярный? Восьми выводные корпуса, SO-8 и его аналоги.

Так что если вы захотите сделать микросхему энергонезависимой памяти, то что бы она была максимально массовой ее объемом должен быть ~1 Мбит, с интерфейсом I2C (ну или SPI, мне он больше нравится) и в 8-ми выводном корпусе. Одна проблема, ее стоимость должна быть около 0,4$ за штуку. Самая популярная микросхема EEPROM - это M24512 от ST с объемом 512 Кбит и ценой 0,3$. И ST обещает выпускать ее еще не менее 10 лет.

Подробнее..

Transparent variadic или безысходность стека

26.10.2020 12:15:22 | Автор: admin

Уже пол-шестого утра Ты знаешь, где сейчас твой указатель стека?
Аноним.

Акт I. Сцена I. Интродукция

Вечер. На сервере лениво поскрипывали регистры, то заполняясь данными, то отдавая их обратно. Указатель на стек замедлялся, перемещаясь все медленнее и медленнее, пока не замер совсем. Блин жесткого диска совершил свой последний на сегодня оборот и замер. Сборка проекта завершилась. Долгие 2.5 секунды компиляции завершились и новая версия увидела мир в первый раз.

Однако страдания сервера на этом не закончились. Завершив первую сборку сервер запустил вторую, за ней третью, затем четвертую и пятую. Казалось, что разным версиям не будет конца. Но что поделать, если целевые машины имеют разный набор библиотек; кому-то нужен openssl версией не выше 0.9.8, кому-то непременно нужна MySQL вместо MariaDB. Мир разнообразен и не все готовы менять то, что уже устоялось и работает долгое время.

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

Займет ли автоматизация процесса неделю? Месяц? Год? Нужно ли расширить счетчик потраченных часов в Jira до 64 бит? Кто знает.

Акт I. Сцена II. Основы линковки

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

Создадим отдельную библиотеку, к которой будем линковаться статически, но которая будет динамически искать подходящую нам библиотеку.

Для начала создадим ряд сокращений, чтобы отделить зерна от плевел и агнцев от козлищ:

/* \brief Определим, что мы находимся под Linux */#if defined(__gnu_linux__)#   define OS_GLX#endif/* \brief Определим, что мы находимся под Windows */#if defined(_WIN32) || defined(_WIN64) || \    defined(__WIN32__) || defined(__TOS_WIN__) || defined(__WINDOWS__)#   define OS_WIN#endif

Затем создадим абстракции типов, чтобы впасть в благостное неведение:

#if defined(OS_GLX)/*! \brief Тип для динамической библиотеки */typedef void * library_t;#elif defined(OS_WIN)/*! \brief Тип для динамической библиотеки */typedef HMODULE library_t;#endif

Объявим помощников наших, делающих работу за нас:

/*! \brief Загружает динамическую библиотеку * \param[in] name Имя файла * \return Хэндлер библиотеки */library_t library_load(const char * name) {#if defined(OS_GLX)    return dlopen(name, RTLD_LAZY);#elif defined(OS_WIN)    LPWSTR wname = _stringa2w(name);    library_t lib = LoadLibrary(wname);    free(wname);    return lib;#endif}/*! \brief Получает указатель на функцию из динамической библиотеки * \param[in] lib Библиотека * \param[in] name Имя функции * \return Указатель на функцию */void * library_func(library_t lib, const char * name) {#if defined(OS_GLX)    return dlsym(lib, name);#elif defined(OS_WIN)    return GetProcAddress(lib, name);#endif}/*! \brief Освобождает ресурсы динамической библиотеки * \param[in] lib Библиотека */void library_free(library_t lib) {#if defined(OS_GLX)    dlclose(lib);#elif defined(OS_WIN)    FreeLibrary(lib);#endif}

Теперь же, забыв, где находимся мы можем приступить к загрузке библиотек, дабы одарили они нас функциями их. Для сего необходимо выполнить три действия:

  1. Открыть библиотеку при помощи library_load

  2. Найти нужные функции при помощи library_func

  3. Закрыть библиотеку при помощи library_free

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

Акт I. Сцена III. Избрание

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

$ nm -D /usr/lib/x86_64-linux-gnu/libmysqlclient.so | grep ' T '0000000000033920 T get_tty_password000000000006fa00 T handle_options0000000000061860 T my_init000000000006d830 T my_load_defaults00000000000351e0 T my_make_scrambled_password00000000000220d0 T mysql_affected_rows0000000000025cd0 T mysql_autocommit0000000000020cf0 T mysql_change_user0000000000022160 T mysql_character_set_name0000000000032e10 T mysql_client_find_plugin0000000000032590 T mysql_client_register_plugin000000000002b580 T mysql_close0000000000025c90 T mysql_commit00000000000215c0 T mysql_data_seek0000000000020bb0 T mysql_debug...

Описание их быта и достатка мы получим, преобразовав манускрипт с объявлениями. Коснемся его компиляторной десницей, дабы избавиться от недомолвок препроцессорных:

gcc -E mysql/mysql.h > mysql_generate.h
[...]const char * mysql_stat(MYSQL *mysql);const char * mysql_get_server_info(MYSQL *mysql);const char * mysql_get_client_info(void);unsigned long mysql_get_client_version(void);const char * mysql_get_host_info(MYSQL *mysql);unsigned long mysql_get_server_version(MYSQL *mysql);[...]

Акт I. Сцена IV. Новое обиталище

Подготовим фундамент для нового обиталища заблудших душ:

/* \brief Экземпляр библиотеки */static library_t library = NULL;/* \brief Инициализатор модуля */void _init(void) __attribute__((constructor));void _init(void) {     library = library_load(MYSQL_FILENAME_SO);     if (!library)         // Грусть и уныние         exit(EXIT_FAILURE);}/*! \brief Деинициализатор модуля */void _free(void) __attribute__((destructor));void _free(void) {    if (library)        library_free(library);}

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

const char * mysql_stat(MYSQL * mysql) {    return (const char (*)(MYSQL * mysql))library_func(library, "mysql_stat")(mysql); }const char * mysql_get_server_info(MYSQL * mysql) {         return (const char (*)(MYSQL * mysql))library_func(library, "mysql_get_server_info")(mysql);}

Жизнь была размеренной и спокойной, пока мы не встретили ужас глубин.

Акт II. Сцена I. Вариативная

int mysql_optionsv(MYSQL * mysql,                   enum mysql_option,                   const void * arg,                   ...);

Сей монстр назывался вариативной функций и не знала история более мерзкого создания, ибо никто не мог сказать сколько голов у данного зверя. Кому-то он показывал одну, кому-то две, а кто-то лицезрел зверя по всём его мерзостном обличие.

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

Даже SWIG, рыцарь из легенд, не cмог побороть монстра, а лишь усыпил его, дав время тому залечить раны да набраться сил.

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

int foo(int argc, ...) {    return argc; }
gcc -S file.c
_Z3fooiz:        pushq   %rbp        movq    %rsp, %rbp        subq    $72, %rsp        movl    %edi, -180(%rbp)        movq    %rsi, -168(%rbp)        movq    %rdx, -160(%rbp)        movq    %rcx, -152(%rbp)        movq    %r8, -144(%rbp)        movq    %r9, -136(%rbp)        testb   %al, %al        je      .L4        movaps  %xmm0, -128(%rbp)        movaps  %xmm1, -112(%rbp)        movaps  %xmm2, -96(%rbp)        movaps  %xmm3, -80(%rbp)        movaps  %xmm4, -64(%rbp)        movaps  %xmm5, -48(%rbp)        movaps  %xmm6, -32(%rbp)        movaps  %xmm7, -16(%rbp).L4:        movl    -180(%rbp), %eax        leave        ret

Ужасен монстр сей. Ведь каждый раз он кладет из регистров данные в стек, чтобы нечестивые дети его - va_start, va_arg, да va_end могли лишь перебирая костяшки стека получать оттуда то, что им не принадлежало.

Акт II. Сцена II. Стековая

Рассмотрим, что же являет собой стек. Стек есть суть массив, в котором данные лежат подряд, однако работа с ними ведется по принципу LIFO. Стек может принять много данных, в отличие от регистров, что быстры подобно стрелам, но малочисленны.

Аргументы функций согласно соглашению о вызове передаются через регистры, а затем через стек (на x86_64), если размера регистров не хватает, чтобы удержать все данные при передаче. Вариативная же функция перекладывает всё содержимое регистров в стек, чтобы все данные, отправленные в функцию кроме регистров находились также и на стеке, давая возможность реализовать va_arg(list, type) как

mov rax, [list.rsp]add list.rsp, sizeof(type)

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

Так как же нам заставить машину передать эти данные в следующую функцию? Ведь мы не можем написать вот так:

int foo(int argc, ...) {    return bar(argc, ...); }

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

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

Акт II. Сцена III. Бездна-void

Мы видели, что происходит внутри такой функции. Но что происходит снаружи?

int foo(int argc, ...) {    return argc;}void bar(void) {    foo(1, 2, 3, "string");}
gcc -S file.c
.LC0:        .string "string"_Z3barv:        pushq   %rbp        movq    %rsp, %rbp        movl    $.LC0, %ecx        movl    $3, %edx        movl    $2, %esi        movl    $1, %edi        movl    $0, %eax        call    _Z3fooiz

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

Если в нашей реализации proxy-функции мы возьмем из стека достаточное количество байт и передадим их в симулируемую функцию обычным образом, то она не заметит подмены:

int foo(int argc, ...) {    return realfoo(argc, <байты из стека>); }

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

int foo(int argc, ...) {    long long int * rsp = &argc;    return realfoo(argc, *(rsp + 1), *(rsp + 2), <...>);}

Однако такой способ неудобен и неочевиден и нас проклянут все последующие поколения, кто будет читать сей опус. Поэтому мы будем использовать стандартизированные инструменты доступа к стеку - те самые функции va:

#include <stdio.h>#include <stdarg.h>void params(const char * fmt, ...) {    va_list list;    va_start(list, fmt);    vprintf(fmt, list);    va_end(list);}void wrapper(const char * fmt, ...) {    va_list list;    va_start(list, fmt);        void * v1 = va_arg(list, void *);    void * v2 = va_arg(list, void *);    void * v3 = va_arg(list, void *);    void * v4 = va_arg(list, void *);    void * v5 = va_arg(list, void *);    void * v6 = va_arg(list, void *);    void * v7 = va_arg(list, void *);    void * v8 = va_arg(list, void *);    void * v9 = va_arg(list, void *);        params(fmt, v1, v2, v3, v4, v5, v6, v7, v8, v9);        va_end(list); }int main(void) {    params("%d %s %lld\n", 5, "sss", (long long int) 32);    wrapper("%d %s %lld\n", 5, "sss", (long long int) 32);    return 0;}

Но следует обратить внимание, что вставив va_arg сразу в params мы отдадим порядок их вызова на откуп хитрому компилятору, что сломает порядок чтения.

Этот способ работает как на x86_64, так и на x86 архитектурах. Если по каким-то причинам нам не будет хватать 9 параметров мы всегда сможем поместить v-переменные в массив нужного нам размера и воспользоваться циклом. Чтение из стека "лишних" переменных ни на что не влияет, поскольку в этой же функции стек был уже заполнен "мусорными" регистрами при входе в эту функцию.

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

После вызова функции wrapper переменные забираются из стека, и снова кладутся в регистры, после чего вызывается функция params, которая не замечая, что переменные были преобразованы в void * выведет их так же, как и в первый раз.

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

Акт II. Сцена IV. Эпилог

Блин диска повернулся еще раз и остановился. Собрав проект один раз, сервер остановился, тяжело вздохнул всеми кулерами, и задумался о том, понадобится ли он еще когда-нибудь или это была последняя сборка в его жизни. Нужен ли он еще или в коде достигнут идеал? Можно ли вообще достигнуть идеала?

Диод на его панели погас и сборочный сервер уснул, так и не придя к однозначному ответу.

Подробнее..

Охота за убегающей памятью в Go на этапе разработки

22.09.2020 16:11:47 | Автор: admin

Проблемы

Убегание памяти в кучу влечет за собой следующие потенциально решаемые проблемы:

  1. Снижение производительности из за расходов на выделение памяти

  2. Снижение производительности из-за расходов на сборку мусора

  3. Появление ошибкиOut of Memory , если скорость появления мусора превышает скорость его уборки

Указанные проблемы могут решаться несколькими способами:

  1. Увеличением объема вычислительных ресурсов (память, процессор)

  2. Тонкой настройкой механизма сборщика мусора

  3. Минимизацией числа побегов в кучу

В данной статье я рассмотрю только третий путь.

С чистого листа

Если все еще впереди, но уже поставлена цель добиться производительности, близкой к максимально возможной, то нужно знать в лицо главных замедлителей в плане работы с памятью. Встречаем основные конструкции, число которых следует минимизировать: make , new , map ,go . Есть и более скрытые способы учинить побег, их я рассмотрю уже в процессе "охоты", а пока - основные способы профилактики.

Вместо постоянного выделения памяти через make и new следует максимально переиспользовать уже ранее выделенное. Одним из способов добиться такого переиспользования является sync.Pool(), на habr этот способ был рассмотрен здесь. Чтобы поменьше быть КО замечу, что использовать элементы типа []byte ,как это делается в статье по сылке, не стоит - при каждом возврате будет дополнительно выделяется 32 байта памяти (для go1.14.6 windows/amd64). Мелочь, но неприятно; если стремиться к совершенству, лучше переиспользовать интерфейсы или указатели, а еще лучше использовать butebuferpool от @valyala.

С map история такая. Интенсивное использование map ведет к интенсивному выделению памяти, но это не единственная проблема. Если приложению нужен огромный кэш, и этот кэш реализован через map, то можем получить то, из-за чего Discord перешел на Rust. Т.е. на постоянное, в рамках уборки мусора, сканирование гигантского скопления указателей будут тратится ресурсы, и по каким-то метрикам система выйдет за рамки требований. Для решения этой проблемы великий @valyala сделал fastcache, там же можно найти и ссылки на альтернативные решения, и, опять же у него, наряду с другими советами по повышению производительности, можно найти достаточно детальный разбор, как использовать slices вместо maps.

С оператором go просто - все обработку нужно развести по фиксированному набору горутин и каналов. Запускать горутину на каждый запрос можно, но относительно дорого и плохо предсказуемо по расходу памяти.

Имеет смысл сделать такое замечание, и я его сделаю - предотвращение массовых "побегов" имеет свою цену, в частности, упомянутый fastcache далеко не "идиоматичен". Нам, например, идеально подходит кэш []byte->[]byteно, не факт, что это так для всех. Возможно, дешевле будет усилить аппаратную часть, а то и вообще ничего не делать - все зависит от требований к системе, те самые "rps", "95th percentile latency" и т.д. Возможно, и даже скорее всего, все будет работать и в "коробочном" варианте, да еще и с запасом. Так что будет вполне разумным сделать прототип "горячих путей" обработки и погонять на скорость. Т.е. заняться той самой "охотой".

Охота

Пойдем опять "на поклон" к Александру Валялкину и выполним:

git clone https://github.com/valyala/fasthttp

Чтобы начать охоту не обязательно добавлять в тесты на производительность некий профилирующий код, как это предлагается, например, здесь, просто наберем:

go test -bench=PServerGet10Req -benchmem -memprofile netmem.out

и

go test -bench=kServerGet10Req -benchmem  -memprofile fastmem.out

Первая команда запустит тесты для стандартного http.Server, вторая - для fasthttp.Server. По выводу мы заметим, что fasthttp примерно в десять раз быстрее и все операции проходят в zero-allocation режиме. Но это не все, теперь у нас есть профили netmem.out и fastmem.out. Смотреть их можно по разному, для быстрой оценки ситуации я предпочитаю такой способ:

echo top | go tool pprof netmem.out

Что дает разбивку потребления памяти по 10 самым "прожорливым" функциям:

Showing top 10 nodes out of 53      flat  flat%   sum%        cum   cum%  698.15MB 21.85% 21.85%   710.15MB 22.22%  net/textproto.(*Reader).ReadMIMEHeader  466.13MB 14.59% 36.43%   466.13MB 14.59%  net/http.Header.Clone  423.07MB 13.24% 49.67%  1738.32MB 54.39%  net/http.(*conn).readRequest  384.12MB 12.02% 61.69%   384.12MB 12.02%  net/textproto.MIMEHeader.Set  299.07MB  9.36% 71.05%  1186.24MB 37.12%  net/http.readRequest  137.02MB  4.29% 75.33%   137.02MB  4.29%  bufio.NewReaderSize  134.02MB  4.19% 79.53%   134.02MB  4.19%  net/url.parse  122.45MB  3.83% 83.36%   122.45MB  3.83%  bufio.NewWriterSize (inline)   99.51MB  3.11% 86.47%   133.01MB  4.16%  context.WithCancel   87.11MB  2.73% 89.20%    87.11MB  2.73%  github.com/andybalholm/brotli.(*h5).Initialize

Можно получить подробную схему убеганий в графическом виде через:

go tool pprof -svg -output netmem.svg netmem.out

После выполнения команды в netmem.svg будет картинка типа такой (фрагмент):

Есть и более крутой способ:

go tool pprof -http=:8088 netmem.out

Здесь, по идее, должен запуститься браузер, и этот браузер с какой-то вероятностью покажет текст: Could not execute dot; may need to install graphviz.Те, кто работает на Unix-подобных системах и так знают, что делать, пользователям же Windows могу посоветовать поставить chocolatey а затем, с правами администратора, вызвать cinst graphviz. После этого можно начать по всякому крутить профиль. Моя любимая крутилка вызывается через VIEW/Source:

Здесь, кроме очевидных убеганий через make, мы также видим большие потери на преобразование []byteв string. Операции со строками весьма затратны и, если "идем на рекорд", их следует избегать и работать исключительно с []byte. Еще одним способом "убежать", с которым встречался, является возврат адреса локальной переменной, т.е. return &localVar . Есть и другие варианты, но углубляться не буду - ваш личный профиль их покажет.

Несмотря на сокрушительное превосходство fasthttp в этом тесте, именно эту библиотеку я не рекомендовал бы использовать. Или рекомендовал бы с осторожностью - с fasthttp у вас не будет поддержки HTTP/2.0, поддержка websockets отполирована не с такой тщательностью, как сам fasthttp (на момент, когда я эту тему изучал), ну и, главное, на реальной нагрузке может и не получиться десятикратного выигрыша. У нас в одном тесте на железе типа c5.4xlarge получалось 250.000 RPS для fasthttp.Server против 190.000 RPS для http.Server . Выигрышь есть, но вам точно надо больше, чем 190.000 RPS? Тут очень многое зависит от профиля нагрузки, от того, что с этой нагрузкой делается дальше, ну и от требований к системе, само собой.

Последним моментом, которого хочу коснуться, является сериализация данных. Построив прототип "горячего пути" для своего приложения и погоняв тесты есть шанс увидеть, что самой прожорливой частью являются преобразования из json/yaml в объекты программы и обратно, и на фоне этой прожорливости меркнет все остальное, что бы вы не пытались написать. Выбор решения тут будет весьма нетривиален и его хоть сколько-нибудь полное описание выходит за рамки статьи, поэтому ограничусь кратким результатом наших, далеко не репрезентативных, тестов.

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

Результаты чтения "все поля большого объекта":

Avro         23394 ns/op    11257 B/opDyno_Untyped  6437 ns/op      808 B/opDyno_Typed    3776 ns/op        0 B/opFlat          1132 ns/op        0 B/opJson         87331 ns/op    14145 B/op

Результаты чтения "несколько полей большого объекта":

Avro         19311 ns/op    11257 B/opDyno_Typed    62.2 ns/op        0 B/opFlat          19.8 ns/op        0 B/opJson         83824 ns/op    11073 B/op 

Последний сценарий является для нас основным, ради которого все и затевалось, и здесь ускорение, по сравнению с тем же linkedin/goavro - весьма и весьма существенное.

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

Заключение

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

Ссылки

Подробнее..

SK hynix представила первую в мире память DDR5 DRAM

06.10.2020 10:05:04 | Автор: admin
Корейская компания Hynix представила публике первую в своем роде оперативную память стандарта DDR5, о чем сообщается в официальном блоге компании.



По заявлению SK hynix, новая память обеспечивает скорость передачи данных в 4,8-5,6 Гбит/с на контакт. Это 1,8 раза больше, чем базовые показатели памяти предыдущего поколения DDR4. При этом производитель утверждает, что напряжение на планке уменьшено с 1,2 до 1,1 В, что, в свою очередь, повышает энергоэффективность модулей DDR5. Также была реализована поддержка коррекции ошибок ECC Error Correcting Code. Как утверждается, благодаря этой функции надежность работы приложений возрастёт в 20 раз по сравнению с памятью предыдущего поколения. Минимальный объем памяти платы заявлен на уровне 16 Гб, максимальный 256 Гб.

Новая память была разработана по спецификации стандарта ассоциации твердотельных технологий JEDEC, который опубликовали в 14 июля 2020 года. Согласно тогдашнему анонсу JEDEC, спецификация DDR5 поддерживает вдвое больший реальный канал, чем DDR4, то есть вплоть до 6,4 Гбит/с у DDR5 против имеющихся 3,2 Гбит/с у DDR4. При этом запуск стандарта будет плавным, то есть первые планки, как планировала ассоциация и что и показывает SK hynix, в базе быстрее только на 50% по сравнению с DDR4, то есть имеют канал в 4,8 Гбит/с

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



Участие Intel не случайность. Hynix заявляет, что пока основным потребителем памяти нового поколения, на их взгляд, будут дата-центры и серверный сегмент в целом. Корпорация Intel до сих пор доминирует на этом рынке, а в 2018 году именно тогда началась активная стадия совместной работы и тестирования новой памяти была неоспоримым лидером процессорного сегмента.

Джонхун О, исполнительный вице-президент и директор по маркетингу Sk hynix заявил:

SK hynix сосредоточится на быстрорастущем рынке серверов премиум-класса, укрепляя свои позиции в качестве ведущей компании в области серверной DRAM.

Основной этап выхода на рынок новой памяти рассчитан на 2021 год именно тогда спрос на DDR5 начнет расти и тогда же подойдет в продажу и оборудование, способное работать с новой памятью. В создании экосистемы для DDR5 вместе с SK hynix сейчас работают компании Synopsys, Renesas, Montage Technology и Rambus.

К 2022 году SK hynix прогнозирует захват памятью стандарта DDR5 доли в 10%, а к 2024 уже 43% рынка оперативной памяти. Правда, не уточняется, имеется в виду серверная память, или весь рынок, в том числе и десктопы, ноутбуки и прочие устройства.

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

Как на microSD помещается 1 ТБ? Разбор

27.10.2020 18:15:50 | Автор: admin
Как на на маленькой карте памяти microSD размером буквально с ноготок помещается 1 терабайт данных? Такой вопрос нам задали в комментариях к видео про шифрование данных. Звучит интересно! Сегодня мы узнаем что находится внутри SD-карты и SSD-диска.Что объединяет современные чипы памяти со слоёным пирогом?И какой емкости будут наши диски и карты памяти через несколько лет?

Олды, кто помнит 2004 год? Тогда в продаже впервые появилась SD-карточка с рекордной на тот момент ёмкостью 1 гигабайт. Это было событием и карточку оценили в солидную сумму 500 долларов США.



А спустя 15 лет представили карты памяти microSD объёмом 1 терабайт.



Но как за 15 лет мы научились размещать в тысячу раз больше информации на вдвое меньшем пространстве?

Чтобы ответить на этот вопрос, нам нужно понять:

Как устроены SD карточки?


Начнем с физической архитектуры. Если заглянуть под слой пластика SD или microSD карточки, мы увидим один небольшой чип это контроллер памяти. И один или два больших чипа это NAND флеш-память: самый распространенный на сегодня тип памяти. Такие же чипы можно встретить в флешках, SSD-дисках и внутри наших гаджетов. Короче, везде!








NAND И NOR


Но почему NAND флеш-память такая популярная? Чтобы ответить на этот вопрос, давайте немного разберемся в том как флеш-память работает.Мы уже как-то рассказывали, что базовая единица современной флэш-памяти это CTF-ячейка (CTF Charge Trap Flash memory cell), то есть Ячейка с Ловушкой Заряда.

Это не образное выражение. Ячейка, действительно способна запирать внутри себя заряд и хранить его годами! Соответственно, если в ячейке есть заряд это 1, если нет заряда это 0.

Все ячейки организованы в структуру NAND. NAND это такой логический элемент NOT-AND, то есть НЕ-И. Вот таблица его значений.



Фактически, это перевернутый вентиль И. По таблице истинности на выходе вентиля И мы получаем единицу только в случае если на оба входа тоже приходит единица. В NAND всё наоборот.



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

Например CMOS-матрицы или КМОП-матрицы, которые используются в большинстве современных цифровых камер, в том числе во всех мобильных телефонах могут быть полностью реализованы только на вентилях NAND.


  • КМОП комплементарная структура металл-оксид-полупроводник
  • CMOS complementary metal-oxide-semiconductor



Свойство функциональной полноты NAND также разделяет с вентилями NOR, то есть НЕ-ИЛИ. К слову, NOR флеш-память тоже существует. Но почему всюду ставят именно NAND память, а не NOR?

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

В NOR памяти всё наоборот, у нас есть доступ каждой ячейке.

Вроде бы как очевидно превосходство NOR, но почему же тогда мы используем NAND?



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

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





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


Структура одного столбца NAND flash с 8 ячейками


Компоновка шести ячеек NOR flash

Более того NOR-память не оптимальна для считывания и записи больших объёмов информации, но она выигрывает тогда, когда нужно считывать много мелких данных случайным образом.Поэтому NOR-память используют только в специфических задачах, например, для хранения и исполнения микропрограмм. Например BIOS вполне может быть записан в NOR-память, или даже прошивка в телефоне. По крайней мере раньше так точно делали.

А NAND-память идеально подходит для SSD, карт памяти и прочего.

2D NAND


Окей, NAND-память плотная, это выяснили. Но как её сделать еще плотнее?

Долгое время ячейки NAND укладывались столбцами горизонтально и получалась однослойная плоская структура. И производство памяти было похожим на производство процессоров при помощи методов литографии.Такая память называлась 2D NAND или планарный NAND.


Структура 2D PLANAR NAND



Соответственно, единственным способом уплотнения информации былоиспользования более тонких техпроцессов, что и делали производители.

Но к 2016 году производители достигли техпроцесса в 14-15 нанометров. Да-да, крутость памяти тоже можно мерить нанометрами. Но тем не менее это оказалось потолком для 2D NAND-памяти.





Получается, что в2016 году прогресс остановился? Совсем нет.

Решение нашла компания Samsung. Понимая, что планарная,то есть плоская NAND находится на последнем издыхании, еще в 2013 году Samsung обогнала своих конкурентов и представила первое в отрасли устройство с 3D NAND-памятью.



Они взяли столбец с горизонтальными NAND ячейками и поставили его вертикально, поэтому 3D NAND ещё называют V-NAND или вертикальной NAND. Вы только посмотрите на эту красоту!



Вот эти красные штуки сверху это битлайны (bit line),то есть каналы данных. А зелёные шутки это слои ячеек памяти. И если раньше данные считывались с одного слоя и поступали в битлайн, то теперь данные со всех слоев стали поступать в канал одновременно!

Поэтому новая архитектура позволила не только существенно увеличить плотность информации, но и вдвараза повысить чтения и записи, а также снизить энергопотребление на 50%!

Первый 3D NAND-чип состоял из 24 вертикальных слоёв. Сейчас норма составляет 128 слоев.Но уже в 2021 году производители перейдут на 256 слоев, а к 2023 году на 512, что позволит на одном флеш-чипе разместить до 12 терабайт данных.





Кхм-кхм. Минуточку! Внимательный читатель, мог заметить, что в приведенной табличке написано 12 терабит, откуда же тогда я взял терабайты?Дело в том, что 12 терабит помещается на одном кристалле флеш памяти, а в одном чипе можно разместить до 8 кристаллов друг над другом. Вот и получается 12 терабайт.

Но наращивать всё больше и больше этажей памяти невозможно бесконечно. Даже сейчас с производством возникает масса проблем.В отличии от 2D-памяти, которая производилась методом литографии, 3D NAND, по большей части, опирается на методы напыления и травления. Производство стало похожим на изготовление самого высокого в мире торта. Нужно было буквально наращивать идеально ровные слои памяти друг над другом, чтобы ничего не поплыло и не осело. Жуть!



Более того в этом слоёном пироге, нужно как-то проделать 2,5 миллиона идеально ровных каналов идущих сверху до низу. И если если когда было 32 слоя, производители с этим легко справлялись. То с увеличим количество слоев возникли проблемы. Всё как в жизни!



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


SLC, MLC, TLC, QLC


Так что же мы снова уперлись в потолок? Теперь уже в буквальном смысле.Нет! Ведь на самом деле, можно не только увеличивать количество ячеек. Можно увеличивать количество данных внутри ячейки!

Те кто интересуется темой, или выбирал себе SSD диск наверняка знают, что бываетчетыретипа ячеек памяти SLC, MLC, TLC, QLC.

SLC-ячейка (Single Layer Cell) может хранить всего 1 бит информации, то есть лишь нолик или единичку.Соответственно MLC-ячейка хранит уже 2 бита, TLC 3, QLC -4.



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

Сейчас не будем на этом подробно останавливаться, но в двух словах в потребительских продуктах сейчас золотой стандарт это TLC-память, то естьтри бита. Это оптимальный вариант, по скорости, надежности и стоимости.

SLC и MLC это крутые профессиональные решения.

А QLC это бюджетный вариант, который подойдет для сценариев, в которыхне надо часто перезаписывать данные.

Кстати, Intel уже готовит, преемника QLC пятибитную PLC-память (Penta Level Cell).

Ответ на вопрос


Это, конечно, всё очень интересно, но может, вернёмся к изначальному вопросу: Как в уже сейчас в простой microSD-карточке помещается 1 терабайт?

Ну что ж, теперь когда мы всё знаем, отвечаем на вопрос.



Внутри карточки Micron (и скорее всего карточки SanDisk) используется одинаковый чип памяти. Это 96-слойная 3D NAND QLC-память. На одном кристалле такой памяти помещается 128 гигабайт данных. Но откуда же тогда 1 терабайт?

Как мы уже говорили раньше, в одном флеш-чипе помещается 8 кристаллов. Вот вам и 1 терабайт. Вот так всё просто!



Что нас ждёт в будущем?


Что ж, технологии производства флеш-памяти развиваются очень быстро. Уже через 2-3 года нам обещают чипы на 12 терабайт.А еще лет через 10, ну может 20, и за сотню терабайт перескочим. Тем более SD-карточки нового формата SD Ultra Capacity поддерживают емкость до 128терабайт.



Непонятно одно -будут ли нам нужны SD-карточки через столько лет.
Подробнее..

Перевод NVMe стирает разницу между памятью и накопителями

04.02.2021 20:12:33 | Автор: admin


История накопителей представляет собой гонку между носителями и вычислительными мощностями. На пути к компьютерной нирване встаёт узкое место хранение миллиардов нулей и единиц. Самый новый из игроков на этом поприще энергонезависимая память Non-Volatile Memory Express (NVMe), представляющая собой что-то вроде гибрида нескольких предыдущих технических решений.

В первом поколении домашних компьютеров в качестве накопителей использовались флоппи-диски и компакт-кассеты, но с ростом возможностей компьютеров постепенно росла и важность накопителей. К 1990-м большое распространение получили жёсткие диски, позволявшие хранить сначала мегабайты, а потом и гигабайты информации. В результате выросла необходимость в быстрой системе связи между накопителем и остальной системой. В то время чаще всего использовался интерфейс ATA (IDE) в режиме программного ввода-вывода Programmed Input-Output (PIO).

В результате технологии перешли на прямой доступ к памяти (DMA), интерфейс UDMA, также известный, как Ultra ATA и Parallel ATA, и основанные на этой системе интерфейсы SCSI в компьютерах Apple и большинстве серверов. В итоге Parallel ATA превратился в Serial ATA (SATA), а Parallel SCSI в Serial Attached SCSI (SAS). SATA в основном использовался в ноутбуках и настольных компьютерах до прихода NVMe и твердотельных накопителей.

Все эти интерфейсы разрабатывались с тем, чтобы не отставать от накопителей. В этом смысле, NVMe выбивается из общей картины своей интеграцией в систему. Также NVMe отличается тем, что не привязан к какому-то определённому интерфейсу или коннектору, что может сбить с толку. Кто может разделить M.2 и U.2, не говоря уже о том, какой протокол использует интерфейс, будь то SATA или NVMe?

Давайте-ка разбираться в чудесном и странном мире NVMe.

Обманчивый внешний вид



Элементы SATA Express, функционально схожие с M.2.

Попросите любого человека показать вам слот для NVMe на материнской плате, и скорее всего вам покажут изображение слота M.2, поскольку он стал наиболее популярным для твердотельных накопителей (ТТН) в потребительской электронике. При этом даже слот M.2 со вставленным в него твердотельным накопителем может не относиться к NVMe, поскольку этот интерфейс использует и SATA.

На плате рядом со слотом M.2 часто указывают, какую технологию он поддерживает. Также хорошей идеей будет почитать инструкцию к материнке. Причина путаницы в том, что изначально для ТТН существовал стандарт Mini-SATA (mSATA), использовавший форм-фактор PCIe Mini Card, который потом развился до форм-фактора М.2 и интерфейса U.2. Последний больше похож на интерфейсы SATA и SAS, и комбинирует два канала, SATA и PCIe, в один интерфейс для подключения ТТН.

Тем временем стандарт М.2 (после краткого экскурса в недолго существовавший стандарт SATA Express) расширили с тем, чтобы поддерживать не только SATA, но и AHCI с NVMe. Поэтому слоты М.2 часто неправильно называют слотами NVMe, кода на самом деле NVMe это протокол, основанный на PCIe, не определяющий никаких форм-факторов или типов коннекторов.


Интерфейс М.2 с ключами B и M

Тем временем сам по себе форм-фактор М.2 довольно разносторонний или запутанный, это кому как. Физически он может быть шириной в 12, 16, 22 и 30 мм, и поддерживать длины от 16 до 110 мм. На краю разъёма наносится последовательность меток, обозначающих функциональность, и совпадающих с метками на самом слоте. Чаще всего это метки В и М из списка ключевых меток, в котором, например, есть следующее:

A: 2x PCIe x1, USB 2.0, I2C и DP x4.
B: PCIe x2, SATA, USB 2.0/3.0, аудио, и т.д.
E: 2x PCIe x1, USB 2.0, I2C, etc.
M: PCIe x4, SATA и SMBus.

Получается, что физических размеров карты расширения М.2 бывает аж 32 штуки, и это ещё до того, как мы учтём 12 возможных вариантов модификаций из списка. К счастью, в основной массе промышленность, судя по всему, пришла к общему стандарту в 22 мм ширины для карт накопителей, варианты длин которых ограничены. В итоге ТТН стандарта NVMe имеют маркировку типа 2242, что означает 22 мм ширины и 42 мм длины. Карточки ТТН могут быть отмечены буквами В, М или обеими.

Важно отметить, что сегодня слоты М.2 актитвно используются в качестве расширения PCIe в стеснённых условиях. Поэтому карточки WiFi часто имеют форм-фактор М.2.

Определяя NVMe


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

Вместо этого NVMe определяет интерфейс, который напрямую можно использовать в любой ОС, имеющей NVMe-драйвер. Команды отправляются на NVMe-накопитель, выполняющий их для чтения или записи или проводящий какие-то операции обслуживания типа TRIM. Поскольку можно положиться на то, что любое устройство, представившееся как NVMe-устройство, представляет собой ТТН (NAND Flash, 3D XPoint, и т.д.), протокол NVMe разработан в расчёте на низкие задержки и большую скорость передачи пакетов.


Optane SSD от Intel типа 3D XPoint работает ровно вне зависимости от нагрузок

Недавно популярность обрела такая особенность NVMe, как местный буфер памяти, Host Memory Buffer (HMB). Это попытка избавиться от необходимости буферизовать данные в DRAM используя ТТН типа NAND Flash. Особенность использует часть памяти системы в качестве буфера, относительно мало теряя при этом в быстродействии, при этом буфер в основном используется для кэширования таблицы адресов.

В долгосрочной перспективе, с учётом темпов развития накопителей, такие технологии, как 3D XPoint делают ненужными даже подобные хитрости. Скорость доступа к той же 3D XPoint ближе к показателям DRAM, чем к NAND Flash. Поскольку ТТН типа 3D XPoint не нуждаются в DRAM-буфере, увеличение их популярности может привести к тому, что NVMe будут оптимизировать уже под них.

Взламывая NVMe



Память на магнитных сердечниках 6464 (4 кБ)

Стоит задуматься, а что ещё можно сделать с NVMe, кроме как купить ТТН и засунуть его в слот M.2 B или М. Тут нужно решить, что вам больше интересно взлом накопителя (пусть это будет лишь некая разновидность DRAM or SRAM), или же самого слота М.2.

Полноразмерные слоты PCIe имеют большой размер, а карты расширения предоставляют много места для таких громоздких компонентов, как BGA-чипы и гигантские системы охлаждения. Карты расширения М.2 наоборот, предназначены для мелких и компактных решений, способных уместиться в ноутбуке. Можно, к примеру, скомбинировать FPGA с нужными блоками железа SerDes и PCIe в форм-факторе M.2, и создать компактную карту расширения для ноутбуков и встраиваемых устройств.

Недавние хаки предлагают добавить поддержку NVMe к Raspberry Pi, заменить ТТН в Pinebook Pro WiFi-картой, и считывать NVMe Flash накопитель от айфона при помощи ZIF-адаптера для PCIe.

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

Заключение


Оглядываясь назад на десятилетия развития вычислительной техники, видно, что различие между памятью и накопителями существовало всегда. Причём памятью всегда служили энергозависимые устройства типа SRAM или DRAM. В последнее время это различие становится всё менее значимым. NAND Flash с NVMe-интерфейсом уже обещают нам потенциально очень низкие задержки и скорость в несколько гигабайт в секунду (особенно с использованием PCIe 4.0) но и это не конец истории.

Самая горячая новинка это DIMM постоянной памяти, размещаемые в обычных слотах памяти. Они используют твердотельную технологию Intel Optane, позволяющую увеличивать объём памяти в системе до 512 Гб на модуль. Эти модули, естественно, пока что работают только в серверах Intel. Используются они для буферизации баз данных, большие объёмы которых не дают использовать в качестве буфера обычную память (например, терабайты DDR4 DIMM).

Если у нас будет очень быстрый и энергонезависимый накопитель, соединённый с контроллером памяти процессора напрямую, мы сможем уменьшить задержки до абсолютных минимумов. И хотя 3D XPoint (как разновидность памяти с изменением фазового состояния) пока ещё не такая быстрая, как DDR SDRAM, она демонстрирует нам, что может появиться после NVMe, когда разница между памятью системы и хранилищем данных совсем исчезнет или изменится до неузнаваемости.
Подробнее..

Курс на независимость китайский производитель флеш-чипов осуществляет запуск 192-слойной 3D NAND памяти

12.01.2021 20:07:52 | Автор: admin
Источник

Yangtze Memory Technologies Co. (YMTС), ведущий производитель микросхем памяти в Китае, удвоит масштабы выпуска стандартных NAND-чипов. Компания планирует начать конкуренцию с технологическими гигантами Samsung и Micron. Более того, этот же производитель запускает опытное производство 192-слойной 3D NAND памяти.

В последние годы Китай усиленно создает внутреннюю цепочку поставок полупроводников и становится все более независимым от импорта микросхем. Достижение YMTC поставленных целей станет важной вехой в истории Китая.

В планах у китайской компании довести объем ежемесячного производства флэш-памяти NAND до 100 тыс.пластин. Это составит примерно 7% от общего мирового производства.

Фото: YMTC

Предприятие YMTC находится в Ухане, но оно не останавливалось даже в разгар пандемии COVID-19, что говорит о стратегической важности предприятия для Поднебесной. Стоимость компании на данный момент составляет $24 млрд и продолжает увеличиваться. Летом прошлого года компания запустила строительство второй очереди производственных линий. После ввода в строй дополнительных мощностей YMTC будет способна выпускать дополнительно 200 тыс. пластин в месяц.

Любопытно, что Samsung и Micron только приступают к выпуску 176-слойных чипов. Тогда как YMTC планирует обогнать конкурентов с более продвинутой 192-слойной памятью.

Фото: YMTC

В конце прошлого года китайская компания освоила выпуск 128-слойных микросхем. Хотя анонс о завершении их разработки вышел в апреле 2020 года.

Среди крупных клиентов YMTC Lenovo Group и Huawei. Помимо чипов NAND, компания выпускает твердотельные SSD-накопители для массового потребителя под брендом Zhitai.

Начинания молодой китайской компании дали импульс созданию работающей местной системы полупроводниковой промышленности. YMTC стали первыми в стране производителем флэш-памяти 3D NAND. Курс на рост определился после успеха 2019 года, когда компания впервые вышла на рынок с 64-слойными микросхемами.

Правда, здесь не обошлось и без проблем. Дело в том, что в угоду скорости страдает качество. К последнему у экспертов есть немало вопросов, поскольку несмотря на амбиции YMTC, уровень выхода годных изделий среди 128-слойной 3D NAND на конвейере YMTC не превышает 70%.

YMT коммерческое предприятие, дочка Tsinghua Unigroup. YMTC активно поддерживается государственными организациями. Например, компания получила средства от так называемого Большого фонда (the China Integrated Circuit Industry Investment Fund) главной программы в стране по финансированию выпуска микросхем.

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

Подробнее..

Зачем ROM и RAM криптовалютчикам?

24.03.2021 10:15:26 | Автор: admin


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


Погружение в Блокчейн


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

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

Я люблю Kingston fkgkd240ckro3
Я люблю Хабр gkfs40sfvmggr
Я люблю Kingston и Хабр fscm2clg5c0r5

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



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

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

Блокчейн децентрализован, то есть записи об операциях не хранятся в одном месте. Никто не может что-то поменять и навязать остальным, что так и было. Аналогичные журналы с операциями находятся у сотен/десятков/тысяч. Чувствуете? Запахло памятью.

Основы майнинга


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

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

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

Майнинг и память


Ранее уже говорилось, что каждая криптовалюта скрывает в себе свой дивный мир с палками и колёсами. Этим и объясняется совершенно разный подход к железу. Логично, что одна и та же видеокарта добывает разное количество коинХабов и КриптоКингстонов за один промежуток времени. При этом основные ресурсы берутся с видеокарты: GPU + видеопамять. Но закон везде один: со временем стучать киркой становится сложнее.

Но при этом стоит учитывать время поднятие системы при отказе. В таком случае выгодно использовать SSD, пускай даже и маленький. Им же легко компенсировать маленькое количество оперативной памяти, например, 4 ГБ DDR4. Этого объёма достаточно для работы с bitcoin на машине под управлением Windows. Главное расширить файл подкачки хотя бы до 16 ГБ. Впрочем, давайте смотреть подробнее.

Зависимость от RAM


Она наступает тогда, когда вы имеете дело с более сложной криптовалютой. Bitсoin хэширует лишь информацию об операции, а в случае с Ethereum, блокчейн может содержать микропрограммы. И вот вместо 4 ГБ, ОЗУ подрастает до 8 ГБ.


Вторым важным моментом является майнинг при помощи процессоров. У видеокарты есть видеопамять, а у процессора кента нет. Для него боевым товарищем становится оперативная память и качество её работы напрямую влияет на производительность майнинга, особенно если вы занимаетесь разгоном. В таком случае для продвинутого майнинга Monero (в конце 2019 года) на одном Ryzen 7 3700X требовалось 16 ГБ ОЗУ. И банальное повышение частоты с 2400 МГц до 3200 МГц приводит к реальным результатам.



Зависимость от ROM


Выше уже было напечатано, что SSD повышает скорость перезагрузки системы в случае ошибки. Вдобавок твердотельный диск требует меньше энергии, что снижает счёт за электричество. Но мы же на Хабре, давайте считать!

Считаем что:

Мы живём в Москве и платим по единому тарифу 5,56 рублей за Киловатт
SSD потребляет минимум 2 Ватта, а HDD не менее 6 Ватт

Тогда для HDD: (((6 x 24) x 365 )/ 1000)) x 5,56 = 292,2 рубля в год
Для SSD: (((2 x 24) x 365 )/ 1000)) x 5,56 = 97,4 рубля в год

Может быть, домашнему майнеру разница покажется смешной. Но если у вас работает огромная ферма из нескольких систем, то проще купить кучку SSD на 60/120 Gb, чем HDD на 250 ГБ. Вы получите не только быстрое изменение профиля разгона, но скоростное возобновление работы при критических ошибках.

Узлам без SSD никуда!


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

Так вот, у вас есть возможность стать полной нодой. Для этого придётся загрузить себе на диск всю историю транзакций с криптовалютой. Для Bitcoin-а в начале марта 2021 года требовалось 330 Гб. Причём со временем этот дамп будет расти, а ваша система сможет верифицировать операции.


Криптовалютчики частенько говорят, что держатели полных нодов благородные люди, которые помогают децентрализации сети. На самом же деле это связано с анонимностью, потому что, передавая данные другому полному ноду, вы не можете быть уверены, что вас не отследят. Так как запрос на внесение изменений в цепочку отправляется публично. А пряча свои тайные делишки операции в своёй ноде (для Bitcoin это Bitcoin Core), вы маскируете их. Дополнительно стоит отметить поддержку Tor.



А если мы вернёмся к Ethereum, то как и с RAM, станет только хуже. Среди рекомендуемых системных требований для узла: 16 Гб оперативной памяти и SSD на 500 ГБ. Если вам кажется, что это с запасом, то оставьте свои надежды Для полной синхронизации требуется не менее 5 Тб. А высокая нагрузка на всю сеть не позволяет использовать медленные HDD. Для справочки: за последний год полный архив подрос на 3 ТБ.



И таких смельчаков немало, публичные полные ноды можно отследить в режиме онлайн на специальной карте. В конце марта их оказалось 6,666 штук, а это минимум 34 719 дисков Kingston A400 по 960 Гб каждый, на общую сумму более 310 миллионов рублей.

Таким образом, только публичные ноды Ethereum можно оценить в 15 406 шести гигабайтных видеокарт GTX 1060, заказанных по средней цене на Ebay.



Шутка ли, но разработчик Bitcoin Core (ПО для полных нод Bitcoin) написал скрипт и насчитал в январе 2021 года более 30 тысяч полных нод с обновлёнными данными, хотя Coin Dance показывал только 11 619 полных нод. Интересно, у Ethereum такая же картина со скрытыми нодами?

Попрощаемся?




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

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

Что касается оперативной памяти, то мы видим явную необходимость в ней при майнинге на CPU. Такие фермы не занимаются добычей популярных валют, а сконцентрированы на узком кругу монеток: Cranepay, Binarium, Yenten, Monero.

Для получения дополнительной информации о продуктах Kingston Technology обращайтесь на официальный сайт компании.
Подробнее..

Мнемоника и английский язык как ошибки превратить в победы

04.12.2020 20:21:06 | Автор: admin


Ученые подсчитали, что объем памяти самого обычного человека примерно равен 2,5 петабайт информации. Больше 2,5 миллионов гигабайт это примерно 35,5 лет непрерывной записи видео в формате Full HD.

Но как ни странно, с таким мощнейшим суперкомпьютером в голове мы часто не можем запомнить элементарные вещи. Возьмем, к примеру, английский.

Affect или effect? Complement или compliment? В каких случаях нужно использовать than, а в каких then? Как правильно писать слово: neccessary, neccesary или necessary? И таких примеров сотни.

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

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

Как работает память и почему мнемоника эффективна


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

Процесс запоминания информации состоит из трех частей:

Сенсорная память. Длительность: от 0,5 до 2 секунд. Она реагирует на только что увиденные или услышанные образы.

Можете прямо сейчас провести эксперимент. Посмотрите на любой предмет в комнате (например, обложку какой-нибудь художественной книги) в течение 3-5 секунд. А затем закройте глаза. Еще примерно секунду вы будете четко и подробно видеть образ предмета, а затем детали просто сотрутся.

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

К примеру, если мимо вас на одноколесном велосипеде проедет клоун, похожий на Эйнштейна с табличкой E=mc2, то мозг активно отреагирует, активируя процесс запоминания. Собственно, это одна из причин, почему мы любим все новое и необычное потому что это любит мозг.

Краткосрочная память. Ее длительность составляет от нескольких минут. Сюда попадает информация, которую мозг уже обработал и интерпретировал.

В среднем оперативная память человека может запомнить 72 единицы. То есть, из беспорядочного набора слов обычный человек запомнит от 5 до 9. Краткосрочную память можно тренировать в целом человек может держать до 15 единиц данных, но больше без специальных техник не получится. Краткосрочная память ограничена.

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

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

Но если мозг активно создает ассоциативные связи с поступающей информацией, то она попадает в долгосрочную память.

Долгосрочная память. От нескольких дней до десятков лет. Сюда попадает информация, которая уже создала прочные ассоциативные связи в мозге.

Мозг пытается классифицировать информацию и упорядочить ее. В большинстве случаев создаются спонтанные ассоциативные связи.

К примеру, вы знакомитесь с новым человеком. А он вдруг похож на солиста Руки вверх Сергея Жукова, да еще и звать Сергей. И все ассоциация есть. В следующий раз, когда вы вспомните о нем, мозг выдаст: Это тот, который из Руки вверх.

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

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

Легальный хак мозга, если можно так выразиться.

Более того, это чуть ли не единственный адекватный способ переучить неправильную информацию.


Мнемоника исправляет ошибки прошлого


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

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

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

Допустим, студент неправильно выучил написание слова necessary. И пишет в нем двойную с, а не s. Даже если он впоследствии выучит правильно, то каждый раз, когда ему нужно будет написать это слово, мозг будет ловить ошибку. Ведь для него оба варианта написания истинны.

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

Не удивляйтесь, чем страннее и необычнее ассоциация, тем лучше она запоминается. У футболки обычно один воротник (collar) и два рукава (sleeve). То есть, одна С и две S.



Теперь когда студенту нужно будет написать слово necessary, он вспомнит футболку и без проблем выберет правильный вариант написания.


Как механизм исправления ошибок в изучении языка мнемоника работает безотказно. Но с ее помощью можно также и учить сложные моменты.

Давайте сразу на примере. Допустим, студент никак не может запомнить употребление слов than и then. Это очень распространенная проблема. Слова похожие, поэтому перепутать очень легко.

На помощь приходит мнемоника.

ThAn compArison (сравнение)
ThEn timE (время)


И все. Буквы А есть в паре слов than-comparison, а буква е в паре then-time. То есть, than используется при сравнении, а then при обозначении времени. Одна маленькая хитрость и студент больше никогда не ошибается в использовании этих слов.


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

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

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

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

Бонус. 7 примеров мнемоники, которые помогут вам запомнить сложные правила английской грамматики



I before e except after c but only when it sounds like bee!

Написание слов с буквами i и e, идущими подряд известная боль. Все слова не выучишь, но это простейшее правило поможет избежать ошибок.

I перед e, за исключением после с, но только если звучит как bee.

На английском звучит приятнее, поэтому выучить будет проще. Если в слове есть буквосочетание ie и оно звучит как в слове bee, то его нужно писать именно как ie. К примеру, achieve, believe, piece, fierce.

После буквы с пишется ei. Ceiling, receipt, conceive.

А если звука ее нет, тогда все наоборот. После с ie, а после других букв ei: science, efficient, foreign, beige.

Affect is action, effect is result

Эти два слова путают не реже, чем than-then. Но разобраться поможет абсолютно та же мнемоника.

Affect Action
Effect rEsult


В паре affect-action есть буква А, а в паре effect- result буква Е.

Есть еще один интересный способ запомнить. С помощью слова RAVEN. В буквах этого слова (кроме первой) кодируется сообщение: Affect verb, effect noun (Affect глагол, effect существительное). И действительно affect это влиять, а effect результат.

It's truly hot in July

Часто студенты пытаются написать слово truly через е truely. Но при этом все без проблем запоминают, как пишется июль July.

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

Mr Lee lost an e in an argument

Та же ситуация с argument. Многие запоминают, что в слове argue есть буква е, поэтому пытаются ее запихнуть.

А эта простая фраза помогает запомнить, что в argument буквы е нет.

Lose lost an O

Очень распространенная ошибка. В слове lose многие слышат звук [u:] и по аналогии с book пишут его с удвоенной о loose.

Фраза Lose потеряло букву О хоть и не рифмованная, но все равно помогает запомнить правильное написание. Потому что Lose это терять.

Ice is cold

Простое предложение, чтобы разобраться со словами, у которых в конце -ice и -ise. К примеру, practice и practise, advice и advise.

Ice здесь существительное, is глагол.

Поэтому в существительных нужно писать в конце -ice, а в глаголах -ise. Если совет, то advice, а если советовать то advise.

Gray vs. Grey

Вы наверняка знаете, что в британском и американском английском некоторые слова пишутся по-разному. К примеру, слово серый. В Британии оно grey, а в США gray.

Запомнить, где какое, очень просто:

GrAy America
GrEy England


2 секунды и вы больше не ошибетесь.

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

Так можно исправить любые ошибки при изучении английского и упростить сложные моменты. А вы используете мнемонику, чтобы изучать что-то? В особенности иностранные языки. Напишите в комменты свои мнемонические правила, нам очень интересно.

Онлайн-школа EnglishDom.com вдохновляем выучить английский через технологии и человеческую заботу




Только для читателей Хабра первый урок с преподавателем по Skype бесплатно! А при покупке занятий получите до 3 уроков в подарок!

Получи целый месяц премиум-подписки на приложение ED Words в подарок.
Введи промокод mnemonic на этой странице или прямо в приложении ED Words. Промокод действителен до 03.12.2021.

Наши продукты:

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru