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

Обновлено: 30.06.2024

На типичных компьютерах, таких как Mac, Windows, Linux, iOS и т. д., когда пользователь запускает программу/двоичный файл/приложение, всегда ли статическая часть программы полностью загружается в память перед началом выполнения? Включает ли это все сегменты/разделы данных в программе, такие как строки и любые другие встроенные данные BLOB? Допустим, я встроил в двоичный файл огромный файл изображения (например, в сегменте __DATA). Будут ли данные этого изображения полностью загружаться в память при запуске?

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

1 Ответ 1

В OS X исполняемые файлы Windows, Linux и iOS не загружаются в оперативную память при выполнении. Вместо этого исполняемый файл отображается в виртуальное адресное пространство процесса. Когда процесс обращается к сопоставленной странице исполняемого файла, который еще не загружен в ОЗУ, ЦП генерирует ошибку страницы, которую ОС обрабатывает, читая страницу в ОЗУ.

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

Обратите внимание, что в Windows и, возможно, в других операционных системах существует существенное исключение. В Windows служба операционной системы, называемая предварительной выборкой, начнет предварительно загружать в память части любого файла, к которым, по ее прогнозам, программа будет обращаться во время запуска. Он делает эти прогнозы на основе записанных шаблонов доступа при запуске предыдущих запусков программы. Поскольку «любой файл» включает в себя сам исполняемый файл, а также любые библиотеки DLL или файлы данных, которые он использует, это означает, что части исполняемого файла будут предварительно загружены в ОЗУ при запуске процесса. Это также означает, что если программа обычно отображает большое изображение при запуске программы (например, заставку), то предварительный загрузчик загрузит изображение в ОЗУ независимо от того, хранится ли оно как часть исполняемого файла или как отдельный файл данных.

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

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

  • Что такое основная память?
  • Что такое управление памятью?
  • Для чего необходимо управление памятью
  • Логическое адресное пространство и физическое адресное пространство
  • Статическая и динамическая загрузка
  • Статическая и динамическая привязка
  • Обмен
  • Распределение непрерывной памяти
    • Распределение памяти
      • Первая подгонка
      • Наилучшее соответствие
      • Наихудший вариант
      • Внутренняя фрагментация
      • Внешняя фрагментация

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

      Что такое основная память:

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


      Рисунок 1. Иерархия памяти

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

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

      Для чего необходимо управление памятью:

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

      Теперь мы обсудим концепцию логического адресного пространства и физического адресного пространства:

      Логическое и физическое адресное пространство:

      Логическое адресное пространство. Адрес, генерируемый ЦП, называется «логическим адресом». Он также известен как виртуальный адрес. Логическое адресное пространство можно определить как размер процесса. Логический адрес можно изменить.

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

      Статическая и динамическая загрузка:

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

      Статическая и динамическая привязка:

      • Статическое связывание. При статическом связывании компоновщик объединяет все необходимые программные модули в одну исполняемую программу. Таким образом, нет никакой зависимости во время выполнения. Некоторые операционные системы поддерживают только статическую компоновку, при которой библиотеки системных языков обрабатываются как любые другие объектные модули.
      • Динамическое связывание. Основная концепция динамического связывания аналогична динамической загрузке. При динамической компоновке «заглушка» включается в каждую соответствующую библиотечную подпрограмму. Заглушка — это небольшой фрагмент кода. Когда заглушка выполняется, она проверяет, находится ли уже нужная подпрограмма в памяти или нет. Если она недоступна, программа загружает подпрограмму в память.

      Обмен:

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

      Распределение непрерывной памяти:

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

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

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

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

      Фиксированное распределение разделов. В этом методе операционная система ведет таблицу, в которой указывается, какие части памяти доступны, а какие заняты процессами. Изначально вся память доступна для пользовательских процессов и считается одним большим блоком доступной памяти. Эта доступная память известна как «дыра».Когда прибывает процесс и ему требуется память, мы ищем дыру, достаточно большую для хранения этого процесса. Если требование выполняется, мы выделяем память для обработки, в противном случае оставляем остальную часть доступной для удовлетворения будущих запросов. При выделении памяти иногда возникают проблемы с динамическим выделением памяти, которые касаются того, как удовлетворить запрос размера n из списка свободных дыр. Есть несколько решений этой проблемы:

      Первое соответствие:-

      При первой подгонке первая доступная свободная дыра удовлетворяет требованиям выделенного процесса.

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

      Наиболее подходящий:-

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

      Здесь, в этом примере, сначала мы просматриваем весь список и находим последнюю дыру 25 КБ, которая лучше всего подходит для процесса A (размер 25 КБ).

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

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

      В этом примере процессу A (размер 25 КБ) выделяется самый большой доступный блок памяти, равный 60 КБ. Неэффективное использование памяти является серьезной проблемой в худшем случае.

      Фрагментация:

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

      Внутренняя фрагментация:

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

      Пример: предположим, что для распределения памяти используется фиксированное разбиение и различный размер блока 3 МБ, 6 МБ и 7 МБ пространства в памяти. Теперь приходит новый процесс p4 размером 2MB и требует блок памяти. Он получает блок памяти размером 3 МБ, но память блока 1 МБ является пустой тратой, и она не может быть выделена другим процессам. Это называется внутренней фрагментацией.

      Внешняя фрагментация:

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

      Пример. Предположим (рассмотрите приведенный выше пример), что три процесса p1, p2, p3 имеют размер 2 МБ, 4 МБ и 7 МБ соответственно. Теперь им выделяются блоки памяти размером 3 МБ, 6 МБ и 7 МБ соответственно. После выделения процесса процесса p1 и процесса p2 осталось 1 МБ и 2 МБ. Предположим, приходит новый процесс p4 и требует блок памяти размером 3 МБ, который доступен, но мы не можем его выделить, потому что свободное пространство памяти не является непрерывным. Это называется внешней фрагментацией.

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

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

      Процесс — это выполняемая программа. Выполнение процесса должно происходить последовательно.

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

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

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

      Стек процесса содержит временные данные, такие как параметры метода/функции, адрес возврата и локальные переменные.

      Это динамически выделяемая память для процесса во время его выполнения.

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

      Этот раздел содержит глобальные и статические переменные.

      Программа

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

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

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

      Жизненный цикл процесса

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

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

      Это начальное состояние, когда процесс впервые запускается/создается.

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

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

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

      Прекращено или выйти

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

      Блок управления технологическим процессом (PCB)

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

      Состояние процесса

      Текущее состояние процесса, т. е. готов ли он, выполняется, ожидает или что-то еще.

      Привилегии процесса

      Это необходимо для разрешения/запрета доступа к системным ресурсам.

      Уникальная идентификация для каждого процесса в операционной системе.

      Указатель на родительский процесс.

      Счетчик программ

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

      Регистры процессора

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

      Информация о планировании ЦП

      Приоритет процесса и другая информация о планировании, необходимая для планирования процесса.

      Информация об управлении памятью

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

      Учетная информация

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

      Информация о статусе ввода-вывода

      Включает в себя список устройств ввода-вывода, выделенных для процесса.

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

      Блок управления процессом

      PCB сохраняется для процесса на протяжении всего его жизненного цикла и удаляется после завершения процесса.

      Компьютер представляет собой сложную систему, состоящую из множества различных компонентов. Но в сердце — или, если хотите, в мозгу — компьютера находится единственный компонент, который выполняет фактические вычисления. Это центральный процессор или центральный процессор. В современном настольном компьютере ЦП представляет собой один «чип» размером порядка одного квадратного дюйма. Работа процессора заключается в выполнении программ.

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

      Когда ЦП выполняет программу, эта программа сохраняется в основной памяти компьютера (также называемой ОЗУ или оперативной памятью). В дополнение к программе в памяти также могут храниться данные, которые используются или обрабатываются программой. Основная память состоит из последовательности ячеек. Эти местоположения пронумерованы, а порядковый номер местоположения называется его адресом.Адрес обеспечивает способ выбора одной конкретной части информации из миллионов, хранящихся в памяти. Когда ЦП необходимо получить доступ к программной инструкции или данным в определенном месте, он отправляет адрес этой информации в качестве сигнала в память; память отвечает, отправляя обратно данные, содержащиеся в указанном месте. ЦП также может хранить информацию в памяти, указав информацию, которая должна быть сохранена, и адрес места, где она должна быть сохранена.

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

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

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

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

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

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