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

Обновлено: 21.11.2024

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

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

Пространства памяти C/C++

Возможно, полезно представить, что память данных в C и C++ разделена на три отдельных пространства:

Статическая память. Здесь находятся переменные, которые определены вне функций. Ключевое слово static обычно не влияет на расположение таких переменных; он определяет их область действия как локальную по отношению к текущему модулю. Переменные, определенные внутри функции, явно объявленные статическими, также хранятся в статической памяти. Обычно статическая память располагается в начале области ОЗУ. Фактическое распределение адресов по переменным выполняется встроенным набором инструментов для разработки программного обеспечения: сотрудничество между компилятором и компоновщиком. Обычно секции программы используются для управления размещением, но более продвинутые методы, такие как мелкозернистое распределение, дают больше контроля. Обычно вся оставшаяся память, которая не используется для статического хранения, используется для создания области динамического хранения, в которой размещаются два других пространства памяти.

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

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

Динамическая память в C

В C динамическая память выделяется из кучи с помощью некоторых стандартных библиотечных функций. Двумя ключевыми функциями динамической памяти являются malloc() и free().

Функция malloc() принимает единственный параметр — размер запрошенной области памяти в байтах. Он возвращает указатель на выделенную память. Если выделение не удается, возвращается NULL. Прототип стандартной библиотечной функции выглядит следующим образом:

void *malloc(size_t size);

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

void free(void *pointer);

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

целый_массив[10];
мой_массив[3] = 99;

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

инт *указатель;
указатель = malloc(10 * sizeof(int));
*(указатель+3) = 99;

Синтаксис разыменования указателя трудно читать, поэтому можно использовать обычный синтаксис ссылки на массив, поскольку [ и ] — это просто операторы:

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

свободно(указатель);
указатель = NULL;

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

Объем пространства кучи, фактически выделенный функцией malloc(), обычно на одно слово больше запрошенного. Дополнительное слово используется для хранения размера выделения и для последующего использования функцией free(). Это «слово размера» предшествует области данных, на которую malloc() возвращает указатель.

Есть еще два варианта функции malloc(): calloc() и realloc().

Функция calloc() в основном выполняет ту же работу, что и malloc(), за исключением того, что она принимает два параметра — количество элементов массива и размер каждого элемента — вместо одного параметра (который является произведением этих двух значения). Выделенная память также инициализируется нулями. Вот прототип:

void *calloc(size_t elements, size_t elementSize);

Функция realloc() изменяет размер памяти, выделенной ранее функцией malloc(). Он принимает в качестве параметров указатель на область памяти и новый требуемый размер. При уменьшении размера данные могут быть потеряны. Если размер увеличен и функция не может расширить существующее выделение, она автоматически выделит новую область памяти и скопирует данные в нее. В любом случае он возвращает указатель на выделенную память. Вот прототип:

void *realloc(void *pointer, size_t size);

Динамическая память в C++

Управление динамической памятью в C++ во многом похоже на C. Хотя библиотечные функции, скорее всего, будут доступны, в C++ есть два дополнительных оператора — new и delete — которые позволяют писать код более четко, лаконично и гибко, с меньшей вероятностью ошибок. Новый оператор можно использовать тремя способами:

p_var = новое имя типа;
p_var = новый тип(инициализатор);
p_array = новый тип [размер];

В первых двух случаях выделяется место для одного объекта; второй включает инициализацию. Третий случай — это механизм выделения места под массив объектов.

Оператор удаления можно вызвать двумя способами:

удалить p_var;
удалить[] p_array;

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

Не существует оператора, обеспечивающего функциональность функции C realloc().

Вот код для динамического выделения массива и инициализации четвертого элемента:

int* указатель;
указатель = новый int[10];
указатель[3] = 99;

Использование нотации доступа к массиву является естественным. Освобождение выполняется следующим образом:

удалить[] указатель;
указатель = NULL;

Опять же, присвоение указателю значения NULL после освобождения — это просто хорошая практика программирования. Другой вариант управления динамической памятью в C++ — использование стандартной библиотеки шаблонов. Это может быть нежелательно для встроенных систем реального времени.

Вопросы и проблемы

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

Существует ряд проблем с динамическим выделением памяти в системе реального времени. Стандартные библиотечные функции (malloc() и free()) обычно не допускают повторного входа, что было бы проблематично в многопоточном приложении. Если исходный код доступен, это можно легко исправить, заблокировав ресурсы с помощью средств RTOS (например, семафора). Более сложная проблема связана с производительностью malloc(). Его поведение непредсказуемо, так как время, необходимое для выделения памяти, чрезвычайно изменчиво. Такое недетерминированное поведение недопустимо в системах реального времени.

Без особой осторожности легко ввести утечки памяти в код приложения, реализованный с помощью malloc() и free(). Это вызвано тем, что память выделяется и никогда не освобождается. Такие ошибки, как правило, вызывают постепенное снижение производительности и, в конечном итоге, сбой. Этот тип ошибки может быть очень трудно обнаружить.

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

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

Лучший способ понять фрагментацию памяти — посмотреть на пример. В этом примере предполагается, что существует куча размером 10 КБ. Во-первых, запрашивается область размером 3 КБ, таким образом:

Затем запрашивается еще 4 КБ:

3 КБ памяти теперь свободно.

Некоторое время спустя первое выделение памяти, на которое указывает p1, освобождается:

При этом остается 6 КБ свободной памяти, разбитой на два фрагмента по 3 КБ. Выдается дополнительный запрос на выделение 4K:

Это приводит к сбою — в p1 возвращается NULL — потому что, хотя доступно 6 КБ памяти, нет доступного непрерывного блока размером 4 КБ. Это фрагментация памяти.

Память с RTOS

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

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

Блокирование/разделение памяти

Обычно выделение блочной памяти выполняется с использованием «пула разделов», который определяется статически или динамически и настраивается таким образом, чтобы содержать определенное количество блоков определенного фиксированного размера. Для ОС Nucleus вызов API для определения пула разделов имеет следующий прототип:

STATUS
NU_Create_Partition_Pool (NU_PAR TITION_POOL *pool, CHAR *name, VOID *start_address, UNSIGNED pool_size, UNSIGNED partition_size, OPTION suspend_type);

Наиболее наглядно это можно понять на примере:

При этом создается пул разделов с дескриптором MyPool, содержащий 2000 байт памяти, заполненный разделами размером 40 байт (т. е. имеется 50 разделов). Пул расположен по адресу 0xB000. Пул настроен таким образом, что, если задача пытается выделить блок, когда его нет в наличии, и запрашивает приостановку при вызове API выделения, приостановленные задачи будут разбужены в порядке «первым поступил — первым вышел». . Другим вариантом был бы порядок приоритета задач.

Для запроса выделения раздела доступен другой вызов API. Вот пример использования ОС Nucleus:

Это запрашивает выделение раздела из MyPool. В случае успеха указатель на выделенный блок возвращается в ptr. Если памяти нет, задача приостанавливается, так как указано NU_SUSPEND; другими вариантами, которые могли быть выбраны, были бы приостановка с тайм-аутом или просто возврат с ошибкой.

Когда раздел больше не нужен, его можно освободить следующим образом:

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

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

Обнаружение утечки памяти

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

Решения для оперативной памяти

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

Динамическая память

Можно использовать выделение памяти разделов для надежной и детерминированной реализации malloc(). Идея состоит в том, чтобы определить серию пулов разделов с размерами блоков в геометрической прогрессии; например 32, 64, 128, 256 байт. Функция malloc() может быть написана для детерминированного выбора правильного пула, чтобы обеспечить достаточно места для данного запроса на выделение. В этом подходе используется детерминированное поведение вызова API выделения разделов, надежная обработка ошибок (например, приостановка задачи) и иммунитет к фрагментации, обеспечиваемый блочной памятью.

Выводы

C и C++ используют память различными способами, как статическими, так и динамическими. Динамическая память включает стек и кучу.

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

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

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

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

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

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

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

      Оперативная память играет центральную роль в работе современного компьютера. Основная память представляет собой большой массив слов или байтов размером от сотен тысяч до миллиардов. Основная память — это хранилище быстро доступной информации, совместно используемой ЦП и устройствами ввода-вывода. Основная память — это место, где хранятся программы и информация, когда процессор эффективно их использует. Основная память связана с процессором, поэтому перемещение инструкций и информации в процессор и из него происходит чрезвычайно быстро. Основная память также известна как 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 МБ, который доступен, но мы не можем его выделить, поскольку свободное пространство памяти не является непрерывным. Это называется внешней фрагментацией.

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

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

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

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

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

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

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

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

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

      • Модули пишутся и компилируются независимо, и все ссылки из одного модуля в другой модуль разрешаются «системой во время выполнения».
      • Разные модули имеют разную степень защиты.
      • Существуют механизмы, с помощью которых модули могут совместно использоваться процессами. Совместное использование может быть предоставлено на уровне модуля, что позволяет пользователю указать желаемое совместное использование.

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

      Справочник: Внутреннее устройство и принципы проектирования, 7-е издание Уильяма Столлингса

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

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

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

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

      Важные функции операционной системы:

      1. Безопасность
        Операционная система использует защиту паролем для защиты пользовательских данных и другие аналогичные методы. он также предотвращает несанкционированный доступ к программам и пользовательским данным.
      2. Контроль производительности системы
        Контролирует общее состояние системы, чтобы повысить производительность. записывает время отклика между запросами на обслуживание и ответом системы, чтобы иметь полное представление о состоянии системы. Это может помочь повысить производительность, предоставляя важную информацию, необходимую для устранения неполадок.
      3. Учет заданий
        Операционная система отслеживает время и ресурсы, используемые различными задачами и пользователями. Эта информация может использоваться для отслеживания использования ресурсов для конкретного пользователя или группы пользователей.
      4. Вспомогательные средства обнаружения ошибок
        Операционная система постоянно контролирует систему, чтобы обнаруживать ошибки и избегать сбоев в работе компьютерной системы.
      5. Координация между другим программным обеспечением и пользователями
        Операционные системы также координируют и назначают интерпретаторы, компиляторы, ассемблеры и другое программное обеспечение различным пользователям компьютерных систем.
      6. Управление памятью
        Операционная система управляет основной или основной памятью. Основная память состоит из большого массива байтов или слов, где каждому байту или слову присвоен определенный адрес. Оперативная память — это быстрое хранилище, доступ к которому может осуществляться непосредственно ЦП. Чтобы программа могла быть выполнена, она должна быть сначала загружена в оперативную память. Операционная система выполняет следующие действия по управлению памятью:

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

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

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

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

      1. Выполнение программы
        Операционная система отвечает за выполнение всех типов программ, будь то пользовательские или системные программы. Операционная система использует различные ресурсы, доступные для эффективной работы всех типов функций.
      2. Обработка операций ввода-вывода
        Операционная система отвечает за обработку всех видов ввода, т. е. с клавиатуры, мыши, рабочего стола и т. д. входы и выходы.
        Например, существует разница в природе всех типов периферийных устройств, таких как мышь или клавиатура, тогда за обработку данных между ними отвечает операционная система.
      3. Управление файловой системой
        Операционная система отвечает за принятие решений относительно хранения всех типов данных или файлов, т. е. дискета/жесткий диск/флешка и т. д. Операционная система решает, как данные должны обрабатываться и храниться.
      4. Обнаружение и обработка ошибок
        Операционная система отвечает за обнаружение любых типов ошибок или ошибок, которые могут возникнуть при выполнении любой задачи. Хорошо защищенная ОС иногда также выступает в качестве контрмеры для предотвращения любых нарушений компьютерной системы из любого внешнего источника и, возможно, для их обработки.
      5. Распределение ресурсов
        Операционная система обеспечивает надлежащее использование всех доступных ресурсов, решая, какой ресурс должен использоваться кем и как долго. Все решения принимаются операционной системой.
      6. Учет
        Операционная система отслеживает учет всех функций, выполняемых в компьютерной системе одновременно. Все подробности, такие как типы возникших ошибок, записываются операционной системой.
      7. Защита информации и ресурсов
        Операционная система отвечает за наиболее защищенное использование всей информации и ресурсов, доступных на компьютере. Операционная система должна препятствовать попыткам любого внешнего ресурса заблокировать какие-либо данные или информацию.

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

      Вклады и атрибуции

      Эта страница находится под лицензией CC BY-SA, автором, ремиком и/или куратором которой является Патрик МакКланахан. Подробная история версий изменений исходного контента доступна по запросу.

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