Docker:namespace环境隔离 CGroup资源控制
Docker:namespace环境隔离 & CGroup资源控制
- Docker
- 虚拟机
- 容器
- namespace
- 相关命令
- dd
- mkfs
- df
- mount
- unshare
- 进程隔离
- 文件隔离
- CGroup
- 相关命令
- pidstat
- stress
- cgroup控制
- 内存控制
- CPU控制
Docker
在开发中,经常会遇到环境问题,比如程序依赖某个库,库又要具体的版本,以及某些函数必须在指定平台使用,这就会为开发带来很大的麻烦。
为此,有人提出采用虚拟化技术,为软件虚拟出一个环境。就像是在一个冰天雪地的地方建了一个花房养花,花房内温度湿度都刚刚好,将花房与外部的冰雪隔离开。
这种实现环境隔离的技术,主要有虚拟机和容器两种,Docker
属于容器化的隔离技术。
虚拟机
所谓虚拟机,其实就是把一台物理主机虚拟为多台逻辑上的计算机。多台虚拟机共用物理上的同一台计算机,而每个逻辑上的计算机可以运行不同的操作系统,安装不同的库,从而提供不同的环境。
如图,上图红色部分与蓝色部分是两个不同的虚拟机,虚拟机技术在硬件层之上,在操作系统层就开始进行隔离。虚拟机通过伪造一个硬件的抽象接口,把操作系统嫁接到硬件上。
在硬件层与操作系统层之间,会存在一个虚拟化层,这其实就是一个软件,该层会负责分配硬件资源。
可以看出,如果想要创建多个虚拟机,就要在一台物理主机上跑多个操作系统,这其实要不小的开销,而容器是一种更加轻量的隔离技术。
容器
容器也是一种虚拟化的实现技术,它在操作系统之上进行环境隔离,每个容器可以有自己的一套工具和库,但是它们共享操作系统的内核!
如图,红色和蓝色区域,是两个不同的容器,它们的网络,文件系统等等都是隔离的,互不影响。
因为使用同样的操作系统内核,所以它们的系统调用接口自然就相同,但是基于相同的系统调用接口,配置了不同的库,不同的文件系统,那么最后两个容器就不同。
比如说上图,可以通过容积隔离技术在一个centOS
操作系统上,运行不同版本的Ubuntu
容器。这听起来很异想天开,但其实不然。
每个容器有自己独立的用户空间,这包括文件系统、库和用户级工具。用户操作接口是用户在容器内操作系统时接触到的命令行工具、库和应用。因此可以在上层的容器中,执行Ubuntu
的命令,虽然内核是CentOS
的。
相比于虚拟机技术,容器化技术非常轻量,容器相当于一个跑在操作系统上的进程,启动一个进程的速度是非常快的,通过容器技术,只需几秒钟就在主机上打开一个新的操作系统。
而容器化技术,目前最流行的实现方案就是Docker
。
那么容器化技术是如何实现各种资源的隔离的?对Linux
来说,它依赖于namespace
和CGroup
技术,这两个技术是由Linux
内核提供的。
namespace
:实现进程,文件系统,用户等资源隔离CGroup
:实现CPU,内存,网络等资源隔离
namespace
namespace
是 Linux
内核用来隔离内核资源的方式。通过 namespace
可以让进程只能看到与自己相关的一部分资源,不同namespace
的进程感觉不到对方的存在。
具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace
中。namespaces
是对全局系统资源的一种封装隔离,使得处于不同 namespace
的进程拥有独立的全局系统资源,改变一个namespace
中的系统资源只会影响当前namespace
里的进程,对其他namespace
中的进程没有影响。
常见namespace
:
namespace | 隔离资源 |
---|---|
UTS | 主机名和域名 |
IPC | 进程间通信:信号量、消息队列、共享内存 |
PID | 进程 |
NetWork | 网络设备,端口等 |
Mount | 文件系统 |
User | 用户 |
解释:
UTS
:每个UTS namespace
都可以有自己独立的主机和域名IPC
:每个IPC namespace
内部的进程可以进行进程间通信,但是不能跨越IPC namespace
进行通信,在逻辑上这算跨主机通信PID
:每个PID namespace
都有自己独立的进程pid
系统,不同的PID namespace
可以出现相同的pid
NetWork
:每个NetWork namespace
都有自己独立的网络设备,IP地址,路由表,端口号等Mount
:每个Mount namespace
有自己的文件系统,互相不能看到对方的文件User
:每个User namespace
都有自己独立的用户和用户组
相关命令
dd
dd
可以从指定输入流读取数据,并输出到指定输出流。
参数:
if=文件名
:从指定文件读取数据,如果不指定,则默认从标准输入读取of=文件名
:输出数据到指定文件,如果不指定,则默认输出到标准输出bs=xxx
:设定一个块block
的大小coun=blocks
:仅仅从输入流拷贝blocks
个块,结合上一个参数,可以指定要读取的数据个数
创建一个指定大小的空文件:
dd if=/dev/zero of=test.txt bs=1M count=80
以上指令,就是创建了一个80M
的空文件,输入流是/dev/zero
,这是一个会不断产生空白字符的文件,也就是ASCII
中字符编码为0
的字符。使用这个文件作为输入流,可以快速初始化一个空文件。
可以看到,最后创建了一个大小为83886080 byte
的文件,其实就是80 M
。
mkfs
mkfs
用于在设备上创建一个文件系统,俗称格式化。
mkfs [option] filesys [blocks]
选项:
-t
:要创建的文件系统类型,比如ext3
、ext4
其中filesys
是被格式化的文件,而block
是文件系统的磁盘块数,可以省略。
把刚才创建的文件进行格式化:
mkfs -t ext4 test.txt
这样就把刚才的空文件进行了格式化,变成了一个文件系统。
df
df
用于显示Linux
中的文件系统磁盘使用情况。
选项:
-h
:以更加可视化的形式输出,默认情况下数据以字节为单位,加上该选项后,会自动转化为GB
,MB
等单位-T
:显示文件系统的类型
查看当前的文件系统,可以看到,其不包含刚才格式化的test.txt
,因为他只是一个被格式化的文件,还没有被挂载。
mount
mount
用于挂载文件系统,相当于给文件系统一个访问入口。
比如说你在电脑上插入一个U盘,它往往会显示为E盘
或者其它盘符。这个盘符就是一个访问入口,因为U盘本身就是一个文件系统,如果想要访问这个文件系统的内容,Windows
自然要提供一个入口,因此它自动分配一个E盘
,让用户可以通过E盘
访问U盘。
同样的,刚才格式化test.txt
为一个文件系统,现在要将其挂载起来,才能访问这个文件系统。
mount [option] device dir
device
:被挂载的文件dir
:挂载到的位置
选项:
-t
:挂载文件的类型,比如ext3
、ext4
,但是可以不填,mount
会自动识别文件系统的类型
把刚才的test.txt
挂载到当前/mymount
目录下:
首先创建一个空目录/mymount
,随后把test.txt
挂载到这个目录下,随后可以看到,/mymount
出现了新的内容。
随后通过df -t ext4
查看系统的文件系统,可以看到/dev/loop0
文件系统,被挂载到了/mymount
下,说明成功挂载了一个文件系统。
如果想要删除这个文件系统,可以执行:
umount /mymount
以上所有命令,是在完成一个文件系统的创建,便于后续测试文件系统的隔离性。
接下来看看Linux
提供的创建namespace
的命令:
unshare
unshare
用于执行一个进程,并且为这个进程提供一个独立的namespace
。
unshare [option] program
program
:要执行的程序
选项:
-i --ipc
:不共享IPC
空间-m --mount
:不共享Mount
空间-n --net
:不共享Net
空间-p --pid
:不共享PID
空间-u --uts
:不共享UTS
空间-U --user
:不共享用户空间--fork
:创建一个子进程执行program
--mount-proc
:挂载一个新的/proc
到命名空间内
此处这个--fork
有一点点绕,因为ushare
这个命令,本身也是一个进程,是在宿主机环境运行的。
如果直接执行unshare
,流程如下:
unshare
创建一个新的命名空间unshare
执行program
,但是没有创建新的进程,而是直接用program
替换了unshare
本身
以上unshare
不带有--fork
参数,执行了/bin/bash
进程。进入namespace
后,可以看到,/bin/bash
的父进程是-bash
。这个-bash
就是宿主机的bash
进程。因为unshare
是在bash
中执行的,所以unshare
的父进程是-bash
。最后将/bin/bash
替换unshare
,/bin/bash
的父进程就是原先的父进程-bash
。
这种情况下,看不到unshare
进程,因为/bin/bash
就是原先的unshare
。
如果加上--fork
参数,流程如下:
unshare
创建一个新的命名空间unshare
在新的命名空间中创建一个新的子进程来执行program
。unshare
本身不退出
加上--fork
参数后,/bin/bash
的父进程就变成了unshare
,unshare
的父进程是-bash
。也就是说unshare
创建了一个子进程来执行program
,而不是亲自执行program
。
如果你跟着操作了,此时还处于namespace
中,要通过exit
来退出,不然会影响后续操作。
进程隔离
现在尝试进行进程隔离,也就是隔离,通过--pid
选项完成:
unshare --fork --pid --mount-proc /bin/bash
以上命令,用于创建一个新的PID
命名空间,并执行bash
进程,也就是执行一个新的命令行。
此处要加上--fork
选项,因为要进行进程隔离,而unshare
本身是宿主机的进程,如果直接让unshare
本身去执行program
,那么program
就不在新的namespace
中,导致错误。
以上示例中,因为没有加上--fork
,报错了。
如果只加上--fork
选项,此时还是不能观察到进程隔离。因为top
、ps
等进程监控的命令,是依赖于/proc/PID
这个目录的。但是命令没有进行文件系统隔离,所以还是会使用宿主机的/proc/PID
目录,导致namespace
内部可以看到外部的进程。
为此,unshare
命令专门提供了一个参数--mount-proc
,在新的namespace
挂载一个独立的/proc
目录,方便进行进程的监控。
进程隔离结果:
可以看到,创建了新的namespace
后,ps -aux
只能查到两个进程,一个是bash
,一个是grep
。这就将namespace
内部的进程与宿主机的进程隔离开了。
文件隔离
想要进行文件隔离,创建一个新的namespace
,然后在里面创建一个文件系统并挂载。再在外部的宿主机查看是否可以看到这个文件系统。
- 创建一个新的文件隔离命名空间
unshare --mount --fork /bin/bash
- 创建一个指定大小的空文件
dd if=/dev/zero of=data.img bs=1M count=80
- 格式化文件为文件系统
mkfs -t ext4 data.img
- 挂载文件系统
mkdir /mymount
mount -t ext4 data.img /mymount
最后通过df -t ext4
,可以看到文件系统已经挂载成功了。
打开一个新的终端,执行df -t ext4
:
此时左右终端看到的文件系统不同,左侧的namespace
内挂载的新文件系统,右侧终端看不到了,这就是文件隔离。
此时在namespace
中执行exit
,就会退出这个bash
,进而退出namespace
,在其内部创建的文件,挂载的文件系统都会自动销毁。
当exit
退出后,再次查看文件系统,也找不到刚才挂载的文件系统了。这和刚才两个终端的情况不同,之前是不同namespace
之间的文件隔离,而此处是退出namespace
后,文件系统已经被销毁了。
CGroup
cgroup
的可以把一系列任务,也就是进程划分到一个任务组,并且限制一个任务组的资源占用。比如可以限制一系列任务最多占用多少CPU
,占用多少内存等等。
也就是说,namespace
完成了不同容器之间环境的隔离,而cgroup
完成了每个容器资源的访问限制。
相关命令
为了方便测试CPU与内存压力,此处使用两个工具分别完成产生压力以及压力检测。
pidstat
pidstat
用于检测一个进程的CPU、内存、IO、线程等等资源的占用情况。
需要下载:
apt install sysstat
语法:
pidstat [option] [时间间隔] [次数]
选项:
-u
:检测CPU使用情况,默认就是该选项-r
:检测内存使用情况-d
:检测IO使用情况-p
:指定进程pid
,如果指定ALL
则监视所有进程-C
:检测通过指定命令启动的进程
直接执行pidstat
:
此时会输出所有进程,默认输出CPU占用情况,也就是%CPU
这一栏。
通过-p
指定进程:
通过-C
指定进程:
此处指定bash
进程。
通过-r
检测内存:
此处%MEM
栏就是内存占用情况。
指定检测次数与频率:
此处的1 3
表示:每隔一秒检测一次,一共检测三次。
stress
stress
是一个压力测试工具,可以对CPU、内存IO等进行压力测试。
这个工具也要下载:
apt install stress
语法:
stress [option]
参数:
-c --cpu N
:产生N个进程,每个进程都循环调用sqrt
函数产生CPU压力-m --vm N
:产生N个进程,每个进程都循环调用malloc free
函数,产生内存压力
示例:
左侧使用stress
创建了一个进程进行CPU压力输出,右侧检测stress
产生的压力,结果一个进程占满了100%
的CPU资源。
cgroup控制
接下来看看如何操作cgroup
,它并没有现成的指令来控制,而是需要操控配置文件来完成。
/proc/cgroups
查看cgroup
支持的资源控制:
在/proc/cgroups
文件中,包含了cgroup
所支持的资源控制的类型,比如CPU、内存等。
查看cgroup
挂载信息:
mount | grep cgroup
这里就是每一个资源的控制目录,比如在/sys/fs/cgroup/cpu
目录下,就是控制CPU资源的配置文件。
内存控制
创建一个内存的控制组很简单,跳转到目录/sys/fs/cgroup/memory
,然后创建一个目录:
此处创建了一个test_memory
目录,这就算创建了一个test_memory
内存控制组。进入目录后,可以看到这个目录被初始化了很多文件,其中memory.limit_in_bytes
这个文件,就是这个cgroup
可以使用的最大内存数目,以字节为单位。
想要限制这个cgroup
的最大内存数量,直接往文件写入数据即可:
echo "20971520" > memory.limit_in_bytes
此处20971520
其实就是20 mb
,此后这个cgroup
的最大内存占用就不会超过20 mb
。
那么要如何把一个进程加入控制组?这里有一个task
文件,只需要把进程的PID
写入到这个文件中,那么一个进程就算加入了这个cgroup
。
如图,创建一个进程,占用50m
的内存:
stress -m 1 --vm-bytes 50m
随后在另一个端口通过pidstat
查看stress
的PID
,为15070
和15069
,其中15069
是控制进程,15070
是真正在产生内存压力的进程。将15070
写入tasks
文件中,让其加入cgroup
。
结果左侧的stress
退出了,无法产生50m
的压力。这是因为一开始就限制了cgroup
只能占用最多20 m
的内存。一旦进程加入后,就会受到限制,从而崩溃。
CPU控制
创建一个CPU的控制组也一样,跳转到目录/sys/fs/cgroup/cpu
,然后创建一个目录:
此处创建了一个test_cpu
目录,也就死和创建了一个test_cpu
CPU控制组。这个目录同样被初始化了很多文件。
其中控制CPU占用的是cpu.cfs_period_us
和cpu.cfs_quota_us
,这两个文件共同完成CPU资源限制。其中cpu.cfs_period_us
作为分母,cpu.cfs_quota_us
作为分子,以百分比的形式限制CPU。
比如cpu.cfs_period_us
内填入5000
,cpu.cfs_quota_us
内填入2000
。那么该cgroup
最多可以占用2000/5000
也就是40%
的CPU资源。要注意的是,这两个文件的最小值都是1000
,不允许使用比1000
更小的数字进行配置。另外的cpu.cfs_quota_us
的默认值为-1
,表示可以占用100%
的CPU。
另一个就是tasks
文件,同样的只要把PID写入这个文件,就算加入了这个CPU控制组。
启动一个stress
进程:
由于stress
本身就会尽可能占满CPU,右侧输出窗口每隔一秒输出stress
的状态,其一直保持100%
的CPU资源占用。
左下角窗口先限制了test_cpu
这个控制组的CPU
最大占用率是2000/10000
,也就是20%
。
随后把stress
的PID20849
写入tasks
:
写入后,从右边的窗口可以看出,stress
的CPU占用率立马下降,100%
到37%
最后稳定在20%
。
可以cgroup
成功对进程的CPU进行了限制。
容器化技术在Linux
中基于namespace
和cgroup
实现,namespace
完成不同容器之间的环境隔离,而cgroup
完成多个容器对资源的占用限制,合理分配资源。这就是容器化技术,以及docker
的最基本原理,也是底层依赖。
相关文章:

Docker:namespace环境隔离 CGroup资源控制
Docker:namespace环境隔离 & CGroup资源控制 Docker虚拟机容器 namespace相关命令ddmkfsdfmountunshare 进程隔离文件隔离 CGroup相关命令pidstatstresscgroup控制 内存控制CPU控制 Docker 在开发中,经常会遇到环境问题,比如程序依赖某个…...

鼠标增强工具 MousePlus v5.3.9.0 中文绿色版
MousePlus 是一款功能强大的鼠标增强工具,它可以帮助用户提高鼠标操作效率和精准度。该软件可以自定义鼠标的各种功能和行为,让用户根据自己的习惯和需求来调整鼠标的表现。 详细功能 自定义鼠标按钮功能:可以为鼠标的各个按钮设置不同的功能…...

Android 圆形进度条CircleProgressView 基础版
一个最基础的自定义View 圆形进度条,可设置背景色、进度条颜色(渐变色)下载进度控制;可二次定制度高; 核心代码: Overrideprotected void onDraw(NonNull Canvas canvas) {super.onDraw(canvas);int mW g…...

理解磁盘结构---CHS---LAB---文件系统
1,初步了解磁盘 机械磁盘是计算机中唯的一个机械设备, 特点是慢,容量大,价格便宜。 磁盘上面的光面,由数不清的小磁铁构成,我们知道磁铁是有n/s极的,这刚好与二进制的&…...
我在1024谈华为
华为的发展历程与技术创新 华为自成立以来,一直是通信技术领域的重要参与者。让我们回顾一下华为的一些关键发展里程碑: 1987年,华为在深圳成立,起初专注于电话交换网络的研发和销售。 进入1990年代,华为转型为通信…...

NVR小程序接入平台/设备EasyNVR多品牌NVR管理工具/设备视频监控解决方案
随着科技的飞速发展,安防视频监控已成为维护公共安全、提升管理效率的重要手段。在这一领域中,NVR小程序接入平台/设备EasyNVR凭借其灵活的部署方式、强大的功能以及卓越的性能表现,脱颖而出,引领着安防视频监控的新纪元。 NVR小程…...
二叉树前序遍历的 Java 实现,包括递归和非递归两种方式
二叉树前序遍历是一种遍历树节点的方式,遵循特定的顺序。其基本过程可以总结为以下几个步骤: 前序遍历的顺序 访问根节点:首先处理当前节点。 递归遍历左子树:然后依次访问左子树。 递归遍历右子树:最后访问右子树。 …...
QT开发:构建现代UI的利器:深入详解QML和Qt Quick基础开发技术
目录 引言 目录 1. 什么是QML和Qt Quick QML的优势 2. QML基础语法 组件 属性 JavaScript表达式 3. 数据绑定 直接绑定 双向绑定 4. 属性和属性别名 属性 属性别名 5. 信号与槽机制 定义信号 处理信号 6. 动画与过渡效果 简单动画 过渡效果 7. 构…...

vue前端使用pdfjs与pdfdist-mergeofd 实现预览pdf并翻页,同时解决预览pdf显示模糊的问题
vue前端使用pdfjs与pdfdist-mergeofd 实现预览pdf并翻页,同时解决预览pdf显示模糊的问题 插件介绍 pdfdist-mergeofd插件的作用可查看这篇文章,同时使用ofdjs和pdfjs遇到的问题,和解决方法——懒加载 该插件主要是为了解决pdfjs和ofdjs同时…...
C语言——回调函数
1、回调函数 在学习了函数之后,我发现了一个比较难的函数——回调函数 回调函数 (Callback Function) 指的是一种函数,它被作为参数传递给另一个函数,并在满足特定条件或事件发生后被调用执行。 它允许你将一段代码延迟执行,或者…...

2016年ATom-1飞行活动期间以10秒间隔进行的一氧化碳(CO)观测数据
目录 简介 摘要 代码 引用 网址推荐 知识星球 机器学习 ATom: Observed and GEOS-5 Simulated CO Concentrations with Tagged Tracers for ATom-1 简介 该数据集包含2016年ATom-1飞行活动期间以10秒间隔进行的一氧化碳(CO)观测数据,…...

MLM之Emu3:Emu3(仅需下一个Token预测)的简介、安装和使用方法、案例应用之详细攻略
MLM之Emu3:Emu3(仅需下一个Token预测)的简介、安装和使用方法、案例应用之详细攻略 导读:这篇论文介绍了Emu3,一个基于单一Transformer架构,仅使用下一个token预测进行训练的多模态模型。 >> 背景痛点: 多模态任…...

Spring Boot与Flyway实现自动化数据库版本控制
一、为什么使用Flyway 最简单的一个项目是一个软件连接到一个数据库,但是大多数项目中我们不仅要处理我们开发环境的副本,还需要处理其他很多副本。例如:开发环境、测试环境、生产环境。想到数据库管理,我们立刻就能想到一系列问…...

input角度:I2C触摸屏驱动分析和编写一个简单的I2C驱动程序
往期内容 本专栏往期内容: input子系统的框架和重要数据结构详解-CSDN博客input device和input handler的注册以及匹配过程解析-CSDN博客input device和input handler的注册以及匹配过程解析-CSDN博客编写一个简单的Iinput_dev框架-CSDN博客GPIO按键驱动分析与使用&…...

SQL-lab靶场less1-4
说明:部分内容来源于网络,如有侵权联系删除 前情提要:搭建sql-lab本地靶场的时候发现一些致命的报错: 这个程序只能在php 5.x上运行,在php 7及更高版本上,函数“mysql_query”和一些相关函数被删除…...

【生成模型之二】diffusion model模型
【算法简历修改、职业规划、校招实习咨询请私信联系】 【Latent-Diffusion 代码】 生成模型分类概述 Diffusion Model,这一深度生成模型,源自物理学中的扩散现象,呈现出令人瞩目的创新性。与传统的生成模型,如VAE、GAN相比&…...
记录 Maven 版本覆盖 Bug 的解决过程
背景 在使用 Maven 进行项目管理时,依赖版本的管理是一个常见且重要的环节。最近,在我的项目中遇到了一个关于依赖版本覆盖的 Bug,这个问题导致了 Apollo 框架的版本不一致,影响了项目的正常运行。以下是我解决这个问题的过程记录…...

【K8S系列】Kubernetes Service 基础知识 详细介绍
在 Kubernetes 中,Service 是一种抽象的资源,用于定义一组 Pod 的访问策略。它为这些 Pod 提供了一个稳定的访问入口,解决了 Pod 可能频繁变化的问题。本文将详细介绍 Kubernetes Service 的类型、功能、使用场景、DNS 和负载均衡等方面。 1.…...
python在物联网领域的数据应用分析与实战!
引言 物联网(IoT)是一个快速发展的领域,涉及到各种设备和传感器的连接与数据交换。随着设备数量的激增,数据的产生速度也在不断加快。 如何有效地分析和利用这些数据,成为了物联网应用成功的关键。Python作为一种强大的编程语言,因其简洁易用的特性和丰富的库支持,成为…...

目标跟踪算法-卡尔曼滤波详解
卡尔曼滤波是一种递归的优化算法,用于估计一个系统的动态状态,常用于跟踪、导航、时间序列分析等领域。它的关键在于使用一系列测量数据(通常含噪声)来估计系统的真实状态,使得估计值更接近实际情况。卡尔曼滤波器适合…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...