I'm trying to make a kernel simulation as my DSA (data structure and algorithm) project in C++. There will be different modules(process manager, memory manager etc.) in it. Right now i have to make a Process Manager and I've only a little a idea about it (like, i can use a queue). Can anyone help me how can i make a process manager in c++.
2 回答
首先制作一个调度程序(除非您将“流程管理器”理解为通常所说的“调度程序”。)您必须决定多任务模型,合作与抢占。先发制人可能很困难 - 使用某种中断等等......对于学校项目来说可能是不必要的复杂。
如果您不知道该选择哪种模型,我强烈建议您进行协作多任务处理。这是每个进程花费一小段时间的地方,然后将控制权自行返回给调度程序 - 例如,在经历其“主循环”的一次迭代之后。通常由主循环调用进程类的某种“task()”函数来完成,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 语句简短而甜蜜,如果有的话在里面循环,展开更大的。但是编写调度程序本身,中断一个程序并保存它的状态,然后恢复它并从它中断的地方恢复它要困难得多。
流程管理器管理流程。显然,要完善它,您首先需要定义操作系统中的进程构成。例如,当您的所有进程都是单线程时,进程管理器没有理由处理线程。如果你没有虚拟内存,也不需要管理。
您确实注意到您将有一个内存管理器。这在流程管理器之外当然是可能的,但是您需要定义它们之间的接口。例如,进程管理器需要分配内存以在启动时加载程序代码;程序本身无法做到这一点(鸡和蛋的问题)。