流程管理器

问题描述 投票:0回答:3

我正在尝试用 C++ 进行内核模拟作为我的 DSA(数据结构和算法)项目。其中会有不同的模块(进程管理器,内存管理器等)。现在我必须制作一个流程管理器,但我对此只有一点想法(例如,我可以使用队列)。任何人都可以帮助我如何用 C++ 制作流程管理器。

c++ process process-monitoring
3个回答
1
投票

首先制作一个调度程序(除非您将“进程管理器”理解为通常所说的“调度程序”。)您必须决定多任务模型,合作还是抢占。先发制人可能很困难 - 使用某种中断等等......对于学校项目来说可能不必要地复杂。

如果你不知道该选择哪个模型,我强烈建议协作多任务处理。每个进程都会花费一小部分时间,然后将控制权返回给调度程序本身 - 例如,在完成其“主循环”的一次迭代之后。通常由主循环调用进程类的某种“task()”函数来完成,task() 以“return”结束,没有长循环正在进行。

从“任务/流程”模型开始。它应该是可加载的(例如,作为共享对象文件),还是在启动时预定义的(类)。入口点、持久状态存储、具有有限状态机的“主循环”例程(通常实现为在各种状态之间移动的开关)。该任务通过重复启动“入口点”例程来工作。

要实施的状态可能是:

  • init,启动时启动,一次
  • 空闲 - 检查活动请求,如果没有,则返回控制
  • 各种“工作”状态。

一旦完成,就准备一个此类任务的动态队列。添加、删除、迭代、提升优先级=乱序调用等等。 “调度程序”迭代所有任务并启动每个任务的“启动例程”。

准备好后,您可以编写通常所说的“任务管理器”——一个编辑列表的程序。从队列中删除程序、添加新程序、更改优先级、暂停等。

为了帮助你想象,你目前通常会写:

 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
投票

流程经理负责管理流程。显然,要完善这一点,您首先需要定义操作系统中进程的构成。例如,当所有进程都是单线程时,进程管理器没有理由处理线程。如果您没有虚拟内存,也不需要管理。

您确实注意到您有一个内存管理器。这当然可以在流程管理器之外实现,但是您需要定义它们之间的接口。例如,进程管理器需要分配内存来在启动时加载程序代码;程序本身无法做到这一点(先有鸡还是先有蛋的问题)。


-2
投票

glhf 格鲁夫 格鲁夫 格鲁夫格鲁夫 格鲁夫 格鲁夫 GLHF

© www.soinside.com 2019 - 2024. All rights reserved.