containerd的原理及应用详解(一)

2024-05-03 09:28

本文主要是介绍containerd的原理及应用详解(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本系列文章简介:

        随着容器技术的迅猛发展,容器运行时成为了关注的焦点之一。而容器运行时的核心组件之一就是containerd。containerd是一个高度可扩展的容器运行时,它负责管理容器的生命周期、镜像管理以及资源隔离等核心功能。它是由Docker团队开发并开源的,目前已经成为了Cloud Native Computing Foundation(CNCF)的顶级项目之一。

        containerd的原理及应用可以说是理解容器技术的关键。本系列文章将详细介绍containerd的原理及应用,从而帮助大家更好地理解容器技术的核心概念和运行原理

        通过本系列文章的学习,大家将对containerd的原理和应用有一个全面的了解,从而能够更好地理解容器技术的核心原理和实践。无论是从事容器技术的开发者,还是运维工程师,本系列文章都将为您提供宝贵的参考和指导,帮助您更好地应用containerd进行容器化部署和管理。

        欢迎大家订阅《Java技术栈高级攻略》专栏,一起学习,一起涨分!

目录

一、containerd概述

1.1 什么是containerd

1.2 containerd的起源与发展

1.3 containerd与Docker的关系

二、containerd的架构与原理

2.1 containerd的组件架构

2.1.1 client

2.1.2 containerd daemon

2.1.3 shim

2.2 OCI(Open Container Initiative)规范

2.2.1 OCI的运行时规范

2.2.2 OCI的镜像规范

2.3 containerd的存储与镜像管理

2.3.1 镜像的拉取与推送

2.3.2 镜像的缓存与存储

2.4 containerd的网络管理

2.5 containerd的容器生命周期管理

三、containerd的应用场景

四、containerd的性能与优化

五、containerd的安全性

六、containerd的实践与案例

七、containerd的未来发展

八、结语


一、containerd概述

1.1 什么是containerd

containerd是一个高性能、高度可扩展的容器运行时,负责在一个或多个操作系统实例中执行容器的生命周期管理和资源隔离。它是由Docker团队开发并开源的,并且已经成为Cloud Native Computing Foundation(CNCF)的顶级项目之一。

在容器技术中,容器是一种轻量级的虚拟化技术,将应用程序及其所有依赖项打包在一起,以便可以在任何环境中运行。而容器运行时则是负责管理和执行这些容器的软件组件。

containerd提供了一组API和工具,可以管理容器的生命周期、镜像管理、资源隔离等核心功能。它为容器提供了高度可靠的运行环境,能够快速启动和停止容器,并提供安全的容器隔离,确保不同容器之间的互相影响。

containerd的架构设计非常模块化和可扩展,它由多个独立的组件组成,包括运行时、镜像管理、网络管理等。这些组件可以根据需求进行灵活配置和定制,以满足不同的容器管理需求。

containerd在容器生命周期管理方面提供了一系列API,包括创建、启动、停止、删除等操作,以及监控和日志记录等功能。同时,containerd还提供了强大的镜像管理功能,可以从远程仓库拉取镜像,并进行本地缓存和共享。

总而言之,containerd是一个高性能、高度可扩展的容器运行时,它提供了容器的生命周期管理、镜像管理和资源隔离等核心功能,是容器技术中不可或缺的关键组件。


1.2 containerd的起源与发展

containerd的起源可以追溯到Docker项目。Docker是一个流行的容器化平台,最初作为开源项目于2013年发布,其背后的技术和概念深刻影响了现代容器技术的发展。而containerd正是在Docker项目中作为核心组件开发出来的。

随着Docker的发展和广泛应用,人们意识到需要将Docker的核心功能拆分成更小、更独立的组件,以提高可扩展性和灵活性,并使其成为一个通用的容器运行时。于是,在2017年,Docker将containerd作为一个独立的开源项目发布,并将其捐赠给了CNCF,成为了CNCF的顶级项目之一。

从那时起,containerd开始引起更多开发者的关注和参与。它的发展逐渐成为一个重要的容器运行时,应用于各种不同的容器管理场景。与此同时,containerd也吸引了其他公司和社区的贡献,不断增加新的功能和扩展性,使其成为一个更加强大和可靠的容器运行时。

containerd的发展还受益于容器技术的普及和云原生计算的兴起。越来越多的企业和组织开始采用容器化技术来构建和部署应用程序,containerd作为其中的关键组件,为其提供了高性能和可靠的容器运行环境。同时,containerd也与其他云原生技术和工具集成,如Kubernetes、CRI-O等,进一步推动了其发展和应用。

总的来说,containerd的起源可以追溯到Docker项目,并在开源社区的共同努力下,逐渐发展成为一个重要的容器运行时,并广泛应用于各种容器管理场景。其发展与容器技术的普及和云原生计算的兴起密不可分,为构建现代化的应用提供了强大的基础设施。


1.3 containerd与Docker的关系

containerd与Docker有着密切的关系,可以说containerd是Docker的核心组件之一。

在过去,Docker将所有的核心功能都集中在一个单独的二进制文件中,负责容器的构建、运行和管理。然而,随着Docker项目的发展,人们意识到需要将其拆分成更小、更独立的组件,以提高可扩展性和灵活性。

因此,Docker决定将Docker引擎中的核心功能抽取出来,形成了containerd项目。containerd可以看作是Docker引擎的运行时部分,负责容器的生命周期管理、镜像管理和运行环境的管理。

具体来说,containerd提供了一组标准的API和功能,用于容器的创建、启动、停止、删除等操作。它还支持镜像的拉取、推送和存储,以及容器的网络和存储管理。containerd还具备高度可扩展性和可插拔性,可以与其他工具和平台集成,如Kubernetes、CRI-O等。

尽管containerd是从Docker项目中分离出来的独立组件,但它仍然保持着与Docker的兼容性。这意味着可以使用Docker CLI和Docker Compose等工具来与containerd进行交互,并且可以无缝地迁移现有的Docker应用程序到基于containerd的环境中。

因此,可以说containerd与Docker是密切相关的,containerd作为Docker的核心组件之一,为Docker提供了高度可扩展和灵活的容器运行时环境,同时也推动了容器技术的进一步发展和普及。

二、containerd的架构与原理

2.1 containerd的组件架构

2.1.1 client

containerd的组件架构非常灵活和可扩展,由多个组件构成,其中之一是client。

在containerd的架构中,client组件负责与containerd守护进程进行通信,并提供用户接口(API)以便与containerd交互。

client组件作为容器的管理接口,允许用户通过命令行工具或编程接口与containerd进行交互,执行容器相关的操作。它提供了一系列的API方法,用于容器的创建、启动、停止、删除以及查看容器状态等操作。

client组件使用gRPC协议与containerd守护进程进行通信,通过与守护进程的交互,可以实现对容器和镜像的管理。通过client组件,用户可以发送命令和请求给containerd守护进程,并获取运行结果或返回的数据。

client组件还可以与其他工具和平台集成,如Docker CLI、Kubernetes等。通过与这些工具的集成,用户可以使用熟悉的工具来管理和操作容器,而不需要直接与containerd进行交互。

总之,client组件是containerd架构中的重要组成部分,它提供了与containerd守护进程进行通信的接口,使用户能够方便地管理和操作容器。通过client组件,用户可以使用命令行工具或编程接口与containerd交互,并执行各种容器相关的操作。


2.1.2 containerd daemon

containerd守护进程(daemon)是containerd架构中的核心组件,它负责管理和运行容器。containerd daemon是一个长期运行的后台进程,提供容器和镜像的生命周期管理、存储管理、网络管理等功能。

containerd daemon的主要功能包括:

  1. 容器管理:containerd负责容器的创建、启动、停止和删除等操作。它提供了对容器的生命周期管理,可以监控容器的状态变化,如容器的运行状态、资源使用等。containerd还支持容器的检查点和恢复功能,允许容器在不同的主机上进行迁移和恢复。

  2. 镜像管理:containerd负责镜像的管理和分发。它能够下载、上传和删除镜像,并支持镜像的构建、导出和导入等操作。containerd通过使用OCI(Open Container Initiative)标准来管理和操作容器镜像,保证了镜像的兼容性和可移植性。

  3. 存储管理:containerd使用容器运行时(runtime)的接口来管理容器的文件系统和存储卷。它通过使用snapshot功能来创建和管理容器的文件系统快照,以及通过使用mount功能将文件系统挂载到容器中。containerd还支持多种存储后端,如本地文件系统、网络存储等。

  4. 网络管理:containerd daemon能够管理容器的网络配置,包括网络接口、IP地址、端口映射等。它支持多种网络模式,如命名空间隔离、overlay网络、MACVLAN等。containerd还支持与常用的网络插件(如CNI)进行集成,以实现更灵活的网络配置。

  5. 安全管理:containerd daemon提供了安全功能来保护容器的运行环境。它支持容器的隔离和安全增强技术,如命名空间、cgroups、seccomp等。containerd还允许用户配置和管理容器的安全策略,以确保容器的安全性和可靠性。

containerd daemon的架构设计灵活且可扩展,它可以与各种容器运行时(如runc、containerd-shim等)以及其他容器管理工具(如Docker、Kubernetes)进行集成,以满足不同的应用需求和场景。 containerd daemon是一个可靠且稳定的基础组件,广泛应用于容器平台和云计算环境中,提供高效、可管理和安全的容器运行时环境。


2.1.3 shim

containerd的架构中的另一个重要组件是shim(容器引导程序),它在containerd daemon和容器运行时之间起到了桥接的作用。shim的主要功能是在宿主机上启动和管理容器,并与containerd daemon进行通信。

shim的核心原理是通过使用标准的容器运行时接口(CRI)来与containerd daemon进行交互。它以独立进程的形式运行,负责处理容器的生命周期管理、资源隔离、文件系统挂载等操作。

shim组件的主要职责包括:

  1. 容器生命周期管理:shim负责启动和停止容器。当containerd daemon接收到创建容器的请求时,它会调用相应的shim启动一个新的容器进程,并将容器的相关信息传递给shim。shim在接收到停止容器的请求后会发送相应的信号给容器进程,从而使容器进程正常退出。

  2. 容器资源隔离:shim负责设置和维护容器的资源隔离机制,如命名空间、cgroups等。容器使用的资源,如CPU、内存、磁盘等可以被限制和控制,以保证容器间的互相隔离和资源的合理分配。

  3. 文件系统挂载:shim负责在容器中挂载文件系统。它会根据containerd daemon传递的挂载请求,将相应的文件系统挂载到容器的指定目录下。shim还可以管理容器中的文件系统快照,以便容器在不同的主机上进行迁移和恢复。

  4. 事件通信:shim负责与containerd daemon进行事件通信。它会向containerd daemon报告容器的状态变化,如容器的创建、启动、停止等。containerd daemon可以通过监听shim发送的事件来实现对容器的实时监控和管理。

shim组件的设计目标是尽量减少对宿主机环境的依赖,使容器的运行环境更加独立和可靠。它具有良好的扩展性和灵活性,可以支持多种容器运行时,如runc(containerd内置的默认运行时)、containerd-shim、gVisor等。

通过将shim作为一个独立的组件,containerd可以更好地实现容器和容器运行时的解耦,并提供一个通用的接口来与不同的容器运行时进行交互。这种架构设计使得containerd更加灵活、可扩展,并能够满足不同的容器管理需求。


2.2 OCI(Open Container Initiative)规范

2.2.1 OCI的运行时规范

在containerd的架构和原理中,OCI(Open Container Initiative)规范扮演着重要的角色。OCI致力于定义容器的标准化规范,包括容器格式和容器运行时。

OCI的运行时规范定义了容器的运行时接口,以使不同的容器运行时能够遵循相同的标准来创建和管理容器。OCI运行时规范的核心概念是运行时(Runtime)和容器(Container)。

  1. 运行时(Runtime):OCI运行时是容器运行时的实现,它负责创建和管理容器的生命周期。运行时是一个可以启动和停止容器的组件,它处理容器的资源隔离、文件系统挂载、网络配置等操作。OCI运行时规范定义了运行时所需的接口和行为,使得运行时可以在遵循规范的前提下与其他组件(如containerd)进行交互。

  2. 容器(Container):OCI定义了容器的标准化格式,即容器映像(Container Image)规范。容器映像是一个只读的文件系统快照,它包含了容器运行所需的文件和元数据。OCI容器映像规范规定了容器映像的结构和内容,并定义了容器的启动方式和运行参数。

OCI运行时规范的目标是实现容器的互操作性和可移植性,使得不同的容器运行时能够在遵循相同规范的前提下无缝地工作。这样,用户可以将容器应用在不同的容器运行时上,而无需对应用进行修改或适配。

对于containerd来说,它作为一个容器运行时管理器,可以通过支持OCI运行时规范来与不同的OCI兼容运行时进行集成。它可以使用OCI容器映像规范来管理和操作容器映像,并通过OCI运行时规范与容器运行时进行通信。这种与OCI规范的整合,使得containerd能够提供与容器格式和容器运行时无关的容器管理功能,同时也促进了容器生态系统的发展和统一。


2.2.2 OCI的镜像规范

OCI(Open Container Initiative)规范在容器化领域起着重要的作用,其中之一就是定义了容器镜像规范。容器镜像规范定义了容器镜像的结构、内容和元数据,以实现容器镜像的互操作性和可移植性。

OCI的镜像规范主要有以下几个方面:

  1. 镜像格式:OCI规范定义了容器镜像的文件格式,该文件格式以tar文件为基础,将容器的文件系统层叠在一起。镜像可以由多个只读的文件系统层组成,每个层代表一个文件系统的快照,并且将这些层按照一定的顺序叠加起来。

  2. 镜像元数据:OCI规范定义了容器镜像的元数据标准,包括容器镜像的名称、版本、作者、创建时间等信息。这些元数据信息以标准的JSON格式进行描述,使得不同的容器运行时能够识别和解析这些信息。

  3. 镜像引用:OCI规范定义了容器镜像的引用规则,即如何唯一标识和引用一个容器镜像。引用规则是基于名称和标签的,名称用于指定镜像的仓库和命名空间,而标签则用于标识镜像的版本信息。

  4. 镜像分发:OCI规范还定义了容器镜像的分发方式,即如何将镜像从一个地方发送到另一个地方。常见的镜像分发方式包括使用容器注册表进行推拉操作,以及使用OCI镜像索引文件进行镜像的索引和分发。

OCI的镜像规范主要目的是实现容器镜像的互操作性和可移植性。通过遵循OCI镜像规范,用户可以将容器镜像在不同的容器运行时之间进行无缝转移和共享,而无需进行修改或适配。这种标准化的镜像规范为容器生态系统的发展和集成提供了便利。


2.3 containerd的存储与镜像管理

2.3.1 镜像的拉取与推送

在containerd中,镜像的拉取和推送是通过容器注册表(Container Registry)进行的。容器注册表是存储和管理容器镜像的服务器,它提供了容器镜像的存储、索引和分发功能。

镜像的拉取过程如下:

  1. 客户端向容器注册表发送拉取请求,指定要拉取的镜像的名称和标签。
  2. 容器注册表接收到请求后,首先检查本地是否已经存在该镜像。如果本地不存在,则根据名称和标签在注册表上查找相应的镜像。
  3. 如果注册表上存在该镜像,将镜像的元数据信息返回给客户端。
  4. 客户端根据元数据信息,向注册表请求下载镜像的各个文件系统层,并将这些层叠加组合成完整的镜像。
  5. 客户端通知containerd将镜像保存到本地存储中,以便后续使用。

镜像的推送过程如下:

  1. 客户端将要推送的镜像上传到容器注册表。客户端需要将镜像分成多个文件系统层,并将这些层按照一定的顺序推送给注册表。
  2. 注册表接收到镜像的各个层,并将这些层保存到持久化存储中。
  3. 注册表根据镜像的名称和标签,更新镜像的元数据信息,包括版本和发布时间等。
  4. 客户端通知containerd推送完成,以便后续使用该镜像。

通过容器注册表,containerd实现了镜像的拉取和推送功能。这使得用户可以方便地获取和共享镜像,以满足不同环境下的容器化需求。


2.3.2 镜像的缓存与存储

在containerd中,镜像的缓存和存储是通过使用Graph驱动程序来管理的。Graph驱动程序负责将镜像的文件系统层缓存到本地,并提供对镜像的读取和写入功能。

镜像缓存的过程如下:

  1. 当用户从容器注册表拉取镜像时,containerd会先检查图像的缓存是否存在。
  2. 如果图像缓存已经存在,则直接从缓存中读取图像。这样可以节省时间,避免重复下载和解压操作。
  3. 如果图像缓存不存在,containerd会根据镜像的名称和标签创建一个临时目录,用于存储下载的镜像文件。
  4. 下载完成后,containerd会将镜像的各个文件系统层解压到该临时目录中。
  5. 完整的镜像文件系统层被存储在临时目录中,并被标记为可读写状态。

镜像存储的过程如下:

  1. 完整的镜像文件系统层通过Graph驱动程序被存储在本地的持久化存储中。Graph驱动程序将镜像的各层以及元数据信息存储在指定的目录结构中。
  2. 存储的目录结构通常由镜像的名称和标签构成,以便容易识别和管理不同版本的镜像。
  3. 当容器需要使用镜像时,containerd会根据镜像的名称和标签从存储中读取相应的文件系统层,并将其加载到容器中。

通过使用Graph驱动程序,containerd实现了镜像的缓存和存储功能。这样可以有效地管理镜像的文件系统层,并提供高效的读写操作,以满足容器化环境中对镜像的需求。


2.4 containerd的网络管理

在containerd中,网络管理主要通过使用CNI(Container Networking Interface)规范来进行。CNI是一种用于容器网络管理的开放标准,可以使不同的容器运行时实现与网络插件进行交互和集成。

containerd使用以下方式进行网络管理:

  1. CNI插件:containerd通过使用CNI插件与宿主机上的网络插件进行交互,以创建和配置容器的网络。CNI插件负责实现容器网络的创建、配置和删除功能,以及容器与宿主机网络之间的连接和通信。

  2. CNI配置:containerd使用CNI配置文件来描述容器的网络配置。CNI配置文件包含了网络插件的名称以及配置参数,描述了容器应该如何进行网络连接和配置。containerd会根据CNI配置文件调用相应的CNI插件来创建和配置容器的网络。

  3. CNI插件链:containerd支持配置多个CNI插件链,可以根据具体需求将多个网络插件串联使用。每个插件链可以包含一个或多个CNI插件,按照顺序调用来完成容器网络的创建和配置。

  4. CNI插件交互:containerd通过调用CNI插件提供的接口与插件进行交互。通过定义合适的输入参数和环境变量,containerd能够向CNI插件传递容器的网络相关信息,如网络名称、IP地址、路由规则等。插件在收到调用请求后,会执行相应的网络操作,并将结果返回给containerd。

通过使用CNI规范,containerd能够与各种网络插件进行集成,灵活地管理容器的网络。这使得用户能够根据自己的需求选择适合的网络插件,并利用containerd来管理容器的网络配置和连接。


2.5 containerd的容器生命周期管理

在containerd中,容器的生命周期管理是通过使用gRPC API和容器运行时接口(CRI)规范实现的。以下是containerd的容器生命周期管理流程:

  1. 容器创建:用户通过containerd的gRPC API调用创建容器的方法,传递容器的配置和参数。containerd会根据接收到的请求,使用CRI规范将容器的创建请求转发给底层容器运行时(如runc)进行处理。

  2. 容器启动:底层容器运行时接收到创建容器的请求后,会根据容器的配置和参数,在宿主机上创建一个新的容器进程。此时,容器进程处于启动状态,但还没有运行用户指定的应用程序。

  3. 应用程序运行:容器进程启动后,底层容器运行时会根据容器配置中指定的镜像,通过containerd的镜像管理模块从本地或远程拉取相应的镜像,并进行解压和准备工作。一旦镜像准备完毕,容器运行时会将用户指定的应用程序运行在容器中。

  4. 容器停止和销毁:当用户通过containerd的gRPC API调用停止或销毁容器的方法时,containerd会将停止或销毁容器的请求转发给底层容器运行时进行处理。底层容器运行时会发送相应的信号给容器进程,使其停止运行。一旦容器停止运行,底层容器运行时会释放容器的资源,并将容器的元数据从containerd中删除。

  5. 容器状态管理:containerd会根据底层容器运行时的状态,实时更新容器的状态信息,并将其存储在元数据目录中。用户可以通过containerd的API查询容器的状态,如运行状态、网络配置等。

通过CRI规范和底层容器运行时的协同工作,containerd能够对容器的生命周期进行管理,包括容器的创建、启动、停止和销毁等操作。这样,用户可以方便地使用containerd来管理容器的生命周期,以及监控和控制容器的状态。

三、containerd的应用场景

        详见《containerd的原理及应用详解(二)

四、containerd的性能与优化

        详见《containerd的原理及应用详解(二)

五、containerd的安全性

        详见《containerd的原理及应用详解(三)

六、containerd的实践与案例

        详见《containerd的原理及应用详解(三)

七、containerd的未来发展

        详见《containerd的原理及应用详解(三)

八、结语

        文章至此,已接近尾声!希望此文能够对大家有所启发和帮助。同时,感谢大家的耐心阅读和对本文档的信任。在未来的技术学习和工作中,期待与各位大佬共同进步,共同探索新的技术前沿。最后,再次感谢各位的支持和关注。您的支持是作者创作的最大动力,如果您觉得这篇文章对您有所帮助,请分享给身边的朋友和同事!

这篇关于containerd的原理及应用详解(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/956403

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、