Зри в корень: java.lang.Object

В Java в вершине иерархии классов лежит класс java.lang.Object. Лежит и лежит, долгое время я им совсем не интересовался.

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

Однако, такой класс есть и я приведу тут исходники java/lang/Object.java, опустив javadoc, и попытаюсь пролить свет на некоторые моменты связанные с реализацией jvm:

Что бы я хотел отметить в этом коде?

Всего в Object 11 публичных методов, 5 обычных и 6 с нативной реализацией.

Рассмотрим обычные методы, так как их код уже доступен.

По дефолту все объекты сравниваются на равенство ссылок. Мне, кстати, в своем время понравилась шутка про то, что для того, чтобы запутать C++ программистов указатели в Java названы ссылками.

toString тоже не содержит ничего необычного, кроме разве того, что hashCode() преобразуется в шестнадцатеричную строку. И если бы apangin не написал, что нынче как только нельзя посчитать hashCode, я бы подумал, что раньше Java программисты могли найти свой объект по hashCode, т.к. он был не чем иным как ссылкой. Те 32 битные времена для многих прошли, и теперь даже не знаю, есть ли смысл в toString() выводить hashCode.

Кроме того, что wait относится к примитивам обеспечивающим многопоточность, хочется отметить бесполезность параметра nanos.

В некоторых случаях он просто добавляет одну милисекунду. Интересно, это закладка на будущее или уже есть системы в которых у wait(long timeout, int nanos) другая реализация.

Завершает парад обычных методов в java.lang.Object:

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

Теперь посмотрим на на java/lang/Object.class Например, мне интересно что в нем указано в качестве супер класса. Находим в установленном jre или jdk rt.jar, распаковываем:

И видим, что в super class у него прописаны 00 00, интересно что будет, если руками создать class файл без супер класса.
Я взял Hello.class из моей предыдущей заметки.

Открыл его в vim и заменил содержание буфера на hex дамп vim.wikia.com/wiki/Hex_dump:

Поразился мощи vim редактора. Быстренько нашел байты для super_class. Напомню, они лежат согласно спецификации через 4 байта после окончания constant_pool. Конец constant_pool ищется по тегу строки 00 01 и последовательности не нулевых байтов, когда начинаются нули идут другие разделы constant_pool. Для других class файлов это может быть не так, но в моем случае сработало.
Возвращаемся обратно к бинарному виду:

Сохраняем изменения. Запускаем наше поправленное приложение:

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

Нам нужны исходники jdk. Я выбрал OpenJDK для исследования. Будем качать их отсюда:

hg.openjdk.java.net/jdk8/jdk8

И хранить в Меркурии:

hg clone hg.openjdk.java.net/jdk8/jdk8

Но на этом не всё.

Надо еще запустить:

И подождать. Отлично, исходники скачались и можно искать нашу ошибку. Я делаю это grep-ом:

Открываем classFileParser.cpp и там на 3095 строчке:

Нас интересует вот эта часть:

check_property лежит в заголовочном файле classFileParser.hpp и выглядит так:

Я стал искать где выставляется _need_verify и за что отвечает. Оказалось в classFileParser.cpp есть вот такая строчка:

verify передается при вызове:

Этот метод вызывается во многих местах, но нас интересует в hotspot/src/share/vm/classfile/classLoader.cpp:

Как же устроен should_verify_for в hotspot/src/share/vm/classfile/verifier.cpp:

Так как в should_verify_class мы передаем false, смотрим BytecodeVerificationLocal в hotspot/src/share/vm/runtime/arguments.cpp:

Зарываясь дальше можно найти черную магию с макросами в hotspot/src/share/vm/runtime/globals_extension.hpp:

Но меня это пока не интересует. Мне надо выяснить значение BytecodeVerificationLocal, в случае когда jvm стартует без параметра -Xverify. Это можно найти в коде, но мне кажется, сейчас не уместным лезть дальнейшие дерби и пора выбираться. Документация в помощь. По дефолту jvm запускается с параметром -Xverify:remote и BytecodeVerificationLocal будет false.

Значит _need_verify тоже false и в check_property вызывается assert_property(property, msg, index, CHECK) с параметрами false, «Invalid superclass index %u in class file %s», 0, CHECK_NULL.

Собственно, здесь и выбрасывается сообщение об ошибке. Теперь посмотрим на fatal(msg), чтобы узнать как это делается.
Хотя, на часть вопроса мы уже ответили. Нельзя сделать classfile в котором для поля super_class будет значение 0 и загружать его с помощью дефолтного ClassLoader.

Итак, fatal определенный в hotspot/src/share/vm/utilities/debug.hpp:

hotspot/src/share/vm/utilities/debug.cpp:

Реализация report_and_die() в hotspot/src/share/vm/utilities/vmError.cpp нетривиальна, но из нее следует, что в Java мы уже не возвращаемся и выводим сообщение об ошибке из недр jvm. На этом я хочу переостановить исследование jvm и java.lang.Object.

Выводы

java.lang.Object особый класс, имеющий уникальный class file, в котором в качестве суперкласса не указан ни один класс. Создать такой же класс средствами языка Java нельзя, но также затруднительно, если вообще возможно, сделать это и манипуляциями с байтами class файла. Надеюсь у меня получилось передать часть восхищения, которое я испытывал исследуя исходники jvm. Призываю всех попробовать сделать то же самое.

Источник

3D NAND – что это. Разбираемся с преимуществами технологии

В одном из предыдущих материалов мы «пробегались» по типам памяти, используемой в SSD-накопителях. Разбирались, в чем отличия MLC от TLC, какие у каждого типа достоинства и недостатки. Но это все была технология планарной памяти, а в тренде сейчас многослойность и третье измерение. 3D NAND – что это такое? Какие у него преимущества, перспективы и, вообще, оно нам надо? Давайте разберемся.

Почему планарная память так называется

В последние годы актуальной задачей стало создание емких, быстрых, надежных и компактных хранилищ данных. Смартфоны, планшеты, фото- и видеоаппаратура, прочая мобильная и не очень техника и, конечно же, бурно завоевывающийся рынок SSD-накопители. Требуются именно емкие и небольшие по размеру микросхемы памяти, учитывая ограничения, которые предъявляют некоторые твердотельные диски. Достаточно посмотреть на форм-фактор M.2 чтобы понять, что большого количества чипов на этой маленькой платке разместить действительно негде.

До некоторого времени увеличивать емкость можно было как минимум двумя способами:

  1. Увеличить количество бит, хранящихся в ячейке памяти. Так появилась MLC (2 бита в ячейке», потом ее активно стала вытеснять TLC (уже 3 бита на ячейку).
  2. Уменьшить физический размер ячейки, для чего использовались все боле тонкие техпроцессы. Так, на смену 32 нм техпроцессу пришел 24 нм, его сменил 19 нм, последний, используемый сейчас, техпроцесс – это 15 нм.

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

Что собой представляет NAND-память

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

SHemaУпрощенная схема NAND-памяти представлена на рисунке. Ячейки (они же транзисторы) соединяются последовательно по 16 или 32 ячеек в группе, образуя страницы, из которых формируется блок. Можно представить себе этакое плоское поле, все утыканное ячейками памяти.

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

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

Подобное соединение ячеек позволяет плотно разместить их на кристалле, чем достигается высокая емкость чипов памяти. Чем больше информации можно разместить на единице площади кристалла, тем ниже себестоимость конечного продукта, в данном случае – SSD-диска.

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

3D NAND – что это, спасение?

Можно сказать, что да. Если стоимость кристалла памяти зависит от его размера, а уплотнять его уже не представляется возможным, то почему бы не перейти от двумерной (планарной) организации ячеек к трехмерной, развернув их вертикально? В этом фундаментальное отличие 3D NAND от старой, «плоской» системы размещения ячеек.

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

3dvnandevolution_041714282246_640x360Первой такую память сделала компания Samsung, назвав ее V-NAND (V – от слова vertical, вертикальная). Первое поколение имело 24 слоя, второе – 32, а в последнем, третьем поколении используются уже 48 слоев. Компании Micron, Toshiba представили свои чипы памяти позже, и производят их уже с 64-мя слоями.

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

Micron располагает управляющие элементы под NAND ячейками, что экономит место на кристалле, позволяя увеличить его емкость. Мало того, хотя Samsung и Toshiba отказались от технологии плавающего затвора, воспользовавшись технологией CTF (Charge Trap Flash), которая использует изолированную область для хранения заряда (именно изолированность позволяет снизить утечки, повысить надежность памяти), в Micron остались верны плавающему затвору.

toshiba-nand-f1В Toshiba управляющие элементы расположены в верхней части, что, по мнению компании, позволяет этим элементам меньше подвергаться нагреву. К тому же линии ячеек как бы свернуты, напоминая букву «U», а не расположены в одну линию. Все это позволяет добиться снижения количества ошибок при операциях чтения/записи. Ну и, как было сказано чуть выше, используется технология CTF. Сама Toshiba называет свою трехмерную память BiCS 3D NAND (Bit Cost Scalable).

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

Итак, трехмерная память сняла остроту необходимости утончать техпроцесс, как один из способов увеличения емкости чипов. Правда, при этом возникли некоторые другие технологические сложности, которые, судя по бодрым анонсам практически всех чипмейкеров, успешно преодолеваются. Так, SK Hynix планирует в скором времени перейти на производство 72-слойных чипов. Та же Toshiba отлаживает выпуск 64-слойных чипов, предлагая их сейчас с емкостью 256 Гб (32 ГБ), а в скором времени ожидается выпуск 3D NAND чипов с емкостью 512 Гб (64 ГБ).

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

Что такое технология CTF

В чем суть этой технологии? Разница заключается в области, в которой хранится заряд, и материала, из которого эта область выполнена. Классический транзистор с плавающим затвором, помимо обычных стока, истока, и затвора, называемого в данном случае «управляющим затвором», имеет и еще одну область – расположенный в слое диэлектрика проводник, называемый «плавающим затвором», в котором, собственно, и накапливается заряд. В нем-то и хранятся биты данных. В качестве диэлектрика используется диоксид кремния SiO2.

CTFТранзистор, выполненный по технологии CTF (Charge Trap Flash) сделан несколько иначе. Собственно, область, где хранится заряд, выполнена из нитрида кремния Si3N4, обладающего рядом отличительных свойств. Так, являясь, по сути, диэлектриком, этот материал способен хранить заряд, что позволяет использовать его в качестве запоминающей ячейки.

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

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

Отсюда становится понятной аллегория, озвученная лидером в разработке 3D NAND памяти, компанией Samsung, что транзисторы с плавающим затвором – это вода, а с ловушкой заряда – это сыр. Плавающий затвор (вода) слабо препятствует перемещениям зарядов и их попыткам вообще покинуть эту область (утечка), в то время как ловушка заряда подобна «сыру», существенно ограничивающая возможность этих перемещений и попытки вырваться на «свободу».

Среди достоинств этой технологии обычно указывают:

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

Различают несколько вариаций изготовления слоев транзистора в зависимости от материалов:

  • SONOS – Silicon-Oxide-Nitride-Oxide-Silicon.
  • MONOS – Metal-Oxide-Nitride-Oxide-Silicon.
  • TANOS – Titanium-Alumina-Nitride-Oxide-Silicon.
  • THNOS – Titanium-high-k dielectric-Nitride-Oxide-Silicon.

Где предел 3D NAND?

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

Samsung-Stacking-transistor-cellsЕсли вкратце, и очень упрощенно, то производство многослойной памяти заключается в напылении n-го количества слоев на кремниевую пластину, образующие линии слов (word line), а другая операция заключается в травлении огромного количества отверстий (high aspect ratio etch) через эти слои, чтобы впоследствии сформировать линии битов (bit line). В пространстве линии слов и битов ориентированы перпендикулярно друг другу, а главные сложности кроются именно в отверстиях.

Еще пару лет назад заявлялось, что есть технологические проблемы с травлением отверстий в слоях, количество которых достигает 60-70. Правда, сейчас, когда 64-слойная память – уже реальность, а на горизонте 72-слойная, и есть разговоры про более многослойные варианты, с этой проблемой удается справиться. Вопрос, как?

Один из вариантов – технология «string stacking». Если не вдаваться в технические подробности, то это установка отдельных чипов памяти (которые сами по себе многослойные) друг на друга (стекирование) с последующим соединением таким образом, чтобы этот многослойный бутерброд распознавался как единое целое, как одна микросхема. Таким образом, использовав чипы 3D NAND с 32-мя слоями, можно получить итоговый чип с 64 (2 слоя чипов), 96 (3 слоя чипов) и т. д. слоями. Но и тут есть сложности технологического порядка, в первую очередь связанные именно с соединением и коммутацией чипов, которые находятся на этапе решения.

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

Высота слоев 32-слойной 3D NAND от Samsung составляет около 4 мкм. При этом полупроводниковые пластины, используемые в производстве микросхем, имеют толщину 625-775 мкм в зависимости от диаметра. Одним из завершающих этапов производства чипов (правда не всегда используемый) является сошлифовывание (back-grinding) обратной стороны этой пластины до толщины порядка 50-75 мкм. Это уменьшает размеры кристалла и облегчает упаковку готовой микросхемы в корпус, да и для стекирования чипов подходит как нельзя лучше.

Если взять толщину 32-слойного чипа памяти и толщину 300-мм пластины, которая составляет 775 мкм, то, в теории, можно уложить более 190 слоев чипов памяти прежде, чем их толщина превысит толщину исходной пластины (775 / 4 = 193.75).

Конечно, это только в теории, и, скорее всего, таких значений достигнуто не будет, но это иллюстрирует, что «запаса прочности» у технологии 3D NAND вполне достаточно. Главное – решить текущие технологические проблемы именно с укладкой чипов друг на друга и их соединением. Если же это будет выполнено, то количество слоев (чипов) может исчисляться десятками и сотнями, а количество слоев ячеек может достигать многих сотен. Возможную емкость подобных микросхем попробуйте посчитать самостоятельно.

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

В общем, в теории перспективы вполне радужные, что будет на практике?

Проблема параллелизма операции чтения/записи

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

Intel 600pЭто хорошо характеризует такой печально известный своей низкой производительностью накопитель Intel 600p. Дело в том, что в нем используются чипы памяти емкостью 384 Гб (48 ГБ) производства Micron, и для того, чтобы получить емкость накопителя в 128 ГБ, надо всего 3 такие микросхемы. Для 256-гигабайтного накопителя используются 6 микросхем и т. д.

Казалось бы, меньше микросхем – больше места для их размещения. Это так, но большинство контроллеров, особенно в сегменте производительных моделей, имеют 4 или 8 каналов, обеспечивающих параллельный доступ к памяти. Если микросхем памяти 3 (6, 9…), то как задействовать все доступные каналы? В том то и дело, что никак. Вместо использования всех 8-ми (или 4-х) каналов приходится ограничиваться использованием только шести (3-х). Получается, что контроллер работает не на полную мощь, отсюда – падение производительности.

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

Заключение. 3D NAND – это то, с чем нам жить

Ни для кого не секрет, что за 3D NAND будущее, и в самом ближайшее время начнется (если уже не началось) активное вытеснение планарной памяти. Все будет зависеть от стоимости решений, производственных возможностей производителей, в первую очередь Micron, Toshiba, и, возможно, SK Hynix, если дело двинется дальше анонсов. Про Samsung говорить нечего, т. к. свои чипы 3D памяти они, фактически, никому не поставляют.

Думается, бюджетные SSD-накопители продержатся еще какое-то время, а вот производительные решения, и, в первую очередь, твердотельные диски, работающие на шине PCIe, будут активно мигрировать именно на 3D NAND.

Источник