Главная Рефераты по рекламе Рефераты по физике Рефераты по философии Рефераты по финансам Рефераты по химии Рефераты по хозяйственному праву Рефераты по цифровым устройствам Рефераты по экологическому праву Рефераты по экономико-математическому моделированию Рефераты по экономической географии Рефераты по экономической теории Рефераты по этике Рефераты по юриспруденции Рефераты по языковедению Рефераты по юридическим наукам Рефераты по истории Рефераты по компьютерным наукам Рефераты по медицинским наукам Рефераты по финансовым наукам Рефераты по управленческим наукам Психология и педагогика Промышленность производство Биология и химия Языкознание филология Издательское дело и полиграфия Рефераты по краеведению и этнографии Рефераты по религии и мифологии Рефераты по медицине Рефераты по сексологии Рефераты по информатике программированию Краткое содержание произведений |
Реферат: Архитектура современных процессоровРеферат: Архитектура современных процессоровСодержание Введение 1. 8086: первый процессор для ПК 2. Одноядерные процессоры 3. Переход к двуядерным процессорам 4. Виртуализация 5. Кратко о некоторых других технологиях 6. Будущие технологии Библиографический список Введение Процессор (или центральный процессор, ЦП) — это транзисторная микросхема, которая является главным вычислительным и управляющим элементом компьютера. Английское название процессора - CPU (Central Processing Unit). Процессор представляет собой специально выращенный полупроводниковый кристалл, на котором располагаются транзисторы, соединенные напыленными алюминиевыми проводниками. Кристалл помещается в керамический корпус с контактами. В первом процессоре компании Intel - i4004, выпущенном в 1971 году, на одном кристалле было 2300 транзисторов, а в процессоре Intel Pentium 4, выпущенном 14 апреля 2003 года, их уже 55 миллионов.Современные процессоры изготавливаются по 0,13-микронной технологии, т.е. толщина кристалла процессора, составляет 0,13 микрон. Для сравнения - толщина кристалла первого процессора Intel была 10 микрон. Рисунок 1 – принципиальная схема процессора Управляющий блок - управляет работой всех блоков процессора. Арифметико-логический блок - выполняет арифметические и логические вычисления. Регистры - блок хранения данных и промежуточных результатов вычислений - внутренняя оперативная память процессора. Блок декодировки - преобразует данные в двоичную систему. Блок предварительной выборки - получает команду от устройства (клавиатура и т.д.) и запрашивает инструкции в системной памяти. Кэш-память (или просто кэш) 1-го уровня - хранит часто использующиеся инструкции и данные. Кэш-память 2-го уровня - хранит часто использующиеся данные. Блок шины - служит для ввода и вывода информации. Эта схема соответствует процессорам архитектуры P6. По этой архитектуре создавались процессоры с Pentium Pro до Pentium III. Процессоры Pentium 4 изготавливаются по новой архитектуре Intel® NetBurst. В процессорах Pentium 4 кэш 1-го уровня поделен на две части - кэш данных и кэш команд. Существует два типа тактовой частоты — внутренняя и внешняя. Внутренняя тактовая частота — это тактовая частота, с которой происходит работа внутри процессора. Внешняя тактовая частота или частота системной шины — это тактовая частота, с которой происходит обмен данными между процессором и оперативной памятью компьютера. До 1992 года в процессорах внутренняя и внешняя частоты совпадали, а в 1992 году компания Intel представила процессор 80486DX2, в котором внутренняя и внешняя частоты были различны — внутренняя частота была в 2 раза больше внешней. Было выпущено два типа таких процессоров с частотами 25/50 МГц и 33/66 МГц, затем Intel выпустила процессор 80486DX4 с утроенной внутренней частотой (33/100 МГц). С этого времени остальные компании-производители также стали выпускать процессоры с удвоенной внутренней частотой, а компания IBM стала выпускать процессоры с утроенной внутренней частотой (25/75 МГц, 33/100 МГц и 40/120 МГц). В современных процессорах, например, при тактовой частоте процессора 3 ГГц, частота системной шины 800 МГц. Для чего предназначены дополнительные наборы команд? В первую очередь — для увеличения быстродействия при выполнении некоторых операций. Одна команда из дополнительного набора, как правило, выполняет действие, для которого понадобилась бы небольшая программа, состоящая из команд основного набора. Опять-таки, как правило, одна команда выполняется процессором быстрее, чем заменяющая ее последовательность. Однако в 99% случаев, ничего такого, чего нельзя было бы сделать с помощью основных команд, с помощью команд из дополнительного набора сделать нельзя. Таким образом, упомянутая выше проверка программой поддержки дополнительных наборов команд процессором, должна выполнять очень простую функцию: если, например, процессор поддерживает SSE — значит, считать будем быстро и с помощью команд из набора SSE. Если нет — будем считать медленнее, с помощью команд из основного набора. Корректно написанная программа обязана действовать именно так. Впрочем, сейчас практически никто не проверяет у процессора наличие поддержки MMX, так как все CPU, вышедшие за последние 5 лет, этот набор поддерживают гарантированно. Для справки приведем таблицу, на которой обобщена информация о поддержке различных расширенных наборов команд различными десктопными (предназначенными для настольных ПК) процессорами. Таблица 1 Сравнение основных наборов команд
* в зависимости от модификации В 1970г. доктор Маршиан Эдвард Хофф с командой инженеров из Intel сконструировал первый микропроцессор. Во всяком случае, так принято считать – хотя на самом деле еще в 1968 году инженеры Рэй Холт и Стив Геллер создали подобную универсальную микросхему SLF для бортового компьютера истребителя F-14. Первый процессор работал на частоте 750 кГц. Сегодняшние процессоры от Intel быстрее своего прародителя более чем в десять тысяч раз Тактовая частота – это то количество элементарных операций (тактов), которые процессор может выполнить в течение секунды. Еще недавно этот показатель был для пользователей не то, что самым важным – единственным значимым! Многие пользователи пытались «разогнать» свой процессор при помощи специальных программ. Впрочем, частота процессоров и безо всякого разгона возрастала в геометрической прогрессии – в полном соответствии с так называемым «законом Мура» (в свое время Гордон Мур предсказал, что каждые полтора года частота микропроцессоров будет удваиваться вместе с числом транзисторов на кристалле). Этот принцип успешно работал вплоть до 2004 г. – пока на пути инженеров Intel не встали законы физики. Ведь размеры транзисторов «ужимать» до бесконечности нельзя. Уже сегодня процессоры производятся по 65-наномикронной технологии (технология 65 нанометров), а толщина «подложки» транзисторов не превышает 1 нм (всего 5 атомов). В ближайшие годы размеры транзисторов могут сократиться до 22 нм, что близко к физическому пределу. Одновременно с уменьшением размеров транзисторов резко возрастает количество тепла, которое выделяет работающий процессор – например у последних моделей Pentium тепловыделение составляет около 120 ватт (что соответствует двум бытовым электролампам)! 1. 8086: первый процессор для ПК 8086 стал первым процессором x86 - Intel к тому времени уже выпустила модели 4004, 8008, 8080 и 8085. Этот 16-битный процессор мог работать с 1 Мбайт памяти по внешней 20-битной адресной шине. Тактовая частота, выбранная IBM (4,77 МГц) была довольно низкой, и к концу своей карьеры процессор работал на 10 МГц. Первые ПК использовали производную процессора 8088, которая имела всего 8-битную внешнюю шину данных. Что интересно, системы управления в американских шаттлах используют процессоры 8086, и NASA пришлось в 2002 году покупать процессоры через eBay, поскольку Intel их больше не производила. Таблица 2 Характеристики 8086
80286: 16 Мбайт памяти, но всё ещё 16 битов Выпущенный в 1982 году, процессор 80286 был в 3,6 раза быстрее 8086 на той же тактовой частоте. Он мог работать с памятью объёмом до 16 Мбайт, но 286 всё ещё оставался 16-битным процессором. Он стал первым процессором x86, оснащённым диспетчером памяти (memory management unit, MMU), который позволял работать с виртуальной памятью. Подобно 8086, процессор не содержал блока работы с плавающей запятой (floating-point unit, FPU), но мог использовать чип-сопроцессор x87 (80287). Intel выпускала 80286 на максимальной тактовой частоте 12,5 МГц, хотя конкурентам удалось добиться 25 МГц. Таблица 3 Характеристики 8026
386: 32-битный и с кэш-памятью Intel 80836 стал первым процессором x86 с 32-битной архитектурой. Вышло несколько версий этого процессора. Две наиболее известные: 386 SX (Single-word eXternal), который использовал 16-битную шину данных, и 386 DX (Double-word eXternal) с 32-битной шиной данных. Можно отметить ещё две версии: SL, первый процессор x86 с поддержкой кэша (внешнего) и 386EX, который использовался в космической программе (например, телескоп "Хаббл" использует этот процессор). Таблица 4 Характеристики 386
486: FPU и множители Процессор 486 для многих стал знаковым, поскольку с него началось знакомство с компьютером целого поколения. На самом деле, знаменитый 486 DX2/66 долгое время считался минимальной конфигурацией для геймеров. Этот процессор, выпущенный в 1989 году, обладал рядом новых интересных функций, подобно встроенному на кристалл сопроцессору FPU, кэшу данных и впервые представил множитель. Сопроцессор x87 был встроен в линейку 486 DX (не SX). В процессор был интегрирован кэш первого уровня объёмом 8 кбайт (сначала со сквозной записью/write-through, затем с обратной записью/write-back с чуть более высокой производительностью). Существовала возможность добавления кэша L2 на материнскую плату (работал на частоте шины). Второе поколение 486 процессоров обзавелось множителем CPU, поскольку процессор работал быстрее, чем FSB, появились версии DX2 (множитель 2x) и DX4 (множитель 3x). Ещё один анекдот: "487SX", продаваемый как FPU для 486SX, представлял собой, по сути, полноценный процессор 486DX, который отключал и заменял оригинальный CPU. Таблица 5 Характеристики 486
У DX4 было 16 кбайт кэша и больше транзисторов - 1,6 млн. Этот процессор, изготавливаемый по 600-нм техпроцессу с площадью кристалла 76 мм², потреблял меньше энергии, чем оригинальный 486 (при напряжении 3,3 В). 2. Одноядерные процессоры Рассмотрим их на примере процессора Intel Pentium 1. В июне 1989 года Винодом Дэмом (англ. Vinod Dahm) были сделаны первые наброски процессора под кодовым названием P5. В конце 1991 года была завершена разработка макета процессора, и инженеры смогли запустить на нём программное обеспечение. Начался этап оптимизации топологии и повышения эффективности работы. В феврале 1992 года проектирование в основном было завершено, началось всеобъемлющее тестирование опытной партии процессоров. В апреле 1992 года принято решение о начале промышленного производства, в качестве основной промышленной базы была выбрана орегонская фабрика № 5. Началось промышленное освоение производства и окончательная доводка технических характеристик. Основные отличия от процессора 486:а) Суперскалярная архитектура. Благодаря использованию суперскалярной архитектуры процессор может выполнять 2 команды за 1 такт. Такая возможность существует благодаря наличию двух конвейеров — u- и v-. u-конвейер — основной, выполняет все операции над целыми и вещественными числами; v-конвейер — вспомогательный, выполняет только простые операции над целыми и частично над вещественными. Чтобы старые программы (для 486) в полной мере использовали возможности такой архитектуры, необходимо было их перекомпилировать. Pentium — первый CISC-процессор, использующий многоконвейерную архитектуру. б) 64-битная шина данных. Позволяет процессору Pentium за один шинный цикл обмениваться вдвое большим объёмом данных с оперативной памятью, чем 486 (при одинаковой тактовой частоте). в) Механизм предсказания адресов ветвления. Применяется для сокращения времени простоя конвейеров, вызванного задержками выборки команд при изменении счетчика адреса во время выполнения команд ветвления. Для этого в процессоре используется буфер адреса ветвления BTB (Branch Target Buffer), использующий алгоритмы предсказания адресов ветвления. г) Раздельное кэширование программного кода и данных. В процессорах Pentium используется кэш-память первого уровня (кэш L1) объёмом 16 Кб, разделённая на 2 сегмента: 8 Кб для данных и 8 Кб для инструкций. Это улучшает производительность и позволяет делать двойное кэширование доступным чаще, чем это было возможно раньше. Кроме того, изменён механизм кэширования. д) Улучшенный блок вычислений с плавающей запятой (FPU). е) Симметричная многопроцессорная работа (SMP). 3. Переход к двуядерным процессорам Рисунок 2 – микрофотография одного из первых двуядерных процессоров компьютер процессор одноядерный двуядерный Первой двуядерные чипы для настольных ПК представила корпорация Intel — 11 апреля было официально объявлено о начале поставок процессора Pentium 4 Extreme Edition 840. AMD не заставила себя долго ждать и уже 21 апреля ознакомила публику с тремя серверными двуядерными процессорами Opteron, а также представила новую торговую марку — Athlon 64 X2, под которой уже 9 мая были официально презентованы двуядерные процессоры для настольных ПК. Переход на двуядерную архитектуру обусловлен тем, что традиционные методы по увеличению производительности практически исчерпали себя. Из-за ряда технологических проблем темпы наращивания тактовых частот в последнее время заметно замедлились. К примеру, в последний год перед появлением двуядерных процессоров компания Intel смогла нарастить частоты своих CPU лишь на 400 МГц, а конкуренты от AMD ускорились всего на 200 МГц. Как видим, рост тактовых частот дается нелегко. А другие методы, такие как увеличение скорости шины и размера кэш-памяти, ощутимого прироста производительности не дают. Поэтому понятно, почему именно внедрение двуядерных процессоров оказалось наиболее логичным шагом на пути к новым вершинам быстродействия и ознаменовало начало новой эры в развитии процессорного рынка. Что же представляет собой двуядерный процессор? На первый взгляд это просто два процессора, объединенных в общем корпусе. Но не все так просто. Во-первых, нужно различать термины «процессор» и «процессорное ядро». Во-вторых, существует проблема общих ресурсов, доступ к которым нужно распределять между двумя ядрами. Если же посмотреть с точки зрения программного обеспечения, то двуядерный процессор система рассматривает как два независимых. Понятно, что двуядерный процессор способен одновременно выполнять два потока инструкций, в то время как обычный CPU производит вычисления строго по очереди. До этого уже была произведена попытка разделить выполняемые инструкции — речь идет о технологии Intel Hyper-Threading. Вот только в ней два «виртуальных» процессора почти во всем разделяют между собой ресурсы одного «физического» процессора (кэши, конвейер, исполнительные устройства). Практически все ресурсы общие — и если они уже заняты одним из выполняющихся потоков, то второй будет вынужден ожидать их освобождения. По сути, принцип работы процессора с Hyper-Threading похож на принцип работы многозадачной операционной системы, только происходит это не на программном, а на аппаратном уровне. Разделение потока на две части, как правило, позволяет эффективнее загрузить исполнительные устройства процессора. И при этом немного облегчить операционной системе задачу имитации множества независимых компьютеров на одном существующем процессоре. Полноценный двуядерный процессор — совсем другое дело. В этом случае система определяет действительно два «честных» процессорных ядра. И прирост производительности при этом составляет уже не 10-20% (средний показатель для процессора с технологией Hyper-Threading), а все 80-90% и даже больше (естественно, при использовании обоих ядер). В принципе, двуядерный процессор представляет собой SMP-систему (SMP — Symmetric MultiProcessing, симметричная многопроцессорная обработка; термин, обозначающий систему с несколькими равноправными процессорами). По сути своей он не отличается от обыкновенной двухпроцессорной системы, в которой установлено два независимых процессора. В результате мы получаем все преимущества двухпроцессорных систем без необходимости использования сложных и дорогих двухпроцессорных материнских плат. Один из способов создать энергоэффективный процессор — это переход от одноядерной процессорной архитектуры к многоядерной. Дело в том, что многоядерные процессоры позволяют повышать производительность именно за счет увеличения IPC, то есть количества инструкций программного кода, обрабатываемых за каждый такт работы процессора. В идеале при переходе от одноядерной архитектуры процессора к двуядерной можно сохранить тот же уровень производительности, снизив тактовую частоту каждого из ядер почти вдвое. В реальности, конечно, все несколько сложнее — результат будет зависеть от используемого приложения и его оптимизации к двуядерному процессору. То есть, чтобы приложение могло одновременно задействовать несколько процессорных ядер, оно должно хорошо распараллеливаться. Если же программный код написан таким образом, что подразумевает только последовательное выполнение инструкций, от многоядерности проку не будет. Для того чтобы продемонстрировать, как именно масштабируется производительность многоядерного процессора в зависимости от оптимизации программного кода к многоядерной архитектуре, рассмотрим следующий пример. Имеется многоядерный процессор с количеством ядер равным n. Предположим, что на этом процессоре выполняется программа, включающая N инструкций программного кода, причем S инструкций этого кода может выполняться только последовательно друг за другом, а P (равное N – S) инструкций являются программно независимыми друг от друга и могут выполняться одновременно на всех ядрах процессора. Обозначим через s (равное S / N) — долю инструкций, выполняемых последовательно, а через p (равное 1 – s) — долю инструкций, выполняемых параллельно. Рисунок 3 - Выполнение программного кода на одноядерном процессоре В случае применения одноядерного процессора (рисунок 4) время, затрачиваемое на выполнение всего программного кода, составит: t1 = N / IPS (3.1) В случае использования n-ядерного процессора (рисунок 1) время, затрачиваемое на выполнение всего программного кода, окажется меньше за счет параллельного выполнения P команд на n ядрах процессора и составит: (3.2) Поскольку приростом производительности в данном случае можно считать сокращение времени выполнения программы при использовании многоядерного процессора по сравнению со временем выполнения той же программы при применении одноядерного процессора, то есть t1 / tn, получим, что прирост производительности составит: (3.3) Графическая зависимость прироста производительности от числа ядер процессора показана на рисунке 5. Рисунок 4 - Выполнение программного кода на многоядерном процессоре Как видно из приведенной формулы, прирост производительности в случае многоядерной архитектуры процессора в большой степени зависит от оптимизации приложения к многоядерной архитектуре, то есть от его способности распараллеливаться. К примеру, даже в случае, когда 90% программного кода распараллеливается на несколько исполнительных ядер, использование четырехъядерного процессора позволяет получить только трехкратный прирост производительности в сравнении с одноядерной архитектурой процессора. Рисунок 5 - Зависимость прироста производительности от числа ядер процессора Рассмотренный пример представляет собой идеальную ситуацию, но в реальности все несколько сложнее, тем не менее, основная идея остается неизменной: использование многоядерных процессоров требует внесения кардинальных изменений в программное обеспечение. До сих пор, обсуждая прирост производительности, который можно получить при переходе от одноядерной к многоядерной архитектуре, мы рассматривали только одно приложение. Тем не менее, многоядерные процессоры позволяют ощутить существенный прирост производительности при одновременной работе нескольких приложений. В идеальном случае каждое приложение может исполняться на отдельном ядре процессора независимо от других приложений. К примеру, можно параллельно конвертировать видеофайлы, играть в игры и т.п. Многоядерная архитектура процессоров позволяет одновременно решать две глобальные задачи: увеличивать производительность процессоров и одновременно создавать энергоэффективные процессоры. Конечно, многоядерная архитектура — это лишь один из рецептов создания высокопроизводительных энергоэффективных процессоров. Для создания действительно энергоэффективного многоядерного процессора необходимо, чтобы каждое его ядро было оптимизировано для многоядерной архитектуры и к тому же было энергоэффективным. К примеру, двухъядерные процессоры Intel, основанные на архитектуре NetBurst (семейство Intel Pentium D), позволяют лишь частично решить проблему повышения энергоэффективности. Дело в том, что микроархитектура каждого ядра процессора семейства Intel Pentium D оптимизирована под масштабирование тактовой частоты и не является энергоэффективной. Другим подходом к повышению производительности в рамках заданного энергопотребления является переход на принципиально иную микроархитектуру ядра. Отметим, что данный подход не противоречит идее многоядерности, а скорее дополняет ее. 4. Виртуализация Виртуализация в вычислениях — процесс представления набора вычислительных ресурсов, или их логического объединения, который даёт какие-либо преимущества перед оригинальной конфигурацией. Это новый виртуальный взгляд на ресурсы, не ограниченных реализацией, географическим положением или физической конфигурацией составных частей. Обычно виртуализированные ресурсы включают в себя вычислительные мощности и хранилище данных. Примером виртуализации являются симметричные мультипроцессорные компьютерные архитектуры, которые используют более одного процессора. Операционные системы обычно конфигурируются таким образом, чтобы несколько процессоров представлялись как единый процессорный модуль. Вот почему программные приложения могут быть написаны для одного логического (виртуального) вычислительного модуля, что значительно проще, чем работать с большим количеством различных процессорных конфигураций. Программная виртуализация: Динамическая трансляция - При динамической трансляции (бинарной трансляции) проблемные команды гостевой OC перехватываются гипервизором. После того как эти команды заменяются на безопасные, происходит возврат управления гостевой ОС. Паравиртуализация — техника виртуализации, при которой гостевые операционные системы подготавливаются для исполнения в виртуализированной среде, для чего их ядро незначительно модифицируется. Операционная система взаимодействует с программой Гипервизора, который предоставляет ей гостевой API, вместо использования напрямую таких ресурсов, как таблица страниц памяти. Метод паравиртуализации позволяет добиться более высокой производительности, чем метод динамической трансляции. Метод паравиртуализации применим лишь в том случае, если гостевые ОС имеют открытые исходные коды, которые можно модифицировать согласно лицензии. Аппаратная виртуализация: а) Упрощение разработки программных платформ виртуализации за счет предоставления аппаратных интерфейсов управления и поддержки виртуальных гостевых систем. Это уменьшает трудоемкость и время на разработку систем виртуализации. б) Возможность увеличения быстродействия платформ виртуализации. Управление виртуальными гостевыми системами осуществляет напрямую небольшой промежуточный слой программного обеспечения, гипервизор, что дает увеличение быстродействия. в) Улучшается защищённость, появляется возможность переключения между несколькими запущенными независимыми платформами виртуализации на аппаратном уровне. Каждая из виртуальных машин может работать независимо, в своем пространстве аппаратных ресурсов, полностью изолированно друг от друга. Это позволяет устранить потери быстродействия на поддержание хостовой платформы и увеличить защищенность. г) Гостевая система становится не привязана к архитектуре хостовой платформы и к реализации платформы виртуализации. Технология аппаратной виртуализации делает возможным запуск 64-битных гостевых систем на 32-битных хостовых системах (с 32-битными средами виртуализации на хостах). Реализации: IBM System 370, VM/370 — 60-е года. На виртуальных системах IBM VM были отработаны идеи и технологии, во многом определившие архитектуры современных решений по виртуализации; VMware; Xen; KVM. Технологии: V86 mode — старая; Intel VT (VT-x) — Intel Virtualization Technology for x86; AMD Pacific. 5. Кратко о некоторых других технологиях а) Intel Turbo Boost – при необходимости позволяет работающим ядрам повышать тактовую частоту (с шагом 133 МГц) до максимально возможной по тепловой защите. Неиспользуемые ядра могут программно переводиться в режим нулевого энергопотребления. б) Технология Intel Smart Cache обеспечивает высокую производительность и эффективность кэш-памяти, оптимизирована для самых современных многопоточных игр. в) Технология Intel QuickPath Interconnect разработана для повышения пропускной способности и снижения задержек в процессе обмена. С процессорами Extreme Edition она позволяет достигнуть суммарных скоростей передачи данных до 25,6 ГБ/с. г) Технология Intel HD Boost значительно повышает производительность в мультимедийных задачах. Команды из наборов дополнительных инструкций выполняются за один тактовый цикл, позволяя достичь нового уровня эффективности с приложениями, оптимизированными для набора команд SSE4. 6. Будущие технологии Оптические компьютеры - Процессоры, в которых вместо электрических сигналов обработке подвергаются потоки света (фотоны, а не электроны).Квантовые компьютеры - Процессоры, работа которых всецело базируется на квантовых эффектах. В настоящее время ведутся работы над созданием рабочих версий квантовых процессоров.Молекулярные компьютеры — вычислительные системы, использующие вычислительные возможности молекул (преимущественно, биологических). Молекулярными компьютерами используется идея вычислительных возможностей расположения атомов в пространстве.Библиографический список Леонтьев, П.В. Новейший самоучитель работы на компьютере / П.В. Леонтьев М.: ОЛМА Медиа Групп, 2008. 528 с. http://www.ixbt.com/cpu/x86-cpu-faq-2006.shtml http://www.thg.ru/cpu/intel_cpu_history/index.html http://ru.wikipedia.org/wiki/Pentium http://rpnyamal.ru/?page_id=3 http://www.compress.ru/article.aspx?id=16962&iid=786 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|