♠ ️ ♠ ️Что такое планирование процессов? | Как работает планирование процессов 🚀?

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

Основная цель системы планирования процессов - обеспечить постоянную загрузку ЦП и обеспечить минимальное время отклика для всех программ. Для этого планировщик должен применять соответствующие правила для обмена процессами IN и OUT ЦП.

⛳⛳ Планирование попадает в одну из двух основных категорий:

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

♠ ️ ♠ ️Что такое очереди планирования?

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

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

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

🍎🍎Типы планировщиков

Доступны три типа планировщиков:

  1. Долгосрочный планировщик
  2. Краткосрочный планировщик
  3. Среднесрочный планировщик

Давайте подробно обсудим все типы планировщиков:

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

✔️✔️ Краткосрочный планировщик: - краткосрочный - планировщик (также известный как планировщик ЦП ) решает, какой из готовых процессов в памяти должен быть выполнен (выделен ЦП) после прерывания часов, прерывания ввода-вывода, вызова операционной системы или другой формы сигнал.

Он также известен как Планировщик ЦП и выполняется очень часто. Основная цель этого планировщика - повысить производительность ЦП и увеличить скорость выполнения процессов. 🙂

✔️✔️ Среднесрочный планировщик: - Этот планировщик удаляет процессы из памяти (и из активной конкуренции за ЦП), тем самым снижая степень многопрограммирования. Через некоторое время процесс может быть повторно введен в память, и его выполнение будет продолжено с того места, где оно было остановлено. Эта схема называется свопинг. Процесс заменяется, а позже заменяется среднесрочным планировщиком.

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

🎯🎯Что такое переключение контекста?

  1. Для переключения ЦП на другой процесс требуется сохранить состояние старого процесса и загрузить сохраненное состояние для нового процесса. Эта задача известна как переключение контекста.
  2. Контекст процесса представлен в блоке управления процессом (PCB) процесса; он включает значение регистров ЦП, состояние процесса и информацию об управлении памятью. Когда происходит переключение контекста, ядро ​​сохраняет контекст старого процесса на своей плате и загружает сохраненный контекст нового процесса, запланированного для запуска.
  3. Время переключения контекста - это чистые накладные расходы, поскольку система не выполняет никакой полезной работы при переключении. Его скорость варьируется от машины к машине, в зависимости от скорости памяти, количества регистров, которые должны быть скопированы, и наличия специальных инструкций (например, одной инструкции для загрузки или сохранения всех регистров). Типичные скорости варьируются от 1 до 1000 микросекунд.
  4. Переключение контекста стало таким узким местом производительности, что программисты используют новые структуры (потоки), чтобы избежать его, когда и где это возможно.

Операции над процессом

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

Ниже мы обсудили две основные операции: создание процесса и завершение процесса . 🍎🍎

Создание процесса

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

Каждому процессу дается целочисленный идентификатор, называемый идентификатором процесса или PID. Родительский PID (PPID) также сохраняется для каждого процесса.

В типичных системах UNIX планировщик процессов называется sched, и ему присваивается PID 0. Первое, что он делает при запуске системы, - это запускать init, который дает этому процессу PID 1. Далее Init запускает все системные демоны и логины пользователей и становится конечным родительским элементом для всех других процессов.

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

🎳🎳После создания дочернего процесса у родительского процесса есть два варианта:

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

Есть также две возможности с точки зрения адресного пространства нового процесса:

  1. Дочерний процесс является дубликатом родительского процесса.
  2. В дочерний процесс загружена программа.

🔮🔮Чтобы проиллюстрировать эти различные реализации, давайте рассмотрим операционную систему UNIX. В UNIX каждый процесс идентифицируется своим идентификатором процесса, который является уникальным целым числом. Новый процесс создается системным вызовом fork. Новый процесс состоит из копии адресного пространства исходного процесса. Этот механизм позволяет родительскому процессу легко взаимодействовать со своим дочерним процессом. Оба процесса (родительский и дочерний) продолжают выполнение инструкции после системного вызова fork с одним отличием: Код возврата для системного вызова fork равен нулю для нового (дочернего) процесса, тогда как (ненулевой ) родительскому процессу возвращается идентификатор процесса дочернего процесса.

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

Ниже приведена программа на языке C, иллюстрирующая разветвление отдельного процесса с использованием UNIX (созданного с использованием Ubuntu):

#include<stdio.h>

void main(int argc, char *argv[])
{
    int pid;

    /* Fork another process */
    pid = fork();

    if(pid < 0)
    {
        //Error occurred
        fprintf(stderr, "Fork Failed");
        exit(-1);
    }
    else if (pid == 0)
    {
        //Child process
        execlp("/bin/ls","ls",NULL);
    }
    else
    {
        //Parent process
        //Parent will wait for the child to complete
        wait(NULL);
        printf("Child complete");
        exit(0);
    }
}

Числовой совет. Если fork вызывается n раз, количество созданных дочерних или новых процессов будет: 2n – 1. 🐎🐎

Прекращение процесса

😍😍При выполнении exit (системного вызова), обычно возвращающего int, процессы могут запросить собственное завершение. Этот тип int передается родительскому элементу, если он выполняет wait(), и обычно равен нулю при успешном завершении и некоторому ненулевому коду в случае любой проблемы.

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

  • Неспособность системы предоставить необходимые системные ресурсы.
  • В ответ на команду KILL или другое необработанное прерывание процесса.
  • Родитель может убить своих потомков, если назначенная им задача больше не нужна, то есть если отпадает необходимость иметь потомка.
  • Если родительский процесс завершается, система может или не может разрешить дочернему процессу продолжить работу без родителя (в системах UNIX осиротевшие процессы обычно наследуются init, который затем продолжает их уничтожать).

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

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

Благодарю вас !

Я надеюсь тебе это понравится. 😊 Спасибо за чтение. 🎉