Docker从认识到实践再到底层原理(二-2)|Namespace+cgroups

前言
那么这里博主先安利一些干货满满的专栏了!
首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。
- 高质量博客汇总
然后就是博主最近最花时间的一个专栏《Docker从认识到实践再到底层原理》希望大家多多关注!
- Docker从认识到实践再到底层原理
Namespace
Namespace可以隔离的一些资源如下。
| Namespace | 系统调用参数 | 被隔离的全局系统资源 | 引入内核版本 |
|---|---|---|---|
| UTS | CLONE_NEWUTS | 主机和域名 | 2.6.19 |
| IPC | CLONE_NEWIPC | 信号量、消息队列和共享内存、进程间通信 | 2.6.19 |
| PID | CLONE_NEWPID | 进程编号 | 2.6.24 |
| Network | CLONE_NEWNET | 网络设备、网络栈、端口等 | 2.6.29 |
| Mount | CLONE_NEWNS | 文件系统挂载点 | 2.6.19 |
| User | CLONE_NEWUSER | 用户和用户组 | 3.8 |
Namespace空间隔离实战
dd命令
Linux dd 命令用于读取、转换并输出数据dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。
dd OPTION
参数
if=文件名:输入文件名,默认为标准输入。即指定源文件of文件名:输出文件名,默认为标准输出。即指定目的文件ibs=bytes:一次读入 bytes 个字节,即指定一个块大小为 bytes 个字节obs=bytes:一次输出 bytes 个字节,即指定一个块大小为 bytes 个字节bs=bytes:同时设置读入/输出的块大小为 bytes 个字节。cbs=bytes:一次转换 bytes 个字节,即指定转换缓冲区大小skip=blocks:从输入文件开头跳过 blocks 个块后再开始复制seek=blocks:从输出文件开头跳过 blocks 个块后再开始复制count=blocks:仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数conv=<关键字>:关键字有11种。
可以用它来生成一个指定大小的空白文件
dd if=/dev/zero of=test.img bs=8k count=1024
/dev/zero是操作系统的一个特殊文件,可以产生连续不断的空白字符流
这里就可以产生一个8M的文件。
(base) [yufc@ALiCentos7:~/Src/Bit-Courses/DockerSrc/data]$ dd if=/dev/zero of=test.img bs=8k count=1024
1024+0 records in
1024+0 records out
8388608 bytes (8.4 MB, 8.0 MiB) copied, 0.00964433 s, 870 MB/s
(base) [yufc@ALiCentos7:~/Src/Bit-Courses/DockerSrc/data]$ ll -h
total 8.0M
-rw-rw-r-- 1 yufc yufc 8.0M Aug 29 19:50 test.img
(base) [yufc@ALiCentos7:~/Src/Bit-Courses/DockerSrc/data]$
也可以用来做一个大小写转换
先创建一个test.txt然后里面写Hello World!


mkfs命令
用于在设备上创建 Linux 文件系统,俗称格式化,比如我们使用 U 盘的时候可以格式化。
mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
参数
Shell
-t fstype : 指定要建立何种文件系统;如 ext3,ext4
filesys : 指定要创建的文件系统对应的设备文件名; blocks:指定文件系统的磁盘块数。
-V : 详细显示模式
fs-options : 传递给具体的文件系统的参数
我们可以把刚才dd命令生成的test.img格式化成一个磁盘。
(base) [yufc@ALiCentos7:~/Src/Bit-Courses/DockerSrc/data]$ ls
out.txt test.img test.txt
(base) [yufc@ALiCentos7:~/Src/Bit-Courses/DockerSrc/data]$ mkfs -t ext4 ./test.img
mke2fs 1.42.9 (28-Dec-2013)
./test.img is not a block special device.
Proceed anyway? (y,n) y
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
2048 inodes, 8192 blocks
409 blocks (4.99%) reserved for the super user
First data block=1
Maximum filesystem blocks=8388608
1 block group
8192 blocks per group, 8192 fragments per group
2048 inodes per groupAllocating group tables: done
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done(base) [yufc@ALiCentos7:~/Src/Bit-Courses/DockerSrc/data]$ ll
total 1184
-rw-rw-r-- 1 yufc yufc 12 Aug 29 19:56 out.txt
-rw-rw-r-- 1 yufc yufc 8388608 Aug 29 20:09 test.img
-rw-rw-r-- 1 yufc yufc 12 Aug 29 19:54 test.txt
(base) [yufc@ALiCentos7:~/Src/Bit-Courses/DockerSrc/data]$
df命令
Linux df(英文全拼:disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。
df [OPTION]... [FILE]...
参数
-a, --all 包含所有的具有 0 Blocks 的文件系统
-h, --human-readable 使用人类可读的格式(预设值是不加这个选项的...)
-H, --si 很像 -h, 但是用 1000 为单位而不是用 1024
-t, --type=TYPE 限制列出文件系统的 TYPE
-T, --print-type 显示文件系统的形式
案例
#查看磁盘使用情况
df -h
#查看磁盘的系统类型
df -Th
(base) [yufc@ALiCentos7:~/Src/Bit-Courses/DockerSrc/data]$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 857M 0 857M 0% /dev
tmpfs 868M 0 868M 0% /dev/shm
tmpfs 868M 572K 867M 1% /run
tmpfs 868M 0 868M 0% /sys/fs/cgroup
/dev/vda1 40G 26G 13G 68% /
tmpfs 174M 0 174M 0% /run/user/1000
(base) [yufc@ALiCentos7:~/Src/Bit-Courses/DockerSrc/data]$ df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 877396 0 877396 0% /dev
tmpfs 887988 0 887988 0% /dev/shm
tmpfs 887988 572 887416 1% /run
tmpfs 887988 0 887988 0% /sys/fs/cgroup
/dev/vda1 41152812 26333864 12915240 68% /
tmpfs 177600 0 177600 0% /run/user/1000
(base) [yufc@ALiCentos7:~/Src/Bit-Courses/DockerSrc/data]$
mount命令
mount 命令用于加载文件系统到指定的加载点。此命令的也常用于挂载光盘,使我们 可以访问光盘中的数据,因为你将光盘插入光驱中,Linux 并不会自动挂载,必须使用 Linux mount 命令来手动完成挂载。
Linux 系统下不同目录可以挂载不同分区和磁盘设备,它的目录和磁盘分区是分离的, 可以自由组合(通过挂载)
不同的目录数据可以跨越不同的磁盘分区或者不同的磁盘设备。 挂载的实质是为磁盘添加入口(挂载点)。
什么是挂载?
比如U盘插进电脑之后,在某个目录下弹出来,这个目录就是挂载点。就是给这个U盘添加入口。
mount [-l]
mount [-t vfstype] [-o options] device dir
参数
常见参数
显示已加载的文件系统列表:
-t: 加载文件系统类型支持常见系统类型的 ext3,ext4iso9660,tmpfs,xis 等,大部分情况可以不指定,mount可以自己识别
-o options 主要用来描述设备或档案的挂接方式。loop:用来把一个文件当成硬盘分区挂接上系统ro:采用只读方式挂接设备rw:采用读写方式挂接设备
device: 要挂接(mount)的设备
dir: 挂载点的目录

unshare命令
unshare 主要能力是使用与父程序不共享的名称空间运行程序。
unshare [options] program [arguments]
参数
| 参数 | 含义 |
|---|---|
| -i, --ipc | 不共享 IPC 空间 |
| -m, --mount | 不共享 Mount 空间 |
| -n, --net | 不共享 Net 空间 |
| -p, --pid | 不共享 PID 空间 |
| -u, --uts | 不共享 UTS 空间 |
| -U, --user | 不共享用户 |
| -V, --version | 版本查看 |
| –fork | 执行 unshare 的进程 fork 一个新的子进程, 在子进程里执行 unshare 传入的参数 |
| –mount-proc | 执行子进程前,将 proc 优先挂载过去 |

这幅图里面,一开始unshare创建了一个子进程,隔离的进程是bash
所以unshare下面我去修改hostname,是修改这个子进程的hostname,然后exit也是退出这个子进程而已,不会影响外面的hostname。
进程隔离实战操作(PID隔离)
unshare -p /bin/bash
我们会发现,直接报错。
(base) [yufc@ALiCentos7:~/Src/Bit-Courses/DockerSrc/data]$ unshare -p /bin/bash
unshare: unshare failed: Operation not permitted
(base) [yufc@ALiCentos7:~/Src/Bit-Courses/DockerSrc/data]$
为什么会报这个错呢?
因为如果直接-p去隔离PID信息,会导致新的进程看不见原来父进程(bash)的信息,会导致他后续会有问题。
也就是说这个新进程,不知道自己的父进程是谁了,这是不允许的。所以。
unshare -p --fork /bin/bash # 这样即可
我们再打开另一个bash,然后ps -ef查看一下进程信息。
发现是一样的,并没有完成隔离。
(base) [yufc@ALiCentos7:~]$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Aug16 ? 00:00:36 /usr/lib/systemd/systemd --switched-root --system --deserial
root 2 0 0 Aug16 ? 00:00:00 [kthreadd]
root 4 2 0 Aug16 ? 00:00:00 [kworker/0:0H]
root 6 2 0 Aug16 ? 00:00:03 [ksoftirqd/0]
...
[root@ALiCentos7:/home/yufc/Src/Bit-Courses/DockerSrc/data]$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Aug16 ? 00:00:36 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 Aug16 ? 00:00:00 [kthreadd]
root 4 2 0 Aug16 ? 00:00:00 [kworker/0:0H]
root 6 2 0 Aug16 ? 00:00:03 [ksoftirqd/0]
...
这是为什么呢,这是因为我们/proc目录下本来就有很多进程,大家都看得到的。
因此要采用另一个参数。
unshare -p --fork --mount-proc /bin/bash
此时再次ps -ef查看进程。
(base) [yufc@ALiCentos7:~/Src/Bit-Courses/DockerSrc/data]$ sudo unshare -p --fork --mount-proc /bin/bash
[root@ALiCentos7:/home/yufc/Src/Bit-Courses/DockerSrc/data]$ ps -efUID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:48 pts/0 00:00:00 /bin/bash
root 20 1 0 09:48 pts/0 00:00:00 ps -ef
[root@ALiCentos7:/home/yufc/Src/Bit-Courses/DockerSrc/data]$
此时已经看不到什么进程了,我们完成进程隔离了。
mount隔离(文件系统隔离)
第一步:打开第一个 shell 窗口 A,执行命令,df -h ,查看主机默认命名空间的磁盘挂载情况。
(base) [yufc@ALiCentos7:~/Src/Bit-Courses/DockerSrc/data]$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 857M 0 857M 0% /dev
tmpfs 868M 0 868M 0% /dev/shm
tmpfs 868M 576K 867M 1% /run
tmpfs 868M 0 868M 0% /sys/fs/cgroup
/dev/vda1 40G 25G 13G 67% /
tmpfs 174M 0 174M 0% /run/user/1000
/dev/loop0 6.8M 77K 6.2M 2% /home/yufc/Src/Bit-Courses/DockerSrc/data/testmymount
(base) [yufc@ALiCentos7:~/Src/Bit-Courses/DockerSrc/data]$
第二步:打开一个新的shell窗口,执行Mount隔离命令
unshare --mount --fork /bin/bash
第三步:在窗口 B 中添加新的磁盘挂载
[root@ALiCentos7:/home/yufc]$ cd /home/yufc/Src/Bit-Courses/DockerSrc/data
[root@ALiCentos7:/home/yufc/Src/Bit-Courses/DockerSrc/data]$ dd if=/dev/zero of=data2.img bs=8k count=10240
10240+0 records in
10240+0 records out
83886080 bytes (84 MB, 80 MiB) copied, 0.0747759 s, 1.1 GB/s
[root@ALiCentos7:/home/yufc/Src/Bit-Courses/DockerSrc/data]$ ls
格式化这个文件。
[root@ALiCentos7:/home/yufc/Src/Bit-Courses/DockerSrc/data]$ mkfs -t ext4 ./data2.img
mke2fs 1.42.9 (28-Dec-2013)
./data2.img is not a block special device.
Proceed anyway? (y,n) y
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
挂载到当前的一个目录下。
[root@ALiCentos7:/home/yufc/Src/Bit-Courses/DockerSrc/data]$ tree .
.
├── data2.img
├── out.txt
├── test.img
├── testmymount
│ └── lost+found
├── testmymount2
└── test.txt3 directories, 4 files
[root@ALiCentos7:/home/yufc/Src/Bit-Courses/DockerSrc/data]$ cd /home/yufc/Src/Bit-Courses/DockerSrc/data^C
[root@ALiCentos7:/home/yufc/Src/Bit-Courses/DockerSrc/data]$ mount -t ext4 ./data2.img ./testmymount2
[root@ALiCentos7:/home/yufc/Src/Bit-Courses/DockerSrc/data]$
我们发现,在这个bash下面是可以看到这个挂载点的。

但是,外面的bash是看不到的!

因此我们成功完成了一次挂载点的隔离!
现在无论我们在testmymount2这个文件夹里面去添加,或者修改任何文件,外面都是找不到的!
因此,在当前的进程中,是有文件隔离的!!
Cgroups
什么是cgroups
cgroups(Control Groups)是 linux 内核提供的一种机制,这种机制可以根据需求把系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。简单说,cgroups 可以限制、记录任务组所使用的物理资源。本质上来说,cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。
cgroups的用途
-
Resource limitation: 限制资源使用,例: 内存使用上限/cpu 的使用限制
-
Prioritization: 优先级控制,例:CPU 利用/磁盘IO 吞吐
-
Accounting:一些审计或一些统计
-
Control: 挂起进程/恢复执行进程
cgroups可以控制的子系统
- https://blog.csdn.net/taoxicun/article/details/127268136
pidstat命令
pidstat是 sysstat 的一个命令,用于监控全部或指定进程的 CPU、内存、线程、设备1O 等系统资源的占用情况。Pidstat 第一次采样显示自系统启动开始的各项统计信息后续采样将显示自上次运行命令后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。
pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
-u : 默认参数,显示各进程的 CPU 使用统计
-r : 显示各进程的内存使用统计
-d : 显示各进程的IO使用情况
-p : 指定进程号,ALL表示所有进程
-C : 指定命令
-l : 显示命令名和所有参数

stress
stress 是 Linux 的一个压力测试工具,可以对 CPU、Memory、IO、磁盘进行压力测试。
stress [OPTION [ARG]]
-c, --cpu N : 产生 N个进程,每个进程都循环调用 sqrt 函数产生 CPU 压力。
-i, --io N : 产生 N个进程,每个进程循环调用 sync 将内存缓冲区内容写到磁盘上,产生I0 压力。通过系统调用 sync 刷新内存缓冲区数据到磁盘中,以确保同步。如果缓冲区内数据较少,写到磁盘中的数据也较少,不会产生IO压力。在 SSD 磁盘环境中尤为明显,很可能 iowait 总是 0,却因为大量调用系统调用 sync,导致系统 CPU 使用率 sys 升高。
-m, --vm N : 产生 N 个进程,每个进程循环调用 malloc/free 函数分配和释放内存。
--vm-bytes B : 指定分配内存的大小
--vm-keep : 一直占用内存,区别于不断的释放和重新分配(默认是不断释放并重新分配内存)
-d, --hdd N : 产生 N个不断执行 write和 unlink 函数的进程(创建文件,写入内容,删除文件)
--hdd-bytes B : 指定文件大小
-t, --timeout N : 在 N秒后结束程序
-q, --quiet:程序在运行的过程中不输出信息
实操。
我们在打开另一个shell,对cpu进行一个监控
pidstat -C stress -p ALL -u 2 10000
这里的意思是,监控stress这个命令相关的所有进程的cpu使用情况,2s输出一次,一共输出10000次。
在另一个shell中启动stress。
stress -c 1
此时我们可以通过shell查看发现,此时cpu已经打满了。

测试一下-i选项。

测试一下-m选项
stress -m 1 --vm-bytes 50m # 申请50mb的内存
pidstat -C stress -p ALL -r 2 10000 # 查看内存就不是-u了,而是-r

测试一下-d选项。
然后监控读写信息。
stress -d 1
pidstat -C stress -p ALL -d 2 10000

测试一下-t选项
stress -d 1 -t 3 # 3s后停止
cgroups版本信息查看
(base) [yufc@ALiCentos7:~]$ cat /proc/filesystems | grep cgroup
nodev cgroup
(base) [yufc@ALiCentos7:~]$
如果看到 cgroup2,表示支持 cgroup v2。
cgroups子系统查看
(base) [yufc@ALiCentos7:~]$ cat /proc/cgroups
#subsys_name hierarchy num_cgroups enabled
cpuset 8 1 1
cpu 2 4 1
cpuacct 2 4 1
memory 7 2 1
devices 9 1 1
freezer 11 1 1
net_cls 4 1 1
blkio 10 1 1
perf_event 3 1 1
hugetlb 6 1 1
pids 5 1 1
net_prio 4 1 1
(base) [yufc@ALiCentos7:~]$
cgroups挂载信息查看
(base) [yufc@ALiCentos7:~]$ mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
(base) [yufc@ALiCentos7:~]$
查看一个进程上的cgroup限制
以当前 shell 进程为例,查看进程的 cgroup。
(base) [yufc@ALiCentos7:~]$ cat /proc/$$/cgroup
11:freezer:/
10:blkio:/
9:devices:/
8:cpuset:/
7:memory:/
6:hugetlb:/
5:pids:/
4:net_prio,net_cls:/
3:perf_event:/
2:cpuacct,cpu:/
1:name=systemd:/user.slice/user-1000.slice/session-2594.scope
(base) [yufc@ALiCentos7:~]$
相关文章:
Docker从认识到实践再到底层原理(二-2)|Namespace+cgroups
前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…...
算法的概述
算法分析: 解决同一问题的算法可以有多种。 我们希望从中选出最优的算法,效率高或者存储空间小。为此,需要对算法进行评估,分析。 通常考虑两个度量: 1、 时间复杂度:算法运行时需要的总步数,…...
菜鸟教程《Python 3 教程》笔记(19):错误与异常
菜鸟教程《Python 3 教程》笔记(19) 19 错误和异常19.1 assert(断言)19.2 异常处理19.2.1 try/except19.2.2 try/except...else19.2.3 try-finally 语句 19.3 抛出异常19.4 用户自定义异常19.5 清理行为19.5.1 定义清理行为19.5.2…...
空气净化器上亚马逊美国站需要办理什么认证?空气净化器UL867测试报告如何办理?
空气净化器又称“空气清洁器”、空气清新机、净化器,是指能够吸附、分解或转化各种空气污染物(一般包括PM2.5、粉尘、花粉、异味、甲醛之类的装修污染、细菌、过敏原等),有效提高空气清洁度的产品,主要分为家用 、商用…...
SpringBoot的测试方案
写完代码后,测试是必不可少的步骤,现在来介绍一下基于SpringBoot的测试方法。 基于SpringBoot框架写完相应功能的Controller之后,然后就可以测试功能是否正常,本博客列举MockMvc和RestTemplate两种方式来测试。 准备代码 实体类…...
华为OD机考算法题:字符串解密
目录 题目部分 解读与分析 代码实现 题目部分 题目字符串解密题目说明给定两个字符串string1和string2。 string1是一个被加扰的字符串。string1由小写英文字母(a~z)和数字字符(0~9)组成,而加扰字符串由0~9、a~f 组…...
unity 锚点设置
锚点聚合情况: 一个2d物体的位置 pos x pos y 是中心点相对于锚点的偏移量: 中心点就是位置。 按住shift 锚点和中心点都会被设置: 按住Alt: 同时按住shift和alt : 中心点 锚点 UI元素在对应的位置上。 锚点拉伸情况…...
Hadoop:HDFS--分布式文件存储系统
目录 HDFS的基础架构 VMware虚拟机部署HDFS集群 HDFS集群启停命令 HDFS Shell操作 hadoop 命令体系: 创建文件夹 -mkdir 查看目录内容 -ls 上传文件到hdfs -put 查看HDFS文件内容 -cat 下载HDFS文件 -get 复制HDFS文件 -cp 追加数据到HDFS文件中 -appendTo…...
自定义封装异步任务组件,实现FutureTask功能
FutureTask 在 JDK1.8 后的异步编排API中的CompletableFuture,提供了 异步任务的成功回调、异常回调。 public class FutureTaskTest {public static void main(String[] args) throws Exception {CompletableFuture<String> future CompletableFuture.sup…...
【区块链 | IPFS】IPFS节点搭建、文件上传、节点存储空间设置、节点上传文件chunk设置
一、创建ipfs节点 通过ipfs init在本地计算机建立一个IPFS节点 本文有些命令已经执行过了,就没有重新初始化。部分图片拷贝自先前文档,具体信息应以实物为准 ipfs init initializing IPFS node at /Users/CHY/.ipfs generating 2048-bit RSA keypair.…...
【autodesk】浏览器中渲染rvt模型
使用Forge完成渲染 Forge是什么 为什么能够渲染出来rvt模型 Forge是由Autodesk开发的一套云端开发平台和工具集。在Forge平台中,有一个名为"Model Derivative"的服务,它可以将包括RVT(Revit)在内的多种BIM(…...
Python超入门(1)__迅速上手操作掌握Python
# 1.第一个代码:输出语句 # 1.第一个代码:输出语句 print("My dogs name is Huppy!") print(o----) print( ||| ) print("*" * 10) """ 输出结果: My dogs name is Huppy! o----||| ********** "&…...
后端面试话术集锦第 十四 篇:go语言面试话术
这是后端面试集锦第十四篇博文——go语言面试话术❗❗❗ 1. go数组、切片、扩容 go的数组和切片都是用来存储相同类型的数据集合。 数组是存储固定大小的集合,且为值引用。 但切片是存储无固定大小的集合,且为引用类型。 切片有三个属性,分别为指向指针的数组array,数组…...
Oralce集群管理-19C RAC 私有网络调整为BOND1
1 尝试在线添加私有网络的新接口 是否成功。 使用oifcfg命令在线添加新的网卡接口,在还没有配置bond1的条件下 也是可以添加成功的。 [gridorcldb1 ~]$ oifcfg getif eno3 192.168.224.0 global public ens3f0 10.2.0.0 global cluster_interconnect,asm eno…...
洛谷 Array 数论
题目: 对于长度为n的数组A,A中只包含从1到n的整数(可重复)。如果A单调不上升或单调不下降,A就可称为美丽的。 找出在长度为n时,有几个美丽的A。 思路: 这是一道数论题。 我们先找找“单调不递…...
简明SQL条件查询指南:掌握WHERE实现数据筛选
条件查询是用于从数据库中根据特定条件筛选数据行的一种方式,它避免了检索整个表中的数据。通常,使用 WHERE 子句来定义过滤条件,只有符合这些条件的数据行才会被返回。 SQL中的运算符有:、!、<、> 等,用于进行…...
通过HbaseClient来写Phoenix表实现
由于数据存储在Hbase上,并且上层使用了Phoenix来读写数据。并且由于数据的列字段不固定,并且可能由于Hbase表列和Phoenix的表列字段不一致,使用Phoenix写入的数据会导致写出报错的问题出现。所以这里直接使用HbaseClient写入到Hbase表中&…...
uniapp qiun charts H5使用echarts的eopts配置不生效
原因是:使用web的要设置 echartsH5 :echartsH5"true" <template><view class"charts-box"><view class"chart-title"> 趋势</view><qiun-data-chartstype"column":eopts"eopts":cha…...
嵌入式Linux驱动开发(LCD屏幕专题)(三)
1. 硬件相关的操作 LCD驱动程序的核心就是: 分配fb_info设置fb_info注册fb_info硬件相关的设置 硬件相关的设置又可以分为3部分: 引脚设置时钟设置LCD控制器设置 2. 在设备树里指定LCD参数 framebuffer-mylcd {compatible "100ask,lcd_drv&qu…...
MySQL视图用户管理
文章目录 视图视图的规则用户用户信息创建用户删除用户修改密码 用户权限给用户授权回收权限 视图 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...
解析“道作为序位生成器”的核心原理
解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...
向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...
边缘计算网关提升水产养殖尾水处理的远程运维效率
一、项目背景 随着水产养殖行业的快速发展,养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下,而且难以实现精准监控和管理。为了提升尾水处理的效果和效率,同时降低人力成本,某大型水产养殖企业决定…...
高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。
2024 年,高端封装市场规模为 80 亿美元,预计到 2030 年将超过 280 亿美元,2024-2030 年复合年增长率为 23%。 细分到各个终端市场,最大的高端性能封装市场是“电信和基础设施”,2024 年该市场创造了超过 67% 的收入。…...
