1.Docker 源码分析
2.yarn源码分析(四)AppMaster启动
3.对linux内核中container_of()宏的理解
4.container_of()
Docker 源码分析
本文旨在解析Docker的核心架构设计思路,内容基于阅读《Docker源码分析》系文章后,整理的核心架构设计与关键部分摘抄。Docker是Docker公司开源的基于轻量级虚拟化技术的容器引擎项目,使用Go语言开发,遵循Apache 2.0协议。高通源码地址Docker提供快速自动化部署应用的能力,利用内核虚拟化技术(namespaces及cgroups)实现资源隔离与安全保障。相比虚拟机,Docker容器运行时无需额外的系统开销,提升资源利用率与性能。Docker迅速获得业界认可,包括Google、Microsoft、VMware在内的领导者支持。Google推出Kubernetes提供Docker容器调度服务,Microsoft宣布Azure支持Kubernetes,VMware与Docker合作。Docker在分布式应用领域获得万美元的yy进频道源码C轮融资。
Docker的架构主要由Docker Client、Docker Daemon、Docker Registry、Graph、Driver、libcontainer以及Docker container组成。
Docker Client:用户通过命令行工具与Docker Daemon建立通信,发起容器管理请求。
Docker Daemon:后台运行的系统进程,接收并处理Docker Client请求,通过路由与分发调度执行相应任务。
Docker Registry:存储容器镜像的仓库,支持公有与私有注册。
Graph:存储已下载镜像,并记录镜像间关系的数据库。
Driver:驱动模块,实现定制容器执行环境,包括graphdriver、闲来邵阳麻将源码networkdriver和execdriver。
libcontainer:库,使用Go语言设计,直接访问内核API,提供容器管理功能。
Docker container:Docker架构的最终服务交付形式。
架构内各模块功能如下:
Docker Client:用户与Docker Daemon通信的客户端。
Docker Daemon:后台服务,接收并处理请求,执行job。
Graph:存储容器镜像,记录镜像间关系。
Driver:实现定制容器环境,包括管理、网络与执行驱动。
libcontainer:库,提供内核访问,实现容器管理。android studio 游戏源码
Docker container:执行容器,提供隔离环境。
核心功能包括从Docker Registry下载镜像、创建容器、运行命令与网络配置。
总结,通过Docker源码学习,深入了解其设计、功能与价值,有助于在分布式系统实现中找到与已有平台的契合点。同时,熟悉Docker架构与设计思想,为云计算PaaS领域带来实践与创新启发。
yarn源码分析(四)AppMaster启动
在容器分配完成之后,启动容器的代码主要在ContainerImpl.java中进行。通过状态机转换,container从NEW状态向其他状态转移时,会调用RequestResourceTransition对象。自动生成预算源码RequestResourceTransition负责将所需的资源进行本地化,或者避免资源本地化。若需本地化,还需过渡到LOCALIZING状态。为简化理解,此处仅关注是否进行资源本地化的情况。
为了将LAUNCH_CONTAINER事件加入事件处理队列,调用了sendLaunchEvent方法。该事件由ContainersLauncher负责处理。ContainersLauncher的handle方法中,使用一个ExecutorService(线程池)容器Launcher。ContainerLaunch实现了Callable接口,其call方法生成并执行launch_container脚本。以MapReduce框架为例,该脚本在hadoop.tmp.dir/application name/container name目录下生成,其主要作用是启动MRAppMaster进程,即MapReduce的ApplicationMaster。
对linux内核中container_of()宏的理解
container_of(ptr, type, member)宏的作用是通过结构体成员的地址和结构体类型推导出结构体的地址。具体来说,type表示结构体类型,member是结构体中的成员名,ptr指向member在type结构体中的地址。
在Linux内核源码中的tools\include\linux\kernel.h文件中,container_of宏的定义如下:
该宏定义中使用了两个关键概念:offsetof和typeof。offsetof宏返回指定成员在结构体中的偏移量,typeof则返回变量或表达式的数据类型。了解了这两个概念后,container_of宏的作用便可以理解。
offsetof宏的定义如下:
该宏将0转化为type *的结构体指针,表示地址为0的结构体指针,然后通过取地址符获取该结构体指针中member成员的地址,并将其强转为size_t类型,即表示member成员在结构体中的偏移量。
offsetof实例:
输出:
offsetof实例结果输出
typeof宏返回传入数据的类型,实例:
输出:
img
理解了offsetof和typeof后,container_of宏的实现就变得清晰了。它将0转化为type *结构体类型,然后取出结构体中的member成员,再通过typeof获取member成员的类型,定义一个member成员类型的指针,并将其赋值给传入的ptr指针。接下来,将获取的member地址强转为char *,减去member在type结构体中的偏移量,强转为type *后得到结构体的地址。
container_of实例:
输出:
原文链接: blog.csdn.net/Aa_lihua/...
container_of()
在Linux内核开发中,container_of宏的使用非常普遍。这个宏的主要作用是通过结构体成员的指针,间接访问到结构体的完整地址,以便访问其他成员变量。 其使用方法非常直观:只需要将结构体成员的指针、结构体类型以及成员名称作为参数传递给container_of宏,宏就会返回结构体的地址。 例如,如果我们需要在函数中操作一个特定结构体的成员,但只提供了该成员的指针,那么就可以使用container_of宏来获取整个结构体的地址,从而进一步操作结构体中的其他成员。 在具体实现中,container_of宏的参数包括了指向结构体成员的指针、结构体类型和成员名称。通过这个宏,我们可以方便地实现对结构体的间接访问。 在Linux源码中,container_of宏的应用十分广泛。比如在处理特定结构体时,我们可以通过传入结构体成员指针来获取结构体的地址,进而访问其他成员。 以下是一个具体的使用示例,通过传入work_struct类型的work指针,我们可以通过container_of宏获取rxrpc_connection类型(processor是rxrpc_connection结构的成员)的conn指针,并进一步访问debug_id、usage、events等成员。 为了验证container_of宏的正确性,可以编写代码并观察调试控制台的输出结果。在实际应用中,使用typeof()函数替代container_of宏的内部实现,可以实现相同的功能。 深入分析container_of宏的实现,我们可以看到其核心在于通过一系列复杂的类型转换和偏移计算,最终获取到结构体的完整地址。 具体来说,container_of宏的内部实现涉及到以下几个关键步骤:使用({ })表达式获取最后一个表达式的值。
通过typeof()或__typeof()函数获取成员在结构体中的类型和偏移。
使用const限定符确保指针的类型和内容不可改变。
通过结构体类型和偏移计算获取结构体的完整地址。
通过这种方式,container_of宏可以在不修改原始接口的情况下,访问到结构体中新增的成员。 其之所以出现的原因,主要是由于Linux内核在早期设计时,为了保持接口的一致性和兼容性,不得不采用这种方式来添加新特性。通过重新定义结构体并包含旧结构体,同时利用container_of宏间接访问新特性,开发者能够在不破坏原有接口的前提下,实现功能扩展。