Linux笔记---内核态与用户态
用户态(User Mode)
权限级别:较低,限制应用程序直接访问硬件或关键系统资源。
适用场景:普通应用程序的运行环境。
限制:无法执行特权指令(如操作I/O端口、修改内存管理单元配置等)。
内核态(Kernel Mode)
权限级别:最高,允许完全访问硬件和系统资源。
适用场景:操作系统内核代码的执行环境。
能力:可执行所有CPU指令,管理进程、内存、设备驱动等核心功能。
1. 操作系统的运行方式
文章开头给出的概念是站在用户的角度上来讲的,对于加深我们对二者的理解来说,无异于杯水车薪。要搞清楚用户态与内核态的概念与意义,我们首先要了解操作系统是如何运行的。
如下是Linux0.11版本中,任务0(init)的主函数部分代码:
void main_rename(void)
{...... // 这里省略前面的初始化代码
/** 注意!! 对于任何其它的任务,'pause()'将意味着我们必须等待收到一个信号才会返* 回就绪运行态,但任务0(task0)是唯一的意外情况(参见'schedule()'),因为任* 务0 在任何空闲时间里都会被激活(当没有其它任务在运行时),* 因此对于任务0'pause()'仅意味着我们返回来查看是否有其它任务可以运行,如果没* 有的话我们就回到这里,一直循环执行'pause()'。*/for(;;) pause();
}
任务0是内核启动后创建的第一个用户态任务(注意任务0不等同于操作系统本身),它的主要作用是在系统空闲时让出CPU,执行for(;;) pause();循环,通过调用pause()系统调用触发schedule(),主动让出CPU给其他任务。
pause()
的作用
常规行为:对于普通任务(非任务 0),
pause()
会使任务进入可中断睡眠状态,直到收到信号后被唤醒。任务 0 的特殊性:
任务 0 是内核初始化后创建的第一个任务(空闲任务),它的pause()
行为被刻意修改为:
不进入睡眠:直接调用
schedule()
主动触发调度。轮询机制:若没有其他任务可运行,调度器会再次选中任务 0,继续执行循环。
简单来说,这个死循环的作用就是:不断触发主动调度,并作为没有其他进程正在运行时的默认动作。
注意:操作系统内核并不是以一个进程的形式存在的,也就是说内核不是依靠进程调度来获得CPU的(毕竟调度本身就是操作系统的任务)。内核是操作系统的核心部分,它是一段运行在特权级别的代码,直接与硬件交互,对系统进行全面的控制和管理。
那么,操作系统的内核在何时能得到运行呢?
在任务0作为一个进程存在的同时,操作系统的内核在不断地等待着别人请求自己的服务,而请求操作系统服务的方式就是引发中断,唤醒处于等待状态之中的操作系统。
可以说,除了初始化以外,在没有中断的时候,操作系统的代码是不执行的;又或者说操作系统就是初始化程序 + 中断处理程序。
包括schedule()主动触发调度,本质上也是依靠触发软中断来请求操作系统的进程调度服务的。
接下来,我们再来介绍一下中断到底是什么,以及在操作系统中有哪几类中断。
2. 中断
中断(Interrupt) 是计算机系统中一种核心的事件驱动机制,允许CPU暂停当前执行的任务,转而处理优先级更高或需要即时响应的外部或内部事件。其本质是通过硬件或软件触发的信号,强制CPU切换执行流程,以保障系统的实时性、资源利用率和错误处理能力。
中断的核心特性
- 异步性:中断的发生与CPU当前执行的指令无关,随时可能被触发(如键盘输入、定时器到期)。
- 优先级分层:不同中断源(如硬件故障、磁盘I/O完成)有不同的优先级,高优先级中断可抢占低优先级中断。
- 上下文保存:CPU在响应中断前,会自动保存当前任务的状态(如寄存器值、程序计数器PC),以便处理完成后恢复原任务。
中断的分类
1. 硬件中断(Hardware Interrupt)
定义:由外部硬件设备通过中断请求线(IRQ)主动触发。
特点:
异步性:与CPU当前执行的指令无关。
可屏蔽性:可通过中断屏蔽位(如x86的
IF
标志位)控制是否响应。子类型:
可屏蔽中断(Maskable Interrupt)
例如:键盘输入、磁盘I/O完成、定时器中断等。
通过中断控制器(如APIC或8259A)管理优先级。不可屏蔽中断(Non-Maskable Interrupt, NMI)
例如:硬件故障(内存校验错误)、系统看门狗超时。
CPU必须立即处理,无法通过软件屏蔽。
2. 软件中断(Software Interrupt)
定义:由程序执行特定指令(如
int
、syscall
)主动触发。特点:
同步性:由程序显式调用,与指令流同步。
不可屏蔽性:无法通过硬件屏蔽。
子类型:
系统调用(System Call)
用户程序通过int 0x80
(x86)或syscall
(x86_64)切换到内核态。调试中断(Breakpoint)
例如:int 3
指令触发调试器断点。异常(Exception)
CPU执行指令时检测到错误(如除零、页错误),自动触发。
2.1 硬件中断
通过外部硬件中断,操作系统就不需要对外设进行任何周期性的检测或者轮询。
由外部设备触发的,中断系统运行流程,叫做硬件中断。
其中,中断向量表在内存中的位置与格式由 CPU 架构硬性规定,中断号实际上就是相对于中断向量表起始地址的偏移量。当CPU获得中断号之后,就可以在中断向量表当中查询到对应的中断服务程序的起始地址,进而转向执行中断服务程序。
而中断服务程序则是由操作系统负责注册到中断向量表当中的:
// 下面是异常(陷阱)中断程序初始化子程序。设置它们的中断调用门(中断向量)。
// set_trap_gate()与set_system_gate()的主要区别在于前者设置的特权级为0,后者是3。因此
// 断点陷阱中断int3、溢出中断overflow 和边界出错中断bounds 可以由任何程序产生。
// 这两个函数均是嵌入式汇编宏程序(include/asm/system.h,第36 行、39 行)。
void trap_init(void)
{int i;set_trap_gate(0,÷_error);// 设置除操作出错的中断向量值。以下雷同。set_trap_gate(1,&debug);set_trap_gate(2,&nmi);set_system_gate(3,&int3); /* int3-5 can be called from all */set_system_gate(4,&overflow);set_system_gate(5,&bounds);set_trap_gate(6,&invalid_op);set_trap_gate(7,&device_not_available);set_trap_gate(8,&double_fault);set_trap_gate(9,&coprocessor_segment_overrun);set_trap_gate(10,&invalid_TSS);set_trap_gate(11,&segment_not_present);set_trap_gate(12,&stack_segment);set_trap_gate(13,&general_protection);set_trap_gate(14,&page_fault);set_trap_gate(15,&reserved);set_trap_gate(16,&coprocessor_error);
// 下面将int17-48 的陷阱门先均设置为reserved,以后每个硬件初始化时会重新设置自己的陷阱门。for (i=17;i<48;i++)set_trap_gate(i,&reserved);set_trap_gate(45,&irq13);// 设置协处理器的陷阱门。outb_p(inb_p(0x21)&0xfb,0x21);// 允许主8259A 芯片的IRQ2 中断请求。outb(inb_p(0xA1)&0xdf,0xA1);// 允许从8259A 芯片的IRQ13 中断请求。set_trap_gate(39,¶llel_interrupt);// 设置并行口的陷阱门。
}初始化串行中断程序和串行接口。
void
rs_init (void)
{set_intr_gate (0x24, rs1_interrupt); // 设置串行口1 的中断门向量(硬件IRQ4 信号)。set_intr_gate (0x23, rs2_interrupt); // 设置串行口2 的中断门向量(硬件IRQ3 信号)。init (tty_table[1].read_q.data); // 初始化串行口1(.data 是端口号)。init (tty_table[2].read_q.data); // 初始化串行口2。outb (inb_p (0x21) & 0xE7, 0x21); // 允许主8259A 芯片的IRQ3,IRQ4 中断信号请求。
}
2.2 时钟中断
我们曾经使用过sleep,alarm等函数,也了解了时间片的概念,那么操作系统是如何计时的呢?
实际上,操作系统运行的一大依据就是时钟中断,顾名思义,这种中断就是用来帮助系统计时的。
时钟中断本质上也是一种硬件中断,这种中断依靠一种特定的硬件设备来触发:时钟源。
早期的时候时钟源就是上图中的外设之一,但是鉴于其重要程度以及时钟中断的时效性,现在大多数的CPU都已经集成了中断源,使中断源能直接向CPU发送信号。
时钟源发送时钟中断的时间间隔是固定的,由其频率。时钟源的频率也叫CPU或者系统的主频:
时钟中断的核心作用
系统计时
通过全局变量jiffies
记录自系统启动以来的节拍数(每个节拍对应一次时钟中断),结合HZ
(每秒节拍数,默认100~1000)实现时间计算。例如,jiffies/HZ
可转换为系统运行时间(秒)。进程调度
每次时钟中断会调用do_timer()函数更新进程时间片,触发抢占式调度。进程的时间片本质上就是一个计数器,每次时钟中断都会使其减1,直到为0。动态定时器管理
内核通过红黑树或时间轮管理动态定时器(timer_list
结构),时钟中断触发时检查并执行到期定时器的回调函数。资源统计
统计进程消耗的用户态和内核态时间,更新系统负载平均值。
2.3 软中断
系统调用本质上就是请求操作系统的服务,这就要求我们能从软件层面上触发中断,即软中断。
为了让操作系统支持进行系统调用,CPU也设计了对应的汇编指令(int 或者 syscall),可以让CPU内部触发中断逻辑。
本质上,我们使用的系统调用函数内部的逻辑就是使用int 0x80指令请求操作系统提供指定的服务,其本身并不具备任务对系统进行操作的能力。
打开文件函数。
// 打开并有可能创建一个文件。
// 参数:filename - 文件名;flag - 文件打开标志;...
// 返回:文件描述符,若出错则置出错码,并返回-1。
int open(const char * filename, int flag, ...)
{register int res;va_list arg;// 利用va_start()宏函数,取得flag 后面参数的指针,然后调用系统中断int 0x80,功能open 进行
// 文件打开操作。
// %0 - eax(返回的描述符或出错码);%1 - eax(系统中断调用功能号__NR_open);
// %2 - ebx(文件名filename);%3 - ecx(打开文件标志flag);%4 - edx(后随参数文件属性mode)。va_start(arg,flag);res = va_arg(arg,int);_asm{mov eax,__NR_openmov ebx,filenamemov ecx,flagmov edx,resint 0x80mov res,eax}
/* __asm__("int $0x80":"=a" (res):"0" (__NR_open),"b" (filename),"c" (flag),"d" (va_arg(arg,int)));*/
// 系统中断调用返回值大于或等于0,表示是一个文件描述符,则直接返回之。if (res>=0)return res;
// 否则说明返回值小于0,则代表一个出错码。设置该出错码并返回-1。errno = -res;return -1;
}
可以看到open函数内部是使用嵌入式汇编的方式传递参数,并使用int 0x80触发软中断。
软中断处理程序 _system_call 根据第一个参数 __NR_open 就能索引到需要调用的函数:
正真有能力对系统进行操作的,操作系统内部的系统调用函数被注册到了一张表当中,这张表就是上面汇编程序索引到所需函数的依据:
3. 内核态与用户态的本质
经历了上面的学习,相信大家对于内核态与用户态的本质已经有了一定的想法。
即,执行用户代码时,系统就处于用户态;因中断而转向执行中断处理程序时(操作系统内核代码),系统就处于内核态。
内核态的代码是全局的,不受约束的(或者说只受到硬件约束);而用户态的代码是以进程的形式,在虚拟地址空间上运行的,受到操作系统的约束。
问题是,CPU在运行代码时,如何区分其是内核代码(特权级)还是用户代码(受限制)呢?
Linux内核态与用户态的本质区别在于CPU特权级隔离和内存访问权限控制,这种设计通过硬件机制与软件协同实现系统资源的保护:
特权级划分
x86架构通过Ring等级划分权限(0-3级),Linux仅使用Ring0(内核态)和Ring3(用户态)。关键寄存器CS
(代码段寄存器)的低2位存储当前特权级(CPL):// 内核代码段选择子(CPL=0) #define __KERNEL_CS 0x10 // 用户代码段选择子(CPL=3) #define __USER_CS 0x1B
内存隔离机制
页表隔离:用户态进程只能访问用户空间页表项(
VM_READ
/VM_WRITE
),内核态通过全局页表swapper_pg_dir
直接映射物理内存。地址空间划分:x86_64下用户空间为0x0000_0000_0000_0000 - 0x0000_7FFF_FFFF_FFFF,内核空间为0xFFFF_8000_0000_0000以上。也就是说,用户代码中地址的范围与内核代码中地址的范围是互斥的,用户态下无法使用内核地址,在内核态下无法使用用户地址。
相关文章:
Linux笔记---内核态与用户态
用户态(User Mode) 权限级别:较低,限制应用程序直接访问硬件或关键系统资源。 适用场景:普通应用程序的运行环境。 限制:无法执行特权指令(如操作I/O端口、修改内存管理单元配置等)…...
MFC 编程中 OnInitDialog 函数
核心作用 对话框初始化入口 :创建完成后第一个执行的函数。是对话框的起点。控件操作安全期 :此时所有控件已创建完成。可以安全地进行控件的初始化、属性设置等操作。界面布局最佳时机 :窗口显示前完成初始化设置。可以进行布局调整、数据初…...
Java高频面试之并发编程-18
hello啊,各位观众姥爷们!!!本baby今天又来报道了!哈哈哈哈哈嗝🐶 面试官:详细说说synchronized synchronized 是 Java 中实现线程同步的核心关键字,用于解决多线程环境下的资源竞争…...
深入探究AKS Workload Identity
Azure Kubernetes 服务 (AKS) 提供了一项名为 Workload Identity 的强大功能,它可以增强安全性并简化在 Kubernetes 集群中运行的应用程序的身份验证。以下是 Workload Identity 在 AKS 环境中的工作原理概述: AKS 中的 Workload Identity 允许 Pod 无需…...
【MySQL基础】MySQL基础:MySQL基本操作与架构
MySQL学习: https://blog.csdn.net/2301_80220607/category_12971838.html?spm1001.2014.3001.5482 前言: 这里是MySQL学习的第一篇,本篇主要是讲解一些MySQL的基础操作,但这并不是重点,本篇我们主要是要理解MySQL…...
【线下沙龙】NineData x Apache Doris x 阿里云联合举办数据库技术Meetup,5月24日深圳见!
5月24日下午,NineData 将联合 Apache Doris、阿里云一起,在深圳举办数据库技术Meetup。本次技术沙龙聚焦「数据实时分析」与「数据同步迁移」 两大核心领域,针对企业数据战略中的痛点,特邀行业资深技术大咖,结合多年技…...
【Unity网络编程知识】Unity的 UnityWebRequest相关类学习
1、UnityWebRequest类介绍 UnityWebRequest是一个unity提供的一个模块化的系统类,用于构成HTTP请求和处理HTTP响应,它主要目标是让unity游戏和Web服务端进行交互,它将之前WWW的相关功能都集成在了其中,所以新版本中都建议使用unit…...
STM32实战指南——DHT11温湿度传感器驱动开发与避坑指南
知识点1【DHT11的概述】 1、概述 DHT是一款温湿度一体化的数字传感器(无需AD转换)。 2、驱动方式 通过单片机等微处理器简单的电路连接就能实时采集本地湿度和温度。DHT11与单片机之间采用单总线进行通信,仅需要一个IO口。 相对于单片机…...
SVG 与 Canvas 技术调研对比
在 画布 中进行 大量矩形框绘制 时,SVG 和 Canvas 都是可行的技术方案,但它们适用于不同的场景,技术特性也有明显区别。下面我从性能、灵活性、可维护性、适用场景等方面做一个系统性的对比,帮助你做出更合适的选择。 ᾞ…...
Ubuntu 远程桌面配置指南
概述: 本文主要介绍在Ubuntu 22.04中通过VNC实现远程连接的方法。首先需安装图形化界面和VNC工具x11vnc,设置开机启动服务;然后在Windows客户端用VNC Viewer通过局域网IP和端口5900连接。 总结: 一、VNC配置与安装 安装图形化界面 在Ubuntu 22.04中需先安装: sudo apt …...
146. LRU 缓存
一、题目 二、思路 题目要求 O(1) 的平均时间复杂度运行 -> 使用Map空间换时间 Map<Integer, Node>Map 通过 key 直接找到对应节点 getNode(key) -> Node记得只要查过该节点之后就应该把该节点放到最前面 pushFront(Node)put 元素后,在map中添加&…...
微信学习之导航功能
先看这个功能的效果: 然后开始学习吧。 一、我们这里用的是vant的Grid控件,首先我们导入: { "usingComponents": {"van-search": "vant/weapp/search/index","my-swiper":"../../components…...
MySQL替换瀚高数据库报错: TO_DAYS()不存在(APP)
文章目录 环境症状问题原因解决方案报错编码 环境 系统平台:中标麒麟(海光)7,中标麒麟(飞腾)7 版本:4.5 症状 MySQL替换为瀚高数据库进行应用系统适配报错:TO_DAYS()不…...
FPGA:高速接口JESD204B以及FPGA实现
本文将先介绍JESD204B高速接口的基本概念和特性,然后详细说明如何基于Xilinx Kintex-7系列FPGA实现JESD204B高速接口。 一、JESD204B高速接口介绍 JESD204B是由JEDEC(固态技术协会)制定的一种高速串行通信标准,主要用于数据转换器…...
HarmonyOS Navigation组件深度解析与应用实践
HarmonyOS Navigation组件深度解析与应用实践 一、组件架构与核心能力 HarmonyOS Navigation组件作为路由导航的根视图容器,采用三层架构设计: 标题层:支持主副标题配置,提供Mini/Free/Full三种显示模式内容层:默认…...
C#中的ThreadStart委托
ThreadStart 委托: ThreadStart 是 .NET 中的一个内置委托类型,表示无参数且无返回值的方法。其定义如下: public delegate void ThreadStart(); 通常用于定义线程的入口方法。 List<ThreadStart>: 这是一个泛型集合&…...
Spring boot 集成 Knife4j
knife4j官网:https://doc.xiaominfo.com/docs/quick-start 1. 引入Knife4j相关依赖 <!-- knife4j--> <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version…...
基于Java在高德地图面查询检索中使用WGS84坐标的一种方法-以某商场的POI数据检索为例
前言 随着移动互联网的飞速发展,基于位置的服务(LBS)需求日益增长,越来越多的应用需要从地图中检索特定区域内的地理信息,例如商业场所、公共服务设施等。商场作为城市商业活动的重要载体,其周边的地理信息…...
6K型护套连接器DLJ0601(2000)-00
6K型护套连接器DLJ0601(2000)-00简介 6K型护套连接器DLJ0601(2000)-00是一种用于电气连接的组件,广泛应用于工业设备、通信系统和电子设备中。该连接器设计紧凑,具有高可靠性和耐用性,适用于多种环境条件下的电气连接需求。 主要特点 高可…...
Hexo的Next主题的Config文件内方便修改的参数(Chat-Gpt)
这是对 Hexo 的 Next 主题 _config.yml 文件各部分配置项的中文解释,帮助你更方便地进行定制: 🚀 核心设置 cache / minify cache.enable: 启用缓存,加快生成速度。minify: 是否压缩生成的 HTML/CSS/JS。 custom_file_path 自…...
【three】给立方体的每个面加载不同贴图
效果图: 主要代码: initCube() {let _this thisconst geometry new Three.BoxGeometry(1, .3, .5)let TextureLoader new Three.TextureLoader()let mater1TextureLoader.load(require(/assets/images/bg2.jpg),function (texture){console.log(tex…...
vscode怎么关闭自动定位文件
关闭自动定位文件功能 方式1 在设置中搜索: explorer.autoReveal 方式2 直接在settings.json中增加"explorer.autoReveal": false 添加类似jetbrains IDE的文件定位功能 可以直接安装插件市场搜索niushuaibing.vs-location, 安装后会有文件定位按钮, 点击后即可…...
2025-5-19Vue3快速上手
1、toRefs和toRef 当解构一个响应式对象(如 reactive 创建的对象)时,直接解构会失去响应性,此时可用 toRefs或toRef 保持响应性 toRef 的核心作用是将对象的属性转换为 ref,保持与原属性的双向绑定,无论原…...
HDMI 屏幕 电脑HDMI HDMI采集卡的关系
一、HDMI接口方向性原理 普通设备的HDMI接口方向: 电脑的HDMI接口:无论是显卡还是主板上的HDMI,均为输出端(信号源),只能向外发送视频信号,无法接收输入信号。 显示器的HDMI接口:均…...
JESD204 ip核使用与例程分析(二)
JESD204 ip核使用与例程分析(二) JESD204时钟方案专用差分时钟对例程分析jesd204_0_transport_layer_demapperjesd204_0_sig_chkjesd204_0_clockingjesd204_0 ip核port寄存器AXI-LITE寄存器配置jesd204_phy ip核JESD204时钟方案 图3-1所示为最通用、灵活的时钟解决方案。在图…...
如何使用VCS+XA加密verilog和spice网表
如果要交付verilog,但是需要对方进行VCS仿真,那么可以用以下方法: 一、基于编译指令的局部加密 适用场景:需精确控制加密范围(如仅加密核心算法或敏感逻辑)。 实现步骤: 代码标注…...
Grafana之Dashboard(仪表盘)
在前面的小节中介绍了Grafana中4中常用的可视化面板的使用,通过在面板中使用PromQL表达式,Grafana能够方便的将Prometheus返回的数据进行可视化展示。例如,在展示主机CPU使用率时,我们使用了如下表达式: 1 - (avg(ira…...
AOSP 中常见的键值对存储方式全解析(适用于系统开发与应用开发)
在 Android 系统开发(AOSP)中,键值对(Key-Value)存储是一种基础且广泛使用的数据持久化方式。从系统属性、用户设置,到应用配置,都依赖于这种结构的存储方式。本文将全面梳理 AOSP 中主流的键值…...
集合进阶2
Java不可变集合、Stream流与方法引用深度解析 一、不可变集合(Immutable Collections)进阶指南 1.1 不可变集合核心特性 防御性编程:防止外部修改数据(如传递集合给第三方库时)线程安全:天然支持多线程读…...
eMMC深度解析:嵌入式多媒体卡的硬件电路设计要点
一、eMMC 技术深度解析 1.定义与背景 eMMC(Embedded Multi Media Card)是一种专为嵌入式系统设计的非易失性存储解决方案,它将 NAND 闪存、主控芯片和接口协议封装在一个 BGA(Ball Grid Array)封装中。其核心目标是简…...
【SPIN】PROMELA语言编程入门同步机制(SPIN学习系列--4)
同步机制 PROMELA 不包含信号量、锁或监控器等常见的同步原语,而是通过语句的**可执行性(executability)**概念来建模同步机制。计算机系统的架构限制了同步机制的设计:本章主要介绍适用于共享内存系统的同步机制,第7…...
整数的个数
【描述】 给定k(1< k < 100)个正整数,其中每个数都是大于等于1,小于等于10的数。写程序计算给定的k个正整数中,1,5和10出现的次数。 【输入】 输入有两行:第一行包含一个正整数kÿ…...
AWS EKS IP 耗尽:原因、解决方案和最佳实践
想象一下,您的 AWS EKS 集群在生产环境中运行顺畅,所有 CI/CD 管道运行正常,服务优雅地扩展,一切都像自动驾驶模式一样。——直到有一天,新的 Pod 无法启动。 您深入研究 kubectl get pods 命令,发现一堆 P…...
艾默生流量计与Profibus DP主站转Modbus RTU/TCP网关通讯案例
艾默生流量计与Profibus DP主站转Modbus RTU/TCP网关通讯案例 在现代工业自动化控制系统中,艾默生流量计因其高精度、稳定性和易用性而备受青睐。然而,为了实现与不同协议设备之间的无缝通信,经常需要借助专业的通讯网关进行协议转换。本文将…...
Python测试单例模式
单例模式的核心思想 单例模式确保一个类只有一个实例,并提供一个全局访问点。这在需要控制资源访问(如配置文件、数据库连接等)时非常有用。 一个简单的示例: import threading import timeclass Singleton:instance Nonelock…...
Linux架构篇、第五章_06Jenkins 触发器全面解析与实战指南
Linux架构篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:jenkins触发器的介绍与使用 版本号: 1.0,0 作者: laowang 日期: 2025.05.16 适用环境:rocky9.5 文档说明 本文档为《jenkins 触发器的介绍与…...
如何快速更换电脑浏览器ip:教程与注意事项
无论是为了访问地域限制内容、保护隐私,还是解决网络问题,快速更换浏览器IP地址的需求日益增多。以下是快速更换电脑浏览器IP地址的几种常用方法及注意事项,结合了多种场景下的解决方案: 一、快速更换浏览器IP的方法 1. 代理服务…...
《黑马前端ajax+node.js+webpack+git教程》(笔记)——ajax教程(axios教程)
黑马程序员前端AJAX入门到实战全套教程,包含学前端框架必会的(ajaxnode.jswebpackgit),一套全覆盖 文章目录 框架前置导学AJAX-Day01-01.AJAX入门与axios使用什么是AJAX如何使用AJAX使用axios获取数据案例axios语法尝试获取数据代…...
超级管理员租户资源初始化与授权管理设计方案
背景说明 在多租户系统中,资源(如功能模块、系统菜单、服务能力等)需按租户维度进行授权管理。超级管理员在创建新租户时,需要初始化该租户的资源授权信息。 两种可选方案 方案描述方案 A:前端传入选中的资源列表创…...
【Python训练营打卡】day30 @浙大疏锦行
DAY 30 模块和库的导入 知识点回顾: 1. 导入官方库的三种手段 2. 导入自定义库/模块的方式 3. 导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何…...
微前端记录
微前端 实习过程中,做了些微前端方向的调研,记录下 微前端将前端拆分为独立的可以单独运行,测试,部署的代码, 具有技术栈无关,多团队,多业务线协作的特点。 前端现有的页面,分为单页…...
词嵌入基础
一 前言 最近在学习NLP方面知识,在此记录一下词嵌入的技术。 二 词袋法 1.理论 就是统计一个句子或文章中,词语出现的次数。这方法有去重词袋法,无去重词袋法。 a 原理与案例 chinese_docs ["我爱自然语言处理","自然语…...
CSS之网页元素的显示与隐藏(旧土豆网遮罩案例)
网页元素的显示与隐藏。 很多网页的侧边栏都会出现广告,我们点击关闭时,广告会消失不见,但若重新刷新网页页面,则广告会重新出现。网页的广告并非是真的被删除了,而是被暂时的隐藏起来了。 • display • visibil…...
关于 Web 漏洞原理与利用:2. XSS(跨站脚本攻击)
一、原理: 用户输入未过滤被执行 攻击者输入的内容,如果没有被正确处理(过滤/转义),被网页原样输出到浏览器中,那么这些内容就可能会被浏览器当成代码执行,这就是 XSS(跨站脚本攻击…...
【TTS回顾】深度剖析 TTS 合成效果的客观评估与主观评价
如何评估合成音色的效果 当我们面对一个新发布的 TTS 模型,或者在多个模型之间进行选择时,一个核心问题摆在我们面前:如何科学、全面地评估一个 TTS 模型的合成效果? 仅仅凭感觉“听一听”显然不够客观和系统。我们需要一套行之有效的评估方法和指标体系,来衡量 AI “说话…...
WPF点击按钮弹出一个窗口
一、基本方法:直接实例化并显示窗口 1. 普通窗口(无参数) 适用场景:简单的弹出窗口,无需传递数据。 private void Button_Click(object sender, RoutedEventArgs e) { var newWindow new MyWindow(); // 实例化…...
WPF中的ObjectDataProvider:用于数据绑定的数据源之一
ObjectDataProvider是WPF(Windows Presentation Foundation)中一种强大而灵活的数据绑定源,它允许我们将对象实例、方法结果甚至是构造函数的返回值用作数据源。通过本文,我将深入探讨ObjectDataProvider的工作原理、使用场景以及如何在实际应用中发挥其…...
Java POJO接收前端null值设置
在 Java 中,若要让 price 字段接收前端传递的 null 值,只需确保以下几点: 1. 使用包装类型 Double 你的 price 字段已经是包装类型 Double(而不是基本类型 double),这天然支持 null 值。基本类型 double …...
C++(24):容器类<list>
目录 一、核心概念 二、基本语法 1. 声明与初始化 2.添加元素 3.访问与遍历 4. 删除元素 三、特点 1. 高效插入/删除 2. 不支持随机访问 3. 特有成员函数 4. 内存与性能 四、示例代码 五、成员函数 六、使用场景 七、注意事项 Lists将元素按顺序储…...
WPF Data Binding 及经典应用示例
什么是Data Binding(数据绑定)? Data Binding是WPF中的核心机制,它建立了UI元素(视图)与数据对象(模型/视图模型)之间的连接通道,实现了数据的自动同步。当数据发生变化…...