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

最佳答案

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

如果您不知道选择哪种模型,我强烈建议您进行协作式多任务处理。在这里,每个进程花费一小段时间,然后将控制权本身返回给调度程序-例如,经过其“主循环”的一次迭代之后。通常是通过主循环调用流程类的某种“ 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语句简短而甜美,而且非常简短,如果内部有任何循环,则展开更大的循环。但是,编写调度程序本身,中断程序并保存其状态,然后还原该程序并从中断的位置继续恢复要困难得多。

10-06 07:06