Определить объем памяти, необходимый для хранения информации о 50 пользователях

Обновлено: 21.11.2024

Я пытаюсь получить от пользователя данные, которые программа будет запоминать при каждом запуске. Я хочу сделать это на C. Исходя из моих ограниченных знаний о компьютерах, это будет храниться в хранилище/жестком диске/ssd вместо ОЗУ/памяти. Я знаю, что мог бы использовать базу данных или писать в текстовый файл, но я не хочу использовать внешний файл или базу данных, так как я думаю, что база данных для этого немного излишняя, а внешний файл можно испортить. пользователем. Как я могу это сделать (заставить пользователя ввести ввод один раз, а программа запомнить его навсегда)? Спасибо! (Если кому-то нужно, чтобы я разъяснил свой вопрос, я был бы рад это сделать, и когда я получу ответ, я уточню этот вопрос для будущих пользователей.)

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

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

@Serket Они используют любой формат файла, который хотели разработчики. Вы пишете программу, поэтому вы можете создать любую логику, которую хотите читать/писать из файла, например, текстовые представления, сериализацию, protobuf и т. д. Вы можете поместить ее в скрытый домашний каталог в Linux или AppData в Windows.< /p>

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

4 ответа 4

Люди делали это разными способами. В порядке от лучшего к худшему (на мой взгляд):

  1. Используйте реестр или его аналог. Вот для чего он нужен.
  2. Используйте переменную среды. IMO, это подвержено ошибкам и может быть не совсем тем, что вам нужно.
  3. Сохраните файл на компьютере пользователя. Легко и просто.
  4. Сохранение файла на сервере и чтение/запись на сервер по сети. Раздражает, что приходится пользоваться сетью, но ладно.
  5. Измените свой собственный двоичный файл на диске. Это весело как опыт обучения, но обычно не рекомендуется в рабочем коде. Тем не менее, иногда это можно сделать, особенно с помощью установщика.
  6. Создать фоновый процесс, который "никогда" не останавливается. Это намного хуже, чем использование файла.

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

Вы можете изменить свой двоичный файл, используя open , read и write . Трудная часть состоит в том, чтобы найти, в какие части безопасно писать, не испортив вашу программу. Это во многом будет зависеть от вашей операционной системы. Если вы можете использовать более документированный метод, такой как реестр, вам будет лучше.

Вы сказали, что это будет забавный опыт обучения, и это то, что я хотел получить от этого вопроса. Я готов принять вызов научиться делать это. С чего начать?

Какую операционную систему вы используете? Вы захотите узнать формат ваших исполняемых файлов, а затем найти библиотеку, которая может их анализировать. Например, в Windows вы ищете библиотеку модификаций PE. Я рекомендую pelib от Avast.

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

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

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

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

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

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

Если вы просто хотите где-нибудь спрятать свой файл для защиты от случайных пользователей (только), дайте ему неясное имя и сделайте файл скрытым, используя как атрибуты файловой системы, так и имя (в системах *nix с . в качестве первого символа имени). имя файла). (Насколько скрытым вы можете сделать это, может быть препятствовать разрешения и/или песочница, в зависимости от ОС.)

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

edit: В случае, если я угадал неправильно, и причина, по которой я хочу это сделать, состоит в том, чтобы просто сохранить «чистоту», просто сохраните его в обычной области «пользовательских настроек» платформы. Например, AppData или реестр в Windows, пользовательские значения по умолчанию или ~/Library/Application Support в macOS, «dotfile» в общих системах *nix и т. д. Не изменяйте само приложение по этой причине.

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

Темы в этом разделе включают следующее:

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

Рекомендации по размеру памяти

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

Хранящиеся данные должны занимать менее 50 % всей памяти

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

AnzoGraph резервирует 20% памяти для ОС

Чтобы избежать неожиданного завершения работы операционной системы Linux, конфигурация AnzoGraph по умолчанию оставляет 20 % памяти доступной для ОС; AnzoGraph не будет использовать более 80% всей доступной памяти. Учитывайте этот буфер памяти при расчете размера памяти.

Использование памяти может временно увеличиться во время загрузки

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

Использование памяти зависит от характеристик данных

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

  • Для хранения в памяти троек с целочисленными объектами, как в следующем примере, требуется около 16 байт.
  • Триплетам, состоящим из URI, как в следующем примере, требуется около 18 байтов для хранения в памяти.
  • Тройки с определяемыми пользователем типами данных (UDT), как в следующем примере, также требуют около 18 байтов для хранения в памяти.
  • Тройкам со значениями dateTime, как в следующем примере, требуется около 20 байтов для хранения в памяти.
  • Для хранения троек с длинными строками, как в следующем примере, в памяти требуется около 700 байт.

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

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

Установка AnzoGraph включает два примера набора данных: Tickit и TPCH. В совокупности наборы данных содержат около 110 миллионов троек. Данные поступают из структурированных источников данных, которые содержат множество URI, коротких строк и числовых значений, и все это может помочь уменьшить объем памяти, который требуется при загрузке в память. После загрузки данные занимают около 3 ГБ доступной памяти. Однако во время загрузки AnzoGraph использует до 7 ГБ памяти. С учетом того, что 20 % памяти зарезервировано для операционной системы, для загрузки всех 110 миллионов троек выборок требуется экземпляр с не менее чем 9 ГБ памяти, доступной во время загрузки. Учитывая, что пользователь может выполнять очень сложные запросы или расширенную аналитику ко всем данным, экземпляр с доступной памятью от 16 до 32 ГБ может быть оптимальным объемом системной памяти при работе с образцами данных или аналогичными наборами данных.

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

  • 340 ГБ в состоянии покоя
  • Более 900 ГБ для загрузки и выполнения запросов

Анализ файлов загрузки без загрузки данных

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

Примечание. Информацию об использовании команды LOAD для загрузки данных в память AnzoGraph см. в разделе Загрузка и выгрузка данных.

Важные аспекты анализа файлов загрузки

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

Синтаксис запроса анализа

Синтаксис, который вы используете для запросов загрузки файлов, зависит от типа файла. Например, для файлов в формате Triple или Quad, таких как файлы Turtle (.ttl), N-Triple (.n3 и .nt), N-Quad (.nq и .quads) и TriG (.trig), вы можете используйте следующий синтаксис:

URI в предложении FROM указывает расположение загружаемого файла или каталога файлов. Например, этот URI указывает один файл в локальной файловой системе:

В этом примере указывается каталог файлов:

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

Примечание. Примеры анализа файлов в других форматах, таких как файлы CSV, см. в разделе Анализ загружаемых файлов без загрузки данных в Руководстве пользователя и развертыванию AnzoGraph. Чтобы загрузить данные из базы данных СУБД, вы можете экспортировать данные таблицы в формат .CSV, а затем выполнить предварительный анализ соответствующих файлов .CSV. В настоящее время AnzoGraph не поддерживает предварительный анализ файлов XML или JSON.

Оценка требований к памяти на основе анализа предварительной загрузки

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

  1. Подсчитайте, сколько троек будет создано набором данных при сохранении в AnzoGraph.
  2. Умножьте количество троек на средний размер тройки.
  3. Добавьте количество символов, хранящихся во всех строках символов, содержащихся в наборе данных.

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

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

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

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

Обратите внимание, что вычисление общего количества 235 774 020 байт дает оценку хранения набора данных «в состоянии покоя» и учитывает только один набор данных, хранящийся в памяти. Таким образом, при выработке окончательных рекомендаций по общим требованиям к памяти для развертывания AnzoGraph вам необходимо учитывать любые другие наборы данных, которые вы, возможно, захотите загрузить в память одновременно. Вам также необходимо помнить о других рекомендациях по размеру памяти, например о том, что все загруженные данные не должны занимать более 50 % всей доступной оперативной памяти.

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

В C есть переменные разных типов данных, например int s, char s и float s. И они позволяют хранить данные.

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

Но на самом деле мы не всегда можем позволить себе роскошь иметь данные только одного типа. Вот где структура входит в картину. В этой статье мы узнаем больше о структурированных типах данных в C.

Содержание

А. Основы

Б. Распределение памяти

С. Указатели

Д. Функции

Э. Самореферентные структуры

Ф. Заключение

Давайте начнем?

Основы

1. Определение и декларация

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

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

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

Но если будет 20 или 100 студентов, будет сложно справиться с этими переменными.

Мы можем объявить структуру, используя ключевое слово struct, следуя приведенному ниже синтаксису:

Приведенный выше оператор определяет новый тип данных struct student . Каждая переменная этого типа данных будет состоять из имени[20], рулона, пола и меток[5]. Они известны как члены структуры.

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

Каждая переменная структуры student имеет свои копии членов.

Несколько важных моментов:

  1. Члены структуры не занимают память, пока не будет создана структурная переменная.
  2. Вы могли заметить, что мы также используем struct в качестве объявления переменной. Разве это не утомительно?

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

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

<р>3. Определение структуры и объявление переменной можно комбинировать, как показано ниже.

<р>4. Использование StructureName является необязательным. Приведенный ниже код полностью действителен.

<р>5. Структуры обычно объявляются в начале файла исходного кода, даже до определения функций (вы поймете, почему).

<р>6. C не позволяет инициализировать переменную внутри объявления структуры.

2. Инициализация и доступ к элементам структуры

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

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

Элементы можно инициализировать в объявлении переменной в любом порядке с помощью . .

Мы также можем инициализировать первые несколько элементов и оставить остальные пустыми.Однако неинициализированные элементы должны быть только в конце списка.

Неинициализированные целые числа и числа с плавающей запятой имеют значение по умолчанию 0 . Это \0 (NULL) для символов и строк.

3. Работа со структурной переменной

Как и переменные примитивных типов данных, мы не можем выполнять арифметические операции, такие как + , - , * , / и т. д. Точно так же операторы отношения и равенства нельзя использовать со структурными переменными.

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

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

4. Массив структуры

Вы уже видели, как нам пришлось создать 4 переменные типа struct student для хранения записей о 4 студентах.

Лучше было бы создать массив struct student (так же, как массив int s).

Чтобы получить доступ к элементам массива stu и членам каждого элемента, мы можем использовать циклы.

5. Вложенная структура

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

Структурная переменная дня рождения типа structbirth вложена внутрь struct student . Должно быть ясно, что нельзя вкладывать структурную переменную типа struct student внутрь struct student .

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

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

Распределение памяти

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

Здесь память будет выделена для имени[20], за которым следуют рулон, пол и отметки[5]. Это означает, что размер st1 или struct student будет равен сумме размеров его элементов, верно? Давайте проверим.

Поскольку оператор sizeof() возвращает long long unsigned int , используйте %I64d в качестве спецификатора формата. Возможно, вам придется использовать %llu или %lld в зависимости от вашего компилятора.

Использование %d выдаст предупреждение: формат '%d' ожидает аргумент типа 'int', но аргумент 2 имеет тип 'long long unsigned int'.

Использование оператора sizeof() дает на 3 байта больше, чем сумма размеров элементов. Почему? Где эти 3 байта в памяти?

Сначала ответим на второй вопрос. Мы можем распечатать адреса членов, чтобы найти адреса этих 3 байтов.

Мы видим, что массив markers[5] вместо выделения из 4225433 был выделен из 4224536 . Но почему?

1. Выравнивание данных

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

Процессор считывает одно слово за один цикл. Это слово составляет 4 байта для 32-битного процессора и 8 байтов для 64-битного процессора. Чем меньше число циклов, тем выше производительность процессора.

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

Выровненные адреса для некоторых типов данных

< td>double, long, * (указатели)
Типы данных Размер (в байтах) Адрес
char 1 кратное 1
короткое 2 кратно 2
int, float 4 кратно 4
8 кратное 8
long double 16 кратно 16

2. Отступы структуры

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

В приведенном выше примере 3 байта выступали в качестве заполнения. Без них метки[0], имеющие тип int (адрес, кратный 4), имели бы базовый адрес 4225433 (не кратный 4).

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

3. Выравнивание элементов структуры

Чтобы объяснить это, мы возьмем другой пример (вы поймете, почему).

Каков будет результат? Давайте применим то, что мы знаем.

i1 имеет размер 4 байта. За ним будет следовать дополнение из 4 байтов, потому что адрес d1 должен делиться на 8.

За этим следуют 8 и 1 байт соответственно для d1 и c1 . Таким образом, на выходе должно получиться 4 + 4 + 8 + 1 = 17 байт.

Что? Опять неправильно! Как? Благодаря массиву struct example мы можем лучше понять. Мы также напечатаем адреса членов примера2[0].

Предположим, что размер примера2[0] составляет 17 байт. Это означает, что адрес example2[1].i1 будет 4225425. Это невозможно, так как адрес int должен быть кратен 4.

Логически возможный адрес для примера2[1].i1 кажется равным 4225428 , кратному 4.

Это тоже неправильно. Ты знаешь почему? Адрес example2[1].d1 теперь будет ( 28 + 4 ( i1 ) + 3 ( padding)) 4225436, что не кратно 8.

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

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

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

В примере со структурой максимальный размер d1 — 8 байт. Таким образом, в конец структуры добавляется 7 байтов, что делает ее размер равным 24 байтам.

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

Хотя мы можем сократить циклы ЦП, значительный объем памяти будет потрачен впустую.

Один из способов уменьшить количество отступов до возможного минимума — объявить переменные-члены в порядке убывания их размера.

Если мы будем следовать этому в примере со структурой, размер структуры уменьшится до 16 байт. Заполнение уменьшается с 7 до 3 байт.

4. Упаковка структуры

Упаковка — это противоположность заполнения. Это предотвращает заполнение компилятором и удаляет нераспределенную память.

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

Указатели

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

1. Указатель как член

Структура также может иметь указатели в качестве элементов.

Использование . (оператор точки), мы снова можем получить доступ к членам. Поскольку адрес roll теперь равен alexRoll , нам придется разыменовать stu1.roll, чтобы получить значение (а не stu1.(*roll)).

2. Указатель на структуру

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

Здесь мы объявили указатель ptrStu1 типа struct student . Мы присвоили адрес stu1 ptrStu1 .

ptrStu1 хранит базовый адрес stu1, который является базовым адресом первого члена структуры. Увеличение на 1 увеличит адрес на sizeof(stu1) байт.

Мы можем получить доступ к элементам stu1 с помощью ptrStu1 двумя способами. Использование * (оператор косвенного обращения) или -> (инфиксный оператор или оператор стрелки).

С * мы будем продолжать использовать расширение . (оператор точки), тогда как с -> нам не понадобится оператор точки.

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

3. Указатель и массив структуры

Мы можем создать массив типа struct student и использовать указатель для доступа к элементам и их членам.

Обратите внимание, что ptrStu_type1 — это указатель на stu[0], а ptrStu_type2 — это указатель на весь массив из 10 struct student . Добавление 1 к ptrStu_type1 будет указывать на stu[1] .

Мы можем использовать ptrStu_type1 с циклом для обхода элементов и их членов.

Функции

1. Действуйте как участник

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

Мы объявили два члена: целое число i и указатель на функцию ptrMessage внутри структуры example . Указатель функции указывает на функцию, которая принимает целое число и возвращает значение void .

message — одна из таких функций. Мы инициализировали eg1 с помощью 6 и message . Затем мы используем . для вызова функции с помощью ptrMessage и передачи eg1.i .

2. Структура как аргумент функции

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

Обратите внимание, что структура struct student объявлена ​​вне функции main() в самом верху. Это делается для того, чтобы обеспечить глобальную доступность и возможность использования display().

Если структура определена внутри main() , ее область действия будет ограничена main() .

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

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

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

3. Структура как возвращаемая функция

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

ФункцияувеличитьBy5()увеличиваетотметки на 5 для предметов, у которых после повышения оценок она меньше или равна 100. Обратите внимание, что возвращаемый тип является структурной переменной типа struct student .

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

Указатель структуры также может быть возвращен функцией.

Обратите внимание, что мы динамически выделили память для прямоугольника структуры size с помощью malloc() . Поскольку он возвращает указатель void, мы должны привести его тип к указателю прямоугольника структуры.

Самореферентная структура

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

Самореферентные структуры — это структуры, которые имеют указатель(и) структуры того же типа, что и их член(ы).

Это самореферентная структура, где next является указателем структуры типа struct student.

Теперь мы создадим две структурные переменные stu1 и stu2 и инициализируем их значениями. Затем мы сохраним адрес stu2 в следующем члене stu1 .

Теперь мы можем получить доступ к членам stu2, используя stu1 и next .

Предположим, нам нужна другая структурная переменная после stu1 , то есть вставьте другую структурную переменную между stu1 и stu2 . Это можно сделать легко.

Теперь stu1.next хранит адрес stuBetween. А stuBetween.next имеет адрес stu2. Теперь мы можем получить доступ ко всем трем структурам с помощью stu1 .

Обратите внимание, как мы сформировали связь между stu1 , stuBetween и stu3 . Мы обсудили здесь отправную точку связанного списка.

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

Заключение

Готово! Мы рассмотрели все, от определения структуры до использования самореферентных структур.

Постарайтесь резюмировать все прочитанные подтемы. Если вы их помните, молодцы! Прочтите еще раз те, которые не можете вспомнить.

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

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

Что такое оперативная память?

Оперативная память (ОЗУ) – это аппаратный компонент, используемый для хранения временных данных программ, работающих на компьютерах, смартфонах, игровых консолях и других устройствах.В операционных системах (таких как Windows и macOS) должен быть установлен определенный объем памяти только для загрузки.

Что делает оперативная память?

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

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

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

Сколько оперативной памяти вам нужно?

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

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

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

Достаточно ли 2 ГБ ОЗУ?

С 2 ГБ ОЗУ у вас будет достаточно памяти для выполнения самых простых задач, таких как использование Microsoft Word и Excel, открытие нескольких вкладок при просмотре веб-страниц или игра в очень недорогие игры. Однако вы можете запускать только одну или две программы одновременно, прежде чем ваше устройство начнет работать медленнее.

Имейте в виду, что 2 ГБ оперативной памяти — это минимум, необходимый для запуска 64-разрядной версии Windows 10. Таким образом, если у вас всего 2 ГБ оперативной памяти, ваш компьютер будет работать очень медленно и вяло. Например, мы использовали более 2 ГБ ОЗУ на ноутбуке с 64-разрядной ОС Windows 10 без запуска каких-либо программ или подключенных устройств.

Достаточно ли 4 ГБ ОЗУ?

С 4 ГБ ОЗУ у вас достаточно памяти для одновременного запуска нескольких легких программ. Вы можете открывать несколько вкладок браузера, выполнять базовое редактирование изображений или видео, играть в недорогие игры и транслировать музыку или видео в Интернете.

Например, мы постоянно использовали более 4 ГБ ОЗУ, просто открывая 10 вкладок в веб-браузере Chrome при работе с Microsoft Word (и диспетчером задач). Однако ваша система может справиться с этими задачами с меньшим объемом памяти, если у вас лучшее оборудование или если вы включите определенные настройки.

В наши дни даже малобюджетные компьютеры и ноутбуки поставляются с предустановленной оперативной памятью не менее 4 ГБ. Если на вашем компьютере всего 2 ГБ памяти, обновление до 4 ГБ памяти будет похоже на день и ночь. Однако важно отметить, что старые 32-разрядные компьютеры не могут поддерживать более 4 ГБ ОЗУ.

Достаточно ли 8 ГБ ОЗУ?

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

В настоящее время на многих компьютерах или ноутбуках с Windows 10 и macOS установлено 8 ГБ памяти. Таким образом, 8 ГБ памяти должно быть более чем достаточно для запуска большинства программ повышения производительности. Это также минимальный объем памяти, рекомендуемый Adobe для запуска программ Creative Cloud, таких как Photoshop.

Хотя 8 ГБ ОЗУ более чем достаточно для большинства людей, вы можете легко использовать ее, если в вашем веб-браузере открыты десятки вкладок и вы одновременно запускаете несколько программ. Например, мы израсходовали более 8 ГБ памяти на ноутбуке, открыв 50 вкладок в Chrome при одновременном запуске Photoshop, PowerPoint, Word и Spotify.

Некоторые новые игры также будут использовать до 8 ГБ ОЗУ. Например, для запуска Cyberpunk 2077 требуется не менее 8 ГБ памяти. Это означает, что вы можете столкнуться с серьезной задержкой при попытке запустить игру, если у вас есть какие-либо другие программы, работающие в фоновом режиме.

Достаточно ли 16 ГБ ОЗУ?

С 16 ГБ ОЗУ у вас достаточно памяти для запуска любого количества программ без замедления работы компьютера. Этого объема памяти достаточно для заядлых геймеров, видеоредакторов, игровых стримеров и всех, кто использует AutoCAD или другое требовательное программное обеспечение.

Например, мы не смогли использовать все 16 ГБ памяти, установленной на нашем ноутбуке, потому что процессор слишком сильно все замедлял. Так что, если у вас 16 ГБ ОЗУ, скорее всего, во всех узких местах виноват ваш процессор.

Стоит ли 32 ГБ оперативной памяти?

С 32 ГБ ОЗУ у вас достаточно памяти для редактирования видео высокого разрешения (4K), моделирования трехмерных сред или работы с очень большими файлами. Это также стоит того, если ваш компьютер должен иметь двойную загрузку или у вас установлено несколько виртуальных машин.

Не слишком ли 64 ГБ ОЗУ?

С 64 ГБ ОЗУ у вас достаточно памяти для машинного обучения, редактирования художественных фильмов и дизайна 3D-графики. Однако большинству опытных пользователей 32 ГБ ОЗУ покажется излишним, особенно если вы предпочитаете только высококлассные игры или многозадачность нескольких ресурсоемких программ.

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

В чем разница между DDR3 и DDR4?

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

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

На данный момент оперативная память DDR3 может достигать максимальной скорости только 2133 МГц, а DDR4 — с 2133 МГц до 4266 МТ/с (миллионов передач в секунду). Что касается емкости, DDR3 поддерживает только до 16 ГБ на один накопитель, но вы можете купить модули DDR4 емкостью до 256 ГБ.

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

А как насчет DDR5?

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

Имеет ли значение скорость оперативной памяти?

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

Некоторые ЦП указывают рекомендуемую скорость ОЗУ в своих технических характеристиках. Использование этой рекомендуемой скорости также может повысить производительность, но лишь незначительно. Например, хотя вы можете не увидеть гораздо более высокую частоту кадров во время игр с более быстрой оперативной памятью, вы можете увидеть более высокую частоту кадров 1% и 0,1%. Кроме того, вам необходимо убедиться, что ваша материнская плата поддерживает более высокие скорости оперативной памяти. В противном случае скорость вашей оперативной памяти будет ограничена, и тогда не будет иметь значения, насколько она быстра.

Что такое хорошая задержка CAS для оперативной памяти?

Задержка CAS – это количество тактовых циклов, которое требуется RAM-накопителю для доступа к набору данных. Для модулей оперативной памяти с одинаковыми скоростями и версиями чипов более низкая задержка лучше. Хотя DDR3 обычно имеет более низкую задержку, чем DDR4, последняя компенсирует это гораздо более высокими скоростями, обеспечивающими более высокую производительность.

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

Сколько оперативной памяти у вас на ПК с Windows 10?

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

  1. Откройте окно поиска Windows. Это можно сделать, нажав на значок увеличительного стекла в левом нижнем углу экрана.
  2. Затем введите Диспетчер задач в строке поиска.
  3. Далее нажмите Открыть. Вы также можете нажать Enter на клавиатуре.
  4. Затем перейдите на вкладку Производительность. Вы увидите это в верхней части всплывающего окна рядом с Процессами.
  5. Вы увидите, сколько у вас оперативной памяти, в правом верхнем углу окна. Затем вы также увидите, сколько памяти вы используете в настоящее время, в нижней части окна рядом с Используется.

Вы также можете получить доступ к этому окну, щелкнув правой кнопкой мыши панель задач в нижней части экрана и выбрав Диспетчер задач. Или вы можете одновременно нажать Ctrl + Shift + Esc на клавиатуре.

Сколько оперативной памяти у вас на компьютере Mac?

Чтобы узнать объем оперативной памяти на компьютере Mac, откройте окно Finder и перейдите в папку Приложения. Затем перейдите в папку «Утилиты» и откройте приложение Мониторинг активности. Наконец, перейдите на вкладку Память, и вы увидите, сколько памяти у вас есть рядом с Физическая память.

  1. Откройте окно Finder. Вы можете сделать это, щелкнув наполовину синий, наполовину серый значок лица в доке. Или вы можете щелкнуть любое пустое место на рабочем столе и одновременно нажать клавиши Command + N на клавиатуре.
  2. Затем перейдите в папку Приложения. Это можно сделать, нажав Приложения на левой боковой панели окна Finder. Или вы можете одновременно нажать клавиши Command + Shift + A на клавиатуре.
  3. Затем откройте папку Утилиты. Вы также можете нажать клавиши Command + Shift + U на клавиатуре и пропустить предыдущий шаг.
  4. Затем откройте Монитор активности.
  5. Затем перейдите на вкладку Память. Вы увидите это в верхней части окна, вложенного в CPU.
  6. Наконец, рядом с Физическая память отображается объем памяти вашего Mac. Вы увидите это внизу по центру окна. Вы также увидите, сколько памяти вы используете в настоящее время рядом с использованной памятью.

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

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

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

память компьютера, устройство, используемое для хранения данных или программ (последовательностей инструкций) на временной или постоянной основе для использования в электронном цифровом компьютере. Компьютеры представляют информацию в двоичном коде, записанном в виде последовательностей нулей и единиц. Каждая двоичная цифра (или «бит») может быть сохранена любой физической системой, которая может находиться в одном из двух стабильных состояний, представляющих 0 и 1. Такая система называется бистабильной. Это может быть выключатель, электрический конденсатор, который может накапливать или терять заряд, магнит с полярностью вверх или вниз или поверхность, на которой может быть ямка или нет. Сегодня конденсаторы и транзисторы, работающие как крошечные электрические переключатели, используются для временного хранения, а для долговременного хранения используются либо диски, либо ленты с магнитным покрытием, либо пластиковые диски с узором из ямок.

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

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

Основная память

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

Магнитная память барабана

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

Память на магнитном сердечнике

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

Полупроводниковая память

Существует два основных типа полупроводниковой памяти. Статическая RAM (SRAM) состоит из триггеров, бистабильной схемы, состоящей из четырех-шести транзисторов. Как только триггер сохраняет бит, он сохраняет это значение до тех пор, пока в нем не будет сохранено противоположное значение. SRAM обеспечивает быстрый доступ к данным, но физически она относительно велика. Он используется в основном для небольших объемов памяти, называемых регистрами, в центральном процессоре компьютера (ЦП) и для быстрой «кэш-памяти». Динамическое ОЗУ (DRAM) хранит каждый бит в электрическом конденсаторе, а не в триггере, используя транзистор в качестве переключателя для зарядки или разрядки конденсатора. Поскольку в нем меньше электрических компонентов, ячейка памяти DRAM меньше, чем SRAM. Однако доступ к его значению происходит медленнее, и, поскольку конденсаторы постепенно теряют заряд, хранящиеся значения необходимо перезаряжать примерно 50 раз в секунду. Тем не менее, DRAM обычно используется для основной памяти, потому что чип того же размера может вместить в несколько раз больше DRAM, чем SRAM.

Ячейки памяти в оперативной памяти имеют адреса. Обычно оперативную память организуют в «слова» от 8 до 64 бит или от 1 до 8 байт (8 бит = 1 байт). Размер слова обычно представляет собой количество битов, которые могут быть переданы за один раз между основной памятью и ЦП. Каждое слово и обычно каждый байт имеют адрес. Микросхема памяти должна иметь дополнительные схемы декодирования, которые выбирают набор ячеек хранения, находящихся по определенному адресу, и либо сохраняют значение по этому адресу, либо извлекают то, что там хранится. Основная память современного компьютера состоит из нескольких микросхем памяти, каждая из которых может содержать много мегабайт (миллионов байтов), а схема адресации выбирает соответствующую микросхему для каждого адреса. Кроме того, DRAM требует, чтобы схемы обнаруживали сохраненные значения и периодически обновляли их.

Для доступа к данным основной памяти требуется больше времени, чем процессору для работы с ними. Например, доступ к памяти DRAM обычно занимает от 20 до 80 наносекунд (миллиардных долей секунды), но арифметические операции ЦП могут занимать всего наносекунду или меньше. Есть несколько способов справиться с этим несоответствием. ЦП имеют небольшое количество регистров, очень быструю SRAM, в которой хранятся текущие инструкции и данные, с которыми они работают. Кэш-память — это больший объем (до нескольких мегабайт) быстрой SRAM на кристалле ЦП. Данные и инструкции из основной памяти передаются в кэш-память, а поскольку программы часто демонстрируют «локальность ссылок», то есть они некоторое время выполняют одну и ту же последовательность инструкций в повторяющемся цикле и оперируют наборами связанных данных, ссылки на память могут помещаться в быстрый кэш после того, как в него будут скопированы значения из основной памяти.

Большая часть времени доступа к DRAM уходит на декодирование адреса для выбора соответствующих ячеек памяти. Свойство локальности ссылки означает, что последовательность адресов памяти будет часто использоваться, а быстрая DRAM предназначена для ускорения доступа к последующим адресам после первого. Синхронная DRAM (SDRAM) и EDO (расширенный вывод данных) — два таких типа быстрой памяти.

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

EPROM (стираемое программируемое ПЗУ), EAROM (электрически изменяемое ПЗУ) и флэш-память — это типы энергонезависимой памяти, которые можно перезаписывать, хотя перезапись занимает гораздо больше времени, чем чтение. Таким образом, они используются в качестве памяти специального назначения, когда запись требуется редко — если они используются, например, для BIOS, их можно изменить для исправления ошибок или обновления функций.

Читайте также: