集群系统MOSIX分析(6)
2008-12-01 11:04:52 来源:WEB开发网deputy这种方式将会给系统调用的执行带来不少的开销,主要是网络延迟。而系统调用是比较频繁的,因此这会给进程的执行带来一部分代价。
从系统调用返回
在系统调用最终真正返回,回到用户态之前,将会转到straight_to_mosix标号,调用mosix_pre_usermode_actions,在返回用户态之前作些MOSIX系统相关的处理工作。首先对当前进程的性质进行判断。
如果当前进程是REMOTE,则调用remote_pre_usermode_actions()。首先检查deputy是否还需要它在核心态中为其做某些处理工作,如果是,则睡眠等待直到deputy的允许进程继续运行。然后检查是否处于错误的节点,如果是,则设置需要迁移回home节点。如果出现紧急事件,如前面设置需要迁移回home节点,则通知deputy有紧急事件发生。最后,如果存在未处理的异步信号或内核强制投递的信号,则将信号转发给deputy处理。
如果是DEPUTY,则调用deputy_main_loop(),根据DEPUTY的特性,我们知道它只是REMOTE在HOME节点的剩余,它应该主要处理和REMOTE的交互,而不是作实际的进程处理工作(计算或IO)。所以DEPUTY进程应该在deputy_main_loop()中循环等待和REMOTE的交互,直到意外死亡或不再是DEPUTY。这就是我们前面所说为什么deputy一直处于核心态的原因。
当前进程应该是本地的普通节点,作local_pre_usermode_actions()。首先做负载信息的衰退工作。如果进程被选中迁移了,则调用follow_whereto()迁移之。每个进程都不是独立的,不可能不受系统运行其它进程的影响。如果其它进程对本进程告知了某些请求,则必须检查并处理它。下面是一些考虑的请求:
DREQ_CHECKCONF:请求该进程检查MOSIX配置。
DREQ_CAPCNG:进程的权能被改变了。
DREQ_DFSASYNC:DFSA改变,需要被同步
DREQ_CHECKSTAY:检查进程是否需要继续呆在当前节点。
更多精彩
赞助商链接