opennebula编译之后,生成两个后台进程oned和mm_sched,当执行one start时,实际执行脚本share/scripts/one,通过分析该脚本,其主要完成两个主要任务:
(1) oned -f 2 > &1 &
(2) mm_sched &
因此,下面的分析将会按照oned和mm_sched这两个进程的角度去分析。
1 oned进程代码分析
oned进程进程一共创建了10个管理者对象,大多数管理者对象的执行流程是类似的,即创建两个线程:管理者线程和监听者线程。
1.1监听者线程
监听者线程都是通过MadManager::start()创建的,该函数主要是创建管道用来实现监听线程与监听对象的通信,这点来分析下监听线程,即函数mad_manager_listener。
1.2管理者线程
管理者线程通过循环判断action队列是否为空,如果为空则睡眠等待,否则,从action队列上取出一个action进行处理,处理函数为:ActionManager::loop(),所有的action都要经过ActionManager类来进行处理,但是具体的实现方法则是通过每个对应的类实现ActionManager的虚成员函数来实现的。
1.3管理线程、监听线程与驱动线程之间的关系
至此,基本搞清楚了opennebula核心框架的运行和交互机制,下面将会详细分析每一个对象管理类的功能和实现细节。