(六)SDN 控制器 NOX 源码分析之—— Kernel

Kernel是用来管理所有组件的,它可以处理组件间的依赖关系,并且记录组件的安装,以供依赖需要,所以它是全局组件的container
接口
Kernel::init(info_file, argc, argv)
初始化核心
Kernel :: get_instance()
Kernel是单例模式,全局只有一个对象存在,通过这个函数取得对象
void Kernel :: attach_deployer(Deployer*)
安装一个Kernel未知的组件时,需要为组件附加一个Deployer
Deployer_list Kernel :: get_deployers() const
得到部署器的列表
Component_context* Kernel :: get(const Component_name&) const
根据组件名字查询组件上下文实例
Component_context*  Kernel ::   get(const Component_name&, const Component_state) const
用两个条件查询组件的上下文实例
Component_context_list Kernel :: get_all() const
得到所有组件上下文实例的列表
void Kernel :: install(const Component_name&, const Component_state) throw(state_change_error);
寻找一个需要安装此组件的deployer安装组件,并将组件的状态改到指定状态,如果组件已经安装,则抛出异常
void Kernel::install(Component_context* ctxt, const Component_state to)
安装新的组件到Kernel中,此方法被 Deployer :: deployer所调用,安装的状态为NOT_INSTALLED,而Deployer :: deployer被上面的同名重载方法install所调用
void Kernel::change(Component_context* ctxt, const Component_state to) throw(state_change_error)
改变组件的状态,组件对状态只能增大,不能变小。源码貌似有问题(kernel.cc第216句,我认为不该先改变它的状态)
void Kernel :: set_argument(const Component_name&, const Component_argument&)
添加想要安装的组件及参数
const Component_argument get_argument(const Component_name&) const
获得组件的参数
私有方法void Kernel::resolve()
Kernel试图解决依赖关系
私有方法bool Kernel :: resolve(const Component_state from, const Component_state to)
被上面的方法调用,解决conponent_context从状态from到to

成员变量的意义及意义
typedef std::list<Component_context*> Component_context_list;
typedef std::list<Deployer*> Deployer_list;
typedef hash_map<Component_name, Component_context*> Component_name_context_map; 
typedef hash_map<int, Component_context_list*> Component_state_context_set_map;
typedef hash_map<Component_name, Component_argument> Component_argument_map;
struct container_info
    {
        /* Universally Unique Identifier (UUID). Not 128-bits as defined
         * in the RFC 4122, but 64-bits for the convenience. */
        uint64_t uuid;
        /* The number of times the container has been restarted. */
        uint64_t restart_counter;
    };

/* Deployers to try if a new component context needs to be created. */ 
Deployer_list  deployers;
/* Every context */
Component_name_context_map  contexts;
/* Application properties */
Component_argument_map  arguments;
/* Set if a context required state has been changed while resolving. */ 
bool  state_requirements_changed;
/* Set if the kernel is installing a component context right now. */ 
bool  installing;
/* start time. used for uptime */
time_t  start_time;
/* Persistent container information unique to this container instance.
     * Retrieved and modified from/in a persistent storage in the
     * beginning of the boot sequence. If nothing exists on the storage,
     * the container creates a new info block with random UUID. */
container_info  info;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值