操作系统高频(七)虚拟地址与页表
操作系统高频(六)虚拟地址与页表
1.什么是文件系统?它的作用是什么?⭐
- 存储管理:文件系统负责管理计算机的存储设备,如硬盘、固态硬盘等。它将文件存储在这些设备上,并负责分配和回收存储空间。文件系统通过数据块的分配和索引机制,确保文件能够被快速定位和访问。
- 文件组织:文件系统定义了文件和目录的结构和组织方式。它通过层次化的目录结构或扁平化的文件结构,帮助用户对文件进行分类、分组和管理。文件系统提供了创建、删除、移动和重命名文件和目录的操作,便于用户组织和管理文件。
- 文件访问控制:文件系统提供了对文件的访问权限控制。它允许用户或程序对文件进行读取、写入和执行等操作,并根据用户角色和权限设置文件的访问级别。这样可以保护文件的机密性和完整性,限制未授权的访问和修改。
- 文件操作和管理:文件系统提供了一系列的接口和工具,允许用户对文件进行各种操作和管理。这包括文件的复制、移动、重命名、压缩和解压缩等操作,以及对文件属性的设置和查询,如文件大小、文件类型、创建时间等。
- 文件共享和备份:文件系统支持文件的共享,使多个用户能够同时访问和修改同一个文件。这促进了团队协作和信息共享。此外,文件系统还提供了备份和恢复的功能,确保用户的数据安全和可靠性。
2.说说进程调度算法有哪些?⭐⭐
- 先来先服务(FCFS):按照进程到达的先后顺序进行调度。先到达的进程先被执行,直到该进程完成或被阻塞。
- 短作业优先(SJF):根据进程的执行时间来进行调度,执行时间短的进程先被执行。该算法可以最小化平均等待时间,但可能导致长作业饥饿。
- 最短剩余时间优先(SRTF):在执行过程中,根据剩余执行时间来动态调度进程。如果一个新到达的进程的剩余执行时间比当前进程的剩余执行时间短,则进行切换。
- 优先级调度:为每个进程分配一个优先级,并按照优先级来调度进程。具有较高优先级的进程先被执行,较低优先级的进程可能会被较高优先级的进程长时间抢占。
- 时间片轮转调度(Round Robin):将可用的CPU时间划分为固定大小的时间片(如10ms),每个进程在一个时间片内被执行,然后被放到就绪队列的末尾。这样可以保证每个进程都有机会执行,并提供一种均衡的调度。
- 多级反馈队列调度:将就绪队列划分为多个队列,每个队列具有不同的时间片大小。新到达的进程首先进入第一个队列,如果在该队列执行完后还有剩余时间,则进入下一个队列,以此类推。这个算法可以根据进程的特性分配不同的优先级。
3.简述LRU算法及其实现方式。⭐⭐
LRU(Least Recently Used)算法是一种用于页面置换的算法,用于决定哪些页面应该被置换出内存。这个算法的基本思想是,当需要置换页面时,选择最近最少被使用的页面进行替换。
LRU 算法:
实现 LRU 算法的方式可以利用一个数据结构来记录页面的访问历史,可以使用链表或者队列来实现。下面是一种基于双向链表的 LRU 算法实现方式:
- 维护一个双向链表。链表的头部表示最近使用的页面,尾部表示最久未使用的页面。
- 当访问一个页面时,如果页面在链表中存在,将其从原位置删除,并插入到链表头部。
- 当访问一个页面时,如果页面不在链表中,且缓存未满,则直接将该页面插入到链表头部。
- 当访问一个页面时,如果页面不在链表中,且缓存已满,则删除链表尾部的页面,并将新页面插入到链表头部。
通过这种方式,最近访问的页面会被移到链表头部,而长时间未被访问的页面会逐渐移到链表尾部。当需要置换页面时,只需要淘汰链表尾部的页面即可。
LRU算法的优点是可以充分利用程序的局部性原理,将最近被访问的页面保留在内存中,从而提高缓存命中率和访问效率。但它也存在一些缺点,如实现复杂度较高和需要额外的数据结构来记录页面访问历史等。
代码实现:
#include <iostream>
#include <unordered_map>
using namespace std;
class LRUCache {
private:
struct ListNode {
int key;
int value;
ListNode* prev;
ListNode* next;
ListNode(int k, int v) : key(k), value(v), prev(nullptr), next(nullptr) {}
};
unordered_map<int, ListNode*> cache;
ListNode* head;
ListNode* tail;
int capacity;
public:
LRUCache(int capacity) {
this->capacity = capacity;
head = new ListNode(-1, -1);
tail = new ListNode(-1, -1);
head->next = tail;
tail->prev = head;
}
void addToHead(ListNode* node) {
node->next = head->next;
node->prev = head;
head->next->prev = node;
head->next = node;
}
void deleteNode(ListNode* node) {
node->prev->next = node->next;
node->next->prev = node->prev;
}
int get(int key) {
if (cache.count(key)) {
ListNode* node = cache[key];
deleteNode(node);
addToHead(node);
return node->value;
}
return -1;
}
void put(int key, int value) {
if (cache.count(key)) {
ListNode* node = cache[key];
deleteNode(node);
node->value = value;
addToHead(node);
} else {
if (cache.size() == capacity) {
ListNode* tailNode = tail->prev;
deleteNode(tailNode);
cache.erase(tailNode->key);
delete tailNode;
}
ListNode* newNode = new ListNode(key, value);
addToHead(newNode);
cache[key] = newNode;
}
}
};
int main() {
LRUCache lruCache(2);
lruCache.put(1, 1);
lruCache.put(2, 2);
cout << lruCache.get(1) << endl; // 输出 1
lruCache.put(3, 3);
cout << lruCache.get(2) << endl; // 输出 -1,因为缓存中已经不存在 key 为 2 的元素
lruCache.put(4, 4);
cout << lruCache.get(1) << endl; // 输出 -1,因为缓存中已经不存在 key 为 1 的元素
cout << lruCache.get(3) << endl; // 输出 3
cout << lruCache.get(4) << endl; // 输出 4
return 0;
}使用了一个结构体 ListNode 表示双向链表的节点,通过指针 prev 和 next 连接节点。缓存的数据通过哈希表 cache 来进行快速查找,键为键值,值为节点指针。LRU 缓存的容量由变量 capacity 控制。每次访问或插入新数据时,通过操作链表的头部指针和节点的连接关系来更新缓存的访问顺序,同时使用哈希表来查询快速访问指定键值的节点。
4.什么是页表,为什么要有?⭐⭐⭐
什么是页表?
答:页表(Page Table)是操作系统中的一种数据结构,用于管理虚拟内存和物理内存之间的映射关系。它记录了进程的页(Page)与物理页框(Page Frame)之间的对应关系。
页表的作用是什么?
页表的作用是实现虚拟内存与物理内存之间的映射关系,并提供对内存访问的控制和管理。具体作用包括:
- 映射关系:通过页表,操作系统可以根据进程的虚拟地址将其转换为实际的物理地址。这样,进程就可以使用连续的虚拟地址空间而不需要关心物理内存的布局。
- 内存管理:页表可以帮助操作系统有效地管理内存。它可以将进程的虚拟地址空间分割成小的固定大小的页,同时将物理内存分割成与页大小相同的块。这样,操作系统可以根据需要进行页面调度,将进程所需的虚拟页加载到物理内存中,并保持合理的内存利用率。
- 内存保护:页表中可以记录访问权限和保护位等信息,用于控制进程对内存的访问权限。通过页表,操作系统可以实现内存的保护,确保进程只能访问到其所拥有的内存空间,防止越界访问和非法操作。
- 虚拟化技术支持:在虚拟化环境下,页表可以实现虚拟机对物理内存的访问和管理。虚拟机监控程序(Hypervisor)会维护独立的页表,将虚拟机的虚拟地址转换为物理地址,隔离不同虚拟机之间的内存空间。
5.简述操作系统中的缺页中断。⭐⭐⭐
缺页异常:malloc和mmap函数在分配内存时只是建立了进程虚拟地址空间,并没有分配虚拟内存对应的物理内存。当进程访问这些没有建立映射关系的虚拟内存时,处理器自动触发一个缺页异常,引发缺页中断。
缺页中断:缺页异常后将产生一个缺页中断,此时操作系统会根据页表中的外存地址在外存中找到所缺的一页,将其调入内存。
操作系统中的缺页中断(Page Fault)是指当程序访问的页不在物理内存中时发生的一种中断机制。当程序需要访问一个虚拟页,但该页当前不在物理内存中时,CPU会触发一个缺页中断,将控制权交给操作系统。
缺页中断的处理过程大致如下:(大致了解)
- 当程序访问一个缺页时,CPU会暂停当前的指令执行,并产生一个异常或中断,即缺页中断。
- 操作系统的内核捕获到缺页中断,并开始处理中断。
- 操作系统首先会检查发生缺页中断的原因。如果该页是无效的或不可访问的,操作系统会终止该进程,因为这可能是非法访问。否则,如果该页是合法的但不在物理内存中,操作系统需要将该页加载到内存中。
- 操作系统根据页表信息确定要替换的物理页框,并根据需要从磁盘中获取相应的页。
- 如果物理内存中有空闲的页面,操作系统将被替换的页面清除并将新的页面加载到物理内存中。如果物理内存没有空间,则必须选择一个页面进行替换,通常会使用一些页面置换算法,如最近最少使用(LRU)或先进先出(FIFO)。
- 操作系统更新页表,将新加载的页与对应的虚拟页建立映射关系,并标记该页为已加载到物理内存中。
- 最后,操作系统恢复中断点,并将控制权返回给触发缺页中断的程序,让它继续执行。
缺页中断的目的是实现了虚拟内存的概念,允许程序使用比实际物理内存更大的地址空间,并将常用的页存放在物理内存中,而将不常用的页放在磁盘上。通过缺页中断处理,操作系统能够根据需求将所需的虚拟页从磁盘加载到内存中,实现了透明的内存管理和动态的页面调度。
6.简述一下虚拟内存和物理内存,为什么要用虚拟内存,好处是什么?⭐⭐⭐
虚拟内存是一种抽象的内存概念,它为每个进程提供了一个独立的地址空间,这个地址空间被称为虚拟地址空间。虚拟内存的大小可以超过物理内存的容量。
物理内存是计算机系统中实际存在的内存硬件,由RAM(Random Access Memory)组成。物理内存存储着正在运行的程序和数据。
为什么要使用虚拟内存?以下是虚拟内存的几个好处:
- 扩展内存容量:虚拟内存允许进程访问超过物理内存容量的虚拟地址空间。当物理内存不足以容纳所有进程的数据时,操作系统可以将不常用的页面置换到磁盘上,从而释放物理内存空间给其他进程使用。
- 内存隔离:每个进程都有独立的虚拟地址空间,使得不同进程之间的内存彼此隔离,互不干扰。这提高了系统的安全性和稳定性,一个进程的错误不会影响其他进程。
- 简化程序设计:虚拟内存使得程序设计人员可以将内存视为连续的地址空间,而不需要关注物理内存的限制和分配。程序可以使用大量的虚拟内存,而不必担心物理内存的实际大小。
- 提高性能:虚拟内存通过提供更大的地址空间和内存管理机制,可以提高系统的性能。它允许操作系统将常用的页面保留在物理内存中,减少了磁盘访问次数,提高了访问速度。
7.虚拟地址到物理地址怎么映射的?⭐⭐⭐
虚拟地址到物理地址的映射是通过页表(Page Table)来实现的。页表是一种数据结构,记录了虚拟页和物理页之间的映射关系。
虚拟地址到物理地址的映射是通过页表实现的。页表是一种数据结构,记录了虚拟页和物理页之间的对应关系。
当程序访问虚拟地址时,操作系统通过页表将其转换为物理地址。具体过程如下:
- 程序生成虚拟地址。
- 虚拟地址由两部分组成:页表索引和页内偏移。页表索引用于在页表中查找对应的页表项。
- 操作系统根据进程的页表找到对应的页表项。
- 页表项中包含了物理页的地址信息。
- 操作系统将虚拟页的高位替换为物理页的高位,形成物理地址的高位部分。
- 将物理地址的高位部分与虚拟地址的低位部分(页内偏移)组合,得到最终的物理地址。
这样,通过页表的映射过程,程序可以通过虚拟地址来访问对应的物理内存。
三级页表转换方法:(两步)
(1)逻辑地址转线性地址:段起始地址+段内偏移地址=线性地址
(2)线性地址转物理地址:
每一个32位的线性地址被划分为三部分:页目录索引(10位)、页表索引(10位)、页内偏移(12位)
- 从cr3中取出进程的页目录地址(操作系统调用进程时,这个地址被装入寄存器中)
- 页目录地址 + 页目录索引 = 页表地址
- 页表地址 + 页表索引 = 页地址
- 页地址 + 页内偏移 = 物理地址

8.中断和异常的区别⭐⭐⭐⭐
当将中断和异常进行对比时,可以注意以下几个方面的区别:
1. 触发方式:
- 中断:由外部设备或其他特殊事件触发,如外部设备请求处理器的服务或时钟中断。
- 异常:由当前执行的指令引发,表示当前指令无法正常执行或发生了错误,如除零错误、越界访问、非法指令等。
2.异步性:
- 中断:是异步事件,与当前程序的执行无关,可以在任何时刻发生。
- 异常:是同步事件,由当前执行的指令引发,与当前程序的执行步骤相关。
3. 处理机制:
- 中断:发生中断时,处理器立即中断当前正在执行的程序,保存当前程序的上下文,并跳转到中断处理程序来处理中断事件。处理完中断后,处理器恢复之前被中断的程序的上下文,并继续执行。
- 异常:发生异常时,处理器立即中断当前指令的执行,保存当前程序的上下文,并跳转到异常处理程序来处理异常情况。处理完异常后,处理器根据异常处理程序的指示继续执行。
4. 类型:
- 中断:中断没有明确的类型,但可以根据中断源进行分类,如外部设备中断、时钟中断等。
- 异常:异常可以分为故障(Fault)、陷阱(Trap)和终止(Abort)三种类型。故障表示可以被修复的异常,陷阱用于实现系统调用和调试功能,终止表示无法恢复的异常。
5. 优先级:
- 中断:中断可以具有不同的优先级,处理器按照优先级处理中断事件,高优先级的中断会打断低优先级的中断处理。
- 异常:异常没有明确的优先级概念,处理器通常按照异常的严重程度来处理。
6. 外部设备:
- 中断:中断通常与外部设备的交互相关,用于处理外部设备的请求和数据传输。
- 异常:异常与外部设备无直接关联,主要用于处理指令执行过程中的错误或异常情况。
9. 请解释一下操作系统的文件访问方式,包括顺序访问、随机访问和直接访问。⭐⭐
操作系统的文件访问方式包括顺序访问、随机访问和直接访问。这些访问方式决定了如何在文件中读取和写入数据。
1. 顺序访问(Sequential Access):
- 顺序访问是按照数据在文件中的顺序进行访问的方式。
- 读取数据时,必须从文件的开头开始,依次读取每个数据项,直到达到目标位置。
- 写入数据时,新的数据将追加到文件的末尾。
- 顺序访问适用于顺序处理数据的场景,如读取日志文件或批量处理数据。
2. 随机访问(Random Access):
- 随机访问允许根据数据在文件中的位置进行直接访问。
- 读取数据时,可以通过指定数据在文件中的位置或偏移量来读取特定位置的数据。
- 写入数据时,可以将数据直接写入文件的指定位置。
- 随机访问适用于需要快速访问文件中特定位置的数据的场景,如数据库系统或索引文件。
3. 直接访问(Direct Access):
- 直接访问允许通过记录的标识符(如文件中的记录号)直接访问文件中的数据。
- 读取数据时,可以通过记录的标识符来定位和读取特定记录的数据。
- 写入数据时,可以将数据直接写入文件中指定记录的位置。
- 直接访问适用于需要根据记录标识符快速访问文件中数据的场景,如数据库系统或索引文件。
相关文章:
操作系统高频(七)虚拟地址与页表
操作系统高频(六)虚拟地址与页表 1.什么是文件系统?它的作用是什么?⭐ 存储管理:文件系统负责管理计算机的存储设备,如硬盘、固态硬盘等。它将文件存储在这些设备上,并负责分配和回收存储空间…...
openEuler24.03 LTS下安装Flume
目录 前提条件 下载Flume 解压 设置环境变量 修改日志文件 测试Flume 在node2安装Flume 前提条件 Linux安装好jdk Flume一般需要配合Hadoop使用,安装好Hadoop完全分布式集群,可参考:openEuler24.03 LTS下安装Hadoop3完全分布式 下载F…...
现代几何风格网页标牌标识logo海报标题设计psai英文字体安装包 Myfonts – Gilroy Font Family
Gilroy 是一款具有几何风格的现代无衬线字体。它是原始 Qanelas 字体系列的弟弟。它有 20 种粗细、10 种直立字体和与之匹配的斜体。Light 和 ExtraBold 粗细是免费的,因此您可以随心所欲地使用它们。设计时考虑到了强大的 opentype 功能。每种粗细都包括扩展语言支…...
ControlNet-Tile详解
一、模型功能与应用 1. 模型功能 ControlNet-Tile模型的主要功能是图像的细节增强和质量提升。它通过以下几个步骤实现这一目标: 语义分割:模型首先对输入的图像进行语义分割,识别出图像中不同的区域和对象。这一步是为了让模型理解图像的内…...
leetcode 2873. 有序三元组中的最大值 I
欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 文章目录 题目描述题目剖析&信息挖掘解题思路方法一 暴力枚举法思路注意复杂度代码实现 方法二 公式拆分动态规划思路注意复杂度代码实现 题目描述 [2873] 有序三元…...
Java创建对象和spring创建对象的过程和区别
暮乘白帝过重山 从new到IoC的演进,体现了软件工程从"怎么做"到"做什么"的思维转变。理解Java对象创建的底层机制,是写出高性能代码的基础;掌握Spring的Bean管理哲学,则是构建可维护大型系统的关键。二者如同…...
RabbitMQ应用2
RabbitMQ应用2 一.实际业务逻辑订单系统中使用MQ(不写订单系统逻辑)1.项目的创建和准备2.代码实现ControllerConfigurationproperties 二.物流系统使用MQ(不实现物流系统业务)1.项目创建同订单(一样)2.代码…...
Windows 实战-evtx 文件分析--笔记
Windows 取证之EVTX日志 - 蚁景网安实验室 - 博客园 一.evtx日志文件是什么 从 Windows NT 6.0(也就是 Windows Vista 和 Windows Server 2008)开始,微软引入了一种全新的日志文件格式,称为 evtx。这种格式取代了之前 Windows 系…...
Vue3的组件通信
父子通信 父传子 1.父组件给子组件添加属性传值 const myCount ref(10) ... <son :count"myCount"/>2.子组件通过defineProps编译器宏接收 const props defineProps({count: Number })3.子组件使用 {{count}}子传父 1. 父组件实现处理函数 const getM…...
【postgresql】锁概览
常规锁 场景测试案例...
python中的 f 是什么意思,f‘{username}_log_archive_{int(time.time())}.txt‘
python中的 f 是什么意思,f’{username}log_archive{int(time.time())}.txt’ 在 Python 中,f 是一种字符串前缀,用于创建格式化字符串(也称为 f-string),它是 Python 3.6 及更高版本引入的一种方便的字符串格式化方式。 基本语法和功能 当你在字符串前加上 f 前缀时,…...
子组件使用:visible.sync=“visible“进行双向的绑定导致该弹窗与其他弹窗同时显示的问题
问题描述:最近写代码时遇到了一个问题:点击A弹窗后关闭,继续点击B弹窗,这时会同时弹窗A、B两个弹窗。经过排查后发现在子组件定义时使用了:visible.sync"visible"属性进行双向的数据绑定 <template> <el-dial…...
【AI产品分享】面向图片的原始位置翻译功能
1. 背景 在撰写文字材料时,往往需要配套图像以增强表达效果。然而,有时自己绘制的图可能达不到理想的质量,而在其他文献材料中却能发现更清晰、直观的示例。希望在“站在巨人的肩膀上”优化自己的图像时,通常希望在保留原始图像的…...
存储型XSS漏洞解析
一、存储型XSS漏洞的核心原理 定义与攻击流程 存储型XSS(Stored XSS)是一种将恶意脚本永久存储在服务器端(如数据库、文件系统)的跨站脚本攻击方式。其攻击流程分为四步: 注入阶段:攻击者通过输入点&…...
【无标题】跨网段耦合器解决欧姆龙CJ系列PLC通讯问题案例
欧姆龙CJ系列PLC不同网段的通讯问题 一、项目背景 某大型制造企业的生产车间内,采用了多台欧姆龙CJ系列PLC对生产设备进行控制。随着企业智能化改造的推进,需要将这些PLC接入工厂的工业以太网,以便实现生产数据的实时采集、远程监控以及与企业…...
K8S学习之基础七十二:Ingress基于Https代理pod
Ingress基于Https代理pod 1、构建TLS站点 (1)准备证书,在xianchaomaster1节点操作 cd /root/ openssl genrsa -out tls.key 2048 openssl req -new -x509 -key tls.key -out tls.crt -subj /CCN/STBeijing/LBeijing/ODevOps/CNak.lucky.com…...
node.js版本管理
概述 遇到了版本升级后,以前项目不兼容的问题。 下载一个node.js的版本管理工具,官网下载地址,可以选择版本下载,我选择的1.11.1版本的。下载完成后点击安装,分别选择nvm安装目录和nodejs的安装目录,点击安…...
Gartner预计2025年AI支出达6440亿美元:数据中心与服务器市场的关键驱动与挑战
根据Gartner最新预测,2025年全球生成式人工智能(GenAI)支出将达到6440亿美元,较2024年增长76.4%,其中80%的支出将集中于硬件领域,尤其是集成AI能力的服务器、智能手机和PC等设备。这一增长的核心驱动力来自…...
clickhouse集群版本部署文档
集群版本介绍 clickhouse是表级别的集群,一个clickhouse实例可以有分布式表,也可以有本地表。本文介绍4个节点的clickhouse情况下部署配置。 分布式表数据分成2个分片,2个副本,总共4份数据: 节点1数据:分…...
AI提示词:好评生成器
提示说明 生成一段幽默的好评 提示词 # Role: 好评生成器# Profile: - author: xxx - version: 1.0 - language: 中文 - description: 生成一段幽默的好评## Goals: - 根据用户提供的体验优点生成一段幽默的好评 - 视角采用第一人称来描述(站在用户的视角) - 用词口语化、语…...
重新安装VMware tools为灰色无法点击问题解决|读取电脑文件的共享文件夹方法
1.问题VMware tools为灰色 sudo systemctl status vmware-tools 显示:Unit vmware-tools.service could not be found. 改 检测方式 弹出(之前没有) 在重启的瞬间点安装 弹出: 双击打开 右键打开终端,解压 cd ~ ta…...
构造超小程序
文章目录 构造超小程序1 编译器-大小优化2 编译器-移除 C 异常3 链接器-移除所有依赖库4 移除所有函数依赖_RTC_InitBase() _RTC_Shutdown()__security_cookie __security_check_cookie()__chkstk() 5 链接器-移除清单文件6 链接器-移除调试信息7 链接器-关闭随机基址8 移除异常…...
mycat --分片规则--
文章目录 MyCat分片规则详解1. rule1 (基于id的func1算法)2. sharding-by-date (按日期分片)3. rule2 (基于user_id的func1算法)4. sharding-by-intfile (基于枚举值分片)5. auto-sharding-long (长整型范围分片)6. mod-long (取模分片)7. sharding-by-murmur (MurmurHash分片)…...
wireshark抓包分析数据怎么看 wireshark使用教程_wireshark怎么看
Wireshark与Sniff Master:网络抓包工具使用指南 网络抓包分析是开发测试和网络故障排查中不可或缺的技能。在众多抓包工具中,Wireshark无疑是最流行且功能强大的选择,而Sniff Master作为后起之秀,也因其简洁高效的特点受到许多专…...
Outlook客户端无法连接到服务器,添加账户显示“无网络连接,请检查你的网络设置,然后重试。[2603]”
1、先切换一下到手机热点或者其他网络,判断是不是现在所连接的网络的问题。如果有VPN代理软件,网银软件,加密软件在后台运行,麻烦退出一下。 2、打开电脑上的 控制面板——网络和Internet——Internet选项——高级——先点击还原…...
LlamaIndex实现RAG增强:融合检索(Fusion Retrieval)与混合检索(Hybrid Search)
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...
递归(实践版)
这篇博客我不会写太多细节,我只做一件事,那就是教你如何写好一个递归. 二叉树的后序遍历 public void dfs(TreeNode root){if(rootnull)return;dfs(root.left);dfs(root.right);System.out.println(root.val); } 归并排序 public void merge(int[] nums,int left,int right)…...
JavaScript instanceof 运算符全解析
JavaScript instanceof 运算符全解析 核心语义: 判断一个对象(object)是否属于某个构造函数(constructor)或类的实例,基于原型链(prototype chain)实现类型检测。 一、JavaScript 中的基础用法 1. 语法结构 object instanceof constructor 返回值:布尔值(true/fal…...
蓝桥杯冲刺:一维前缀和
系列文章目录 蓝桥杯系列:一维前缀和 文章目录 系列文章目录前言一、暴力的写法:二、一维前缀和的模板: 具体实现: 三、具体例题:求和 1.题目参考:2.以下是具体代码实现: 总结 前言 上次我介绍…...
Ubuntu24.04-中文输入法的切换
Ubuntu24.04在安装后自带中文全拼输入法。。 根据官方的说明,需使用 shift super 空格 切换输入法,但在之前使用windows或者ubuntu的早些版本,多使用 Ctrl 空格 的方式切换输入法,本文就介绍如何进行输入法快捷键切换的配置&a…...
