嵌入式系统 第七讲 ARM-Linux内核
• 7.1 ARM-Linux内核简介
• 内核:是一个操作系统的核心。是基于硬件的第一层软件扩充, 提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统, 决定着系统的性能和稳定性。现代操作系统设计中,为减少系 统本身的开销,往往将一些与硬件紧密相关的(如中断处理程 序、设备驱动程序等)、基本的、公共的、运行频率较高的模 块(如时钟管理、进程调度等)以及关键性数据结构独立开来, 使之常驻内存,并对他们进行保护。通常把这一部分称之为操 作系统的内核。
• Linux内核:Linux内核的主要模块(或组件)分以下几个部分: 存储管理、CPU和进程管理、文件系统、设备管理和驱动、网 络通信,以及系统的初始化(引导)、系统调用等。
• ARM-Linux内核:基于ARM处理器的Linux内核。
• 7.1.1 ARM-Linux内核和普通Linux内核的区别(背)
– 相对于ARM Linux,我们说的普通Linux指的是x86 Linux,它们 都是Linux系统,但是由于ARM和x86是不同的CPU架构,它们的 指令集不同,所以软件编译环境不同,软件代码一般不能互用, 一般需要进行兼容性移植。
– x86是经典的CISC指令集,指令集复杂,功能多,串行执行,但 是也意味着执行效率低下,但性价比突出,所以称为民用终端 的主流处理器内置指令集。Intel和AMD的家用处理器都是x86指 令集。以x86为代表的CISC,理论并发线程1-2条。
– ARM是Advanced RISC Machine 的缩写。它的指令集比RISC还要 精简。通常使用ARM架构处理器的机型,多为嵌入式或者便携 机。主频通常不高,现在高通公司的ARM架构处理器有1.0GHz 的,已经算相当高了。另外,ARM 7沿用冯·诺依曼结构;而从 ARM 9以后,就都采用了哈佛结构。ARM的并发线程,理论上 有4条左右,处理效率较X86高不少。
• 7.1.2 ARM-Linux的版本控制
– Linux的版本号
• 主版本号:序号的第1位
• 次版本号:序号的第2位
• 修订号:序号的第3位
• 稳定版:序号的第2位(次版本号)为偶数
• 测试版:序号的第2位(次版本号)为奇数
– 查看Linux系统的版本号(Ubuntu)
• linux@linux-pc:~$ cat /etc/issue
– Ubuntu 18.04.4 LTS \n • linux@linux-pc:~$ cat /etc/os-release
– NAME="Ubuntu"
– VERSION="18.04.4 LTS (Bionic Beaver)"
– ID=ubuntu
– ID_LIKE=debian
– PRETTY_NAME="Ubuntu 18.04.4 LTS"
– VERSION_ID="18.04"
– HOME_URL="https://www.ubuntu.com/"
– SUPPORT_URL="https://help.ubuntu.com/"
– BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
– PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
– VERSION_CODENAME=bionic
– UBUNTU_CODENA
– 查看Linux内核的版本号(Ubuntu)
• linux@linux-pc:~$ cat /proc/version
– Linux version 5.4.0-139-generic (buildd@lcy02-amd64-036) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #156~18.04.1-Ubuntu SMP Wed Jan 25 15:56:22 UTC 2023• linux@linux-pc:~$ uname-a
– Linux linux-pc 5.4.0-139-generic #156~18.04.1-Ubuntu SMP Wed Jan 25 15:56:22 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux• linux@linux-pc:~$ uname-r
– 5.4.0-139-gen
• 7.1.3 ARM-Linux的代码结构
– 位于Ubuntu的/home/linux/workdir/fs3399/system/kernel/目录下
1.android:Android系统的配置
2.arch :包含和硬件体系结构相关的代码,每种平台(处理器)占一个相应的目录,如i386、 arm、arm64、powerpc、mips等
3.block:块设备驱动程序
4.certs:存储认证和签名相关代码
5.crypto:常用加密和散列算法(如AES、SHA 等),还有一些压缩和CRC 校验算法
6.Documentation:内核各部分的通用解释和注释(文档)
7.drivers :设备驱动程序,每个不同的驱动占用一个子目录,如char、block、net、mtd、i2c 等
8. firmware:固件,包含了让计算机读取和理解从设备发来的信号的代码
9. fs:所支持的各种文件系统,如EXT、FAT、NTFS、JFFS2 等
10. include:头文件,与系统相关的头文件放置在include/linux子目录下
11. init:内核初始化代码,著名的start_kernel() 就位于init/main.c文件中
12. ipc:进程间通信的代码
13. kernel :内核最核心的部分,包括进程调度、定时器等,而和平台(处理器)相关的一部分 代码放在arch/*/kernel 目录下
14. lib:库文件代码
15. mm:内存管理代码,和平台(处理器)相关的一部分代码放在arch/*/mm 目录下
16. net:网络相关代码,实现各种常见的网络协议
17. samples:一些内核编程的范例 文 件 夹
18. scripts:用于配置内核的脚本文件
19. security:Linux安全模型的代码
20. sound:ALSA、OSS 音频设备的驱动核心代码和常用设备驱动
21. tools:这个文件夹中包含了和内核交互的工具
22. usr:实现用于打包和压缩的cpio等
23. virt:此文件夹包含了虚拟化代码,它允许用户一次运行多个操作系统
23. Kbuild:这是一个设置一些内核设定的脚本
24. Kconfig:内核配置选项文件
25. Makefile:这个脚本是编译内核的主要文件,这个文件将编译参数和编译所需的文件和必要的 信息传给编译器
26. System.map:该文件可以帮助我们理解内核编译,它记录了所有代码的运行地址
27. vmlinux:是可引导的、压缩的Linux内核
28. vmlinux.o:是vmlinux的目标文件
• 7.2 ARM-Linux内存管理
• 7.2.1 影响内存管理的两个方面
– Linux内核对内存的管理(Linux操作系统的内存管理)
• 内存管理是操作系统必不可少也是非常重要的一部分,包括:
① 地址映射
② 内存空间的分配
③ 地址访问的限制(即保护机制)
④ I/O地址的映射(I/O编址与内存编址相同)
– ARM体系结构对内存的管理(MMU)
• MMU(存储器管理单元)的主要作用有两个方面:
① 地址映射
② 对地址访问进行保护和限制
• MMU可以做在CPU芯片中,也可以作为一个协处理器(用协处理器实现)
• 7.2.2 ARM-Linux的存储机制
– 基于x86体系结构的Linux内核的存储空间
• 32位地址形成4GB的虚拟地址空间,被分为两部分:
① 内核空间(系统空间):位于高端的1GB,属于Linux操作系统
② 用户空间:位于低端的3GB,属于应用程序
– ARM-Linux内核的存储空间
• 32位地址形成4GB的虚拟地址空间,也被分为两部分,但是内核空间(系统空 间)和用户空间的具体划分,可以因CPU芯片和开发板(实验箱)而有所不同
• 另外,ARM将I/O也放在内存地址空间中
• 7.2.3 虚拟内存
– 虚拟内存(虚拟存储器):是计算机系统内存管理的一种技术, 它使得应用程序认为它拥有连续的可用的内存(一个连续完整的 地址空间),而实际上,它通常是被分隔成多个物理内存碎片, 还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
– Linux虚拟内存的实现需要6种机制的支持:
① 地址映射机制
② 请求页机制
③ 内存分配回收机制
④ 缓存和刷新机制
⑤ 交换机制
⑥ 内存共享机制
• 7.3 ARM-Linux进程管理和调度
• 进程:也称为任务,是一个动态的执行过程,是处于执行期的程序,进程是系统资源 分配的最小单位。
• 狭义定义:进程是正在运行的程序的实例。
• 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。 它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元, 也是基本的执行单元。
• 进程的概念主要有两点:
① 进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据 区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程 执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
② 进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统 执行之),它才能成为一个活动的实体,我们称其为进程。
• 7.3.1 进程的表示和生命周期
– 进程描述符:用task_struct{}数据结构表示
– 进程的状态(重要):
① TASK_RUNNING:可执行状态,进程要么正在执行,要么准备 执行
② TASK_INTERRUPTIBLE:可中断的睡眠状态
③ TASK_UNINTERRUPTIBLE:不可中断的睡眠状态
④ TASK_STOPPED:暂停状态,进程停止执行
⑤ TASK_TRACED:跟踪状态,进程被追踪
⑥ EXIT_ZOMBIE:僵尸状态的进程,表示进程被终止
⑦ EXIT_DEAD:进程的最终状态,进程死亡
⑧ TASK_DEAD:死亡
⑨ TASK_WAKEKILL:唤醒并杀死的进程
⑩ TASK_WAKING:唤醒进程
– 进程标识符:PID,Process ID(进程ID)
• 7.3.3 Linux进程的调度
– Linux进程的创建:
• 通过fork函数创建进程
• 创建用户空间进程:vfork()、fork()
• 创建内核空间进程:copy_process()、kernel_thread()、do_fork()、 sys_vfork()、sys_fork()、sys_clone()
– Linux进程的执行:
• 通过exec函数执行进程
• exec函数族:execl() 、execlp()、execle()、execv()、execvp()、execve()
– Linux进程的销毁:
• 通过do_exit函数结束进程
• 7.3.2 Linux进程的创建、执行和销毁(重要)
– Linux是一个多进程系统。多进程就是指计算机同时执行多个进程,即同 时运行多个程序。对于多进程系统,就存在多个进程如何进行调度的问 题,包括进程调度时机和进程调度依据。
– 进程调度时机:
① 主动调度:随时可以进行。
② 被动调度:发生在系统调用返回的前夕、中断异常处理返回前、用户态处理软中 断返回前。
③ 抢占式内核:处于内核态的进程也可能被调度出去。
– 进程调度依据:
• 在所有处于可运行状态的进程中,如何选择最值得运行的进程投入运行,以下4项 是选择的依据:
① policy:进程的调度策略。
② priority:进程的静态优先级。
③ counter:进程剩余的时间片(进程的动态优先级)。
④ rt_priority:用于实时进程间的选择。
– 进程调度函数:schedule()函数
① 主动调度:主动调用schedule()函数。
② 被动调度:被动调用schedule()函数。
• 7.4 ARM-Linux模块机制
• Linux是单内核的,单内核最大的优点是效率高,因为所有的内容都集中在一起, 单内核也有可扩展性差、可维护性差的缺点。
– 单内核,是个很大的进程。它的内部又能够被分为若干模块(或是层次或其他)。但是在运行的时候,它是个单独的二 进制大映象。其模块间的通讯是通过直接调用其他模块中的函数实现的,而不是消息传递。单内核结构的例子:传统的 UNIX内核----例如伯克利大学发行的版本,Linux内核。
– 微内核结构由一个非常简单的硬件抽象层和一组比较关键的原语或系统调用组成,这些原语仅仅包括了建立一个系统必 需的几个部分,如线程管理,地址空间和进程间通信等。微内核的例子:AIX,BeOS,L4微内核系列,.Mach中用于GNU Hurd和Mac OS X,Minix,MorphOS,QNX,RadiOS,VSTa,鸿蒙OS。
– 混合内核它很像微内核结构,只不过它的的组件更多的在核心态中运行,以获得更快的执行速度。混合内核实质上是微 内核,只不过它让一些微核结构运行在用户空间的代码运行在内核空间,这样让内核的运行效率更高些。混合内核的例 子: BeOS 内核 ,DragonFly BSD,ReactOS内核,Windows NT、Windows 2000、Windows XP、Windows Server 2003以 及Windows Vista等基于NT技术的操作系统。
– 外内核系统,也被称为纵向结构操作系统,是一种比较极端的设计方法。 外内核这种内核不提供任何硬件抽象操作,但 是允许为内核增加额外的运行库,通过这些运行库应用程序可以直接地或者接近直接地对硬件进行操作。外核设计还停 留在研究阶段,没有任何一个商业系统采用了这种设计。几种概念上的操作系统正在被开发,如剑桥大学的Nemesis, 格拉斯哥大学的Citrix系统和瑞士计算机科学院的一套系统。麻省理工学院也在进行着这类研究。
• 模块机制的引入就是为了弥补这一缺点(可扩展性差、可维护性差)。
• 模块(内核模块,动态可加载内核模块,Loadable Kernel Module,LKM)是Linux 内核向外部提供的一个插口。
• 7.4.1 Linux模块概述
– Linux内核支持动态可加载模块(Loadable Kernel Module,LKM), 模块是内核的一部分,模块通常是设备驱动程序,但是并没有编 译到内核里面去。
– 与模块相关的命令:
① insmod:加载模块
② rmmod:卸载模块
③ lsmod:列出已经安装的模块
④ depmod:产生模块依赖的映射文件
⑤ modprob:根据depmod命令所产生的相依关系,决定要载入哪些 模块
• 7.4.2 模块代码结构
– module_test实验驱动程序(模块)的代码结构:
• 头文件
#include <linux/kernel.h>
#include <linux/module.h>
• 模块宏声明
MODULE_LICENSE("GPL");
MODULE_ALIAS("hqyj:module");
MODULE_AUTHOR("HQYJ <yanfa@hqyj.com>");
MODULE_DESCRIPTION("A sample Hello World module");
• 模块初始化函数
static int __init hello_init(void){printk("hello init\n");return 0;}
• 模块退出函数
static void __exit hello_exit(void){printk("hello exit\n");}
• 入口、出口函数设置
module_init(hello_init);
module_exit(hello_exit);
• 7.4.3 模块的加载
– 模块加载的两种方式:
① 手工加载模块:通过insmod命令将模块加载到内核:
– insmodmodule_test.ko:加载module_test.ko模块
② 根据需要加载模块到内核:当内核发现需要某个模块时,内核守 护进程(kerneld)加载该模块到内核。
• 7.4.4 模块的卸载
– 使用rmmod命令卸载模块:
• rmmod module_test:卸载module_test.ko模块
– 但是当内核在使用模块时,该模块是不能被卸载的。
• 7.4.5 版本依赖
– 模块代码一定要在连接到不同内核版本之前重新编译, 因为模块是结合到某个特殊内核版本的数据结构和数 据原型上,不同的内核版本的接口可能差别很大。
– 模块依赖于内核的版
• 7.5 ARM-Linux系统启动和初始化
• 7.5.1 使用Boot Loader将内核映像载入
– Boot Loader将Linux的内核加载到内存(SDRAM)后,将跳到函数 start_kernel()进入初始化过程。
– start_kernel()函数:位于 /home/linux/workdir/fs3399/system/kernel/init/main.c中。
• 7.5.2 内核引导第一部分:内核数据结构初 始化
– start_kernel()函数中调用了一系列初始化函数,以完成内核 (Kernel)本省的设置。
– start_kernel()函数最后启动init过程,创建第一个内核线程,调用 init()函数。
• 7.5.3 内核引导第二部分:外设初始化
– init()函数作为内核线程,首先锁定内核,然后调用 do_basic_setup()函数,完成外设及其驱动程序的加载和初始化。
• 7.5.4 init进程和inittab脚本
– init进程是系统所有进程的起点,内核在完成核内引导以后,即在 本线程(进程)空间内加载init程序,它的进程号是1。
– init程序需要读取Ubuntu的inittab脚本文件作为其行为指针。
• 7.5.5 rc启动脚本
– Linux系统运行后将启动rc脚本(S05rc.local)。
– rc启动脚本(S05rc.local)位于实验箱的/etc/rc2.d/目录下。
• 7.5.6 Shell的启动
– Login用户(Ubuntu和实验箱都是linux用户)将启动一个用户指定的Shell,这个指 定的Shell就是/bin/bash
• Shell:俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。
– bash:是一个为GNU计划编写的Unix shell。它的名字是一系列缩写:Bourne-Again SHell — 这是关于Bourne shell(sh)的一个双关语(Bourne again / born again)。 Bourne shell是一个早期的重要shell,由史蒂夫·伯恩在1978年前后编写,并同 Version 7 Unix一起发布。bash则在1987年由布莱恩·福克斯创造。在1990年,Chet Ramey成为了主要的维护者。
相关文章:
嵌入式系统 第七讲 ARM-Linux内核
• 7.1 ARM-Linux内核简介 • 内核:是一个操作系统的核心。是基于硬件的第一层软件扩充, 提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统, 决定着系统的…...
记一次 dockerfile 的循环依赖错误
文章目录 1. 写在最前面1.1 具体循环依赖的例子 2. 报错的位置2.1 代码快速分析2.2 代码总结2.3 关于 parser 的记录 3. 碎碎念 1. 写在最前面 笔者在使用 dockerfile 多阶段构建的功能时,写出了一个「circular dependency detected on stage: xx」的错误。 解决方…...
用css实现瀑布流布局
上效果 知识理解 column-count: 4; column-gap: 15px;实现固定四行瀑布流布局 columns: 200px auto;column-gap: 15px;由浏览器根据容器的宽度自动调整,尽可能一行多个200px宽度的列数 <!DOCTYPE html> <html lang"en"><head><me…...
Spring Bean required a single bean, but 2 were found,发现多个 Bean
问题复现 在使用 Autowired 时,不管你是菜鸟级还是专家级的 Spring 使用者,都应该制造或者遭遇过类似的错误: required a single bean, but 2 were found 顾名思义,我们仅需要一个 Bean,但实际却提供了 2 个ÿ…...
用 Python 从零开始创建神经网络(十八):模型对象(Model Object)
模型对象(Model Object) 引言到目前为止的完整代码: 引言 我们构建了一个可以执行前向传播、反向传播以及精度测量等辅助任务的模型。通过编写相当多的代码并在一些较大的代码块中进行修改,我们实现了这些功能。此时,…...
Springboot 升级带来的Swagger异常
当升级到Springboot 2.6.0 以上的版本后,Swagger 就不能正常工作了, 启动时报如下错误。当然如果你再使用sping boot Actuator 和 Springfox, 也会引起相关的NPE error. (github issue: https://github.com/springfox/springfox/issues/3462) NFO | jvm 1 | 2022/04…...
【蓝桥杯研究生组】第15届Java试题答案整理
D 题 试题 D: 商品库存管理 时间限制: 3.0s 内存限制: 512.0MB 本题总分:10 分 【问题描述】 在库存管理系统中,跟踪和调节商品库存量是关键任务之一。小蓝经营的仓库中存有多种商品,这些商品根据类别和规格被有序地分类并编号,…...
数据结构(链式栈)
链式栈 链式栈(Linked Stack)是一种基于链表的数据结构,用于实现栈(后进先出,LIFO)的特性。与基于数组的栈不同,链式栈通过动态分配内存来存储数据,这使得它更加灵活,能…...
《代码随想录》Day22打卡!
回溯算法 《代码随想录》回溯算法:组合 本题完整题目如下: 本题的完整思路如下: 1.本题使用回溯算法,其实回溯和递归是一样的道理,也是分为三步曲进行: 2.第一步:确定递归函数的返回值和参数&…...
NetSuite Formula(HTML)超链打开Transaction
当Saved Search作为Sublist应用在Form时,如果Document Number是Group过的,则会出现如下超链失效的情况。 解决办法: 可以利用Saved Search中的Formula(HTML)功能来构建超链,用于打开Transaction。 以下图…...
传统听写与大模型听写比对
在快节奏的现代生活中,听写技能仍然是学习语言和提升认知能力的重要环节。然而,传统的听写练习往往枯燥乏味,且效率不高。现在,随着人工智能技术的发展,大模型听写工具的问世,为传统听写带来了革命性的变革…...
本地快速推断的语言模型比较:Apple MLX、Llama.cpp与Hugging Face Candle Rust
本地快速推断的语言模型比较:Apple MLX、Llama.cpp与Hugging Face Candle Rust 在自然语言处理(NLP)部署中,推断速度是一个关键因素,尤其是对于支持大型语言模型(LLM)的应用来说。随着Apple M1…...
Tomcat调优相关理解
什么是QPS? 是Queries Per Second 的缩写,是指服务器每秒查询数,比如定义一个a接口,该接口是10QPS,那么就是指该接口每秒可以处理10个请求 springboot默认并发处理数是多少? springboot并发处理要看serv…...
python爬虫--小白篇【selenium自动爬取文件】
一、问题描述 在学习或工作中需要爬取文件资源时,由于文件数量太多,手动单个下载文件效率低,操作麻烦,采用selenium框架自动爬取文件数据是不二选择。如需要爬取下面网站中包含的全部pdf文件,并将其转为Markdown格式。…...
Flink读写Kafka(DataStream API)
在Flink里,已经预定义了kafka connector,使用该connector我们可以读写kafka,并且能实现exactly once的语义。 要使用需要引入相关的maven依赖,在这里,因为读写kafka,就会涉及一个问题,kafka-client和broker的版本兼容问题,不过因为kafka client和broker的双向兼容的良…...
活动预告 | Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁
课程介绍 通过 Microsoft Learn 免费参加 Microsoft 安全在线技术公开课,掌握创造新机遇所需的技能,加快对 Microsoft Cloud 技术的了解。参加我们举办的“通过扩展检测和响应抵御威胁”技术公开课活动,了解如何更好地在 Microsoft 365 Defen…...
nginx核心配置文件及常用功能
华子目录 配置文件说明配置文件格式说明nginx配置文件中的变量默认nginx.conf配置文件格式说明main全局配置events配置段 nginx配置中的root和aliaslocation用法详解虚拟主机配置nginx账户认证功能nginx自定义错误页面nginx自定义日志 配置文件说明 nginx官方帮助文档…...
基于AT89C51单片机的可暂停八路抢答器设计
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/90196607?spm1001.2014.3001.5503 C15 部分参考设计如下: 摘要 随着社会进步和科技发展,电子设备在各类活动中的应用日益普遍,…...
github加速源配置
访问github速度很慢? 试试一下方法 1: 编辑配置 vim /etc/docker/daemon.json 2:都复制粘贴上 { "registry-mirrors": [ "https://docker.211678.top", "https://docker.1panel.live…...
骑行解压:身心的奇妙之旅,VELO Angel Revo坐垫
在快节奏的都市生活中,骑行不仅是一种健康的生活方式,更是一种心灵的释放。从心理生理学的角度来看,骑行能够促使身体分泌内啡肽,带来愉悦感,同时,它还能转移注意力,缓解焦虑。在这场身心的奇妙…...
(七)- plane/crtc/encoder/connector objects
1,framebuffer/plane Rockchip RK3399 - DRM framebuffer、plane基础知识 - 大奥特曼打小怪兽 - 博客园 2,crtc Rockchip RK3399 - DRM crtc基础知识 - 大奥特曼打小怪兽 - 博客园 3,encoder/connector/bridge Rockchip RK3399 - DRM en…...
从零开始:如何在 .NET Core 中优雅地读取和管理配置文件
在.net中的配置文件系统支持丰富的配置源,包括文件(json、xml、ini等)、注册表、环境变量、命令行、Azure Key Vault等,还可以配置自定义配置源并跟踪配置的改变,然后按照优先级进行覆盖,总之对文件的配置有很多方法,这…...
Python中PDF转Word的技术
Python PDF转Word技术概述 在日常办公和数据处理中,经常需要将PDF文档转换为Word文档,以便进行编辑、修改或格式调整。Python作为一种强大的编程语言,提供了多种库和工具来实现这一功能。以下是对Python中PDF转Word技术的详细介绍。 一、技…...
挑战春招找到java后端实习第一天(1.1)
八股文 1.java中有哪些集合类请简单介绍一下 集合类分为两大类Collection和Map。前者是对象的集合,后者是键值对。 Collection分为List,Set,Queue三个接口。 List有LinkedList,ArrayList,Vector Set(不…...
leetcode hot 小偷
class Solution(object):def rob(self, nums):""":type nums: List[int]:rtype: int"""# 使用动态规划,把之前的给保存起来ans[0,nums[-1]]for i in range(1,len(nums)):ans.append(max(ans[-1],ans[-2]nums[-1*i-1]))return ans[-1]…...
一、Git与GitHub基础说明
Git与GitHub Git与GitHub一、Git1定义2核心功能(1) 版本控制(2) 分支管理(3) 合并操作 二、GitHub1定义2核心功能(1)远程仓库托管(2)Pull Requests(拉取请求)(3) Issue Tracking(问题跟踪)(4) 团队管理(5) 社交功能(6)个人资料和贡…...
Unity-Mirror网络框架-从入门到精通之Room示例
文章目录 前言Room示例场景设置NetworkRoomManagerSpawnerRewardRoomPlayerGamePlayer 最后 前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。Mirror是一个用于Unity的开源网络框架,专为多人游戏开发设计。它使得开发者能够轻松实现…...
httpslocalhostindex 配置的nginx,一刷新就报404了
当你的Nginx配置导致页面刷新时报404错误时,通常是由于以下几个原因造成的: 静态文件路径配置错误:Nginx没有正确地指向静态文件的目录。前端路由问题:如果是SPA(单页应用),刷新页面时Nginx没有…...
Java重要面试名词整理(十九):Seata
文章目录 分布式事务概述实现思路:两阶段提交协议(2PC) SeataSeata的三大角色Seata的生命周期Seata解决方案 AT模式一阶段二阶段 XA模式TCC模式如何处理空回滚如何处理幂等如何处理悬挂 SAGA模式四种模式对比 分布式事务概述 在微服务架构中,完成某一个…...
OpenCV和PyQt的应用
1.创建一个 PyQt 应用程序,该应用程序能够: 使用 OpenCV 加载一张图像。在 PyQt 的窗口中显示这张图像。提供四个按钮(QPushButton): 一个用于将图像转换为灰度图一个用于将图像恢复为原始彩色图一个用于将图像进行翻…...
【Linux】进程间通信(一)
目录 一、进程间通信1.1 进程间通信目的1.2 理解进程间通信1.3 进程间通信发展1.4 进程间通信分类 二、管道2.1 什么是管道2.2 管道的原理2.3 匿名管道2.3.1 pipe函数2.3.2 匿名管道的实现2.3.3 匿名管道小结2.3.3.1 匿名管道的四种情况2.3.3.2 匿名管道的五种特性 2.3.4 匿名管…...
Fama MacBeth两步法与多因子模型的回归检验
Fama MacBeth两步法与多因子模型的回归检验 – 潘登同学的因子投资笔记 本文观点来自最近学习的石川老师《因子投资:方法与实践》一书 文章目录 Fama MacBeth两步法与多因子模型的回归检验 -- 潘登同学的因子投资笔记 多因子回归检验时序回归检验截面回归检验Fama–…...
Postman[4] 环境设置
作用:不同的环境可以定义不同的参数,在运行请求时可以根据自己的需求选择需要的环境 1.创建Environment 步骤: Environment-> ->命名->添加环境变量 2.使用Environment 步骤:Collection- >右上角选择需要的环境...
【paddle】初次尝试
张量 张量是 paddlepaddle, torch, tensorflow 等 python 主流机器学习包中唯一通货变量,因此应当了解其基本的功能。 张量 paddle.Tensor 与 numpy.array 的转化 import paddle as paddle import matplotlib.pyplot as plt apaddle.to_t…...
开源架构中的数据库选择优化版
上一篇文章推荐: 开源架构学习指南:文档与资源的智慧锦囊(New) 我管理的社区推荐:【青云交社区】和【架构师社区】 推荐技术圈福利社群:点击快速加入 开源架构中的数据库选择优化版 一、引言二、关系型开源…...
Echarts+vue电商平台数据可视化——webSocket改造项目
websocket的基本使用,用于测试前端能否正常获取到后台数据 后台代码编写: const path require("path"); const fileUtils require("../utils/file_utils"); const WebSocket require("ws"); // 创建WebSocket服务端的…...
【网络安全实验室】SQL注入实战详情
如果额头终将刻上皱纹,你只能做到,不让皱纹刻在你的心上 1.最简单的SQL注入 查看源代码,登录名为admin 最简单的SQL注入,登录名写入一个常规的注入语句: 密码随便填,验证码填正确的,点击登录…...
【信息系统项目管理师】第14章:项目沟通管理过程详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 一、规划沟通管理1、输入2、工具与技术3、输出二、管理沟通1、输入2、工具与技术3、输出三、监督沟通1、输入2、工具与技术3、输出一、规划沟通管理 定义:规划沟通管理是基于每个干系人或干系人群体的信息需求…...
YOLOv5部署到web端(flask+js简单易懂)
文章目录 前言最终实现效果图后端实现 主界面检测函数检测结果显示 前端实现 主界面(index.html)显示图片界面 总结 前言 最近,老板让写一个程序把yolov5检测模型部署到web端,在网页直接进行目标检测。经过1个星期的努力,终于实…...
什么是自治系统和非自治系统
自治系统 自治系统的特征是其状态方程不依赖于时间。举个简单的例子,考虑一阶常微分方程: d x d t − x \frac{dx}{dt} -x dtdx−x 这是一个经典的指数衰减过程,其中状态 (x) 随时间 (t) 衰减。这个系统是自治的,因为它的演…...
使用 CSS 的 `::selection` 伪元素来改变 HTML 文本选中时的背景颜色
定义 ::selection 伪元素: 在你的 CSS 文件中,添加 ::selection 伪元素,并设置 background-color 属性来改变选中文本的背景颜色。 示例代码: ::selection {background-color: yellow; /* 你可以根据需要更改颜色 */color: black…...
从0入门自主空中机器人-3-【环境与常用软件安装】
关于本课程: 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程,包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程,带你从0开始,组装属于自己的自主无人机,并让…...
jmeter分布式启动
https://www.cnblogs.com/qtclm/p/11082081.html 1、代理机:输入“ipconfig”,找到IP地址,在Jmeter/bin/jmeter.properties设置remote host 启动jmeter server 1、控制机:输入“ipconfig”,找到IP地址,在J…...
【Linux】HTTP cookie与session
在登录B站时,有登录和未登录两种状态, 问题:B站是如何认识我这个登录用户的?问题:HTTP是无状态、无连接的,怎么能够记住我? HTTP协议是无状态、无连接的。比如客户端(浏览器&#…...
20. 【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--补充--自动添加接口地址
在同学学习过程,部分同学向我反馈说每次新增接口都要在接口表里手动添加一条接口很麻烦,因此我把项目代码做了一个改动,使我们不需要手动添加,每次项目运行起来后就会自动把新的接口地址添加进去。 一、实现 首先,我…...
[Linux] 服务器CPU信息
(1)查看CPU信息(型号) cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c输出:可以看到有128个虚拟CPU核心,型号是后面一串 128 Intel(R) Xeon(R) Platinum 8336C CPU 2.30GHz(2&…...
java_使用阿里云oss服务存储图片
什么情况下可以使用阿里云oss服务存储图片? 对图片的访问速度有高要求时使用,方便用户快速的(比如在网页页面中)访问到图像 参考:41 尚上优选项目-平台管理端-商品信息管理模块-阿里云OSS介绍_哔哩哔哩_bilibili 1.…...
Dali 1.1.4 | 解锁版AI图像生成器,无限生成
Dali是一款先进的AI图像生成器应用程序,能够根据您的描述生成不同风格的独特图像。它不仅限于生成艺术作品,还可以创建创新的纹身设计、独一无二的标志以及超写实照片。该软件使用尖端技术,将想象力转化为现实,提供迷人的数字艺术…...
快手视频不让下载怎么保存到相册
快手,作为国内领先的短视频平台之一,吸引了无数用户发布创意视频、分享生活点滴。随着短视频版权保护和用户隐私问题的日益严重,越来越多的视频内容在平台内都采取了“不让下载”的限制。面对这一情况,很多用户都希望能够保存自己…...
Linux环境下CUDA与对应版本CuDNN的安装指南
转载:Linux环境下CUDA与对应版本CuDNN的安装指南-百度开发者中心...