С помощью чего осуществляется выборка программы из памяти

Обновлено: 05.07.2024

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

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

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

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

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

Классификация ПО.

Программы, работающие на компьютере, можно разделить на три категории:

- прикладные программы, непосредственно обеспечивающие выполнение необходимых пользователям работ: редактирование текстов, рисование картинок, обработка информационных массивов и т. д.;

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

- Вспомогательное ПО (инструментальные системы и утилиты).

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

Прикладное ПО. Для IBMPC разработаны и используются сотни тысяч различных прикладных программ для различных применений. Наиболее широко применяются программы:

Прикладная программа – это любая конкретная программа, способствующая решению какой-либо задачи в пределах данной проблемной области.

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

Прикладные программы могут носить и общий характер, например, обеспечивать составление и печатание документов и т.п.

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

Системы обработки текстов. Текстовый редактор: назначение, основные возможности.

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

Более совершенные текстовые редакторы - текстовые процессоры (например, "Word") позволяют управлять не только содержанием, но и оформлением текста. Эти приложения имеют широкий спектр возможностей по созданию документов (вставка списков и таблиц, средства проверки орфографии, сохранение исправлений и др.).

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




Для подготовки к публикации в Интернете Web-страниц и Web-сайтов используются Web-редакторы (например, MacromediaHomeSite).

Управление памятью – одна из главных задач ОС. Она критична как для программирования, так и для системного администрирования. Я постараюсь объяснить, как ОС работает с памятью. Концепции будут общего характера, а примеры я возьму из Linux и Windows на 32-bit x86. Сначала я опишу, как программы располагаются в памяти.

Каждый процесс в многозадачной ОС работает в своей «песочнице» в памяти. Это виртуальное адресное пространство, которое в 32-битном режиме представляет собою 4Гб блок адресов. Эти виртуальные адреса ставятся в соответствие (mapping) физической памяти таблицами страниц, которые поддерживает ядро ОС. У каждого процесса есть свой набор таблиц. Но если мы начинаем использовать виртуальную адресацию, приходится использовать её для всех программ, работающих на компьютере – включая и само ядро. Поэтому часть пространства виртуальных адресов необходимо резервировать под ядро.

image

image

Это не значит, что ядро использует так много физической памяти – просто у него в распоряжении находится часть адресного пространства, которое можно поставить в соответствие необходимому количеству физической памяти. Пространство памяти для ядра отмечено в таблицах страниц как эксклюзивно используемое привилегированным кодом, поэтому если какая-то программа пытается получить в него доступ, случается page fault. В Linux пространство памяти для ядра присутствует постоянно, и ставит в соответствие одну и ту же часть физической памяти у всех процессов. Код ядра и данные всегда имеют адреса, и готовы обрабатывать прерывания и системные вызовы в любой момент. Для пользовательских программ, напротив, соответствие виртуальных адресов реальной памяти меняется, когда происходит переключение процессов:

Голубым отмечены виртуальные адреса, соответствующие физической памяти. Белым – пространство, которому не назначены адреса. В нашем примере Firefox использует гораздо больше места в виртуальной памяти из-за своей легендарной прожорливости. Полоски в адресном пространстве соответствуют сегментам памяти таким, как куча, стек и проч. Эти сегменты – всего лишь интервалы адресов памяти, и не имеют ничего общего с сегментами от Intel. Вот стандартная схема сегментов у процесса под Linux:

image

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

Самый верхний сегмент в адресном пространстве процесса – это стек, в большинстве языков хранящий локальные переменные и аргументы функций. Вызов метода или функции добавляет новый кадр стека (stack frame) к существующему стеку. После возврата из функции кадр уничтожается. Эта простая схема приводит к тому, что для отслеживания содержимого стека не требуется никакой сложной структуры – достаточно всего лишь указателя на начало стека. Добавление и удаление данных становится простым и однозначным процессом. Постоянное повторное использование районов памяти для стека приводит к кэшированию этих частей в CPU, что добавляет скорости. Каждый поток выполнения (thread) в процессе получает свой собственный стек.

Можно прийти к такой ситуации, в которой память, отведённая под стек, заканчивается. Это приводит к ошибке page fault, которая в Linux обрабатывается функцией expand_stack(), которая, в свою очередь, вызывает acct_stack_growth(), чтобы проверить, можно ли ещё нарастить стек. Если его размер не превышает RLIMIT_STACK (обычно это 8 Мб), то стек увеличивается и программа продолжает исполнение, как ни в чём не бывало. Но если максимальный размер стека достигнут, мы получаем переполнение стека (stack overflow) и программе приходит ошибка Segmentation Fault (ошибка сегментации). При этом стек умеет только увеличиваться – подобно государственному бюджету, он не уменьшается обратно.

Динамический рост стека – единственная ситуация, в которой может осуществляться доступ к свободной памяти, которая показана белым на схеме. Все другие попытки доступа к этой памяти вызывают ошибку page fault, приводящую к Segmentation Fault. А некоторые занятые области памяти служат только для чтения, поэтому попытки записи в эти области также приводят к Segmentation Fault.

После стека идёт сегмент отображения в память. Тут ядро размещает содержимое файлов напрямую в памяти. Любое приложение может запросить сделать это через системный вызов mmap() в Linux или CreateFileMapping() / MapViewOfFile() в Windows. Это удобный и быстрый способ организации операций ввода и вывода в файлы, поэтому он используется для подгрузки динамических библиотек. Также возможно создать анонимное место в памяти, не связанное с файлами, которое будет использоваться для данных программы. Если вы сделаете в Linux запрос на большой объём памяти через malloc(), библиотека C создаст такую анонимное отображение вместо использования памяти из кучи. Под «большим» подразумевается объём больший, чем MMAP_THRESHOLD (128 kB по умолчанию, он настраивается через mallopt().)

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

image

И вот мы добрались до самой нижней части схемы – BSS, данные и текст программы. BSS и данные хранят статичные (глобальные) переменные в С. Разница в том, что BSS хранит содержимое непроинициализированных статичных переменных, чьи значения не были заданы программистом. Кроме этого, область BSS анонимна, она не соответствует никакому файлу. Если вы пишете static int cntActiveUsers , то содержимое cntActiveUsers живёт в BSS.

Сегмент данных, наоборот, содержит те переменные, которые были проинициализированы в коде. Эта часть памяти соответствует бинарному образу программы, содержащему начальные статические значения, заданные в коде. Если вы пишете static int cntWorkerBees = 10 , то содержимое cntWorkerBees живёт в сегменте данных, и начинает свою жизнь как 10. Но, хотя сегмент данных соответствует файлу программы, это приватное отображение в память (private memory mapping) – а это значит, что обновления памяти не отражаются в соответствующем файле. Иначе изменения значения переменных отражались бы в файле, хранящемся на диске.

Пример данных на диаграмме будет немного сложнее, поскольку он использует указатель. В этом случае содержимое указателя, 4-байтный адрес памяти, живёт в сегменте данных. А строка, на которую он показывает, живёт в сегменте текста, который предназначен только для чтения. Там хранится весь код и разные другие детали, включая строковые литералы. Также он хранит ваш бинарник в памяти. Попытки записи в этот сегмент оканчиваются ошибкой Segmentation Fault. Это предотвращает ошибки, связанные с указателями (хотя не так эффективно, как если бы вы вообще не использовали язык С). На диаграмме показаны эти сегменты и примеры переменных:

image

Изучить области памяти Linux-процесса можно, прочитав файл /proc/pid_of_process/maps. Учтите, что один сегмент может содержать много областей. К примеру, у каждого файла, сдублированного в память, есть своя область в сегменте mmap, а у динамических библиотек – дополнительные области, напоминающие BSS и данные. Кстати, иногда, когда люди говорят «сегмент данных», они имеют в виду данные + bss + кучу.

Бинарные образы можно изучать при помощи команд nm и objdump – вы увидите символы, их адреса, сегменты, и т.п. Схема виртуальных адресов, описанная в этой статье – это т.н. «гибкая» схема, которая по умолчанию используется уже несколько лет. Она подразумевает, что переменной RLIMIT_STACK присвоено какое-то значение. В противном случае Linux использует «классическую» схему:

Этот принцип обеспечивает автоматизацию процессов вычислений на ЭВМ.

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

2. Принцип однородности памяти.

Отсутствие принципиальной разницы между программой и данными дало возможность ЭВМ самой формировать для себя программу в соответствии с результатом вычислений.

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

3. Принцип адресности.

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

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

Устройство управления, которое организует процесс выполнения программ

Запоминающее устройство для хранения программ и данных

Внешние устройства для ввода-вывода информации.

Компьютеры, построенные на этих принципах, относят к типу фон - неймановских.


На сегодняшний день это подавляющие большинство компьютеров, в том числе и IBM PC – совместимые. Но есть и компьютерные системы с иной архитектурой – например системы для параллельных вычислений.

Цикл команд в ЦП


Что CPU / ЦЕНТРАЛЬНЫЙ ПРОЦЕССОР выполняет инструкции программы, находящейся в памяти. Но знаете ли вы, что все они следуют одним и тем же общим правилам? Все они следуют одному и тому же командному циклу, который разделен на три отдельных этапа, называемых «выборка», «декодирование» и «выполнение», которые переводятся как выборка, декодирование и выполнение. Мы объясняем, как работают эти этапы и как они организованы.

Визуализация цикла обучения

Ciclo Instrucción Unidad Control

  • Получить или захватить: В котором инструкция захватывается из ОЗУ и копируется в процессор.
  • Декодирование или декодирование: В котором ранее захваченная инструкция декодируется и отправляется исполнительным блокам.
  • Выполнили: Если инструкция разрешена, а результат записан во внутренние регистры процессора или в адрес памяти RAM

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

Первый этап цикла обучения: выборка

Получить процесс

  1. Программный счетчик или Программный счетчик: Что указывает на следующую строку памяти, где находится следующая инструкция процессора. Его значение увеличивается на 1 каждый раз, когда завершается полный цикл команд или когда команда перехода изменяет значение программного счетчика.
  2. Регистр адреса памяти: MAR копирует содержимое ПК и отправляет его в ОЗУ через адресационные контакты ЦП, которые соединены с адресными контактами самого ОЗУ.
  3. Регистр данных памяти или регистр данных памяти : В случае, если ЦП должен выполнить чтение памяти, MDR копирует содержимое этого адреса памяти во внутренний регистр ЦП, который является временным регистром передачи, прежде чем его содержимое будет скопировано в регистр команд. MDR, в отличие от MAR, подключается к выводам данных RAM, а не к контактам адресации, и в случае инструкции записи содержимое того, что вы хотите записать в RAM, также записывается в MDR.
  4. Реестр инструкций: Заключительной частью этапа выборки является запись инструкции в регистр инструкций, из которого блок управления процессором копирует ее содержимое для второго этапа цикла инструкций.

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

устройство управления

Устройство управления

  • Они отвечают за координацию движения и порядок, в котором данные перемещаются внутри и вне процессора, а также за различные подблоки, которые за это отвечают.
  • В общем, считается, что блоки этапа захвата или Fetch являются частью оборудования, которое мы называем блоком управления, и это оборудование также называется Front-End процессора.
  • Он интерпретирует инструкции и отправляет их различным исполнительным устройствам, к которым он подключен.
  • Он передается различным ALU и исполнительным блокам процессора, которые действуют
  • Он отвечает за захват и декодирование инструкций, а также за запись результатов в регистры, кеши или в соответствующий адрес ОЗУ.

Код операции-режим-адрес

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

Второй этап: декодирование

Decodificación Instrucciones

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

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

Блок управления Ciclo Instrucción

Maqueta Tren Ciclo Instrucción

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

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

Третий этап: Выполнить

1 бит ALU

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

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

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

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