Ramfs, rootfs 和 initramfs
什么是ramfs
Ramfs 是一个非常简单的文件系统,它将 Linux 的磁盘缓存机制(页面缓存和 dentry 缓存)导出为可动态调整大小的基于 RAM 的文件系统。
通常,Linux 会将所有文件缓存在内存中。从后备存储(通常是文件系统所安装的块设备)读取的数据页面会保留以备再次需要,但会标记为干净(可释放),以防虚拟内存系统需要内存用于其他用途。同样,写入文件的数据在写入后备存储后会立即标记为干净,但会保留以备缓存,直到 VM 重新分配内存。类似的机制(dentry 缓存)大大加快了对目录的访问速度。
使用 ramfs 时,没有后备存储。写入 ramfs 的文件会像往常一样分配 dentry 和页面缓存,但没有地方写入它们。这意味着页面永远不会被标记为干净,因此当 VM 想要回收内存时,它们无法被释放。
实现 ramfs 所需的代码量很小,因为所有工作都由现有的 Linux 缓存基础结构完成。基本上,您将磁盘缓存作为文件系统安装。因此,ramfs 不是可通过 menuconfig 移除的可选组件,因为这样节省的空间可以忽略不计。
ramfs和ramdisk
较旧的“ram disk”机制从 RAM 的某个区域创建一个合成块设备,并将其用作文件系统的后备存储。此块设备的大小是固定的,因此安装在其上的文件系统的大小也是固定的。使用 ram disk 还需要不必要地将内存从伪块设备复制到页面缓存中(并将更改复制回来),以及创建和销毁 dentry。此外,它还需要文件系统驱动程序(例如 ext2)来格式化和解释这些数据。
与 ramfs 相比,这会浪费内存(和内存总线带宽)、给 CPU 带来不必要的工作,并污染 CPU 缓存。(有一些技巧可以通过使用页表来避免这种复制,但它们非常复杂,而且成本与复制差不多。)更重要的是,ramfs 所做的所有工作无论如何都必须发生,因为所有文件访问都要经过页面和 dentry 缓存。RAM 磁盘根本就没有必要;ramfs 内部要简单得多。
ramdisk 半过时的另一个原因是,引入了回送设备,提供了一种更灵活、更方便的方法来创建合成块设备,现在可以通过文件而不是内存块来创建。
ramfs和tmpfs
ramfs 的一个缺点是,您可以不断向其中写入数据,直到填满所有内存,而 VM 无法释放它,因为 VM 认为文件应该写入后备存储(而不是交换空间),但 ramfs 没有任何后备存储。因此,只有 root(或受信任的用户)才应被允许对 ramfs 挂载进行写访问。
ramfs 的衍生产品 tmpfs 是为了增加大小限制和将数据写入交换空间的能力而创建的。普通用户可以对 tmpfs 挂载进行写访问 。
什么是rootfs
Rootfs 是 ramfs(或 tmpfs,如果启用的话)的一个特殊实例,它始终存在于 2.6 系统中。您无法卸载 rootfs 的原因与您无法终止 init 进程的原因大致相同;与使用特殊代码检查和处理空列表相比,内核只需确保某些列表不会变为空,这样更小更简单。
大多数系统只是在 rootfs 上安装另一个文件系统并忽略它。ramfs 的空实例占用的空间很小。
如果启用了 CONFIG_TMPFS,rootfs 将默认使用 tmpfs 而不是 ramfs。要强制使用 ramfs,请在内核命令行中添加“rootfstype=ramfs”。
什么是initramfs
所有 2.6 Linux 内核都包含一个 gzip 压缩的“cpio”格式档案,内核启动时会将其解压到 rootfs 中。解压后,内核会检查 rootfs 是否包含文件“init”,如果是,则以 PID 1 执行该文件。如果找到,则此 init 进程负责启动系统,包括定位和安装实际根设备(如果有)。如果将嵌入式 cpio 档案解压到 rootfs 中后,rootfs 中不包含 init 程序,则内核将转到较旧的代码来定位和安装根分区,然后从中执行 /sbin/init 的某个变体。
这与旧的 initrd 有以下几个不同之处:
-
旧的 initrd 始终是一个单独的文件,而 initramfs 档案链接到 linux 内核映像中。(该目录linux-*/usr专门用于在构建期间生成此档案。)
-
旧的 initrd 文件是一个经过 gzip 压缩的文件系统映像(采用某些文件格式,例如 ext2,需要内置驱动程序到内核中),而新的 initramfs 存档是一个经过 gzip 压缩的 cpio 存档(类似于 tar,但更简单,请参阅 cpio(1) 和initramfs 缓冲区格式)。内核的 cpio 提取代码不仅非常小,而且它还是可以在启动过程中丢弃的 __init 文本和数据。
-
旧 initrd(称为 /initrd,而不是 /init)运行的程序进行了一些设置,然后返回到内核,而 initramfs 中的 init 程序预计不会返回到内核。(如果 /init 需要移交控制权,它可以使用新的根设备覆盖 / 并执行另一个 init 程序。请参阅下面的 switch_root 实用程序。)
-
当切换另一个根设备时,initrd 会先pivot_root,然后卸载ramdisk。但是 initramfs 是rootfs:您既不能pivot_root rootfs,也不能卸载它。相反,删除rootfs中的所有内容以释放空间(find -xdev / -exec rm ‘{}’ ‘;’),用新的根覆盖rootfs(cd /newmount; mount --move . /; chroot .),将stdin/stdout/stderr附加到新的/dev/console,然后执行新的init。
由于这是一个非常棘手的过程(并且需要在运行命令之前删除它们),klibc 包引入了一个辅助程序(utils/run_init.c)来为您完成所有这些工作。大多数其他包(例如 busybox)将此命令命名为“switch_root”。
填充initramfs
2.6 内核构建过程始终会创建一个 gzip 压缩的 cpio 格式的 initramfs 存档并将其链接到生成的内核二进制文件中。默认情况下,此存档为空(在 x86 上占用 134 个字节)。
配置选项 CONFIG_INITRAMFS_SOURCE(位于 menuconfig 中的常规设置中,位于 usr/Kconfig 中)可用于指定 initramfs 存档的源,该源将自动合并到生成的二进制文件中。此选项可以指向现有的 gzip 压缩的 cpio 存档、包含要存档的文件的目录或文本文件规范,例如以下示例:
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init initramfs/init.sh 755 0 0
运行“usr/gen_init_cpio”(内核构建之后)以获取记录上述文件格式的使用消息。
配置文件的一个优点是不需要 root 访问权限即可在新存档中设置权限或创建设备节点。(请注意,这两个示例“文件”条目希望在 linux-2.6.* 目录下的“initramfs”目录中找到名为“init.sh”和“busybox”的文件。 有关更多详细信息,请参阅早期用户空间支持。)
内核不依赖外部 cpio 工具。如果您指定目录而不是配置文件,内核的构建基础结构将从该目录创建一个配置文件(usr/Makefile 调用 usr/gen_initramfs.sh),然后继续使用该配置文件打包该目录(通过将其提供给 usr/gen_init_cpio,后者是从 usr/gen_init_cpio.c 创建的)。内核构建cpio 时创建代码完全是自包含的,内核的启动提取也是自包含的。
您可能需要安装外部 cpio 实用程序来创建或提取您自己预先准备好的 cpio 文件以提供给内核构建(而不是配置文件或目录)。
以下命令行可以将 cpio 映像(通过上述脚本或内核构建)提取回其组件文件中:
cpio -i -d -H newc -F initramfs_data.cpio --no-absolute-filenames
下面的 shell 脚本可以创建一个预建的 cpio 档案,您可以用它代替上面的配置文件:
#!/bin/sh
if [ $# -ne 2 ]
then
echo "usage: mkinitramfs directory imagename.cpio.gz"
exit 1
fiif [ -d "$1" ]
then
echo "creating $2 from $1"
(cd "$1"; find . | cpio -o -H newc | gzip) > "$2"
else
echo "First argument must be a directory"
exit 1
fi
外部initramfs镜像
如果内核启用了 initrd 支持,也可以将外部 cpio.gz 存档传递到 2.6 内核中以代替 initrd。在这种情况下,内核将自动检测类型(initramfs,而不是 initrd)并在尝试运行 /init 之前将外部 cpio 存档提取到 rootfs 中。
这具有 initramfs(无 ramdisk 块设备)的内存效率优势,但具有 initrd 的单独打包优势(如果您有非 GPL 代码想要从 initramfs 运行,而又不将其与 GPL 许可的 Linux 内核二进制文件混淆,那么这非常好)。
它还可用于补充内核的内置 initramfs 映像。外部存档中的文件将覆盖内置 initramfs 存档中的任何冲突文件。一些分销商还喜欢使用特定于任务的 initramfs 映像自定义单个内核映像,而无需重新编译。
为什么选择cpio而不是tar
- cpio 是一个标准。它已有几十年历史(从 AT&T 时代开始),并且已在 Linux 上广泛使用(在 RPM 中,Red Hat 的设备驱动程序磁盘)。它不像 tar 那样流行,因为传统的 cpio 命令行工具需要 truly_hideous 命令行参数。但这并没有说明存档格式,还有其他替代工具。
- 内核选择的 cpio 存档格式比任何(实际上有几十种)不同的 tar 存档格式都更简单、更干净(因此更容易创建和解析)。完整的 initramfs 存档格式在 buffer-format.rst 中进行了说明,在 usr/gen_init_cpio.c 中创建,并在 init/initramfs.c 中提取。这三个文件加起来总共不到 26k 的人类可读文本。
- GNU 项目对 tar 的标准化与 Windows 对 zip 的标准化大致相同。Linux 不属于任何一个组织,并且可以自由地做出自己的技术决策。
- 由于这是内核内部格式,因此它很容易成为一种全新的格式。内核提供了自己的工具来创建和提取此格式。使用现有标准是可取的,但不是必需的。
未来方向
如今 (2.6.16),initramfs 始终被编译,但并非始终被使用。内核会回退到旧式引导代码,只有当 initramfs 不包含 /init 程序时才会使用。回退是旧式代码,用于确保平稳过渡并允许早期引导功能逐渐移至“早期用户空间”(即 initramfs)。
迁移到早期用户空间是必要的,因为查找和安装真正的根设备很复杂。根分区可以跨越多个设备(RAID 或单独的日志)。它们可以在网络上(需要 DHCP、设置特定的 MAC 地址、登录到服务器等)。它们可以存在于可移动媒体上,具有动态分配的主/次编号和持续的命名问题,需要完整的 udev 实现来解决。它们可以被压缩、加密、写时复制、环回安装、奇怪的分区等等。
这种复杂性(不可避免地包括策略)在用户空间中得到了正确的处理。klibc busybox/uClibc 都在开发简单的 initramfs 包,以便将其放入内核构建中。
klibc 软件包现已被纳入 Andrew Morton 的 2.6.17-mm 树。内核当前的早期启动代码(分区检测等)可能会被迁移到默认的 initramfs 中,由内核构建自动创建和使用。
相关文章:
Ramfs, rootfs 和 initramfs
什么是ramfs Ramfs 是一个非常简单的文件系统,它将 Linux 的磁盘缓存机制(页面缓存和 dentry 缓存)导出为可动态调整大小的基于 RAM 的文件系统。 通常,Linux 会将所有文件缓存在内存中。从后备存储(通常是文件系统所…...
Xdebug
1、开启xdebug扩展 2、修改一下php.ini文件 xdebug.remote_enable 1 xdebug.remote_autostart 13、vscode安装插件php debug 4、生成launch.json文件,好像啥都不用改 5、vscode没有配置php路径的,需要去配置: 6、发起请求 8、代码断…...
LinkedList类 (链表)
目录 一. LinkedList 基本介绍 二. LinkedList 中的法及其应用 1. 添加元素 (1) add() (2) addAll() (3) addFirst() (4) addLast() 2. 删除元素 (1) remove() (2) removeAll() (3) removeFirst() (4) removeLast() 3. 遍历元素 (1) for 循环遍历 (2) for - each …...
删除拼排序链表中的重复元素(最优解)
题目来源 82. 删除排序链表中的重复元素 II - 力扣(LeetCode) 题目描述 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head…...
arm架构 uos操作系统离线安装k8s
目录 操作系统信息 安装文件准备 主机准备 主机配置 配置hosts(所有节点) 关闭防火墙、selinux、swap、dnsmasq(所有节点) 系统参数设置(所有节点) 配置ipvs功能(所有节点) 安装docker(所有节点) 卸载老版本 安装docke…...
影视仓最新接口+内置本包方法的研究(2024.12.27)
近日喜欢上了研究影视的本地仓库内置,也做了一个分享到了群里。 内置本地仓库包的好处很明显,当前线路接口都是依赖网络上的代码站存放,如果维护者删除那就GG。 虽然有高手制作了很多本地包,但推送本地包到APP,难倒一片…...
Unity开发AR之Vuforia-MultiTarget笔记
前言 在增强现实(AR)技术蓬勃发展的今天,越来越多的开发者开始探索如何将AR应用于各种场景中。Vuforia作为一个领先的AR开发平台,为开发者提供了强大的工具和功能,使得创建AR体验变得更加简单和直观。本文将为您介绍Vuforia的基本概念、特点,以及如何配置和使用MultiTar…...
软体机器人研究报告:设计方法、材料与驱动、感知与控制
软体机器人因其出色的可变形性和高适应性受到了广泛关注,这些特性使其在医疗、救援、探测等复杂场景中展现出独特的优势和巨大的应用潜力。研究人员对软体机器人的设计方法、材料与驱动技术、感知与控制策略等方面进行深入研究,取得了一系列成果。 本文汇…...
XL系列433芯片、2.4G收发芯片 通讯对码说明
XL系列433芯片对码说明: 发射芯片 XL4456 通过数据脚接收高低电平然后经过调制将波形发出,而接收芯片 XL520 通过接收波形后进行解调,数据脚输出高低电平。至于具体的通信协议,需要用户自定义,一般而言,使…...
Redis的持久化机制
目录 RDB 触发机制 bgsave命令执行流程 RDB的文件处理 RDB的优缺点 AOF AOF工作流程 AOF缓冲区同步文件策略 AOF重写机制 AOF重写触发机制 AOF重写流程 在这里我们知道,redis存储的数据是存储在缓存中的,重启服务器数据就不存在了。要想持久化…...
LeetCode 83 :删除排链表中的重复元素
题目: 地址:https://leetcode.cn/problems/remove-duplicates-from-sorted-list/ 方法一: 方法二: package com.zy.leetcode.LeetCode_04;/*** Author: zy* Date: 2024-12-25-15:19* Description: 删除排链表中的里复元素* …...
复习打卡大数据篇——Hadoop MapReduce
目录 1. MapReduce基本介绍 2. MapReduce原理 1. MapReduce基本介绍 什么是MapReduce MapReduce是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在Hadoop集群上。 MapRed…...
无法验证服务器身份是什么意思?
当你尝试访问某个网站或连接到服务器时,系统突然弹出一个提示,告诉你“无法验证服务器身份”?这到底是什么意思?在如今这个网络安全日益重要的时代,了解这种提示的含义以及背后的原因是非常必要的。今天,我们就来了解一下“无法…...
用友-友数聚科技CPAS审计管理系统V4 getCurserIfAllowLogin存在SQL注入漏洞
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...
Java 深拷贝全面解析
1. 引言 在 Java 编程中,对象之间的复制是一个常见的需求。根据复制的深度不同,我们可以将复制分为浅拷贝和深拷贝。本文将深入探讨 深拷贝(Deep Copy) 的概念、应用场景、具体实现方法及其优缺点,并提供一些实用的建…...
极狐GitLab 17.7正式发布,可从 GitLab 丝滑迁移至极狐GitLab【一】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
云原生架构中的中间件容器化:优劣势与实践探索
在云原生架构逐步推进的过程中,许多企业已经开始将应用和服务容器化,以充分利用云计算带来的弹性和自动化。随着容器技术的发展,容器化不仅仅限于应用层,越来越多的中间件也被考虑纳入容器化范畴,包括Redis、Kafka、Ra…...
Go+chromedp实现Web UI自动化测试
1.为什么使用go进行UI自动化测试? 速度:Go速度很快,这在运行包含数百个UI测试的测试套件时是一个巨大的优势 并发性:可以利用Go的内置并发性(goroutines)来并行化测试执行 简单:Go的简约语法允许您编写可读且可维护…...
Adversarial Machine Learning(对抗机器学习)
之前把机器学习(Machine Learning)的安全问题简单记录了一下,这里有深入研究了一些具体的概念,这里记录一下方便以后查阅。 Adversarial Machine Learning(对抗机器学习) Adversarial Examples 相关内容Eva…...
EleutherAI/pythia-70m
EleutherAI/pythia-70m” 是由 EleutherAI 开发的一个小型开源语言模型,它是 Pythia Scaling Suite 系列中参数量最小的模型,拥有大约 7000 万个参数。这个模型主要旨在促进对语言模型可解释性的研究; Pythia Scaling Suite是为促进可解释性…...
【C#】C#打印当前时间以及TimeSpan()介绍
1. C#打印当前时间 string currentDate DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");Console.WriteLine(currentDate);2. TimeSpan()介绍 TimeSpan(long ticks)的单位是100ns //500ms new TimeSpan(10*1000*500);参考: C#-TimeSpan-计算时间差...
典型常见的基于知识蒸馏的目标检测方法总结二
来源:https://github.com/LutingWang/awesome-knowledge-distillation-for-object-detection收录的方法 NeurIPS 2017:Learning Efficient Object Detection Models with Knowledge Distillation CVPR 2017:Mimicking Very Efficient Networ…...
设计一个监控摄像头物联网IOT(webRTC、音视频、文件存储)
前言: 设计一个完整的 监控摄像头物联网 IoT 平台 涉及 视频直播和点播、WebRTC 和 文件存储模块,可以分为以下几个主要部分:摄像头设备、服务端处理、Web 前端、视频流存储和回放。以下是结合这些技术的一个具体完整流程设计,涵盖…...
C# OpenCV机器视觉:凸包检测
在一个看似平常却又暗藏玄机的午后,阿强正悠闲地坐在实验室里,翘着二郎腿,哼着小曲儿,美滋滋地品尝着手中那杯热气腾腾的咖啡,仿佛整个世界都与他无关。突然,实验室的门 “砰” 的一声被撞开,小…...
yii2 手动添加 phpoffice\phpexcel
1.下载地址:https://github.com/PHPOffice/PHPExcel 2.解压并修改文件名为phpexcel 在yii项目的vendor目录下创建一个文件夹命名为phpoffice 把phpexcel目录放到phpoffic文件夹下 查看vendor\phpoffice\phpexcel目录下会看到这些文件 3.到vendor\composer目录下…...
Apifox 12月更新|接口的测试覆盖情况、测试场景支持修改记录、迭代分支能力升级、自定义项目角色权限、接口可评论
Apifox 新版本上线啦!!! 在快速迭代的开发流程中,接口测试工具的强大功能往往决定了项目的效率和质量。而 Apifox 在 12 月的更新中,再次引领潮流,推出了一系列重磅功能!测试覆盖情况分析、场景…...
“库存管理软件的用户体验”:界面与交互设计
3.1可行性分析 开发者在进行开发系统之前,都需要进行可行性分析,保证该系统能够被成功开发出来。 3.1.1技术可行性 开发该库存管理软件所采用的技术是vue和MYSQL数据库。计算机专业的学生在学校期间已经比较系统的学习了很多编程方面的知识,同…...
Mysql大数据量表分页查询性能优化
一、模拟场景 1、产品表t_product,数据量500万+ 2、未做任何优化前,cout查询时间大约4秒;LIMIT offset, count 时,offset 值较大时查询时间越久。 count查询 SELECT COUNT(*) AS total FROM t_product WHERE deleted = 0 AND tenant_id = 1 分页查询 SELECT * FROM t_…...
Linux基础--1.1 什么是 Linux 操作系统
Linux 的起源与定义 Linux 是一种开源的操作系统,由 Linus Torvalds 于 1991 年首次发布。它基于 UNIX 操作系统,并以自由和开放为核心理念。Linux 的代码可以由任何人查看、修改并发布,这是它与许多专有操作系统(如 Windows 和 …...
数电实验期末作业——基于FPGA的数字时钟设计
1. 概述 本系统主要完成数字电子钟的以下功能: 1.计时功能(24小时) 2.闹钟功能(设置闹钟以及到时播放音乐) 3.校时功能 4.其他简单功能(清零、输入频率选择(1hz、500hz、5khz)、…...
hdfs命令(三)- hdfs 管理命令(三)- hdfs dfsadmin命令
文章目录 前言一、hdfs分布式文件系统管理命令1. 介绍2. 语法及解释3. 命令3.1 生成HDFS集群的状态报告3.1.1 语法及解释3.1.2 示例 3.2 重新加载配置文件并更新NameNode中的节点列表3.3 刷新指定DataNode上的NameNode信息3.3.1 语法 3.4 获取并显示指定DataNode的信息3.4.1 语…...
TCP off-path exploits(又一个弄巧成拙的例子)
承接前面几篇文章的观点,本文用一个安全攻击的例子说明为了解决一个伤害很低的低概率问题,会引入多么大的麻烦,这次是可怕的被攻击 (⊙o⊙)。 TCP 端口号只有 16bit,序列号只有 32bit,这意味着在强大攻击算力面前&…...
Docker【初识Docker】
目录 为什么会出现Docker这门技术喃? 应用开发和部署的困境 容器技术的先兆 Docker 的出现:简化容器化 Docker 技术的关键创新: Docker 的广泛应用和变革 什么是 Docker? Docker的历史 早期背景:容器化和虚拟化…...
开机存活脚本
vim datastadard_alive.sh #!/bin/bashPORT18086 # 替换为你想要检查的端口号 dt$(date %Y-%m-%d)# 使用netstat检查端口是否存在 if netstat -tuln | grep -q ":$PORT"; thenecho "$dt Port $PORT is in use" > /opt/datastadard/logs/alive.log# 如…...
【elementplus】中文模式
设置中文 <el-date-picker v-model“userAddKey” type“daterange” style“width: 240px” start-placeholder“Start Date” end-placeholder“End Date” change“handleUserAddChange” /> 引入: import zhCn from “element-plus/es/locale/lang/zh-cn”…...
【Docker命令】如何使用`docker exec`在容器内执行命令
大家好,今天我们来聊聊Docker容器管理中的一个非常有用的命令:docker exec。在日常工作中,我们经常需要在运行中的Docker容器内执行各种命令,docker exec正是帮助我们实现这一需求的利器。下面我将通过一个简单的例子,…...
FPGA的DMA应用——pcileech
硬件通过pcie总线,访存本机的内存,并进行修改,可以进行很多操作。 学习视频:乱讲DMA及TLP 1-pcileech项目简介和自定义模块介绍_哔哩哔哩_bilibili vivado2024.1的下载文章链接和地址:AMD-Xilinx Vivado™ 2024.1 现…...
前后端数据交互
一、后端部分 1.创建Spring Boot项目:在IDEA中创建一个Spring Boot项目,引入必要的依赖。 2.编写Controller层:在Spring Boot项目中创建Controller,用于处理前端的请求和响应数据。 RestController RequestMapping("/demo/s…...
将现有Web 网页封装为macOS应用
文章目录 方式一:Unite for macOS方式二:Web2Desk方式三:Nativefier方式四:Flutter Flutter WebView Plugin总结 方式一:Unite for macOS Unite 是一款专为 macOS 设计的工具,可以将任意 Web 页面快速封装…...
代码随想录Day52 101. 孤岛的总面积,102. 沉没孤岛,103. 水流问题,104.建造最大岛屿。
1.孤岛的总面积 卡码网:101. 孤岛的总面积(opens new window) 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格…...
Python毕业设计选题:基于Python的社区爱心养老管理系统设计与实现_django
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 身体健康界面 公共书籍界面 借阅信息界面 归还…...
逆袭之路(11)——python网络爬虫:原理、应用、风险与应对策略
困厄铸剑心,逆袭展锋芒。 寒苦凝壮志,腾跃绘华章。 我要逆袭。 目录 一、引言 二、网络爬虫的基本原理 (一)网络请求与响应 (二)网页解析 (三)爬行策略 三、网络爬虫的应用领…...
【Rust自学】7.3. 路径(Path)Pt.2:访问父级模块、pub关键字在结构体和枚举类型上的使用
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 7.3.1. super 我们可以通过在路径开头使用super来访问父级模块路径中的内容,就像使用..语法启动文件系统路径。例如ÿ…...
wangEditor富文本插件在vue项目中使用和媒体上传的实现
wangEditor是前端一个比较流行的简洁易用,功能强大的前端富文本编辑器,支持 JS Vue React,提供了很多丰富的功能,下面手把手教你实现wangWditor富文本插件在vue项目中配置,保存、图片上传等功能。无脑ctrlc即可 基本功…...
FFmpeg 的常用API
FFmpeg 的常用API 附录:FFmpeg库介绍 库介绍libavcodec音视频编解码核心库编码 (avcodec_send_frame, avcodec_receive_packet)。解码 (avcodec_send_packet, avcodec_receive_frame)。libavformat提供了音视频流的解析和封装功能,多种多媒体封装格式&…...
【软件】教务系统成绩提交工具使用步骤
【软件】教务系统成绩提交工具使用步骤 零、快速开始 安装 与大多数软件一样,安装步骤很简单,一直点击“下一步”即可快速完成安装,安装完成后,在桌面会有一个软件图标,双击即可打开软件主界面。 导入成绩到Excel中…...
es快速扫描
介绍 Elasticsearch简称es,一款开源的分布式全文检索引擎 可组建一套上百台的服务器集群,处理PB级别数据 可满足近实时的存储和检索 倒排索引 跟正排索引相对,正排索引是根据id进行索引,所以查询效率非常高,但是模糊…...
埃斯顿机器人程序模版案例,欢迎指点
埃斯顿机器人程序模版案例,欢迎指点...
解锁成长密码:探寻刻意练习之道
刻意练习,真有那么神? 在生活中,你是否有过这样的困惑:每天苦练英语口语,可一到交流时还是支支吾吾;埋头苦学吉他,却总是卡在几个和弦转换上;工作多年,业务能力却似乎陷入…...
对外发PDF设置打开次数
在线 Host PDF 文件并对链接进行限制——保障文件安全的最佳解决方案 在数字化办公和远程协作日益普及的今天,如何安全高效地分享 PDF 文件成为许多用户关注的重点。MaiPDF 作为一款功能强大的在线工具,不仅支持在线 host PDF 文件,还提供多…...