Менеджер процессов - PullRequest
       13

Менеджер процессов

0 голосов
/ 18 января 2011

Я пытаюсь создать симуляцию ядра как мой проект DSA (структура данных и алгоритм) на C ++.В нем будут разные модули (диспетчер процессов, диспетчер памяти и т. Д.).Прямо сейчас мне нужно сделать Process Manager, и у меня есть только небольшое представление об этом (например, я могу использовать очередь).Может ли кто-нибудь помочь мне, как я могу сделать менеджер процессов в C ++.

Ответы [ 2 ]

1 голос
/ 18 января 2011

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

Если вы не знаете, какую модель выбрать, я настоятельно рекомендую совместную многозадачность.Именно здесь каждый процесс занимает определенный небольшой промежуток времени, а затем сам возвращает управление планировщику - скажем, после прохождения одной итерации своего «основного цикла».Обычно выполняется главным циклом, вызывающим некую функцию «task ()» класса процесса, и задача (), заканчивающаяся «return», без выполнения длинных циклов.

Начинаем с модели"задачи / процесса".Должен ли он быть загружаемым (скажем, как общий объектный файл) или предопределенным при запуске (класс).Точка входа, постоянное хранилище состояний, подпрограмма «основного цикла» с конечным автоматом (обычно реализуемая как переключатель, который перемещается между различными состояниями).Задача работает путем многократного запуска процедуры «точки входа».

Скорее всего, будут реализованы следующие состояния:

  • init, запускаемый при запуске, один раз
  • idle - проверка запросов на активность, если их нет, возвращает управление
  • различными «рабочими» состояниями.

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

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

Чтобы помочь себе представить, вы обычно пишете:

 int main()
 {

      do_something1();
      do_something2();
 }

 void do_something1()
 {

      //initialize
      ...perform stuff
     int x=0;
      //main loop
      do {
           if(condition...) {
                ...perform stuff
           } else {
                ...perform other stuff
                blargh(x);
                x++;
           }
      } while(!end);

      //ending

      //finish...
      ...mop up.
 }

Что нужно написать:

 int main()
 {

      //main loop
      do {
           do_something1();
           do_something2();

      } while(!global_end);
 }

 void do_something1()
 {
      static state_enum state = STATE_INI;
      static int x=0;

      switch(state)
      {
      case STATE_INI:
           //initialize
           ...perform stuff
           state = STATE_WORK1;
           x=0;
      break;
      case STATE_WORK1:
           //main loop, mode 1
           ...perform stuff
           if(condition) state = STATE_WORK2;
           if(condition2) state = STATE_END;
           if(condition4) state = STATE_IDLE;
      break;
      case STATE_WORK2:
           //main loop, mode 2
           ...perform stuff
              blargh(x);
              x++;
           if(condition3) state = STATE_WORK1;
           if(condition4) state = STATE_IDLE;
      break;
      case STATE_IDLE:
           //do nothing
           //don't do any stuff.
           if(any_condition) state = STATE_WORK1;
      break;
      case STATE_END:
           //finish...
           ...mop up.
      break;
      }

      return;
 }

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

           do_something1();
           do_something2();

, на динамический список функций для вызова.

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

0 голосов
/ 18 января 2011

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

Вы заметили, что у вас будет менеджер памяти.Это, конечно, возможно за пределами диспетчера процессов, но вам необходимо определить интерфейс между ними.Например, диспетчер процессов должен был бы выделить память для загрузки программного кода при запуске;Сама программа не может этого сделать (проблема с курицей и яйцом).

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