当前位置: 首页 > news >正文

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来说,它依赖于namespaceCGroup技术,这两个技术是由Linux内核提供的。

  • namespace:实现进程,文件系统,用户等资源隔离
  • CGroup:实现CPU,内存,网络等资源隔离

namespace

namespaceLinux 内核用来隔离内核资源的方式。通过 namespace 可以让进程只能看到与自己相关的一部分资源,不同namespace的进程感觉不到对方的存在。

具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个namespace 中的系统资源只会影响当前namespace 里的进程,对其他namespace 中的进程没有影响。

常见namespace

namespace隔离资源
UTS主机名和域名
IPC进程间通信:信号量、消息队列、共享内存
PID进程
NetWork网络设备,端口等
Mount文件系统
User用户

解释:

  1. UTS:每个UTS namespace都可以有自己独立的主机和域名
  2. IPC:每个IPC namespace内部的进程可以进行进程间通信,但是不能跨越IPC namespace进行通信,在逻辑上这算跨主机通信
  3. PID:每个PID namespace都有自己独立的进程pid系统,不同的PID namespace可以出现相同的pid
  4. NetWork:每个NetWork namespace都有自己独立的网络设备,IP地址,路由表,端口号等
  5. Mount:每个Mount namespace有自己的文件系统,互相不能看到对方的文件
  6. 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:要创建的文件系统类型,比如ext3ext4

其中filesys是被格式化的文件,而block是文件系统的磁盘块数,可以省略。

把刚才创建的文件进行格式化:

mkfs -t ext4 test.txt

在这里插入图片描述

这样就把刚才的空文件进行了格式化,变成了一个文件系统。


df

df用于显示Linux中的文件系统磁盘使用情况。

选项:

  • -h:以更加可视化的形式输出,默认情况下数据以字节为单位,加上该选项后,会自动转化为GBMB等单位
  • -T:显示文件系统的类型

在这里插入图片描述

查看当前的文件系统,可以看到,其不包含刚才格式化的test.txt,因为他只是一个被格式化的文件,还没有被挂载。


mount

mount用于挂载文件系统,相当于给文件系统一个访问入口。

比如说你在电脑上插入一个U盘,它往往会显示为E盘或者其它盘符。这个盘符就是一个访问入口,因为U盘本身就是一个文件系统,如果想要访问这个文件系统的内容,Windows自然要提供一个入口,因此它自动分配一个E盘,让用户可以通过E盘访问U盘。

同样的,刚才格式化test.txt为一个文件系统,现在要将其挂载起来,才能访问这个文件系统。

mount [option] device dir
  • device:被挂载的文件
  • dir:挂载到的位置

选项:

  • -t:挂载文件的类型,比如ext3ext4,但是可以不填,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,流程如下:

  1. unshare 创建一个新的命名空间
  2. 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参数,流程如下:

  1. unshare 创建一个新的命名空间
  2. unshare 在新的命名空间中创建一个新的子进程来执行 program
  3. unshare本身不退出

在这里插入图片描述

加上--fork参数后,/bin/bash的父进程就变成了unshareunshare的父进程是-bash。也就是说unshare创建了一个子进程来执行program,而不是亲自执行program

如果你跟着操作了,此时还处于namespace中,要通过exit来退出,不然会影响后续操作。


进程隔离

现在尝试进行进程隔离,也就是隔离,通过--pid选项完成:

unshare --fork --pid --mount-proc /bin/bash

以上命令,用于创建一个新的PID命名空间,并执行bash进程,也就是执行一个新的命令行。

此处要加上--fork选项,因为要进行进程隔离,而unshare本身是宿主机的进程,如果直接让unshare本身去执行program,那么program就不在新的namespace中,导致错误。

在这里插入图片描述

以上示例中,因为没有加上--fork,报错了。

如果只加上--fork选项,此时还是不能观察到进程隔离。因为topps等进程监控的命令,是依赖于/proc/PID这个目录的。但是命令没有进行文件系统隔离,所以还是会使用宿主机的/proc/PID目录,导致namespace内部可以看到外部的进程。

为此,unshare命令专门提供了一个参数--mount-proc,在新的namespace挂载一个独立的/proc目录,方便进行进程的监控。

进程隔离结果:

在这里插入图片描述

可以看到,创建了新的namespace后,ps -aux只能查到两个进程,一个是bash,一个是grep。这就将namespace内部的进程与宿主机的进程隔离开了。


文件隔离

想要进行文件隔离,创建一个新的namespace,然后在里面创建一个文件系统并挂载。再在外部的宿主机查看是否可以看到这个文件系统。

  1. 创建一个新的文件隔离命名空间
unshare --mount --fork /bin/bash
  1. 创建一个指定大小的空文件
dd if=/dev/zero of=data.img bs=1M count=80
  1. 格式化文件为文件系统
mkfs -t ext4 data.img
  1. 挂载文件系统
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查看stressPID,为1507015069,其中15069是控制进程,15070是真正在产生内存压力的进程。将15070写入tasks文件中,让其加入cgroup

结果左侧的stress退出了,无法产生50m的压力。这是因为一开始就限制了cgroup只能占用最多20 m的内存。一旦进程加入后,就会受到限制,从而崩溃。


CPU控制

创建一个CPU的控制组也一样,跳转到目录/sys/fs/cgroup/cpu,然后创建一个目录:

在这里插入图片描述

此处创建了一个test_cpu目录,也就死和创建了一个test_cpuCPU控制组。这个目录同样被初始化了很多文件。

其中控制CPU占用的是cpu.cfs_period_uscpu.cfs_quota_us,这两个文件共同完成CPU资源限制。其中cpu.cfs_period_us作为分母,cpu.cfs_quota_us作为分子,以百分比的形式限制CPU。

比如cpu.cfs_period_us内填入5000cpu.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中基于namespacecgroup实现,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”和一些相关函数被删除&#xf…...

【生成模型之二】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作为一种强大的编程语言,因其简洁易用的特性和丰富的库支持,成为…...

目标跟踪算法-卡尔曼滤波详解

卡尔曼滤波是一种递归的优化算法,用于估计一个系统的动态状态,常用于跟踪、导航、时间序列分析等领域。它的关键在于使用一系列测量数据(通常含噪声)来估计系统的真实状态,使得估计值更接近实际情况。卡尔曼滤波器适合…...

SpringBoot后端开发常用工具详细介绍——application多环境配置与切换

文章目录 引言介绍application.yml(主配置文件)application-dev.yml(开发环境配置)application-test.yml(测试环境配置)application-prod.yml(生产环境配置)激活配置文件参考内容 引…...

php反序列化漏洞典型例题

1.靶场环境 ctfhub-技能树-pklovecloud 引用题目&#xff1a; 2021-第五空间智能安全大赛-Web-pklovecloud 2.过程 2.1源代码 启动靶场环境&#xff0c;访问靶场环境&#xff0c;显示源码&#xff1a;直接贴在下面&#xff1a; <?php include flag.php; class pks…...

浅析Android View绘制过程中的Surface

前言 在《浅析Android中View的测量布局流程》中我们对VSYNC信号到达App进程之后开启的View布局过程进行了分析&#xff0c;经过对整个App界面的View树进行遍历完成了测量和布局&#xff0c;确定了View的大小以及在屏幕中所处的位置。但是&#xff0c;如果想让用户在屏幕上看到…...

基于卷积神经网络的大豆种子缺陷识别系统,resnet50,mobilenet模型【pytorch框架+python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; 大豆种子缺陷识别系统&#xff0c;卷积神经网络&#xff0c;resnet50&#xff0c;mobilenet【pytorch框架&#xff0c;python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷积神…...

HarmonyOS项目开发一多简介

目录 一、布局能力概述 二、自适应布局 三、响应式布局 四、典型布局场景 一、布局能力概述 布局决定页面元素排布及显示&#xff1a;在页面设计及开发中&#xff0c;布局能力至关重要&#xff0c;主要通过组件结构来确定使用何种布局。 自适应布局与响应式布局&#xff1…...

C++基础三

构造函数 构造函数(初始化类成员变量)&#xff1a; 1、属于类的成员函数之一 2、构造函数没有返回类型 3、构造函数的函数名必须与类名相同 4、构造函数不允许手动调用(不能通过类对象调用) 5、构造函数在类对象创建时会被自动调用 6、如果没有显示声…...

利用ChatGPT完成2024年MathorCup大数据挑战赛-赛道A初赛:台风预测与分析

利用ChatGPT完成2024年MathorCup大数据挑战赛-赛道A初赛&#xff1a;台风预测与分析 引言 在2024年MathorCup大数据挑战赛中&#xff0c;赛道A聚焦于气象数据分析&#xff0c;特别是台风的生成、路径预测、和降水风速特性等内容。本次比赛的任务主要是建立一个分类评价模型&…...

Linux系统操作篇 one -文件指令及文件知识铺垫

Linux操作系统入门-系统篇 前言 Linux操作系统与Windows和MacOS这些系统不同&#xff0c;Linux是黑屏的操作系统&#xff0c;操作方式使用的是指令和代码行来进行&#xff0c;因此相对于Windows和MacOS这些带有图形化界面的系统&#xff0c;Linux的入门门槛和上手程度要更高&…...

隨筆20241028 ISR 的收缩与扩展及其机制解析

在 Kafka 中&#xff0c;ISR&#xff08;In-Sync Replicas&#xff09; 是一组副本&#xff0c;它们与 Leader 保持同步&#xff0c;确保数据一致性。然而&#xff0c;ISR 的大小会因多种因素而变化&#xff0c;包括收缩和扩展。以下是 ISR 收缩与扩展的详细解释及其背后的机制…...

linux-字符串相关命令

1、cut 提取文件每一行中的内容 下面是一些常用的 cut 命令选项的说明&#xff1a; -c, --characters列表&#xff1a;提取指定字符位置的数据。-d, --delimiter分界符&#xff1a;指定字段的分隔符&#xff0c;默认为制表符。-f, --fieldsLIST&#xff1a;提取指定字段的数据…...

广宗企业做网站/2023年7月疫情还会严重吗

微信活码 活码的原理就是通过扫描活码后&#xff0c;看到一个你自己的真实二维码&#xff0c;而这个二维码可以在后台随意更换&#xff0c;或者按照一定规则自动切换的形式。 群裂变利器 通过微信活码进行群裂变&#xff0c;二维码永不过期啦&#xff01;还可以根据用户所在城…...

做网站首页ps分辨率多少/sem竞价培训班

艺术风格转换是一种图像的合成问题&#xff0c;其中图像的内容是以另一种风格再现的。 Artistic style transfer is an image synthesis problem where the contentof an image is reproduced with the style of another. 近年来的研究表明&#xff0c;利用预训练卷积神经网络…...

福建有没有网站做一件代发/app拉新接单平台

一、电阻的测量 选择欧姆档 200欧、2K欧、20K欧、200K欧、20M欧 步骤&#xff1a;不知电阻多大&#xff0c;先调到最大档20M欧&#xff0c;如果大概知道就调到相应的档&#xff0c; 当显示1时说明此电阻过大&#xff0c;需要往档大调&#xff0c; 当显示0时说明此电阻过小&…...

wordpress响应瀑布主题/营销网络建设

嵌套查询 带有EXISTS谓词的子查询 EXISTS谓词 —— 存在量词 ∃\exists∃ 带有EXISTS谓词的子查询不返回任何数据&#xff0c;只产生逻辑真值“true”或逻辑假值“false” 若内层查询为空&#xff0c;外层WHERE子句返回false若内层查询非空&#xff0c;外层WHERE子句返回tr…...

自助网站建设哪家好/链接提交

在javascript值中有两个“家伙”总是叫人很迷糊&#xff0c;它们就是 null 和 undefined&#xff1b;开发过程中&#xff0c;我们可以说会经常碰到这两个“家伙”&#xff0c;但是要真正了解null 和 undefined两者的区别&#xff0c;还是要特别研究下的。最近查看了一些相关资料…...

云南网站建设方法/外贸营销渠道

SpringCloud Function作为SpringCloud家族成员最早在2017年提出&#xff0c;项目主要负责人为Mark Fisher&#xff0c;目前已经来到了3.0版本。SpringCloud Function的出现旨在为快速发展的Serverless市场提供一个Spring的接入路径&#xff0c;使用SpringCloud Function进行无服…...