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

【docker知识】联合文件系统(unionFS)原理

一、说明

        Docker CLI 操作起来比较简单——您只需掌握Create、Run、InspPull和Push容器和图像,但是谁想过Docker 背后的内部机制是如何工作的?在这个简单的表象背后隐藏着许多很酷的技术, UnionFS(统一文件系统)就是其中之一。

二、UnionFS是所有容器和镜像层背后的底层文件系统

2.1 联合文件系统是个理念

         联合挂载或联合文件系统是一种实现的概念,并不是一种具体的文件系统类型。

        联合挂载是一种文件系统,它是在不修改其原始(物理)源的情况下创建将多个目录的内容合并为一个逻辑目录。更有创意的用法是:能将相关的文件集存储在不同的磁盘或媒体中,但我们在单个视图中显示它们。总之,将多个、种类不同的数据源整合成一个逻辑数据源是有意义的。

        一个例子是来自远程 NFS 服务器的一堆用户的 /home 目录全部合并到一个目录中,另一个例子是:将拆分的 ISO 映像合并到一个完整的目录中。

        而对于Docker这种分层结构,需要将每一层的文件展示到用户观察的一个平面上,换句话就是要用户感觉不出分层的存在。

2.2 当今UnionFS观念下的产品

        在联合文件系统的概念之下,有许多具体产品。其中有的更快一些,有的更简单一些,总之,对于不同的目标或不同的成熟度都有对应的设计理念。因此,在我们开始深入研究细节之前,让我们快速浏览一下目前这些产品发展现状:

  •  UnionFS 

         最原始的可堆叠的统一文件系统,它可以合并多个目录(分支)的内容,同时保持它们的物理内容独立。 Unionfs 用于统一源码树管理、合并拆分光盘内容、合并单独的软件包目录、数据网格等。 Unionfs 允许任意混合只读和读写分支,以及在扇出的任何位置插入和删除分支。为了维护 unix 语义,Unionfs 处理消除重复项、部分错误条件等。 Unionfs 是更大的 FiST 项目的一部分,该项目包括 Wrapfs 包装器可堆叠文件系统。(2014年停止更新)

  • aufs

         原始 UnionFS 的改进版,添加了许多新功能,但被拒绝合并到主线 Linux 内核中。 Aufs 是 Ubuntu/Debian 上 Docker 的默认驱动程序,但已被 OverlayFS 取代(对于 Linux 内核 >4.0)。与 Docker 文档页面中描述的其他联合文件系统相比,它具有一些优势。

  • OverlayFS

        也是UnionFS的改进版,OverlayFS 自 3.18(2014 年 10 月 26 日)起包含在 Linux 内核中。这是 overlay2 Docker 驱动程序默认使用的文件系统(您可以使用 docker system info | grep Storage 进行验证)。它通常比 aufs 具有更好的性能,并且具有一些不错的功能,例如页面缓存共享。

  • ZFS - ZFS

        是由 Sun Microsystems(现为 Oracle)创建的联合文件系统。它具有一些有趣的功能,例如分层校验和、快照的本机处理和备份/复制或本机数据压缩和重复数据删除。但是,由 Oracle 维护,它具有非 OSS 友好许可证 (CDDL),因此不能作为 Linux 内核的一部分发布。但是,您可以使用 ZFS on Linux (ZoL) 项目,该项目在 Docker 文档中被描述为健康且成熟的......,但尚未准备好用于生产。

  • Btrfs

        另一款产品是 Btrfs,它是多家公司(包括 SUSE、WD 或 Facebook)的联合项目,在 GPL 许可下发布,是 Linux 内核的一部分。 Btrfs 是 Fedora 33 的默认文件系统。它还有一些有用的功能,例如块级操作、碎片整理、可写快照等等。如果您真的想经历为 Docker 切换到非默认存储驱动程序的麻烦,那么 Btrfs 及其功能和性能可能是您的不二之选。

        总之:在翻阅Docker资料中,统统将overlay2和UnionFS看成是一个概念,这一点是不会有错的。

三、采用UnionFS的理由

        我们用来启动容器的许多镜像都非常庞大,无论是大小为 72MB 的 ubuntu 还是大小为 133MB 的 nginx。每次我们想从这些图像创建一个容器时,分配那么多空间是非常昂贵的。多亏了联合文件系统,Docker 只需要在镜像之上创建薄层,其余部分可以在所有容器之间共享。这还提供了减少启动时间的额外好处,因为无需复制图像文件和数据。

        联合文件系统还提供隔离,因为容器对共享图像层具有只读访问权限。如果他们需要修改任何只读共享文件,他们会使用写时复制策略(稍后讨论)将内容复制到可以安全修改的顶层可写层。

四、UnionFS是如何工作的

        现在需要问一个重要的问题:UnionFS——它实际上是如何工作的?从上面描述的所有事情来看,整个联合文件系统在云里雾里,但也并非不能模拟。

        下面我们将用shell语句进行模拟这种UnionFS,假定有以下路径和文件:

.
├── upper
│   ├── code.py  # Content: `print("Hello Overlay!")`
│   └── script.py
└── lower├── code.py  # Content: `print("This is some code...")`└── config.yaml
  •         在联合挂载术语中,这些目录称为分支。
  •         这些分支中的每一个都被分配了优先级。

        此优先级用于确定在多个源分支中存在同名文件的情况下哪个文件将显示在合并视图中。查看上面的文件和目录 - 很明显,如果我们尝试覆盖它们,就会产生这种冲突(code.py 文件)。

        那么,让我们试着下列shell代码后出现什么:

~ $ mount -t overlay \-o lowerdir=./lower,\upperdir=./upper,\workdir=./workdir \overlay /mnt/merged~ $ ls /mnt/merged
code.py  config.yaml  script.py~ $ cat /mnt/merged/code.py
print("Hello Overlay!")

        在上面的示例中,我们使用带有覆盖类型的 mount 命令将低级目录(只读;低优先级)和上级目录(读写;高优先级)合并到 /mnt/merged 中的合并视图中。我们还包含了 workdir=./workdir 选项,workdir在 lowerdir 和 upperdir 以原子操作移动到 /mnt/merged 之前用作准备 lowerdir 和 upperdir 的合并视图的地方。

1)读取数据

       查看上面 cat 命令的输出,我们可以看到上层目录中的文件内容确实在合并视图中优先。

        所以,现在我们知道如何合并 2 个目录以及如果存在冲突会发生什么,但是如果我们尝试从合并视图中修改某些文件会发生什么?这就是写时复制 (CoW) 发挥作用的地方。那么,它到底是什么? CoW 是一种优化技术,如果两个调用者请求相同的资源,您可以向他们提供指向相同资源的指针而无需复制它。仅当其中一个调用者尝试写入其“副本”时才需要复制 - 因此术语复制(首次尝试)写入。

2)写入数据

        在联合挂载的情况下,这意味着当我们尝试修改共享文件(或只读文件)时,它首先被复制到顶部可写分支(upperdir),它比只读的较低分支(lowerdir)具有更高的优先级。然后 - 当它在可写分支中时 - 它可以被安全地修改并且它的新内容将在合并视图中可见,因为顶层具有更高的优先级。

3)删除数据

        我们可能要执行的最后一个操作是删除文件。为了执行“删除”,在writeable 分支中创建一个whiteout 文件来清除我们要删除的文件。这意味着该文件实际上并未被删除,而是隐藏在合并视图中。

        我们讨论了很多关于 union mount 的一般工作原理,但它与 Docker 及其容器有何关系?为了将它们重新连接在一起,让我们看一下 Docker 分层架构。容器的沙箱由一些镜像分支——或者我们都知道的——层组成。这些层是合并视图的只读 (lowerdir) 部分,容器层是薄的可写顶部 (upperdir) 部分。

        除了这个架构术语,它实际上是一回事——你从Registry中提取的图像层是 lowerdir,当你运行一个容器时,upperdir 附加到镜像层的顶部,为你的容器提供可写的工作空间。听起来很简单,对吧?那么,让我们试试吧!

五、分层和优先级

  • 按照分层可以将读写成看成优先级最高。lowdir最低优先。
  • 在用户层面,将若干层投影到一个透明画布上,看起来大家都在一个目录展示。

六、在真实Docker中尝试

        为了演示 Docker 如何使用 OverlayFS,我们将尝试模拟 Docker 如何挂载容器和图像层。在动手做之前,我们首先需要清理我们的工作区并获取一个镜像来玩:

~ $ docker image prune -af
...
Total reclaimed space: ...MB
~ $ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a076a628af6f: Pull complete
0732ab25fa22: Pull complete
d7f36f6fe38f: Pull complete
f72584a26f32: Pull complete
7125e4df9063: Pull complete
Digest: sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

        我们有一个图像 (nginx) 可以玩,接下来,让我们检查它的层。我们可以通过对图像运行 docker inspect 并检查 GraphDriver 字段或通过存储所有图像层的 /var/lib/docker/overlay2 目录来检查图像层。所以,让我们两者都做,看看里面有什么:

~ $ cd /var/lib/docker/overlay2
~ $ ls -l
total 0
drwx------. 4 root root     55 Feb  6 19:19 3d963d191b2101b3406348217f4257d7374aa4b4a73b4a6dd4ab0f365d38dfbd
drwx------. 3 root root     47 Feb  6 19:19 410c05aaa30dd006fc47d8c23ba0d173c6d305e4d93fdc3d9abcad9e78862b46
drwx------. 4 root root     72 Feb  6 19:19 685374e39a6aac7a346963bb51e2fc7b9f5e2bdbb5eac6c76ccdaef807abc25e
brw-------. 1 root root 253, 0 Jan 31 18:15 backingFsBlockDev
drwx------. 4 root root     72 Feb  6 19:19 d487622ece100972afba76fda13f56029dec5ec26ffcf552191f6241e05cab7e
drwx------. 4 root root     72 Feb  6 19:19 fb18be50518ec9b37faf229f254bbb454f7663f1c9c45af9f272829172015505
drwx------. 2 root root    176 Feb  6 19:19 l~ $ tree 3d963d191b2101b3406348217f4257d7374aa4b4a73b4a6dd4ab0f365d38dfbd/
3d963d191b2101b3406348217f4257d7374aa4b4a73b4a6dd4ab0f365d38dfbd/
├── diff
│   └── docker-entrypoint.d
│       └── 20-envsubst-on-templates.sh
├── link
├── lower
└── work~ $ docker inspect nginx | jq .[0].GraphDriver.Data
{"LowerDir": "/var/lib/docker/overlay2/fb18be50518ec9b37faf229f254bbb454f7663f1c9c45af9f272829172015505/diff:/var/lib/docker/overlay2/d487622ece100972afba76fda13f56029dec5ec26ffcf552191f6241e05cab7e/diff:/var/lib/docker/overlay2/685374e39a6aac7a346963bb51e2fc7b9f5e2bdbb5eac6c76ccdaef807abc25e/diff:/var/lib/docker/overlay2/410c05aaa30dd006fc47d8c23ba0d173c6d305e4d93fdc3d9abcad9e78862b46/diff","MergedDir": "/var/lib/docker/overlay2/3d963d191b2101b3406348217f4257d7374aa4b4a73b4a6dd4ab0f365d38dfbd/merged","UpperDir": "/var/lib/docker/overlay2/3d963d191b2101b3406348217f4257d7374aa4b4a73b4a6dd4ab0f365d38dfbd/diff","WorkDir": "/var/lib/docker/overlay2/3d963d191b2101b3406348217f4257d7374aa4b4a73b4a6dd4ab0f365d38dfbd/work"
}

        查看上面的输出,它看起来与我们使用 mount 命令看到的非常相似,对吧?进一步来说:

  • LowerDir:是只读镜像层的目录,用冒号隔开
  • MergedDir:图像和容器中所有层的合并视图
  • UpperDir:写入更改的读写层
  • WorkDir:Linux OverlayFS 用来准备合并视图的工作目录
  • 接下来,让我们更进一步,运行一个容器并检查它的层:
~ $ docker run -d --name container nginx
~ $ docker inspect container | jq .[0].GraphDriver.Data
{"LowerDir": "/var/lib/docker/overlay2/59bcd145c580de3bb3b2b9c6102e4d52d0ddd1ed598e742b3a0e13e261ee6eb4-init/diff:/var/lib/docker/overlay2/3d963d191b2101b3406348217f4257d7374aa4b4a73b4a6dd4ab0f365d38dfbd/diff:/var/lib/docker/overlay2/fb18be50518ec9b37faf229f254bbb454f7663f1c9c45af9f272829172015505/diff:/var/lib/docker/overlay2/d487622ece100972afba76fda13f56029dec5ec26ffcf552191f6241e05cab7e/diff:/var/lib/docker/overlay2/685374e39a6aac7a346963bb51e2fc7b9f5e2bdbb5eac6c76ccdaef807abc25e/diff:/var/lib/docker/overlay2/410c05aaa30dd006fc47d8c23ba0d173c6d305e4d93fdc3d9abcad9e78862b46/diff","MergedDir": "/var/lib/docker/overlay2/59bcd145c580de3bb3b2b9c6102e4d52d0ddd1ed598e742b3a0e13e261ee6eb4/merged","UpperDir": "/var/lib/docker/overlay2/59bcd145c580de3bb3b2b9c6102e4d52d0ddd1ed598e742b3a0e13e261ee6eb4/diff","WorkDir": "/var/lib/docker/overlay2/59bcd145c580de3bb3b2b9c6102e4d52d0ddd1ed598e742b3a0e13e261ee6eb4/work"
}~ $ tree -l 3 /var/lib/docker/overlay2/59bcd145c580de3bb3b2b9c6102e4d52d0ddd1ed598e742b3a0e13e261ee6eb4/diff  # The UpperDir
/var/lib/docker/overlay2/59bcd145c580de3bb3b2b9c6102e4d52d0ddd1ed598e742b3a0e13e261ee6eb4/diff
├── etc
│   └── nginx
│       └── conf.d
│           └── default.conf
├── run
│   └── nginx.pid
└── var└── cache└── nginx├── client_temp├── fastcgi_temp├── proxy_temp├── scgi_temp└── uwsgi_temp

        这里我们只是从前面的代码片段中获取值并将它们传递给 mount 命令中的适当参数,唯一的区别是我们使用 /mnt/merged 作为合并视图而不是 /var/lib/docker/overlay2/.../合并。

        这就是 Docker 中整个 OverlayFS 的真正含义 - 跨多个堆叠层的单个挂载命令。下面是负责此的 Docker 代码的一部分 - 替换 lowerdir=...,upperdir=...,workdir=... 值,然后是 unix.Mount

// https://github.com/moby/moby/blob/1ef1cc8388165b2b848f9b3f53ec91c87de09f63/daemon/graphdriver/overlay2/overlay.go#L580
opts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", strings.Join(absLowers, ":"), path.Join(dir, "diff"), path.Join(dir, "work"))
mountData := label.FormatMountLabel(opts, mountLabel)
mount := unix.Mount
mountTarget := mergedDirrootUID, rootGID, err := idtools.GetRootUIDGID(d.uidMaps, d.gidMaps)
// ...

七、结论

        从外面看 Docker 的界面,它可能看起来像一个黑盒子,里面有很多晦涩的技术。这些技术 - 虽然晦涩难懂 - 但非常有趣且有用,虽然您不需要了解它们就可以有效地使用 Docker,但在我看来,学习和理解它们仍然是值得的。

相关文章:

【docker知识】联合文件系统(unionFS)原理

一、说明 Docker CLI 操作起来比较简单——您只需掌握Create、Run、InspPull和Push容器和图像,但是谁想过Docker 背后的内部机制是如何工作的?在这个简单的表象背后隐藏着许多很酷的技术, UnionFS(统一文件系统)就是其…...

使用Lame库实现wav、pcm转mp3

文章目录 前言 一、Lame库是什么? 二、使用步骤 0.创建native项目 1.下载Lame库 2.pcm转MP3 3.wav转MP3 4、native方法如下 三、注意 总结 前言 因为使用android录音后生成的文件是wav或者pcm格式,项目要求最后的文件需要是mp3格式,于…...

c++11 标准模板(STL)(std::multimap)(三)

定义于头文件 <map> template< class Key, class T, class Compare std::less<Key>, class Allocator std::allocator<std::pair<const Key, T> > > class multimap;(1)namespace pmr { template <class Key, class T…...

【报复性赚钱】2023年5大风口行业

今天就来和大家分享一下&#xff0c;在时代的洪流下&#xff0c;普通人如何顺应大势抓住机遇&#xff01; 实现人在风口上&#xff0c;猪都会飞起来。 根据对市场的观察及各平台数据分析结果&#xff0c;结合国家政策和经济专家的分析&#xff0c;小编预测了2023年将会迎来大…...

单目相机、双目相机和RGB-D相机学习笔记(一些视频和博文网址)

目录1. 单目相机1.1 摄像头原理1.2 单目相机的标定2 双目相机2.1 双目相机定位原理2.2 双目相机的缺陷3 RGB-D相机3.1 深度相机结构光原理3.2 RGB-D相机的应用1. 单目相机 1.1 摄像头原理 视频网址&#xff1a;【全网最详细】摄像头原理分析&#xff08;约25分钟课程&#xf…...

word和wps添加mathtype选项卡

word或wps添加mathtype选项卡 前提 安装好word或wps安装好mathtype 步骤 确认word或wps具体安装位置确认word或wps位数为32位还是64位复制mathtype中的MathPage.wll文件和MathType Commands 2016.dotm文件到STARTUP位置添加受信任位置添加加载项 安装位置 通过开始页面&a…...

获取成员userID

文章目录一、简介二、获取token1、获取秘钥2、获取Token三、获取部门数据1、获取部门列表2、获取子部门ID列表3、获取单个部门详情四、获取成员信息1、读取成员2、获取部门成员3、获取部门成员详情一、简介 同步数据到企微&#xff1a; 企业如果需要从自有的系统同步通讯录到…...

DOM编程-显示网页时钟

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>显示网页时钟</title> </head> <body bgcolor"antiquewhite"> <script type"text/javascrip…...

浅谈保护数据的加密策略

加密是一种将信息从可读格式转换为混乱字符串的技术。这样做可以防止数据传输中的机密数据泄露。文档、文件、消息和所有其他形式的网络通信都可以加密。加密策略和身份验证服务的结合&#xff0c;还能保障企业机密信息只对授权用户开启访问权限。常见的数据加密包括以下两种&a…...

Java中String,StringBuffer和StringBuilder

String类 我们在定义string变量时 常常写 String str "hello word"; 这样的代码,看起来和int a 0; 是一样的声明方式, 但其实两者是不同的, int 是java中定义的基本数据类型, 而String是一个类&#xff0c;是一个特殊的类&#xff0c;可以像基本数据类型一样直接赋…...

华为认证常见技术问答整理:什么是Datacom认证?

一、关于Datacom认证Q&#xff1a;什么是Datacom认证&#xff1f;A&#xff1a;Datacom&#xff0c;即DatacomCommunication的缩写&#xff0c;中文为“数据通信”&#xff0c;属于ICT技术架构认证类别&#xff08;华为认证包含ICT技术架构认证、平台与服务认证和行业ICT认证三…...

Read book Netty in action (Chapter II) (Netty Introduction)

前言 支持15W的并发客户端&#xff0c;我们应该视为理所当然的事情&#xff0c;很多公司甚至能够支撑更多&#xff0c;例如我们熟知的 BAT&#xff0c;当几年前双十一的夜晚&#xff0c;并发量是不可估计的。还有春节的时候购票的时候的并发。作为一个优秀的开发人员&#xff…...

python--route

routes是用python重新实现的Rails routes系统&#xff0c;用于将url映射到应用程序的actions &#xff0c;并反过来生成url 它也是在openstack实现restful通信的方式&#xff0c;它被用来做将 URL 映射为 App 的 action&#xff0c;以及为 App的action 产生 URL 两个重要的方法…...

java面试中被问到项目中的难点,怎么回答

java面试中被问到项目中的难点&#xff0c;怎么回答回答步骤举例说明回答步骤 回答这个问题的方法取决于你的项目的类型和难度。 但是&#xff0c;一般来说&#xff0c;你可以遵循以下步骤来回答这个问题&#xff1a; 描述你的项目&#xff1a;首先简要描述你的项目的类型和目…...

【速通版】吴恩达机器学习笔记Part1

准备速通一下吴恩达的机器学习 很快做个笔记5.2.3 监督学习 part 2_哔哩哔哩_bilibili 目录 1.概述&#xff08;P1-P3) 2.supervised learning&#xff1a;&#xff08;P4,P5) regression&#xff1a; classification 3.unsupervised learning &#xff08;P6- 1.聚类算…...

面试(九)小米C++开发一面 21.11.02

1、局部变量与全局变量的区别?可以同名嘛? 首先是作用域: 局部变量只在变量声明的代码块范围内生效 全局变量在其声明后的所有位置都能访问到 在局部变量与全局变量同名的情况下,全局变量会被屏蔽掉,只会使用局部变量的内容 2、extern 当在a.c中想要使用b.c中的函数fu…...

儿童书写台灯哪个牌子比较好?2023儿童护眼台灯分享

现在儿童的近视率高达52.7%&#xff0c;有科技水平的提高和电子产品的普及&#xff0c;近视率逐年攀升&#xff0c;出现低龄化现象&#xff0c;调查结果显示&#xff0c;其中6岁儿童达到14.3%&#xff0c;小学生为35.6%。初中生71.1%&#xff0c;高中生高达80.5%&#xff0c;可…...

市场调研计划书如何写?

想要做好一个产品&#xff0c;市场调研是必不可少的一步&#xff0c;也是第一步&#xff0c;那么如何进行市场调研呢&#xff1f;以下是我整理的一份市场调研计划书&#xff0c;希望能够帮助到大家&#xff01;&#xff01;&#xff01; 一、文档版本控制 主要记录文档的版本…...

python网络爬虫—快速入门(理论+实战)(七)

系列文章目录 &#xff08;1&#xff09;python网络爬虫—快速入门&#xff08;理论实战&#xff09;&#xff08;一&#xff09; &#xff08;2&#xff09;python网络爬虫—快速入门&#xff08;理论实战&#xff09;&#xff08;二&#xff09; &#xff08;3&#xff09; p…...

机器学习笔记——Chapter 1 – The Machine Learning landscape

ML学习笔记 Chapter 1 – The Machine Learning landscape 1.如何定义机器学习&#xff1f; Answer&#xff1a;机器学习是一门通过编程让计算机从数据中进行学习的科学&#xff08;和艺术&#xff09;。 2.机器学习在哪些问题上表现突出&#xff0c;你能给出四种类型吗&am…...

skimage.feature--corner_harris、hog、local_binary_pattern说明

skimage.feature说明–corner_harris、hog、local_binary_pattern 文章目录skimage.feature说明--corner_harris、hog、local_binary_pattern1. 前言2. corner_harris2.1 介绍2.2 参数及返回3. hog3.1 介绍3.2 参数及返回4. local_binary_pattern4.1 介绍4.2 参数及返回5. 总结…...

致敬白衣天使,学习Python读取

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、c 主页&#xff1a;阿玥的小东东 故事设定&#xff1a;现在学校要求对所有同学进行核酸采集&#xff0c;每位同学先在宿舍内等候防护人员&#xff08;以下简称“大白”&#xff09;叫号&#xff0c;叫到自己时去停车场排…...

JVM - 认识JVM规范

目录 重识JVM JVM规范作用及其核心 JVM 整体组成 理解ClassFile结构 ASM开发 重识JVM JVM概述JVM&#xff1a; Java Virtual Machine&#xff0c;也就是Java虚拟机所谓虚拟机是指&#xff1a; 通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统…...

文献阅读笔记 # CodeBERT: A Pre-Trained Model for Programming and Natural Languages

《CodeBERT: A Pre-Trained Model for Programming and Natural Languages》EMNLP 2020 (CCF-B)作者主要是来自哈工大、中山大学的 MSRA 实习生和 MSRA、哈工大的研究员。资源&#xff1a;code | pdf相关资源&#xff1a;RoBERTa-base | CodeNN词汇&#xff1a; bimodal: 双模态…...

openHarmony的UI开发

自适应布局 拉伸能力 ​ Blank在容器主轴方向上&#xff0c;空白填充组件具有自动填充容器空余部分的能力。仅当父组件为Row/Column时生效&#xff0c;即是线性布局。这样便可以在两个固定宽度或高度的组件中间添加一个Blank()&#xff0c;将剩余空间占满&#xff0c;从而实现…...

【JavaSE】深入HashMap

文章目录1. HashMap概述2. 哈希冲突3. 树化与退化3.1 树化的意义3.2 树的退化4. 二次哈希5. put方法源码分析6. key的设计7. 并发问题参考 如何防止因哈希碰撞引起的DoS攻击_hashmap dos攻击_双子孤狼的博客-CSDN博客 为什么 HashMap 要用 h^(h &#xff1e;&#xff1e;&#…...

华为机试题:HJ62 查找输入整数二进制中1的个数(python)

文章目录博主精品专栏导航知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方法2、print() &#xff1a;打印输出。1、整型int() &#xff1a;将指定进制&#xf…...

代码随想录训练营一刷总结|

分为几个大部分&#xff1a; 数组 最先接触的部分&#xff0c;虽然说感觉是最简单的&#xff0c;但是需要掌握好基础&#xff0c;特别是小心循环。这里面需要再仔细看的就是螺旋矩阵那一块&#xff0c;其他的在后续刷的时候能用一种方法一次a就行。 链表 需要注意链表的基础…...

CSS中的几种尺寸单位

一、尺寸单位 CSS 支持多种尺寸单位&#xff0c;包括&#xff1a; px&#xff1a;像素&#xff0c;固定大小单位em&#xff1a;相对于当前元素字体大小的单位rem&#xff1a;相对于根元素&#xff08;HTML&#xff09;字体大小的单位%&#xff1a;相对于父元素的百分比单位vh…...

运维必会:ansible剧本(piaybook)

playbooks 概述以及实例操作 Playbooks 组成部分&#xff1a; Inventory Modules Ad Hoc Commands Playbooks Tasks: 任务&#xff0c;即调用模块完成的某些操作 Variables: 变量 Templates: 模板 Handlers: 处理器&#xff0c;由某时间触发执行的操作 Roles: 角色 YAML 介绍…...

没企业可以做网站吗/网站开发步骤

题目 两个排序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。 请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (mn)) 。 示例 1:nums1 [1, 3] nums2 [2]中位数是 2.0 示例 2:nums1 [1, 2] nums2 [3, 4]中位数是 (2 3)/2 2.5 复制代码思…...

网站 子域名/网站搭建需要什么

本节将学习OpenGL的着色器语言GLSL。本节效果主要内容什么是着色器如何在OpenGL中使用Shader如何编写顶点着色器和片段着色器代码实现过程什么是着色器前面说了&#xff0c;3D编程要完成2件事。物体显示在哪&#xff1f;物体显示成什么样&#xff1f;着色器&#xff0c;也叫sha…...

.net购物网站开发/如何制作网页教程

在使用Nginx时&#xff0c;经常会碰到502 Bad Gateway和504 Gateway Time-out错误&#xff0c;下面以NginxPHP-FPM来分析下这两种常见错误的原因和解决方案。 1.502 Bad Gateway错误 在php.ini和php-fpm.conf中分别有这样两个配置项&#xff1a;max_execution_time和request_te…...

wordpress 中英双语/今天热点新闻事件

快速估算msk信号载波的方法【专利摘要】本发明提出一种快速估算MSK信号载波的方法&#xff0c;旨在提供一种能在测控系统中更准确快速的对MSK信号载波频率进行估算的方法。本发明通过下述技术方案予以实现&#xff1a;首先对来自测控系统的MSK测控信号&#xff0c;经模/数转换器…...

武汉网站建设与服务/电商运营培训班

HTTP是一个属于应用层的面向对象的协议&#xff0c;由于其简捷、快速的方式&#xff0c;适用于分布式超媒体信息系统。 http请求消息和响应消息都是由开始行&#xff08;对于请求消息&#xff0c;开始行就是请求行&#xff0c;对于响应消息&#xff0c;开始行就是状态行&#x…...

如何对网站做实证分析/semen

数据库系统原理与应用教程&#xff08;003&#xff09;—— MySQL 安装与配置&#xff1a;手工配置 MySQL&#xff08;windows 环境&#xff09; 目录数据库系统原理与应用教程&#xff08;003&#xff09;—— MySQL 安装与配置&#xff1a;手工配置 MySQL&#xff08;windows…...