Docker实现原理/容器原理(LXC,Cgroups,Docker)

2023-05-16

Docker实现原理/容器原理

  • Docker实现原理/容器原理
    • 什么是容器(Container)
    • 容器
      • 传统架构问题
      • 容器是什么
      • 容器如何实现
    • Cgroups
      • Cgroups是什么
      • Cgroups解决什么问题
      • Cgroups如何工作
        • Cgroups层级结构(Hierarchy)
    • LXC
      • LXC是什么
      • LXC解决什么问题
      • LXC如何工作
    • Dcoker
      • Docker是什么
      • Docker解决什么问题
      • Docker如何工作
  • reference

本文主要让你了解什么是容器,Docker是什么,容器和Docker是什么关系,Docker实现原理

Docker实现原理/容器原理

容器是Linux内核提供得技术,Docker只是一个容器工具Docker ≠ 容器

谈Docker必谈容器 先了解一下容器是什么

什么是容器(Container)

根据WIKI的定义,容器概念如下:

  1. 容器是一种基础工具;泛指任何可以用于容纳其他物品的工具,可以是部分或完全封闭,被用于容纳、存储、运输物品。物体可以放置在容器中,而容器则可以保护内容物。
  2. 人类使用容器的历史至少有十万年,甚至可能有数百万年的历史;

计算机领域内的容器技术想要能明白的话,要先了解一下传统虚拟化面临的问题。先看下一节。

容器

容器Logo

计算机容器技术本身也是一种虚拟化技术(轻量级虚拟化)。在容器技术诞生之前我们已经有了传统虚拟化:KVM、VMware、Xen等传统虚拟化实现。那我为什么还要使用容器呢?

传统架构问题

传统虚拟化架构图

如上图所示传统虚拟化分为Type-I(裸机) 和Type-2(寄宿)两种类型,试想一下,如下场景:
我想运行一个Nginx,在两种虚拟化类型下分别需要做那些事情:
1.Type-I: 需要为Nginx程序创建一个操作系统,然后才能运行Nginx。Nginx运行在虚拟操作系统的用户空间。

硬件资源虚拟化链路为 hypervisor->操作系统内核空间->操作系统用户空间->Nginx。

2.Type-II: 需要为Nginx程序创建一个操作系统,然后才能运行Nginx。Nginx运行在虚拟操作系统的用户空间。

硬件资源虚拟化链路为 寄宿的操作系统->hypervisor->操作系统内核空间->操作系统用户空间->Nginx

综上所述,我就想运行一个Nginx,在传统虚拟化中需要为Nginx准备一个操作系统,才能运行Nginx。必须花费大量的时间来安装与设置虚拟机,接着才能开始评估或测试所需运作的软件,这些设置包含了操作系统的安装、安全性或兼容性软件的更新、网络、系统调校…等。
注:横线部分不是容器技术本身能解决的,由Docker提供镜像(Image) 机制解决。

回归一下这个问题的本质。应用程序运行依赖操作系统提供的库,依赖的软件和特定于系统的数据结构或文件系统。于是我们要为应用程序提供虚拟操作系统,虚拟的操作系统同时提供了一个虚拟的内核。虚拟的内核来管理虚拟的硬件设备。

**总结一下:传统虚拟化在使用成本上较高,提供虚拟的硬件设备,虚拟的操作系统。当然还有为了提供这些所造成的CPU,内存压力。既然如此何不直接把虚拟的操作系统去掉?于是容器技术就诞生了。

容器是什么

去掉虚拟的操作系统层后,我们所追求的环境如下:

容器内核

创建多个隔离环境。应用程序应该跑在用户空间,内核提供的是内核空间,而现在需要进程运行在隔离环境,在一个内核中用户空间只有一个,那就表示所需要隔离的是用户空间。所以期望的是将用户空间隔离成多组,彼此之间互相不干扰,一个用户空间至运行一个或部分进程。(注意通常会有一个名称空间有特权,一般是第一个用户空间,类系Xen和KVM) 随后进程启动和运行在用户空间中,在众多用户空间能共享底层同一个内核,被同一个内核管理。但是进程自己运行时所能看到的边界是所属用户空间的边界。这样彼此间也就隔离了。(这样隔离并没有主机虚拟化隔离的那么彻底) 此时这个用户空间给进程提供运行环境,并且其能够保存内部进程不是其他进程干扰。这就是计算机的容器技术。

容器如何实现

容器实现

一个用户空间的主要目标就是隔离环境,任何进程运行在用户空间当中,进程就认为自己是唯一运行在到当前内核之上的用户空间中的进程,而且它所能看到的所有进程也就是当前主机的所有进程了。 一个名称空间他应该有这些组件:UTS(主机名和域名)、Mount(根文件系统)、IPC(同名称空间进程间通信专用通道)、 PID(进程数)、User(用户)、Net(网卡,网络接口,全套接字)。如上这些资源都由内核通过名称空间机制,并且封装成为系统调用向外暴露。还有一个很重要的机制chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以 /,即以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为 / 位置。 在现代计算机中容器就是通过内核提供的6个名称空间和chroot实现的。

内核在设计之初并没有提供如上的资源隔离机制,如下是各个名称空间隔离在内核实现的对应关系。
资源隔离对应内核版本号

namespace系统调用参数隔离内容内核版本
UTSCLONE_NEWUTS主机和域名2.6.19
IPCCLONE_NEWIPC信号量,消息队列和共享内存2.6.19
PIDCLONE_NEWPID进程编号2.6.24
NetworkCLONE_NEWNET网络设备、网络栈、端口等2.6.29
MountCLONE_NEWNS挂载点(文件系统)2.4.19
UserCLONE_NEWUSER用户和用户组3.8

Cgroups

Cgroups是什么

cgroups,其名称源自控制组群(英语:control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组的资源(如CPU、内存、磁盘输入输出等)。

这个项目最早是由Google的工程师(主要是Paul Menage和Rohit Seth)在2006年发起,最早的名称为进程容器(process containers)。在2007年时,因为在Linux内核中,容器(container)这个名词有许多不同的意义,为避免混乱,被重命名为cgroups,并且被合并到2.6.24版的内核中去。自那以后,又添加了很多功能。

Cgroups解决什么问题

有过个容器在跑,万一有一个容器内部的进程出现意外情况,像脱缰的野马一样疯狂的抢占系统资源,如CPU,内存等。CPU因为是可压缩性资源所以其实还好,内存一旦被使用完系统将会发生OOM(暴头程序)等异常,且其他容器内的进程也会因没有内存而无法运行。因为容器共用一个内核所以一旦资源被疯狂掠夺,其他运行的进程将受影响。这怎么能行呢? 于是Cgroup就用来解决容器资源限制的问题。在内核中用Cgroup针对每一种名称空间进行资源限制。

Cgroups如何工作

Cgroups无非是把系统级的资源分成多个资源组(子系统),然后把每个组内的资源量指派或分配到特定用户空间的进程来实现。

Cgroups可以将资源分成多个资源组(子系统) 如下所示:

  1. blkio: 块设备IO
  2. cpu: CPU
  3. cpuacct: CPU资源使用报告
  4. cpuset: 多处理器平台上的CPU集合
  5. devices:设备访问
  6. freezer: 挂起或恢复任务
  7. memory: 内存用量及报告
  8. perf_event: 对cgroup中的人种进行统一的性能测试
  9. net_cls: cgroup中的任务创建的数据报文的类别标识符

Cgroups层级结构(Hierarchy)

内核使用cgroup结构体来表示一个control group对某一个或多个cgroups资源组的资源限制。cgroup结构体可以组织成一颗树的形式,每一棵cgroup组成的树称之为一个cgroups层级结构。 cgroups层级结构可以attach 一个或多个cgroups资源组,层级结构可以使用被attach的cgroups资源组进行资源限制。
Cgroup绑定关系
上图所示 一个cgroups层级结构,一个层级结构中是一颗树形结构,树的每一个节点是一个cgroup结构体(如cpuRoot,cpu2,CM3)。 这个cgroups层级结构attach了cpu资源组和cpuacct资源组,于是当前资源组就可以对cpu资源进行限制,并且对进程的cpu使用情况进行统计。 在每一个cgroups层级结构中,每一个节点(cgroup结构体)可以对资源设置不同的限制权重,子节点默认会遵循父节点的权重。如上图cpu2组中的进程可以使用60%的cpu时间片而CM3组的进程可以使用40%的cpu时间片。

进程和层级结构关系

在创建了cgroups层级结构中的节点(cgroup结构体)之后,可以把进程加入到某一个节点的控制任务列表中,一个节点的控制列表中的所有进程都会受到当前节点的资源限制。同事某一个进程也可以被加入到不同的cgroups层级的节点中,因为不同的cgroups层级结构可以负责不同的系统资源。进程和节点(cgroup结构体)是多对多的关系,但是节点(cgroup结构体)不可以是同一个cgroups层级结构中的。

LXC

LXC是什么

在这里插入图片描述

LXC,其名称来自Linux软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–level virtualization)技术,为Linux内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享API来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得Linux用户可以容易的创建和管理系统或应用容器。

在Linux内核中,提供了cgroups功能,来达成资源的区隔化。它同时也提供了名称空间区隔化的功能,使应用程序看到的操作系统环境被区隔成独立区间,包括行程树,网络,用户id,以及挂载的文件系统。但是cgroups并不一定需要引导任何虚拟机。

LXC利用cgroups与名称空间的功能,提供应用软件一个独立的操作系统环境。LXC不需要Hypervisor这个软件层,软件容器(Container)本身极为轻量化,提升了创建虚拟机的速度。软件Docker被用来管理LXC的环境。

LXC解决什么问题

通过上面的介绍,我们知道容器(6个名称空间)和cgroups组合即可实现完整并且保证隔离的容器环境。但是控制名称空间和cgroups都是系统调用,又有多少人能掌握呢? 于是LXC出现了,LXC就是让用户可以轻松地创建和管理系统或应用程序容器。

LXC如何工作

LXC架构
LXC容器通常被认为是在chroot和传统虚拟化之间的。LXC的目标是创建一个尽可能接近标准的linux安装环境,但不需要单独的内核。换而言之LXC就像是传统虚拟化一样提供一个VM只是和寄宿系统公用同一个内核(与docker不一样)

LXC工作模式是这样的,使用lxc-create创建一个容器(名称空间),然后通过模板(早期shell脚本,目前yaml脚本),执行安装过程。这个模板,会自动实现安装过程,这个安装就是指向了你想创建的容器(名称空间)的系统发行版的仓库,利用仓库中的程序包下载至本地来完成安装过程。于是这个容器(名称空间)就像虚拟机一样使用。

lxc-centos模板示例
lxc-centos模板:https://github.com/AtlanCI/LXC-Centos_template/blob/main/lxc-centos

Dcoker

Docker是什么

在这里插入图片描述

Docker 是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。 Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。

Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。 容器更多的用于表示 软件的一个标准化单元。由于容器的标准化,因此它可以无视基础设施(Infrastructure)的差异,部署到任何一个地方。另外,Docker也为容器提供更强的业界的隔离兼容。

Docker解决什么问题

通过上面的描述我们知道了LXC被用来管理容器,但是使用LXC来管理容器将会面临下列问题:

  1. 要想使用LXC管理容器,要学习很对LXC工具。LXC命令列表
  2. 必要时要定制模板
  3. 每一个名称空间都是安装生成的,在该名称空间中运行的进程会生成一些文件(数据库之类的),当该宿主故障时,如何迁移到其他宿主机上
  4. 批量创建较困难

Docker和LXC架构对比

总结起来就是通过LXC管理容器比起传统虚拟化的虚拟机的使用复杂度没有多大降低,更何况隔离性也没有虚拟机那么好。当然了好处在于每个容器中的进行都可以直接使用宿主机的性能,中间没有额外开销(节约资源)。LXC在分发和大规模使用上没有很好的方法。于是后来就出现了Docker,早期的Docker可以看作为是LXC的增强版(主要解决分发和大规模使用)。

Docker本身不是容器,Docker只是容器的易用工具。容器是Linux内核的技术,Docker只是简化容器这种技术的使用

目前LXC被进一步更新为LXD(当然使用方式还是和虚拟机差不多,分发和大规模使用会好很多),如想了解请参阅:https://linuxcontainers.org/lxd/introduction/

Docker如何工作

网上关于Docker的文章一抓一大把,这里只简短介绍如何解决分发和大规模的技术。

Docker工作流程

如上所述LXC面临大规模使用和在其他的主机上复刻容器(分发)很难,于是Docker就在这方面着手解决。所以早期的Docker就是LXC的二次封装。功能上是通过LXC作为容器管理引擎,但是创建容器时,不在是用模板现场安装生成,而是事先通过一种叫做镜像的技术。把一个操作系统的用户空间用到了所有组件编排好,编排好以后整体打包成一个文件。这个文件就叫做镜像文件(Image)。使用Docker创建容器时,Docker不会激活LXC的模板创建安装。而是连接到镜像仓库,下载一个创建容器所需要的镜像。 Docker极大的简化了容器的使用,比如想要运行一个nginx 直接docker run nginx 就行了。

每个容器本身可以运行一个多一组进程,Docker为了使容器的使用更加易于管理,采用在一个Docker容器中之运行一个进程。这样会带来一下好处和坏处。

好处:

1.每个容器只运行一个进程,多个进程走容器间通信(更加隔离性,更容器分发)

坏处:

1.所需要的存储空间增加了
2.调试容器中的进程比较困难

开发人员开发的好的程序只需要打包到一个Docker镜像中,便可以到处运行在拥有在Docker的机器上。一些特殊进程类似数据库这种,需要采用共享存储才可以更好的解决分发问题。通过将应用打包为镜像这种机制,可以很好的解决分发的问题。 在大规模使用场景上也是很简单的,在每个机器上只需要有一份镜像文件便可以启动N个示例。(具体参考Docker镜像,分层部署-联合挂载这一特性)

有了Docker的镜像机制后就可以很好的解决分发和大规模使用了。 当然想好用好容器还是要有容器编排工具的。

reference

Cgroups:https://tech.meituan.com/2015/03/31/cgroups.html
LXC introduction:https://linuxcontainers.org/lxc/introduction/
LXD introduction:https://linuxcontainers.org/lxd/introduction/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker实现原理/容器原理(LXC,Cgroups,Docker) 的相关文章

  • 【matlab】获取文件夹下文件名或路径保存到txt

    获取某文件夹下的所有文件名并保存 当需要在某一个文件夹下获取子文件的所有文件名 xff0c 并进行保存时 xff0c 可使用下面的代码 xff1a Path 61 39 D 文件夹 39 设置数据存放的文件夹路径 File 61 dir f
  • pycharm:新建虚拟环境和安装依赖

    前言 小编深有体会 xff0c 在刚开始用pycharm跑python的项目的时候 xff0c 一时间不知道如何下手 xff0c 特别是作为一个新手小白 xff0c 这里总结了一份新手避坑指南 xff0c 主要是新建虚拟环境 xff08 生
  • unbuntu安装 PyTorch 1.7.0+ torchvision 0.8.1

    unbuntu安装 PyTorch 1 7 0 43 torchvision 0 8 1 一 创建环境二 启动环境三 查看电脑CUDA版本 xff0c 若电脑只有CPU则忽略这一步四 下载安装包到本地安装4 1 点击以下链接进入下载网站4
  • 树莓派VNC界面不显示或显示不全问题_解决方案

    刚开始上手树莓派的小伙伴们估计都遇到过这一问题 xff0c 用树莓派登录VNC时 xff0c 界面不显示或者界面显示的比例有问题 先打开VNC xff0c 输入自己的IP地址 xff0c 登录VNC 我这里在登录VNC时 xff0c VNC
  • ArcGIS Engine:对COM组件的调用返回了错误HRESULT E_FAIL

    最近做一个项目 xff0c 需要调用GP的 通视性 工具 该工具在ARCScene中界面如下 xff1a 需要两个参数 xff08 必选 xff09 xff0c 即视线和障碍物 xff0c 在 帮助 中查看要求参数都是FeatureLaye
  • idea 2019.3之后的版本的项目使用gradle构建,编译时会出现中文乱码

    目录 背景1 修改gradle编译选项2 修改idea设置3 其他方法 xff08 尝试后没有效果 xff09 3 1 修改File Encdoing3 2 修改idea的custom VM option 背景 把公司电脑的idea更新到了
  • shell编程3循环语句

    文章目录 shell编程3循环语句1 for循环1 1 基本格式1 2 类C语言格式 2 while循环2 1 基本格式2 2 死循环 3 until循环4 跳出循环4 1 continue4 2 break 5 实验5 1 编写脚本实现计
  • ArduPilot飞控之ubuntu22.04-Gazebo模拟

    ArduPilot飞控之ubuntu22 04 Gazebo模拟 1 源由2 Gazebo安装2 1 ubuntu22 04系统更新2 2 安装Gazebo Garden2 3 安装ArduPilot Gazebo插件2 3 1 基础库安装
  • ArduPilot飞控之DIY-F450计划

    ArduPilot飞控之DIY F450计划 1 历史2 源由3 计划3 1 硬件3 2 软件 4 动手4 1 接线4 1 1 ELRS nano接收机4 1 2 BN880 GPS模块4 1 3 Radio Telemetry 4 2 配
  • ArduPilot Kakute F7 AIO DIYF450 without GPS配置

    ArduPilot Kakute F7 AIO DIYF450 without GPS配置 1 源由2 配置2 1 Kakute F7 AIO相关配置2 1 1 串口规划2 1 2 电传配置2 1 3 GPS配置2 1 4 CRSF接收机配
  • ArduPilot之posHold&RTL实测

    ArduPilot之posHold amp RTL实测 1 源由2 模式配置3 测试步骤4 飞行实测5 总结6 参考资料7 附录 关于QGC 暂不支持MAVLink2 signing Protocol问题7 1 问题描述7 2 硬件配置7
  • BetaFlight统一硬件配置文件研读之resource命令

    BetaFlight统一硬件配置文件研读之resource命令 1 源由2 代码分析3 实例分析4 配置情况4 1 resource4 2 resource show 5 参考资料 统一硬件配置文件的设计是一种非常好的设计模式 xff0c
  • ArduPilot之开源代码UARTs and the Console使用

    ArduPilot之开源代码UARTs and the Console使用 1 源由2 UART定义2 1 HAL Empty2 2 HAL ChibiOS2 3 HAL ESP322 4 HAL Linux2 5 HAL SITL 3 配
  • ArduPilot之开源代码调试技巧

    ArduPilot之开源代码调试技巧 1 源由2 ArduPilot Code Debugging Part13 ArduPilot Code Debugging Part24 持续更新中 5 参考资料 1 源由 对于如何调试和验证Ardu
  • ArduPilot飞控启动&运行过程简介

    ArduPilot飞控启动 amp 运行过程简介 1 源由2 Copter飞控2 1 入口2 3 运行 main loop 3 Ardunio编程3 1 setup AP Vehicle setup3 2 loop AP Vehicle l
  • WIN7 64位系统 CDC类 虚拟串口驱动无法安装的解决办法

    最近用STM32装个USB转虚拟串口 xff0c 但是驱动怎么也安装不上 百度了一些网页 xff0c 方法很多 xff0c 但是我这里按如下步骤处理 xff1a 首先 xff0c 确保C Windows System32 drivers u
  • ubuntu桌面版打开终端Terminal的几种方法

    1 Ctrl 43 Alt 43 T 快捷键直接打开 2 在Ubuntu左上角选择File Open in Terminal 3 快捷键alt 43 F2调出Run a Command xff0c 输入gnome terminal 4 添加
  • 什么是对称加密(对称加密简介)

    什么是对称加密 1 什么是对称加密2 编码3 加密算法3 1 DES3 1 1 什么是DES3 1 2 加密和解密 4 3DES4 3 1 什么是3DES4 3 2 3DES加密解密 5 AES5 1 什么是AES5 2 AES加密解密 1
  • Linux应用程序之Helloworld入门

    对于初学者来说 xff08 本人就是 xff09 xff0c 如何开始写第一个程序至关重要 有的时候一个简单的问题会严重影响到学习的积极性和自信心 这里结合实际工作中的一些经验 xff0c 总结方法步骤 xff0c 对Linux下应用程序H
  • ctags简明使用方法

    ctags xff08 Generate tag files for source code xff09 是vim下方便代码阅读的工具 xff0c 它可以在命令行下帮助程序员很容易地浏览源代码 ctags 最先是用来生成C代码的tags文件

随机推荐

  • char和unsigned char强制转换成int后的差异

    最近有人提到char和unsigned char有什么区别 xff0c 当然这个问题如果刚学计算机或者编程语言的人来说 xff0c 非常简单 我也这么认为 xff0c 无非就是有符号和无符号的差别嘛 这个问题让我想到了以前学习计算机常识的时
  • 如何使用mstsc进行远程登录?

    如何使用mstsc进行远程登录 xff1f 步骤一 xff1a 点击 开始 gt 运行 xff0c 输入mstsc xff0c 如下图所示 xff1a 步骤二 xff1a 输入连接PC的IP地址 xff0c 如下图所示 xff1a 步骤三
  • VNC远程ubuntu时,右击无法打开terminal

    参考博客 xff1a https blog csdn net qq 44132116 article details 103960393 问题描述 xff1a 我通过命令行连接实验室服务器 xff0c 装了anaconda xff0c 之后
  • TCP实时传图像

    目的 xff1a QT 43 openCV xff0c 在Ubuntu16 04版本下 xff0c 通过TCP实现图片的传输 步骤 xff1a 客户端建一个相机线程 xff0c 一个TCP线程 xff0c 相机线程捕获画面并将Mat传到TC
  • Ubuntu mate 16.04安装ROS

    官方文档有详细的安装步骤 xff1a http wiki ros org kinetic Installation Ubuntu 配置Ubuntu属性如下 xff1a https help ubuntu com community Repo
  • 关于ROS中的namespace

    当我们给发布的消息起名字时 xff0c 注意 34 points image 34 和 34 points image 34 是不一样的 xff0c 前者表示这个话题的名字是一个绝对名称 xff0c 它不在任何的namespace中 xff
  • 算法移植arm开发板小结(一)

    将windows的c c 43 43 代码移植到友善Tinny4412的arm上运行 首先要先将windows代码在ubuntu系统下编译通过 xff0c 然后在ubuntu系统下建立Tinny4412的arm交叉编译器 xff0c 并将代
  • CVTE嵌入式软件实习面经-已offer

    面试通过 时间线 4月份投的简历 xff0c 后面因为考试错过了 xff0c 后面月尾赶上最后了最后一场笔试 xff0c 笔试完四天左右通过 xff0c 通过两天后接到面试官电话 xff0c 那时候投了挺多公司的 xff0c 以为是其他的
  • 非对称加密详解

    非对称加密 1 非对称加密1 1 什么是非对称加密1 2 非对称加密通信流程1 3 RSA1 3 1 RSA加密1 3 2 RSA解密1 3 3 总结 1 4 ECC椭圆曲线 1 非对称加密 1 1 什么是非对称加密 非对称加密也叫公钥密码
  • PHP函数usort()解释

    定义和用法 usort 函数使用用户自定义的函数对数组排序 注释 xff1a 如果两个元素比较结果相同 xff0c 则它们在排序后的数组中的顺序未经定义 到 PHP 4 0 6 之前 xff0c 用户自定义函数将保留这些元素的原有顺序 但是
  • strchr()、strrchr()、strchrnul()…

    头文件 xff1a include 函数原型 xff1a char strchr char str int c char strrchr char str int c define GNU SOURCE 头文件 xff1a include
  • freertos- 任务调度器-vTaskStartScheduler()解析(笔记)

    1 全局状态量 系统时钟节拍计数器tick static volatile TickType t xTickCount 61 TickType t 0U 全局下一任务调度需要的阻塞时间 xff0c 用于及其唤醒任务static volati
  • freertos- 重要管理数据结构-列表List及其操作API (笔记)

    1 xff0c 源码中的位置 list h xff0c list c 2 xff0c 列表和列表项结构 列表项分为2种 xff1a struct xLIST ITEM listFIRST LIST ITEM INTEGRITY CHECK
  • 技术分享 | Javaer 如何做单元测试?

    前言 xff1a 本文适用于 javaer xff0c 其他开发者或许可以借鉴 写本文的主旨有两个 xff0c 一是简单的给大家介绍下单元测试 xff0c 二是通过一个简单的示例来介绍一些单元测试的技巧 xff0c 希望以此来降低大家写单元
  • 扩展卡尔曼滤波【转】

    1 重点看 SLAM中的EKF xff0c UKF xff0c PF原理简介 半闲居士 博客园 2 机器人重点看 定位 xff08 一 xff09 xff1a 扩展卡尔曼滤波 windSeS的博客 3 重点实例 扩展卡尔曼滤波 xff08
  • AGV - Background(1)- Company

    Company 米克力美 DZ 80无轨导航AGV小车采用windows10智能交互系统 xff0c xff08 米克力美工业AGV小车机器人采用安卓交互系统 xff09 可自动编程和程序化 xff0c 实现自主学习 使用人员无需培训即可轻
  • 无线路由器CPU浅析 MT7621A、 BCM47189 到底谁强?

    转自 xff1a http bbs 360 cn thread 14459037 1 1 html 在第一讲中 xff0c 已经粗略介绍过了目前路由芯片的四大厂 xff1a Broadcom xff08 博通 xff09 Qualcomm
  • STM32F4_串口通信详解

    目录 1 串口相关介绍及使用 1 1 串口设置的一般步骤 xff1a 1 1 1 串口时钟和GPIO时钟使能 1 1 2 设置引脚复用器映射 1 1 3 GPIO端口模式设置 1 1 4 串口参数初始化 1 1 5 开启中断并且初始化NVI
  • 嵌入式Linux设备驱动开发笔记(二)

    一 内核的时间 xff08 1 xff09 Tick xff08 滴答 xff09 内核采用了一个新的时间单位来进行计时 该时间单位称为tick 滴答 xff0c 一个tick对应硬件定时器两次中断之间的时间间隔 当前内核每秒钟硬件定时器会
  • Docker实现原理/容器原理(LXC,Cgroups,Docker)

    Docker实现原理 容器原理 Docker实现原理 容器原理什么是容器 Container 容器传统架构问题容器是什么容器如何实现 CgroupsCgroups是什么Cgroups解决什么问题Cgroups如何工作Cgroups层级结构