что такое code memory

code memory

Смотреть что такое «code memory» в других словарях:

Memory barrier — Memory barrier, also known as membar or memory fence or fence instruction, is a type of barrier and a class of instruction which causes a central processing unit (CPU) or compiler to enforce an ordering constraint on memory operations issued… … Wikipedia

Memory bandwidth — is the rate at which data can be read from or stored into a semiconductor memory by a processor. Memory bandwidth is usually expressed in units of bytes/second, though this can vary for systems with natural data sizes that are not a multiple of… … Wikipedia

Code 46 — film poster Directed by Michael Winterbottom Produced by … Wikipedia

Memory disambiguation — is a set of techniques employed by high performance out of order execution microprocessors that execute memory access instructions (loads and stores) out of program order. The mechanisms for performing memory disambiguation, implemented using… … Wikipedia

Code Age Commanders: Tsugu Mono Tsuga Reru Mono — Developer(s) Square Enix Publisher(s) Square Enix Director(s) … Wikipedia

Memory protection — is a way to control memory access rights on a computer, and is a part of most modern operating systems. The main purpose of memory protection is to prevent a process from accessing memory that has not been allocated to it. This prevents a bug… … Wikipedia

Code injection — is the exploitation of a computer bug that is caused by processing invalid data. Code injection can be used by an attacker to introduce (or inject ) code into a computer program to change the course of execution. The results of a code injection… … Wikipedia

Code of Personal Status (Tunisia) — The Code of Personal Status (CPS) (Arabic: مجلة الأحوال الشخصية‎) is a series of progressive Tunisian laws aiming at the institution of equality between women and men in a number of areas. It was promulgated by beylical decree on August 13, 1956… … Wikipedia

Memory ordering — is a group of properties of the modern microprocessors, characterising their possibilities in memory operations reordering. It is a type of out of order execution. Memory reordering can be used to fully utilize different cache and memory banks.… … Wikipedia

Memory management — is the act of managing computer memory. The essential requirement of memory management is to provide ways to dynamically allocate portions of memory to programs at their request, and freeing it for reuse when no longer needed. This is critical to … Wikipedia

Memory segmentation — is the division of computer memory into segments or sections. Segments or sections are also used in object files of compiled programs when they are linked together into a program image, or the image is loaded into memory. In a computer system… … Wikipedia

Источник

Как исправить Windows Stop Code Memory Management BSOD

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

Иногда коды остановки выдают очень специфические ошибки. В других случаях вам, возможно, придется поработать с рядом исправлений Windows 10. Остановочный код Windows 10 «Управление памятью» включает последнее.

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

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

Управление памятью в Windows жизненно важно, чтобы ваша операционная система работала нормально. Управление памятью — это функция, которая управляет вашей системной памятью. (Я слышал, вы говорите: «Ага, Гэвин, это в названии!») Однако правильное управление памятью жизненно важно для здоровья вашей системы.

Когда управление памятью идет не так, ваша система начнет регулярно показывать BSOD. Вот почему:

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

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

Ошибка синего экрана управления памятью

Проще говоря, BSOD управления памятью означает, что произошла критическая ошибка управления памятью. Код остановки BSOD управления памятью — 0x0000001A. Есть несколько хорошо известных причин ошибок управления памятью:

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

Так как же это исправить? Вот несколько вещей, которые вы можете попробовать.

1. Перезагрузите компьютер.

Вы пробовали выключить компьютер и снова включить? Это простое исправление может исправить всевозможные проблемы Windows 10, включая код остановки управления памятью Windows 10.

2. Обновите Windows 10.

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

Как управлять Центром обновления Windows в Windows 10

Для фанатов контроля Центр обновления Windows — кошмар. Он работает в фоновом режиме и обеспечивает безопасность и бесперебойную работу вашей системы. Мы покажем вам, как это работает и что вы можете настроить.

Нажмите клавишу Windows + I, чтобы открыть панель настроек. Теперь перейдите в Обновление и безопасность, затем проверьте в Центре обновления Windows наличие ожидающих обновлений. Если есть обновление, сохраните все важные файлы и нажмите «Перезагрузить сейчас». Ваша система перезагрузится во время процесса.

3. Запустите средство диагностики памяти Windows 10.

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

Введите «Диагностика памяти Windows» в строку поиска меню «Пуск» и выберите наиболее подходящий. У вас есть два варианта: немедленно перезагрузиться и запустить утилиту или настроить запуск утилиты после следующей перезагрузки. Поскольку вы пытаетесь исправить ошибки BSOD, связанные с управлением памятью, сохраните все важные документы и немедленно перезагрузите систему. Диагностика памяти Windows запускается сразу после перезагрузки.

Однако файл журнала не отображается после того, как вы снова загрузитесь в Windows 10. Нажмите клавишу Windows + X и выберите Просмотр событий в меню питания. В средстве просмотра событий выберите Просмотр событий (локальный)> Журналы Windows> Система. Затем в правом столбце выберите Найти и введите в поле MemoryDiagnostic. Нажмите «Найти далее». Результаты вашей диагностики отобразятся в нижней части окна.

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

4. Запустите MemTest86.

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

MemTest86 — это бесплатный автономный инструмент для тестирования памяти для компьютеров x86. Вы загружаете MemTest86 с USB-накопителя (или загрузочного диска) и оставляете его для проверки вашей системной RAM. Теперь проверка RAM MemTest86 занимает много времени; один проход занимает часы, в зависимости от объема установленной ОЗУ.

Хотите попробовать? Ознакомьтесь с разделом «Шаг 7: проверьте свою оперативную память с помощью MemTest86» в нашем руководстве по исправлению неисправимой ошибки WHEA. В нем есть все необходимые инструкции!

5. Обновите драйверы

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

Нажмите Windows Key + I, чтобы открыть панель настроек, затем выберите Обновление и безопасность> Просмотреть историю обновлений. Здесь вы можете найти любые обновления драйверов. Теперь введите диспетчер устройств в строке поиска меню «Пуск» и выберите наиболее подходящий. Прокрутите список и проверьте наличие символа ошибки. Если ничего нет, скорее всего, причина проблемы не в статусе вашего драйвера.

Тем не менее, вы можете использовать сторонний инструмент для одновременного обновления всех системных драйверов. Ознакомьтесь с этим списком бесплатных инструментов, которые вы можете использовать для решения большинства проблем Windows. Первые два варианта — Driver Booster и Snappy Driver Installer от IOBit — делают именно это.

6. Обновите драйверы графического процессора.

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

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

Если вы не знаете, какой графический процессор вы используете, введите dxdiag в строке поиска меню «Пуск» и выберите «Лучшее совпадение». Когда откроется средство диагностики DirectX, выберите вкладку «Экран». Здесь вы найдете свой графический процессор.

Владельцы графических процессоров Nvidia также могут установить Nvidia GeForce Experience, но стоит ли это того?

7. Запустите CHKDSK.

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

Введите командную строку в строке поиска меню «Пуск», затем щелкните правой кнопкой мыши наиболее подходящий вариант и выберите «Запуск от имени администратора». (Или нажмите клавиши Windows + X, затем выберите в меню Командная строка (администратор).)

Затем введите chkdsk / r и нажмите Enter. Команда просканирует вашу систему на наличие ошибок и исправит любые проблемы в процессе.

8. Запустите SFC.

Управление памятью все еще происходит? Проверка системных файлов — это еще один системный инструмент Windows, который проверяет отсутствие и повреждение системных файлов Windows. Похоже на CHKDSK, правда? Что ж, SFC специально проверяет системные файлы Windows, а CHKDSK сканирует весь ваш диск на наличие ошибок.

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

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

9. Переустановите оборудование вашей системы.

И последнее, но не менее важное: физически проверьте оборудование вашей системы. Вы недавно перенесли свою систему? Есть небольшая вероятность того, что ваше оборудование отключится во время процесса. Шанс небольшой, но стоит проверить!

10. Сброс Windows 10 (последнее средство)

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

Зайдите в «Настройки»> «Обновление и безопасность»> «Восстановление», затем в разделе «Сбросить этот компьютер» выберите «Начать». Ваша система перезагружается, как только вы нажимаете кнопку, поэтому обязательно заранее сделайте резервную копию всех важных файлов. Ваша система перезагрузится, после чего вы можете выбрать «Сохранить мои файлы» или «Удалить все».

Исправлена ​​ошибка кода остановки управления памятью

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

Чтобы узнать о более конкретном исправлении, ознакомьтесь с нашим руководством по устранению неполадок «внутренней ошибки планировщика видео».

8 неприятных проблем с Windows 10 и способы их решения

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

что такое code memory. Смотреть фото что такое code memory. Смотреть картинку что такое code memory. Картинка про что такое code memory. Фото что такое code memory

Гэвин — старший писатель MUO. Он также является редактором и SEO-менеджером дочернего сайта MakeUseOf, ориентированного на криптовалюту, Blocks Decoded. У него есть степень бакалавра (с отличием) в области современного письма с использованием методов цифрового искусства, разграбленных на холмах Девона, а также более десяти лет профессионального писательского опыта. Он любит много чая.

Подробнее о Гэвине Филлипсе Подпишитесь на нашу рассылку

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

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

Источник

Черный квадрат. Насколько глубоко QR-коды проникнут в нашу жизнь

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

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

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

что такое code memory. Смотреть фото что такое code memory. Смотреть картинку что такое code memory. Картинка про что такое code memory. Фото что такое code memoryФото: Александр Кряжев/РИА Новости

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

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

Нет, ну теперь-то, кажется, это начали исправлять. QR-коды появятся в законодательстве. И хотя авторы обещают, что формально вводить их будут региональные власти, все понимают степень самостоятельности губернаторов. Так же как и понимают, что режим будет действовать не для всех — всегда будут специальные рестораны для специальных людей, которых будут обслуживать без всяких кодов. Есть ли QR-коды у наших министров и президента? Коды — самая короткая дорога к сегрегации, аналог «оранжевых штанов».

Возникнет ли здесь также и мелкая низовая коррупция, система блата или «черный рынок» поддельных QR-кодов? Безусловно, возникнет. Каждый вахтер, проводник или бармен приравнивается к инспектору ГИБДД. Власть жестом сеятеля делегирует полномочия неопределенному кругу лиц, и это в ином случае называется анархией.

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

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

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

Системой кодов можно в принципе заменить весь аппарат, предназначенный для общения граждан с властью. В Китае уже ведь вовсю идет эксперимент с «социальным рейтингом», чем мы хуже. А можно и дальше пойти: недавно, например, депутаты проговорились о горячем желании сделать геномную экспертизу обязательной не только для мигрантов и преступников, но и для всех россиян поголовно. Давайте же привяжем ее к QR-кодам, и пусть государство контролирует нашу ДНК. Хочешь, допустим, жениться — покажи код, все ли с тобой в порядке, здоровое ли дашь потомство.

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

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

А что вы думаете об этом? Обсудить тему и поспорить с автором теперь можно в комментариях к материалу.

Больше текстов о политике и обществе — в нашем телеграм-канале «Проект “Сноб” — Общество». Присоединяйтесь

Источник

memory code

запоминаемый код
Код, вводимый вручную с помощью клавиатуры, кодовых переключателей или других подобных устройств.
[РД 25.03.001-2002]

Тематики

Смотреть что такое «memory code» в других словарях:

Memory barrier — Memory barrier, also known as membar or memory fence or fence instruction, is a type of barrier and a class of instruction which causes a central processing unit (CPU) or compiler to enforce an ordering constraint on memory operations issued… … Wikipedia

Memory bandwidth — is the rate at which data can be read from or stored into a semiconductor memory by a processor. Memory bandwidth is usually expressed in units of bytes/second, though this can vary for systems with natural data sizes that are not a multiple of… … Wikipedia

Code 46 — film poster Directed by Michael Winterbottom Produced by … Wikipedia

Memory disambiguation — is a set of techniques employed by high performance out of order execution microprocessors that execute memory access instructions (loads and stores) out of program order. The mechanisms for performing memory disambiguation, implemented using… … Wikipedia

Code Age Commanders: Tsugu Mono Tsuga Reru Mono — Developer(s) Square Enix Publisher(s) Square Enix Director(s) … Wikipedia

Memory protection — is a way to control memory access rights on a computer, and is a part of most modern operating systems. The main purpose of memory protection is to prevent a process from accessing memory that has not been allocated to it. This prevents a bug… … Wikipedia

Code injection — is the exploitation of a computer bug that is caused by processing invalid data. Code injection can be used by an attacker to introduce (or inject ) code into a computer program to change the course of execution. The results of a code injection… … Wikipedia

Code of Personal Status (Tunisia) — The Code of Personal Status (CPS) (Arabic: مجلة الأحوال الشخصية‎) is a series of progressive Tunisian laws aiming at the institution of equality between women and men in a number of areas. It was promulgated by beylical decree on August 13, 1956… … Wikipedia

Memory ordering — is a group of properties of the modern microprocessors, characterising their possibilities in memory operations reordering. It is a type of out of order execution. Memory reordering can be used to fully utilize different cache and memory banks.… … Wikipedia

Memory management — is the act of managing computer memory. The essential requirement of memory management is to provide ways to dynamically allocate portions of memory to programs at their request, and freeing it for reuse when no longer needed. This is critical to … Wikipedia

Memory segmentation — is the division of computer memory into segments or sections. Segments or sections are also used in object files of compiled programs when they are linked together into a program image, or the image is loaded into memory. In a computer system… … Wikipedia

Источник

Оптимизация кода: память

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

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

что такое code memory. Смотреть фото что такое code memory. Смотреть картинку что такое code memory. Картинка про что такое code memory. Фото что такое code memory

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

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

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

На написание этой статьи меня вдохновила шестая глава из книги Computer Systems: A Programmer’s Perspective. В другой статье из этой серии, «Оптимизация кода: процессор», мы также боремся за такты процессора.

Память тоже имеет значение

Рассмотрим две функции, которые суммируют элементы матрицы. Они практически одинаковы, только первая функция обходит элементы матрицы построчно, а вторая — по столбцам.

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

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

Иерархия памяти

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

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

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

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

Современная система имеет примерно такие характеристики:

Тип кэшаВремя доступа (тактов)Размер кэша
Регистры0десятки штук
L1 кэш432 KB
L2 кэш10256 KB
L3 кэш508 MB
Оперативная память2008 GB
Буфер диска100’00064 MB
Локальный диск10’000’0001000 GB
Удалённые сервера1’000’000’000

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

Допустим, ваш компьютер имеет 8 ГБ оперативной памяти и диск размером 1000 ГБ. Но подумайте, что вы не работаете со всеми данными на диске в один момент. Вы загружаете операционную систему, открываете веб-браузер, текстовый редактор, пару-тройку других приложений и работаете с ними несколько часов. Все эти приложения помещаются в оперативной памяти, поэтому вашей системе не нужно обращаться к диску. Потом, конечно, вы закрываете одно приложение и открываете другое, которое приходится загрузить с диска в оперативную память. Но это занимает пару секунд, после чего вы несколько часов работаете с этим приложением, не обращаясь к диску. Вы не особо замечаете медленный диск, потому что в один момент вы работаете только с небольшим бъёмом данных, которые кэшируются в оперативной памяти. Вам нет смысла тратить огромные деньги на установку 1024 ГБ оперативной памяти, в которую можно было бы загрузить содержимое всего диска. Если бы вы это сделали, вы бы почти не заметили никакой разницы в работе, это было бы «деньги на ветер».

Так же дело обстоит и с маленькими кэшами процессора. Допустим вам нужно выполнить вычисления над массивом, который содержит 1000 элементов типа int. Такой массив занимает 4 КБ и полностью помещается в кэше первого уровня размером 32 КБ. Система понимает, что вы начали работу с определённым куском оперативной памяти. Она копирует этот кусок в кэш, и процессор быстро выполняет действия над этим массивом, наслаждаясь скоростью кэша. Потом изменённый массив из кэша копируется назад в оперативную память. Увеличение скорости оперативной памяти до скорости кэша не дало бы ощутимого прироста в производительности, но увеличило бы стоимость системы в сотни и тысячи раз. Но всё это верно только если программы имеют хорошую локальность.

Локальность

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

Рассмотрим, программу, которая суммирует элементы массива:

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

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

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

Желательно обходить массив последовательно, читая его элементы один за другим. Если нужно обойти элементы матрицы, то лучше обходить матрицу построчно, а не по столбцам. Это даёт хорошую пространственную локальность. Теперь вы можете понять, почему функция matrixsum2 работала медленнее функции matrixsum1. Двумерный массив расположен в памяти построчно: сначала расположена первая строка, сразу за ней идёт вторая и так далее. Первая функция читала элементы матрицы построчно и двигалась по памяти последовательно, будто обходила один большой одномерный массив. Эта функция в основном читала данные из кэша. Вторая функция переходила от строки к строке, читая по одному элементу. Она как бы прыгала по памяти слева-направо, потом возвращалась в начало и опять начинала прыгать слева-направо. В конце каждой итерации она забивала кэш последними строками, так что в начале следующей итерации первых строк кэше не находила. Эта функция в основном читала данные из оперативной памяти.

Дружелюбный к кэшу код

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

Вычисления над матрицами очень важны в приложениях анализа сигналов и научных вычислениях. Если перед программистами встанет задача написать функцию перемножения матриц, то 99.9% из них напишут её примерно так:

Этом код дословно повторяет математическое определение перемножения матриц. Мы обходим все элементы окончательной матрицы построчно, вычисляя каждый из них один за другим. В коде есть одна неэффективность, это выражение B[k][j] в самом внутреннем цикле. Мы обходим матрицу B по стобцам. Казалось бы, ничего с этим не поделаешь и придётся смириться. Но выход есть. Можно переписать то же вычисление по другому:

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

Блокинг

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

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

Блокинг появляется естественным образом. Представьте перед собой большую квадратную матрицу. Теперь иссеките эту матрицу горизонтальными и вертикальными линиями, чтобы разбить её, скажем, на 16 равных блока (четыре строки и четыре столбца). Выберите два любых симметричных блока. Обратите внимание, что все элементы в одном блоке имеют свои симметричные элементы в другом блоке. Это наводит на мысль, что ту же операцию можно совершать над этими блоками поочерёдно. В этом случае на каждом этапе мы будем работать только с двумя блоками. Если блоки сделать достаточно маленького размера, то они поместятся в кэше высокого уровня. Выразим эту идею в коде:

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

На машине с процессором Core i7 Haswell вторая функция не выполняется быстрее. На машине с более простым процессором Pentium 2117U вторая функция выполняется в 2 раза быстрее. На машинах, которые не выполняют предвыборку, производительность улучшилась бы ещё сильнее.

Какие алгоритмы быстрее

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

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

Допустим, очередь длиной 1000 элементов мы реализовали обоими способами. И нам нужно вставить элемент в середину очереди. Элементы списка хаотично разбросаны по памяти, поэтому чтобы обойти 500 элементов, нам понадобится 500*200=100’000 тактов. Массив расположен в памяти последовательно, что позволит нам наслаждаться скоростью кэша первого уровня. Используя несколько оптимизаций, мы можем двигать элементы массива, тратя 1-4 такта на элемент. Мы сдвинем половину массива максимум за 500*4=2000 тактов. То есть быстрее в 50 раз.

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

Заключение

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

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

В частности, рекомендуются следующие техники:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *