Tina_Linux_系统裁剪_开发指南
文章目录
- Tina_Linux_系统裁剪_开发指南
- 1 概述
- 2 Tina系统裁剪简介
- 2.1 boot0裁剪
- 2.2 uboot裁剪
- 2.3 内核裁剪
- 2.3.1 删除不使用的功能
- 2.3.2 删除不使用的驱动
- 2.3.3 修改内核源代码
- 2.3.3.1 size工具.
- 2.3.3.2 ksize.py脚本
- 2.3.3.3 nm命令
- 2.3.3.4 kernel压缩方式.
- 2.4 文件系统裁剪.
- 2.4.1 应用程序及冗余文件裁剪
- 2.4.2 库的裁剪
- 2.4.2.1 C库的选择.
- 2.4.2.2 删除没用到的库
- 2.4.3 应用程序与库strip
- 2.4.4 文件系统压缩.
- 3 参考资料
Tina_Linux_系统裁剪_开发指南
1 概述
编写目的:
嵌入式产品往往为了压缩成本而使用较小的flash存储器,因此可能需要对系统进行裁剪来减少对flash的占用。系统经过裁剪过后,通常也会提升启动速度以及减少内存占用。
本文介绍TinaLinux中系统裁剪的方法,为有裁剪需求的使用者提供参考。
2 Tina系统裁剪简介
Tina固件中通常包含boot0、uboot、kernel、rootfs等镜像。基于经验,各个镜像尺寸的量级如下表所示:
表2-1:各镜像尺寸的量级
| 镜像 | 大小 |
|---|---|
| boot0 | < 100K |
| uboot | < 1M |
| kernel | >= 3M,< 15M |
| rootfs | >= 4M |
可以看到boot0、uboot、kernel、rootfs的尺寸是依次增大的。对于大尺寸的裁剪效果往往比小尺寸的裁剪效果明显,比如rootfs裁剪1M可能很容易,对于uboot来说,则非常困难。
因此,后续主要介绍kernel以及rootfs的裁剪。
2.1 boot0裁剪
由于boot0很小,通常来说boot0代码也不开源,因此略过。
2.2 uboot裁剪
目前tina环境中有不同版本的uboot,分别存在两个不同的文件路径中,以实际sdk的目录为准,cboot可以进入到相应的uoot目录,这两个路径分别为lichee/brandy/u-boot或者lichee/brandy-2.0/u-boot
主要有下面两种裁剪思路:
- 修改uboot配置文件,删减不需要的配置。uboot配置文件通常位于源码下include/configs/CHIP.h或者configs/{CHIP}.h或者configs/CHIP.h或者configs/{CHIP}_*_defconfig。
- 删除不需要的uboot命令。
2.3 内核裁剪
通常关于Linux内核裁剪主要有如下方法:
- 删除不使用的功能。如符号表、打印、调试等功能。
- 删除不使用的驱动。
- 修改内核源代码。
- 内核压缩。
2.3.1 删除不使用的功能
下表中列出了一些内核选项,包含选项的描述,默认值以及推荐值(减小内核镜像尺寸)。
表2-2:内核选项及描述
| CONFIG option | Description | Def | Small |
|---|---|---|---|
| CORE_SMALL | tune some kernel data sizes | N | Y |
| NET_SMALL | tune some net-related data sizes | N | Y |
| KMALLOC_ACCOUNTING | turn on kmalloc accounting | N | Y * |
| AUDIT_BOOTMEM | print out all bootmem allocations | N | Y * |
| DEPRECATE_INLINES | cause compiler to emit info about inlines | N | Y * |
| PRINTK | printk code and message data | Y | N |
| BUG | allow elimination of BUG code | Y | N |
| ELF_CORE | allow disabling of ELF core dumps | Y | N |
| PROC_KCORE | allow disabling of /proc/kcore | Y | N |
| AIO allow | disabling of async IO syscalls | Y | N |
| XATTR allow | disabling of xattr syscalls | Y | N |
| FILE_LOCKING | allow disabling of file locking syscalls | Y | N |
| DIRECTIO | allow disabling of direct IO support | Y | N |
| MAX_SWAPFILES_SHIFT | number of swapfiles | 5 | 0 |
| NR_LDISCS | number of tty line disciplines | 16 | 2 |
| MAX_USER_RT_PRIO | number of RT priority levels | 100 | 5 |
| KALLSYMS | load all symbols for debugging/kksymoops | Y | N |
| SHMEM | allow disabling of shmem filesystem | Y | N + |
| SWAP | support for a swap segment | Y | N |
| SYSV_IPC | support for System V IPC | Y | N + |
| POSIX_MQUEUE | POSIX message queue support | Y | N + |
| SYSCTL | allow disabling of sysctl support | Y | N + |
| LOG_BUF_SHIFT | control size of kernel printk buffer | 14 | 11 |
| CC_OPTIMIZE_FOR_SIZE | Use gcc -os to optimize for size | Y | Y |
| MODULES | allow support for kernel loadable modules | Y | N + |
| KMOD | automatic kernel module loading | Y | N |
| PCI | allow support for PCI bus and devices | Y | Y - |
| XIP_KERNEL | allow support for kernel Execute-in-Place | N | N |
| BLK_DEV_LOOP | support for loopback block device | Y | Y - |
| BLK_DEV_RAM | block devices for RAM filesystems | Y | Y - |
| IOSCHED_AS | Include Anticipatory IO scheduler | Y | Y |
| IOSCHED_DEADLINE | Include Deadline IO scheduler | Y | N + |
| IOSCHED_CFQ | Include CFQ IO scheduler | Y | N + |
| IP_PNP | support for IP autoconfiguration | Y | N + |
| IP_PNP_DHCP | support for IP autoconfiguration via DHCP | Y | N + |
| IDE | support for IDE devices | Y | N + |
| SCSI | support for SCSI devices | Y | N + |
其中:
- “Y *”-表示开发的时候设置成Y,发布的时候可以设置成N。
- “N +”-表示基于应用需要来判断是否设置成N。
- “Y -”-表示可能需要,可以设置N尝试一下。
在Tina中,集成了CONFIG_REDUCE_KERNEL_SIZE宏。一旦使能该宏后,将会采用部分上面的裁剪措施来减小kernel镜像尺寸,主要思路是关闭与log/debug等相关的配置,然后对kernel进行xz压缩,可参考tina/scripts/reduce-kernel-size.sh。
执行make menuconfig,开启如下选项:
Tina Configuration
Target Images —>
[*] downsize the kernel size (EXPERIMENTAL)
说明:此功能当前是 EXPERIMENTAL 的。建议直接执行 make kernel_menuconfig ,然后按照上述表格来配置。
2.3.2 删除不使用的驱动
方案明确之后,所需的内核驱动也明确了。可以执行make kernel_menuconfig,将没有用到的驱动关闭。
2.3.3 修改内核源代码
内核源码庞大,直接修改往往难度很大,可借助相关工具来评估模块以及符号的大小,然后进行针对性的裁剪。
2.3.3.1 size工具.
size命令可查看内核镜像的text、data、bss等段的大小。如执行"size vmlinux",将会得到:
text data bss dec hex filename
5818117 1378944 168972 7366033 706591 vmlinux
2.3.3.2 ksize.py脚本
在tina/lichee/linux-4.9/scripts目录下有一个ksize脚本,可以对内核目录下的built-in.o进行解析,并将解析的内容按照尺寸进行排序,显示出来。执行结果如下所示:
Linux Kernel total | text data bss
--------------------------------------------------------------------------------
vmlinux 7366033 | 5818117 1378944 168972
--------------------------------------------------------------------------------
drivers/built-in.o 2244823 | 2080782 123885 40156
net/built-in.o 1682005 | 1630911 32590 18504
fs/built-in.o 975830 | 950780 5442 19608
kernel/built-in.o 678363 | 593347 41064 43952
mm/built-in.o 302442 | 272965 7309 22168
sound/built-in.o 237890 | 227338 6836 3716
security/built-in.o 170272 | 145055 13989 11228
block/built-in.o 149110 | 145408 2458 1244
crypto/built-in.o 145972 | 131610 7258 7104
lib/built-in.o 141721 | 141093 559 69
init/built-in.o 33551 | 18558 14909 84
ipc/built-in.o 29998 | 29218 772 8
usr/built-in.o 138 | 138 0 0
--------------------------------------------------------------------------------
sum 6792115 | 6367203 257071 167841
delta 573918 | -549086 1121873 1131
drivers total | text data bss
--------------------------------------------------------------------------------
drivers/built-in.o 2244823 | 2080782 123885 40156
--------------------------------------------------------------------------------
drivers/usb/built-in.o 448756 | 409279 27813 11664
drivers/block/built-in.o 357202 | 324752 21582 10868
drivers/tty/built-in.o 174213 | 155371 13938 4904
drivers/base/built-in.o 157961 | 153861 3460 640
drivers/mmc/built-in.o 133678 | 131782 1756 140
drivers/scsi/built-in.o 105021 | 95105 9348 568
drivers/md/built-in.o 100909 | 98382 1291 1236
drivers/mtd/built-in.o 96023 | 92244 1467 2312
drivers/hid/built-in.o 86072 | 81552 4160 360
drivers/clk/built-in.o 69737 | 58289 10856 592
drivers/cpufreq/built-in.o 51525 | 44400 1793 5332
drivers/pinctrl/built-in.o 50463 | 46458 3921 84
drivers/input/built-in.o 45250 | 44046 1156 48
drivers/i2c/built-in.o 43511 | 42791 656 64
drivers/spi/built-in.o 39888 | 38323 1557 8
drivers/thermal/built-in.o 38654 | 36673 1893 88
drivers/regulator/built-in.o 36217 | 35257 820 140
drivers/of/built-in.o 35994 | 35095 407 492
drivers/gpio/built-in.o 29432 | 29167 224 41
drivers/leds/built-in.o 25548 | 25076 464 8
drivers/rtc/built-in.o 25072 | 24428 460 184
drivers/tee/built-in.o 24823 | 24662 113 48
drivers/char/built-in.o 23718 | 21642 1224 852
drivers/soc/built-in.o 20916 | 13980 6804 132
drivers/bluetooth/built-in.o 20223 | 19319 100 804
drivers/dma/built-in.o 17892 | 17458 334 100
drivers/irqchip/built-in.o 14767 | 12371 2308 88
drivers/pwm/built-in.o 14636 | 14036 472 128
drivers/dma-buf/built-in.o 13975 | 13904 23 48
drivers/cpuidle/built-in.o 12613 | 10848 1749 16
drivers/watchdog/built-in.o 9986 | 9660 281 45
drivers/power/built-in.o 9836 | 8296 1224 316
drivers/clocksource/built-in.o 9608 | 8708 796 104
drivers/misc/built-in.o 8471 | 8105 340 26
drivers/bus/built-in.o 6357 | 5691 618 48
drivers/hwmon/built-in.o 5230 | 5054 144 32
drivers/hwspinlock/built-in.o 4792 | 4664 128 0
drivers/firmware/built-in.o 4453 | 4384 9 60
drivers/reset/built-in.o 3818 | 3686 132 0
drivers/net/built-in.o 1803 | 1755 48 0
drivers/mfd/built-in.o 1623 | 1511 108 4
drivers/video/built-in.o 379 | 379 0 0
--------------------------------------------------------------------------------
sum 2381045 | 2212444 125977 42624
delta -136222 | -131662 -2092 -2468
net total | text data bss
--------------------------------------------------------------------------------
net/built-in.o 1682005 | 1630911 32590 18504
--------------------------------------------------------------------------------
net/ipv4/built-in.o 428233 | 401161 14719 12353
net/mac80211/built-in.o 302085 | 301822 259 4
net/core/built-in.o 267334 | 256693 8573 2068
net/bluetooth/built-in.o 227913 | 226708 1033 172
net/wireless/built-in.o 160236 | 158651 557 1028
net/xfrm/built-in.o 74537 | 72737 1384 416
net/bridge/built-in.o 59936 | 58812 1112 12
net/sched/built-in.o 29706 | 28344 1346 16
net/packet/built-in.o 26453 | 26172 281 0
net/netlink/built-in.o 26105 | 25498 455 152
net/unix/built-in.o 24671 | 22266 340 2065
net/key/built-in.o 21095 | 20783 308 4
net/*.o 16279 | 15811 412 56
net/8021q/built-in.o 15245 | 14981 264 0
net/ipv6/built-in.o 9445 | 8295 1136 14
net/rfkill/built-in.o 7142 | 6710 408 24
net/ethernet/built-in.o 2431 | 2391 40 0
net/llc/built-in.o 2068 | 1980 72 16
net/802/built-in.o 1944 | 1792 140 12
--------------------------------------------------------------------------------
sum 1702858 | 1651607 32839 18412
delta -20853 | -20696 -249 92
fs total | text data bss
--------------------------------------------------------------------------------
fs/built-in.o 975830 | 950780 5442 19608
--------------------------------------------------------------------------------
fs/*.o 351665 | 339511 1774 10380
fs/ext4/built-in.o 295807 | 294110 1125 572
fs/jffs2/built-in.o 99642 | 99446 124 72
fs/proc/built-in.o 77696 | 73111 377 4208
fs/fat/built-in.o 49264 | 49088 144 32
fs/jbd2/built-in.o 47379 | 47254 65 60
fs/overlayfs/built-in.o 24939 | 24842 93 4
fs/squashfs/built-in.o 23156 | 23092 60 4
fs/kernfs/built-in.o 21086 | 16863 111 4112
fs/configfs/built-in.o 18193 | 17916 261 16
fs/debugfs/built-in.o 16120 | 16056 52 12
fs/pstore/built-in.o 13904 | 13531 325 48
fs/crypto/built-in.o 13083 | 12799 264 20
fs/notify/built-in.o 12525 | 12186 227 112
fs/nls/built-in.o 11024 | 10904 116 4
fs/sysfs/built-in.o 7041 | 6990 39 12
fs/devpts/built-in.o 3359 | 2986 365 8
fs/ramfs/built-in.o 1820 | 1776 40 4
--------------------------------------------------------------------------------
sum 1087703 | 1062461 5562 19680
delta -111873 | -111681 -120 -72
kernel total | text data bss
--------------------------------------------------------------------------------
kernel/built-in.o 678363 | 593347 41064 43952
--------------------------------------------------------------------------------
kernel/*.o 376931 | 346029 17531 13371
kernel/sched/built-in.o 127386 | 119841 6265 1280
kernel/time/built-in.o 101386 | 89633 7465 4288
kernel/printk/built-in.o 55033 | 18477 8444 28112
kernel/irq/built-in.o 47323 | 44325 906 2092
kernel/rcu/built-in.o 29815 | 27655 2131 29
kernel/locking/built-in.o 25617 | 25592 21 4
kernel/power/built-in.o 16652 | 15256 848 548
kernel/bpf/built-in.o 8348 | 7988 68 292
--------------------------------------------------------------------------------
sum 788491 | 694796 43679 50016
delta -110128 | -101449 -2615 -6064
sound total | text data bss
--------------------------------------------------------------------------------
sound/built-in.o 237890 | 227338 6836 3716
--------------------------------------------------------------------------------
sound/soc/built-in.o 125556 | 119220 5416 920
sound/core/built-in.o 108923 | 104799 1400 2724
sound/*.o 6612 | 6440 28 144
--------------------------------------------------------------------------------
sum 241091 | 230459 6844 3788delta -3201 | -3121 -8 -72
security total | text data bss
--------------------------------------------------------------------------------
security/built-in.o 170272 | 145055 13989 11228
--------------------------------------------------------------------------------
security/selinux/built-in.o 142606 | 119156 12250 11200
security/keys/built-in.o 31690 | 30618 788 284
security/*.o 25826 | 24091 1719 16
security/integrity/built-in.o 1838 | 1806 20 12
--------------------------------------------------------------------------------
sum 201960 | 175671 14777 11512
delta -31688 | -30616 -788 -284
block total | text data bss
--------------------------------------------------------------------------------
block/built-in.o 149110 | 145408 2458 1244
--------------------------------------------------------------------------------
block/*.o 145968 | 142021 2699 1248
block/partitions/built-in.o 7563 | 7543 16 4
--------------------------------------------------------------------------------
sum 153531 | 149564 2715 1252
delta -4421 | -4156 -257 -8
lib total | text data bss
--------------------------------------------------------------------------------
lib/built-in.o 141721 | 141093 559 69
--------------------------------------------------------------------------------
lib/*.o 216133 | 214935 1092 106
lib/zlib_inflate/built-in.o 11187 | 11187 0 0
lib/xz/built-in.o 8215 | 8179 36 0
lib/lzo/built-in.o 2551 | 2551 0 0
lib/lz4/built-in.o 1188 | 1188 0 0
--------------------------------------------------------------------------------
sum 239274 | 238040 1128 106
delta -97553 | -96947 -569 -37
可以对各个模块的代码段数据段的统计信息进行确认,对占用空间大的进行针对性优化。
2.3.3.3 nm命令
nm命令可查看内核模块中各个符号的尺寸。如执行"nm --size -r vmlinux | head -10",可得到:
00004000 b __log_buf
00003e58 D nand_tbl
00003b14 T __blockdev_direct_IO
0000398c T hidinput_connect
00002f6c t ext4_fill_super
000027fc T hci_event_packet
0000245c t l2cap_recv_frame
000023d4 T dev_ethtool
00002274 t test_atomics
000020e4 t nl80211_send_wiphy
说明,一共有三列数据,分别表示大小、符号类型、符号名。其中符号类型:
- b/B -符号位于bss段。
- t/T -符号位于text段。
- d/D -符号位于data段。
如果某些函数或者全局变量占用较大,可以进行针对性的优化。
2.3.3.4 kernel压缩方式.
tina环境提供了几种压缩格式方式,选择方式为make kernel_menuconfig:
General setup --->Kernel compression mode (Gzip) --->(X) Gzip( ) LZMA( ) XZ( ) LZO( ) LZ
同一个kernel镜像使用不同的压缩方式,镜像大小如下表所示:
| 压缩方式 | 镜像大小 | 加载内核时间(从falsh加载到dram的时间) | 解压时间 | 总时间 |
|---|---|---|---|---|
| GZIP | 2.31M | 124ms | 89ms | 213ms |
| LZO | 2.53M | 136ms | 23ms | 159ms |
| LZ4 | 2.68M | 143ms | 27ms | 170ms |
| XZ | 1.95M | 104ms | 667ms | 771ms |
2.4 文件系统裁剪.
对于文件系统裁剪来说,主要思路是删、换、压。
- 删。删除不需要的内容。如帮助文档、没用到的库、调试程序等。
- 换。使用小尺寸的实现替换大尺寸的实现。如使用musl libc库替换glibc库等。
- 压。使用合适的压缩算法。
2.4.1 应用程序及冗余文件裁剪
在不影响整体功能的情况下,一些应用程序或冗余文件往往可以删除:
- 调试工具。比如tcpdump、mpstat、strace等等。
- 性能测试工具。比如lmbench、sysstat、tiobench等等。
- 冗余文件。帮助文档、辅助程序、配置文件和数据模块等,又比如很多应用有相同的共能,只留其一。
- 采用具有通用功能的替代软件包。Linux上有许多具有相似功能的软件包,可以选择其中占存储空间较小的软件包并移植到嵌入式设备上。
- 资源文件。一些音视频以及UI资源往往占用很大空间,如果没有用到,也需要删除。
2.4.2 库的裁剪
关于库的裁剪主要有两个思路:
- 使用较小的C库,如musl libc,uclibc等来替换glibc。
- 删除没有用到的库。
2.4.2.1 C库的选择.
下表列出了当前一些通用的C库及其特征。
表2-4:常用C库及其特征
| C库 | 环境 | 大小 | 优点 | 缺点 |
|---|---|---|---|---|
| glibc | Distribution | 大 | 强大稳定,支持最多的cpu架构 | 占用空间大 |
| uclibc | Embedded | 小 | 为嵌入式设计,可配置性好 | 不支持libdb与libnss |
| bionic | Android | 小 | 提供了Android特性的函数 | 不提供libthread_db/libm |
| musl | Embedded | 小 | 更小,高效静态链接,稳定 | 支持较少的cpu arch |
当前Tina环境下可支持glibc与musl libc两种C库。具体可通过menuconfig的方式来配置
使用哪一套。
[*] Advanced configuration options (for developers) --->Select external toolchain C library (Use glibc) --->
注意,更换C库后,需要清除方案编译产物(可执行make distclean),重新编译。
2.4.2.2 删除没用到的库
嵌入式产品通常应用程序有限,因此可能存在很多库不会被用到,可以进行删除。
当前Tina环境提供了一种删除方法,执行make menuconfig,打开如下选项:
Tina ConfigurationTarget Images --->[*] downsize the root filesystem or initramfs
打开之后,在生成rootfs/initramfs之前会对其中没有用到的库进行删除。
具体可参考scripts/reduce-rootfs-size.sh文件,其主要思路是:
- 分析rootfs下的应用程序所依赖的库。
- 分析“应用程序依赖库”所依赖的库,一直递归下去,直到完全找出所有依赖的库。
- 根据上述查找结果,删除没有被依赖的库。
说明:此方法有一定的限制:
- 当前只分析 /lib , /usr/lib 下的库,其他目录不会处理。
- 对于部分使用 dlopen 的应用程序,解析库可能会出现问题。
2.4.3 应用程序与库strip
strip会去掉应用程序与库的符号信息和调试信息,大大减少空间占用。
当前Tina环境下默认开启了strip功能,如果没开启,请确保开启以减少空间占用。
Tina ConfigurationGlobal build settings --->Binary stripping method (strip) --->
说明:Tina 上还支持 sstrip ,即 super strip ,相对于 strip 来说,更能减少应用与库的大小。
2.4.4 文件系统压缩.
有些文件系统支持压缩,有些不支持。下表列出了常见的文件系统类型:
表2-5:常用文件系统类型
| FS | 使用 | 压缩 | 读写 | 备 注 |
|---|---|---|---|---|
| ext2 | block device | 无 | RW | 突然断电或当机时可能导致数据丢失 |
| ext3 | block device | 无 | RW | 向前兼容ext3,日志式文件系统,非常成熟稳定 |
| ext4 | block device | 无 | RW | 向前兼容ext2和ext3,扩展存储限制,提升性能 |
| btrfs | block device | 有 | RW | 着重于容错、修复及易管理 |
| FAT | block device | 无 | RW | Windows,长期使用速度变慢,不支持>4G文件 |
| NTFS | block device | 有 | RW | Windows,基于FAT做若干改进,日志文件系统 |
| Cramfs | NAND Flash | 无 | RO | 2013停用,使用Squashfs |
| Squashfs | Raw Flash | 有 | RO | 压缩度更高,没有大小限制 |
| UBIFS | Raw Flash | 有 | RW | 基于JFFS2,Linux3.7之后 |
| JFFS2 | Raw Flash | 有 | RW | mount时间很慢,读写性能不好 |
| YAFFS2 | NAND Flash | 无 | RW | 没有透明压缩,不在Linux主线 |
当前Tina环境下比较常用的是squahfs、ext4、jfss2三种文件系统。具体可执行makemenu-
config进行选择:
Tina ConfigurationTarget Images --->*** Root filesystem images ***[ ] ext4 ----[ ] jffs[*] squashfs --->
常见的压缩有lzop,gzip,xz等,压缩率最高的是xz。但是xz压缩解压最慢,非常影响启动速度。实际在选择压缩方式时应综合考虑。
3 参考资料
- [1] https://elinux.org/Kernel_Size_Tuning_Guide
- [2] Karim Yaghmour. Building Embedded Linux Systems [M]
- [3] Michael Opdenacker. Embedded Linux size reduction techniques
- [4] https://tiny.wiki.kernel.org/
相关文章:
Tina_Linux_系统裁剪_开发指南
文章目录Tina_Linux_系统裁剪_开发指南1 概述2 Tina系统裁剪简介2.1 boot0裁剪2.2 uboot裁剪2.3 内核裁剪2.3.1 删除不使用的功能2.3.2 删除不使用的驱动2.3.3 修改内核源代码2.3.3.1 size工具.2.3.3.2 ksize.py脚本2.3.3.3 nm命令2.3.3.4 kernel压缩方式.2.4 文件系统裁剪.2.4…...
算法刷题打卡第99天:至少在两个数组中出现的值
至少在两个数组中出现的值 难度:简单 给你三个整数数组 nums1、nums2 和 nums3 ,请你构造并返回一个 元素各不相同的 数组,且由 至少 在 两个 数组中出现的所有值组成。数组中的元素可以按 任意 顺序排列。 示例 1: 输入&…...
线程池面试题
1. 什么是线程池?为什么要使用线程池? 线程池是一种用于管理线程的技术,它可以在应用程序中重复使用一组线程来执行多个任务。线程池的优点包括提高应用程序的性能和可伸缩性、避免线程创建和销毁的开销、避免线程过多导致系统负担过重等。线…...
【学习笔记】NOIP爆零赛5
说实话是不想补题的。因为每一道题都贼难写,题解又通篇写着显然,然后自己天天搞竞赛又把注意力搞差了,调一道题又调半天,考试的题又难的要死 不会正解 ,部分分又写挂了 可能心态崩了就是从那场t1t1t1签到题考高精度数位…...
【数据结构】时间复杂度
🚀write in front🚀 📜所属专栏:初阶数据结构 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对…...
vector的基本使用
目录 介绍: vector iterator 的使用 增删查改 增(push_back insert): 删(pop_back erase): swap: vector的容量和扩容: 排序(sort): 介绍ÿ…...
剑指 Offer 55 - I. 二叉树的深度
摘要 剑指 Offer 55 - I. 二叉树的深度 一、深度优先搜索 如果我们知道了左子树和右子树的最大深度l和r,那么该二叉树的最大深度即为:max(l,r)1。 而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计…...
Bean的生命周期和作用域
Bean的生命周期Bean的执行流程:Bean 执行流程:启动Spring 容器 -> 实例化 Bean(分配内存空间,从无到有)-> Bean 注册到 Spring 中(存操作) -> 将 Bean 装配到需要的类中(取…...
TestNG和Junit的区别,测试框架该如何选择?
要想知道两个框架的区别,首先分别介绍一下两个框架。 TestNG是一个java中的开源自动化测试框架,其灵感来自JUnit和NUnit,TestNG还涵盖了JUnit4整个核心的功能,但引入了一些新的功能,使其功能更强大,使用更…...
MySQL安全登录策略
MySQL密码复杂度策略设置 MySQL 系统自带有 validate_password 插件,此插件可以验证密码强度,未达到规定强度的密码则不允许被设置。MySQL 5.7 及 8.0 版本默认情况下貌似都不启用该插件,这也使得我们可以随意设置密码,比如设置为…...
优化模型验证23:带无人机停靠站的卡车无人机协同配送车辆路径问题、模型、gurobipy验证及结果可视化
带中转hub的卡车无人机车辆路径问题 模型来源为:Wang Z , Sheu J B . Vehicle routing problem with drones[J]. Transportation Research Part B: Methodological, 2019, 122(APR.):350-364. 问题描述: 这篇问题研究了一个带停靠站的卡车无人机路径问题,无人机仅能从起点…...
mongoTemplate Aggregation 多表联查 排序失效问题解决
目录说明说明 接着上一个文章的例子来说:mongoTemplate支持多表联查 排序 条件筛选 分页 去重分组 在按照上一个demo的代码执行后,可能会发生排序失效的问题,为什么说可能呢?每个人负责业务不同,不可能是最简单的dem…...
什么是智慧实验室?
智慧实验室是利用现代信息技术和先进设备将实验室实现智能化和智慧化的概念。通过将各种数据、信息和资源整合在一起,实现实验室设备的互联互通,数据的实时采集、传输、处理和分析,从而提高实验室的效率、精度和可靠性。一、智慧实验室包含多…...
Python abs() 函数
Python abs() 函数Python 数字描述abs() 函数返回数字的绝对值。语法以下是 abs() 方法的语法:abs( x )参数x -- 数值表达式。返回值函数返回x(数字)的绝对值。实例以下展示了使用 abs() 方法的实例:#!/usr/bin/python print "abs(-45) …...
裸辞了,面试了几十家软件测试公司,终于找到想要的工作
上半年裁员,下半年裸辞,有不少人高呼裸辞后躺平真的好快乐!但也有很多人,裸辞后的生活五味杂陈。 面试了几十家终于找到心仪工作 因为工作压力大、领导PUA等各种原因,今年2月下旬我从一家互联网小厂裸辞,没…...
ShardingSphere
1.简介 1.开源的分布式数据生态项目 ShardingSphere-JDBC:轻量级Java框架ShardingSphere-Proxy:数据库代理ShardingSphere-Sidecar(规划中):Kubernetes的云原生数据库代理 2.使用版本:ShardingSphere5.1.1 1.数据库集群架构 1.出现…...
配置Maven
对于刚开始认识的Maven的初学者超级有用的哦!项目统一共享使用一套jar包,由maven统一管理。节省了jar空间,统一jar包版本首先将maven安装完毕测试有没有配置完成,在命令框里面打 mvn -version进行测试maven安装完,第一…...
赛宁网安“网络安全卓越中心”:立足科技创新 推动网安产业高质量发展
2月22日上午,网络安全卓越中心CPCOE——圆桌论坛活动在南京召开。本次论坛由南京未来科技城主办,南京赛宁信息技术有限公司承办。论坛上,江苏省科协副主席、南京理工大学教授李千目,江苏省互联网协会副理事长兼秘书长刘湘生&a…...
操作系统题目收录(十四)
1、 有些操作系统中将文件描述信息从目录项中分离出来,这样做的好处是()。 A:减少读文件时的I/O信息量B:减少写文件时的I/O信息量C:减少查找文件时的I/O信息量D:减少复制文件时的I/O信息量 解…...
Qt 第1课、Qt 的窗口组件和窗口类型
GUI 程序的开发原理: GUI 程序在运行的时候,操作系统会为它创造一个消息队列,消息队列用于存储操作系统发过来的系统消息。 用户使用操作系统的过程中,操作系统内核检测到用户的操作(鼠标,键盘)…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...
