集群系统MOSIX分析(5)
2008-12-01 11:04:43 来源:WEB开发网2 向目标节点发送迁移请求并协商:
当节点A的调度函数schedule( )调度进程a运行时,在a退出核心态之前,OS将会检查该标志位,发现进程a要被迁移到节点B,则会向节点B上的迁移守护进程mosix_mig_daemon发出迁移请求。 节点B上的迁移守护进程接收到该请求后,将会派生(fork)出一个新的进程b来处理迁移请求,自己则继续在迁移端口监听迁移请求信息。b被标志为Remote进程。此时,进程b和进程a之间已经建立一条TCP的通讯连接,用于相互间交换信息。进程b则首先向B的负载平衡模块询问,是否要接受该请求。负载平衡模块根据平衡算法来决定接收或拒绝迁移请求。
3 提取并传送进程状态:
当节点B同意进程a迁移到本节点后,将向节点A发出同意应答。A收到同意应答后,则开始获取a的进程状态,并通过a与b之间打开的连接将状态传送到进程b。进程b则接收进程a的状态,并据此修改自身的进程状态。
4 恢复进程的执行:
a的进程状态迁移完后,a将成为进程的deputy部分,一直处于核心态的deputy_main_loop循环中,直到进程死亡或被迁移回home节点。在节点B上,进程b被改为就绪状态,加入运行队列中,等待被调度执行。当b被调度后,返回到用户空间后,将从a迁移前的用户指令处继续往下执行。至此,整个迁移过程完毕。
进程状态提取和恢复
在Linux中,一个进程有关的所有信息都保存在进程控制块(struct task_struct)中,包括进程调度、进程标识和用户标识、信号量处理、文件系统管理、内存管理、进程标志等等信息。进程标识符pid唯一的标识着一个进程。全局变量current指针指向当前正在运行进程的进程控制块。MOSIX是采用抢先式进程迁移机制,迁移的是当前的活跃进程。因此,通过全局变量current,我们很容易获取到正在迁移进程的的进程状态信息。
更多精彩
赞助商链接