操作系统-锁/内存/中断/IO
文章目录
- 锁
- 自旋锁
- 互斥锁
- 悲观锁和乐观锁
- 内存管理
- 物理/虚拟内存
- 页表
- 段表
- 虚拟内存布局
- 写时复制copy on write
- brk,mmap
- 页面置换算法
- 中断
- 中断分类
- 中断流程
- 网络I/O
- I/O模型
- 服务器处理并发请求
锁
自旋锁
自旋锁是一种基于忙等待(Busy-Waiting)的同步机制。
通过 CPU 提供的 CAS 函数),完成加锁解锁操作:
第一步:查看锁的状态,为空,则执行第二步
第二步:将锁设置为当前线程持有
这两步是原子指令,要么一次性执行完,要么都不执行。
当线程尝试获取锁失败时,它会循环检查锁的状态(“自旋”),直到它拿到锁。
等待时间较短的情况下效率较高,因为避免了线程上下文切换的开销。但长时间等待会导致CPU资源的浪费。
适用于多核系统,且临界区代码执行时间非常短的场景。
互斥锁
在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁,确保同一时间只有一个线程访问共享资源。
自旋锁和互斥锁的区别
工作机制:自旋锁在获取不到锁时会一直循环检查,而互斥锁会让线程进入睡眠(挂起)状态,调度其他线程运行。
适用场景:自旋锁适合保护执行时间极短的代码段,自旋的代价可能小于线程切换的代价。互斥锁适合保护执行时间较长的代码段
性能影响:自旋锁无上下文切换开销,但一直占用CPU,互斥锁挂起唤醒线程产生下上文切换开销,但等待期间CPU执行其他任务,资源利用率更高.
实现复杂度:自旋锁依赖CAS原子操作,不需要操作系统调度,而互斥锁复杂度高,依赖操作系统调度
悲观锁和乐观锁
悲观锁:先加锁,再操作
认为并发操作一定会发生冲突,因此每次访问数据时都会加锁,比如synchronized和ReentrantLock。
适用写多的场景。
举个例子:出门时锁门(默认有小偷)
乐观锁:先操作,提交时再检查冲突
认为并发操作很少发生冲突,只在提交操作时检查是否冲突,比如CAS操作,数据库的乐观锁和Java中的Atomic类。
适用读多写少。
举个例子:
1.购物车结算时才检查库存(默认没人抢购)
2.或者在网上订票,系统显示还有1个座位,你点击预订,系统会先让你填写信息,然后提交的时候检查是否还有座位。如果有,预订成功;如果没有,提示你重新选择
内存管理
计算机系统的核心功能之一,其目标是高效、安全地管理物理内存和虚拟内存资源,确保多个进程能共享内存且互不干扰
物理/虚拟内存
-
物理内存
计算机硬件中的实际内存芯片,容量固定,由硬件决定,直接由CPU通过物理地址访问,是程序运行的真实存储空间。
-
虚拟内存
操作系统为每个进程提供的逻辑地址空间,独立于物理内存,通过通过页表、MMU(内存管理单元,负责管理内存访问和地址转换)、缺页中断等机制管理,将虚拟地址映射到物理地址或磁盘空间。
-
虚拟内存允许程序使用比物理内存更大的地址空间
-
每个进程拥有独立的虚拟地址空间,彼此无法直接访问对方内存,避免恶意或错误操作。
-
页表
操作系统与硬件(如MMU)协作实现虚拟内存的核心数据结构,负责记录虚拟地址到物理地址的映射关系。
核心作用
- 地址映射
将进程的虚拟页号 映射到物理内存的物理页号。 - 权限控制
通过页表项的权限位(读/写/执行)限制内存访问。 - 状态标记
记录页是否在物理内存中、是否被修改过等状态信息。
工作流程
- 把虚拟内存地址,切分成页号和页内偏移量
- 根据页号,从页表里面,查询对应的物理页号
- 直接拿物理页号,加上前面的偏移量,就得到了物理内存地址。
如果在页表中没有相应页号,触发缺页中断。此时进入系统内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行。
段表
虚拟地址也可以通过段表与物理地址进行映射的
- 程序的内存空间被划分为多个逻辑段,每个段代表一个逻辑单元
- 每个段有独立的基址(起始地址)和界限(长度)
- 段的大小可变,与程序逻辑直接对应(例如代码段大小取决于代码量)
- 物理地址 = 段基址 + 段内偏移
虚拟内存布局
1. 代码段
- 位置:低地址起始(如
0x400000
)。 - 内容:编译后的机器指令(可执行代码)。
- 权限:只读+可执行(防止代码被篡改)。
- 示例:
main
函数、库函数的指令。
2. 数据段
- 位置:紧接代码段。
- 内容:已初始化的全局变量和静态变量。
- 权限:可读写,不可执行。
- 示例:
int global_var = 42;
。
3. BSS段
- 位置:紧接数据段。
- 内容:未初始化的全局变量和静态变量。
- 权限:可读写。
- 示例:
int uninitialized_var;
。
4. 堆
- 位置:BSS段之上,向高地址增长。
- 管理:通过
malloc
、free
动态分配内存。 - 特点:碎片化问题常见,需手动管理(或依赖垃圾回收)。
- 示例:
int *arr = malloc(100 * sizeof(int));
。
5. 文件映射区域
- 位置:堆与栈之间。
- 内容:
- 共享库(如
libc.so
、libm.so
)。 - 内存映射文件(通过
mmap
映射的文件)。 - 匿名映射(用于大块内存分配,如
malloc
可能使用mmap
)。
- 共享库(如
- 权限:按需设置(如可读写、可执行)。
6. 栈
- 位置:高地址区域(如
0x7FFFFFFFFFFFF000
),向下增长。 - 内容:函数调用栈帧(局部变量、返回地址、函数参数)。
- 管理:自动分配/释放内存,由编译器控制。
- 限制:栈大小固定(默认几MB,可通过
ulimit
调整)。 - 示例:
int local_var = 10;
。
7. 内核空间
- 位置:虚拟地址空间的高位(如64位Linux中高128TB)。
- 权限:仅内核态可访问,用户进程无权直接读写。
- 内容:内核代码、数据结构、设备内存映射等。
写时复制copy on write
COW,一种内存管理优化技术,延迟数据的物理拷贝,直到真正需要修改数据时才进行复制。
-
问题场景:
假设父进程和子进程共享同一物理内存页(未复制),且子进程修改了某个变量。如果此时父进程读取该变量,会发现值被意外改变。- 示例:
父进程定义变量int x = 42
,子进程修改x = 100
。若未复制,父进程的x
也会变为 100,导致逻辑错误。
- 示例:
-
COW 的解决方案:
当子进程尝试写入x
时,触发复制,子进程获得独立的物理页副本。- 父进程的
x
保持 42,子进程的x
变为 100,两者互不影响。
- 父进程的
具体步骤:
- 步骤1:共享内存页
调用fork()
时,子进程与父进程共享所有物理内存页,页表项标记为只读。 - 步骤2:触发复制
- 当父进程或子进程尝试写入共享页时,触发缺页中断。
- 操作系统捕获中断,检查触发原因是 COW,执行以下操作:
- 分配新的物理页,复制原页内容到新页。
- 更新触发写入的进程的页表项,指向新物理页,并标记为可写。
- 另一进程仍指向原物理页(保持只读,直到其写入时触发复制)。
- 步骤3:后续操作
- 修改后的页独立于原页,后续写入不再触发复制。
COW有什么好?
fork()的时候,子进程不需要复制父进程的物理内存,只需要复制父进程的页表,避免了不必要的内存复制开销,这时候父子进程的页表指向的都是共享的物理内存。
只有当父子进程任何有一方对这片共享的物理内存发生了修改操作,这时候才会复制发生修改操作的物理内存。
brk,mmap
int *arr = malloc(100 * sizeof(int))
这里的动态分配内存malloc():
1.如果请求分配的内存<128KB,则通过brk()申请
2.如果请求分配的内存>128KB,则通过mmap()申请
-
brk:修改指针,向高地址移动,获得新内存空间
-
mmap:从文件映射区申请一块内存
如果物理内存不足
当使用malloc()申请虚拟内存时,如果虚拟内存还没有映射到物理内存,CPU产生缺页中断,缺页中断函数查看是否有空闲物理内存,有则建立虚拟与物理内存的映射,如果没有,则开始回收内存(页面置换/丢弃/终止):
回收内存,包括:
- 页面置换
- 将部分物理内存页换出到磁盘(Swap空间),释放物理内存供其他进程使用。
- 释放可丢弃的干净页
- 直接丢弃未被修改的页(如代码段、文件缓存页),无需写回磁盘。
- 终止进程(OOM Killer)
- 强制终止占用内存过多的进程,释放其所有内存(极端情况下的最后手段)。
1.后台内存回收:唤醒 kswapd 内核线程来回收内存(异步,不阻塞进程执行)
2.直接内存回收:如果异步回收速度跟不上申请内存速度,则直接回收(同步,阻塞进程执行)
哪些内存可以被回收?
- 文件页
内核缓存的磁盘数据(Buffer)和内核缓存的文件数据(Cache)都叫作文件页。需要读时,重新读取磁盘即可。而如果修改过但还没写入磁盘的数据(脏页)需要先写进磁盘,才进行回收。
- 匿名页
无实际载体,所以不能直接释放内存。会把不常访问的内存先写到磁盘,再释放这些内存。
如果经过上面的步骤物理内存仍不满足,则触发Out-Of-Memory Killer
- OOM根据算法杀死一个占用物理内存较高的进程,释放其内存资源
- 如果依然不满足,继续杀死,直至释放足够物理内存
页面置换算法
页面置换,内存回收的核心手段之一。
选择一个物理页面换出到磁盘,然后把需要访问的页面换入到物理页。
-
最佳页面OPT
思想:置换出在未来长时间不会使用的页面
-
先进先出FIFO
思想:换出在内存中占用时间最长的页面
-
最近最久未使用LRU
思想:换出前面长时间没有访问过的页面
-
时钟页面LOCK
思想:将所有页面存在环形链表,每页需要一个访问位(0:未访问1:已访问)
初始:所有页访问位为0
缺页时,指针移动,
访问位为1:重置为0,指针后移
访问位为0:选择,换出内存
-
最不常用LFU
思想:对每个页面增加一个访问计数器,被访问一次,计数器+1,发生缺页中断时,换出访问次数最少的页面,
中断
计算机系统响应外部或内部事件的机制,允许 CPU 暂停当前任务,转而处理紧急或异步事件(如键盘输入)。处理完后回来继续执行刚才的任务。
中断机制是操作系统实现多任务、设备管理、错误处理等功能的基础
中断分类
外部中断(硬件中断)
- 触发源:外部设备(如键盘、磁盘、定时器)。
- 类型:
- 可屏蔽中断:可通过中断屏蔽位(如
IF
标志)暂时关闭,可随时处理,甚至不处理。 - 不可屏蔽中断:必须立即处理(如硬件故障、内存校验错误)。
- 可屏蔽中断:可通过中断屏蔽位(如
内部中断(软件中断)
- 触发方式:由程序执行特定指令或发生异常。
- 异常:同步触发,由 CPU 执行指令时检测到错误(如缺页、除零)交由故障处理程序处理。
- 陷阱:一般是在编写程序时故意设下的陷阱指令,而后执行到陷阱指令后,CPU将会调用特定程序进行相应的处理,处理结束后返回到陷阱指令的下一条指令。
- 终止:发生致命错误,不可修复,程序无法继续运行,直接终止。
中断流程
-
发生中断:设备或程序触发中断,发送信号到 CPU 的中断控制器
-
中断响应:保存上下文,CPU 暂停当前任务,将程序计数器(PC)、寄存器等压入内核栈,保存当前执行现场,以便处理完中断后恢复执行。
-
中断处理:CPU根据中断向量表找到对应中断处理程序入口地址,进行中断处理
-
恢复上下文:继续执行之前的程序
网络I/O
I/O模型
网络I/O模型定义了应用程序如何管理输入和输出操作,尤其是在处理多个并发连接时如何高效利用资源
- 阻塞I/O
- 工作原理:
应用程序发起I/O操作后,进程会被阻塞,直到数据就绪或操作完成。在此期间,进程无法执行其他任务。 - 优点:
实现简单,代码直观,适合低并发场景。 - 缺点:
每个连接需独立线程/进程,资源消耗大,无法支撑高并发。 - 适用场景:
简单的客户端应用或低负载服务(实时性要求不高)。
- 工作原理:
- 非阻塞I/O
- 工作原理:
I/O操作立即返回结果(成功或错误),不会被阻塞。若数据未就绪,返回错误,应用需轮询检查状态。 - 优点:
单线程可管理多个连接,避免线程阻塞。 - 缺点:
轮询消耗CPU资源,延迟较高。 - 适用场景:
需要同时处理少量连接且对延迟不敏感的场景(多路复用)。
- 工作原理:
- I/O多路复用
- 工作原理:
使用select
、poll
、epoll
(Linux)等系统调用,同时等待多个I/O操作,当任一I/O准备就绪时通知应用处理。 - 优点:
单线程处理高并发连接,资源利用率高。 - 缺点:
事件通知后仍需同步处理I/O,编程复杂度较高。 - 适用场景:
Web服务器(如Nginx)、即时通讯等高并发服务。
- 工作原理:
- 信号驱动I/O
- 工作原理:
发起I/O请求后继续做其他事情,当I/O操作就绪时,内核发送信号通知处理,应用执行I/O操作。 - 优点:
避免轮询,减少CPU占用。 - 缺点:
信号处理复杂,可能丢失事件,多线程中难以管理。 - 适用场景:
需要异步I/O通知的场景,提高系统并发能力。
- 工作原理:
- 异步I/O
- 工作原理:
应用发起I/O请求后立即做其他事情,内核完成整个I/O操作后通知应用。 - 优点:
无阻塞,资源利用最优,适合高吞吐场景。 - 缺点:
实现复杂,需操作系统和库支持,调试困难。 - 适用场景:
高并发,高性能场景,减少系统调用,提高系统效率。
- 工作原理:
服务器处理并发请求
-
单线程web服务器
一次处理一个请求,性能低
-
多进程/多线程web服务器
服务器生成多个进程/线程并行处理多个用户请求,消耗大量系统资源
-
I/O多路复用web服务器
只用一个线程处理多个用户请求
-
多路复用多线程web服务器
避免一个进程服务于过多用户请求,生成多个进程,一个进程生成多个线程,每个线程处理一个请求
考完操作系统不久,结合小林Coding写了些笔记,感谢大家的点赞收藏>W<
相关文章:
操作系统-锁/内存/中断/IO
文章目录 锁自旋锁互斥锁悲观锁和乐观锁 内存管理物理/虚拟内存页表段表虚拟内存布局写时复制copy on writebrk,mmap页面置换算法 中断中断分类中断流程 网络I/OI/O模型服务器处理并发请求 锁 自旋锁 自旋锁是一种基于忙等待(Busy-Waiting)…...
割点与其例题
割点 定义: 若一个点在图中被去掉后,图的连通块个数增加,那么这个点就被称为“割点”。如下图所示红点。 定义说白了就是若去掉一个点,图被“断开”的点称为割点。 朴素算法: 枚举每个点 u。遍历图,如果…...
CSS实现文本自动平衡text-wrap: balance
不再有排版孤行和寡行 我们都知道那些标题,最后一个单词换行并单独站在新行上,破坏了视觉效果,看起来很奇怪。当然,有老式的 手动换行或将内容分成不同部分。但您听说过text-wrap: balance吗? 通过应用text-wrap: bal…...
【未完】【GNN笔记】EvolveGCN:Evolving Graph Convolutional Networks for Dynamics Graphs
Evolving Graph Convolutional Networks for Dynamics Graphs 视频链接:《图神经网络》 相关系列: 《Dynamic Graph的分类》《动态图网络之Dynamic Self-Attention Network》 文章目录 Evolving Graph Convolutional Networks for Dynamics Graphs一、…...
【愚公系列】《Manus极简入门》042-投资策略分析师:“投资智慧导航”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
《AI大模型应知应会100篇》第65篇:基于大模型的文档问答系统实现
第65篇:基于大模型的文档问答系统实现 📚 摘要:本文详解如何构建一个基于大语言模型(LLM)的文档问答系统,支持用户上传 PDF 或 Word 文档,并根据其内容进行智能问答。从文档解析、向量化、存储到…...
P1439 【模板】最长公共子序列
P1439 【模板】最长公共子序列 - 洛谷 题目描述 给出1, 2, …, n的两个排列P1和P2,求它们的最长公共子序列。 输入格式 第一行是一个数n。 接下来两行,每行为n个数,为自然数1, 2, …, n的一个排列。 输出格式 一个数,即…...
LLaMA-Factory:环境准备
一、硬件和系统 操作系统: Ubuntu 24.04.2 LTS(64位)GPU: NVIDIA RTX 4090 笔记本 GPU,16GB显存CPU: 建议高性能多核 CPU(如 Intel i7/i9 或 AMD Ryzen 7/9)以支持数据预处理,我的是32核。RAM: 至少 32GB&…...
polarctf-web-[rce1]
考点: (1)RCE(exec函数) (2)空格绕过 (3)执行函数(exec函数) (4)闭合(ping命令闭合) 题目来源:Polarctf-web-[rce1] 解题: 这段代码实现了一个简单的 Ping 测试工具,用户可以通过表单提交一个 IP 地址,服务器会执…...
AI实践用例---日程规划(通用日程管理文件ICS)灵感踩坑日常
我是一位践行独立开发者之路的菜鸟开发者。 由于执行力较差,常常有很多想法但是很多时候没有去践行。 所以我有了让大模型为我生成日程安排的想法,这确实可以,很简单。只需要将你的想法告诉ai就行了。 例如: 发给AI的提示词: 我想你帮我对,嗯,未来的一年做一个嗯,大…...
MySQL 8.0 OCP 1Z0-908 121-130题
Q121.Examine these statements and output: mysql> GRANT PROXY ON accountinglocalhost TO ’ ‘ ‘%’; mysql> SELECT USER(), CURRENT_USER(), proxy_user; --------------------------------------------------------- |USER() | CURRENT_USER() | proxy_user I | …...
InfluxDB 2.7 连续查询实战指南:Task 替代方案详解
InfluxDB 2.7 引入了 Task 功能,作为连续查询(CQ)的现代替代方案。本文详细介绍了如何使用 Task 实现传统 CQ 的功能,包括语法解析、示例代码、参数对比以及典型应用场景。通过实际案例和最佳实践,帮助开发者高效迁移并…...
计算机网络 : Socket编程
计算机网络 : Socket编程 目录 计算机网络 : Socket编程引言1.UDP网络编程1.1 网络地址与端口转换函数1.2 本地环回1.3 EchoServer1.4 DictServer1.5 DictServer封装版1.6 简单聊天室 2.TCP网络编程2.1 TCP Socket API详解2.2 Echo Server2.3 Echo Serve…...
C++动态内存分配
内存管理 1.代码段(Code Segment / Text Segment)常量区2. 数据段(Data Segment)静态区3. BSS 段(未初始化数据段)4. 堆(Heap)5. 栈(Stack)6. 内存映射段&…...
git版本控制学习
1.环境搭配 2.Linux常用指令 cd:更改目录cd..回到上一级目录pow:显示当前所在的目录路径li(||):列出当前目录所有文件,只不过||例出的内容更为详细touch:新建一个文件夹如touch index.js就会在当前目录下新建一个index.js文件rm:删除一个文件,rm index.js 就会把in…...
在MYSQL中导入cookbook.sql文件
参考资料: GitHub 项目:svetasmirnova/mysqlcookbook CSDN 博客:https://blog.csdn.net/u011868279/category_11645577.html 建库: mysql> use mysql Reading table information for completion of table and column names …...
安科瑞AcrelEMS3.0企业微电网智慧能源平台-安科瑞 蒋静
1、平台介绍 Acrel-EMS3.0 智慧能源平台是针对企业微电网的能效管理平台,满足江苏省《新型电力负荷管理系统数据接入规范》的技术架构,可通过云云互联方式接受电力平台的调度指令和策略下发,支持作为微网调度子系统或子平台。 2、解决方案 …...
5G-A和未来6G技术下的操作系统与移动设备变革:云端化与轻量化的发展趋势
目录 5G技术带来的革命性变革 云端化操作系统的实现路径 完全云端化模式 过渡性解决方案 未来操作系统的发展方向 功能架构演进 安全机制强化 移动设备的形态变革 终端设备轻量化 物联网设备简化 实施挑战与应对策略 技术挑战 商业模式创新 总结与展望 5G技术作为…...
TensorFlow/Keras实现知识蒸馏案例
创建一个“教师”模型(一个稍微复杂点的网络)。创建一个“学生”模型(一个更简单的网络)。使用“软标签”(教师模型的输出概率)和“硬标签”(真实标签)来训练学生模型。 import tens…...
能源数字化转型关键引擎:Profinet转Modbus TCP网关驱动设备协同升级
在工业自动化的世界中,ModbusTCP和Profinet是两个非常重要的通讯协议。ModbusTCP以其开放性和易用性,被广泛应用于各种工业设备中;而Profinet则以其高效性和实时性,成为了众多高端设备的首选。然而,由于这两种协议的差…...
大模型的实践应用43-基于Qwen3(32B)+LangChain框架+MCP+RAG+传统算法的旅游行程规划系统
大家好,我是微学AI,今天给大家介绍一下大模型的实践应用43-基于Qwen3(32B)+LangChain框架+MCP+RAG+传统算法的旅游行程规划系统。本报告将阐述基于大模型Qwen3(32B)、LangChain框架、MCP协议、RAG技术以及传统算法构建的智能旅游行程规划系统。该系统通过整合多种技术优势,实…...
【Unity】用事件广播的方式实现游戏暂停,简单且实用!
1.前言 在做Unity项目的时候,要考虑到“游戏暂停”的功能,最直接的办法是修改游戏的Time.TimeScale 0f。但是这种方式的影响也比较大,因为它会导致游戏中很多程序无法正常运行。 于是我就有了一个想法,在游戏中想要暂停的对象&…...
二维数组以及C99中的变长数组(如何在VS2022中使用苹果的clang编译器)
一、二维数组的创建 1.1 二维数组的概念 在上一篇文章中所写的称为一维数组,数组的元素都是内置类型的,如果我们把一维数组作为数组的元素,这时候就是二维数组,二维数组作为数组元素的数组被称为三维数组,二维数组以…...
影楼精修-肤色统一算法解析
注意:本文样例图片为了避免侵权,均使用AIGC生成; 本文介绍影楼精修中肤色统一算法的实现方案,并以像素蛋糕为例,进行分析说明。 肤色统一就是将人像照片中皮肤区域的颜色进行统一,看起来颜色均匀一致&…...
mac的Cli为什么输入python3才有用python --version显示无效,pyenv入门笔记,如何查看mac自带的标准库模块
根据你的终端输出,可以得出以下结论: 1. 你的 Mac 当前只有一个 Python 版本 系统默认的 Python 3 位于 /usr/bin/python3(这是 macOS 自带的 Python)通过 which python3 确认当前使用的就是系统自带的 Pythonbrew list python …...
城市内涝监测预警系统守护城市安全
一、系统背景 城市内涝是指由于强降水或连续性降水超过城市排水能力,导致城市内产生积水灾害的现象。随着气候变化和城市化进程的加快,城市内涝现象愈发频繁和严重。传统的城市排水系统已难以满足当前的城市排水需求,特别是在暴雨等极端天气条…...
ThinkPad X250电池换电池芯(理论技术储备)
参考:笔记本电池换电芯的经验与心得分享 - 经典ThinkPad专区 - 专门网 换电池芯,需要克服以下问题: 1 拆电池。由于是超声波焊接,拆解比较费力,如果暴力撬,有可能导致电池壳变形... 2 替换电池芯的时候如…...
2025第三届盘古初赛(计算机部分)
前言 比赛的时候时间不对,打一会干一会,导致比赛时候思路都跟不上,赛后简单复现一下,希望大家批批一下 计算机取证 1、分析贾韦码计算机检材,计算机系统Build版本为?【标准格式:19000】 183…...
qtc++ qdebug日志生成
本文介绍了将qdebug注册到日志系统,这样qdebug打印的信息将记录在日志文本文件,方便观看程序运行中的历史信息,但是需要注意的是,注册后qdebug的信息将不会打印在qtcreator的输出中,所以作者建议,在开发的时…...
Tomcat 配置 HTTPS 访问全攻略(CentOS 环境)
Tomcat 配置 HTTPS 访问全攻略(CentOS 环境) 一、环境说明 操作系统:CentOS Tomcat 版本:Apache Tomcat/9.0.105 服务器 IP:192.168.1.35 目标:将 Tomcat 默认的 HTTP 访问升级为 HTTPS,提…...
20250516使用TF卡将NanoPi NEO core开发板出厂的Ubuntu core22.04.3系统降级到Ubuntu core16.04.2
20250516使用TF卡将NanoPi NEO core开发板出厂的Ubuntu core22.04.3系统降级到Ubuntu core16.04.2 2025/5/16 10:58 缘起:NanoPi NEO core核心板出厂预制的OS操作系统为Ubuntu core22.04.3系统。 【虽然是友善之臂提供的最新的系统,但是缺少很多用用程序…...
针对大事务问题对业务存储过程改造
针对大事务问题对业务存储过程改造 一、问题描述 1. 问题现象 业务调用存储过程没有成功,发现存在大事务,单独拿出来执行发现问题。 greatsql> INSERT INTOywdb1.t1(TIMEKEY,zbbh,zcbl,zcblms,zjzh,zjzhms,cbzh,ljzjzh,xmbh,xmmc,sfgj,dd,ddsm,cb…...
如何解决Move to iOS 不起作用的问题?
iPhone 16系列已经上市有一段时间了。你已经把旧的 Android 手机换成了 iPhone 16 了吗?然而,当您兴奋地准备传输数据时,您发现 Move to iOS 无法正常工作。这确实令人沮丧。但不用担心,因为我们找到了 9 个有效的解决方案&#x…...
npm cross-env工具包介绍(跨平台环境变量设置工具)
文章目录 cross-env:跨平台环境变量设置工具什么是cross-env?为什么需要cross-env?平台差异带来的问题 cross-env的工作原理核心功能技术实现 安装与基本使用安装步骤基本使用方法运行效果 高级使用技巧设置多个环境变量环境变量传递与链式命…...
分布式锁: Redis和ZooKeeper两种分布式锁对比
在分布式系统中,分布式锁是协调多节点共享资源访问的核心机制。Redis 和 ZooKeeper 是两种常用的分布式锁实现方案,但两者的设计理念、适用场景和优缺点存在显著差异。本文将从 一致性模型、性能、可靠性、实现原理 等维度进行对比,并提供技术…...
笔试强训:Day5
一、笨小猴(哈希数学) 笨小猴_牛客题霸_牛客网 #include <iostream> #include <cmath> using namespace std; string s; bool isprime(int x){//试除法if(x2) return true;if(x<2||x%20) return false;int nsqrt(x);for(int i3;i<n;i…...
Flask框架搭建
1、安装Flask 打开终端运行以下命令: pip install Flask 2、创建项目目录 在Windows上: venv\Scripts\activate 执行 3、创建 app.py 文件 可以在windows终端上创建app.py文件 (1)终端中创建 使用echo命令 echo "fr…...
【Kubernetes】单Master集群部署(第二篇)
目录 前言 一、实验环境 二、操作系统初始化配置 三、部署 docker引擎 四、部署 etcd 集群 4.1 准备签发证书环境 4.2 准备cfssl证书生成工具 4.3 生成Etcd证书 4.4 启动etcd服务 4.5 检查群集状态 五、部署 Master 组件 5.1 准备软件包 5.2 创建用于生成CA证书、…...
JavaScript性能优化实战(10):前端框架性能优化深度解析
引言 React、Vue、Angular等框架虽然提供了强大的抽象和开发效率,但不恰当的使用方式会导致严重的性能问题,针对这些问题,本文将深入探讨前端框架性能优化的核心技术和最佳实践。 React性能优化核心技术 React通过虚拟DOM和高效的渲染机制提供了出色的性能,但当应用规模…...
vue3中预览Excel文件
1.前言 有时候项目中需要预览Excel文件,特别是对于.xls格式的Excel文件许多插件都不支持,经过尝试,最终有三种方案可以实现.xlsx和.xls格式的Excel文件的预览,各有优缺点 2.luckyexcel插件 2.1说明 该插件优点在于能保留源文件…...
VsCode和AI的前端使用体验:分别使用了Copilot、通义灵码、iflyCode和Trae
1、前言 大杂烩~每次开发一行代码,各个AI争先恐后抢着提供帮助 备注:四款插件都需要先去官网注册账号,安装好之后有个账号验证。 2、插件详解 2.1、AI分析的答案 GitHub Copilot 定位:老牌 AI 代码补全工具,深度集成…...
【问题排查】easyexcel日志打印Empty row!
问题原因 日志打印I/O 操作开销(如 Log4j 的 FileAppender)会阻塞业务线程,直到日志写入完成,导致接口响应变慢 问题描述 在线上环境,客户反馈导入一个不到1MB的excel文件,耗时将近5分钟。 问题排…...
若依框架SpringBoot从Mysql替换集成人大金仓(KingBase)数据库
一、安装人大金仓数据库 1、下载 前往人大金仓数据库下载自己想要的版本(建议下载Mysql兼容版)人大金仓官网,点击服务与支持,点击安装包下载 点击软件版本,选择数据库 选择合适的版本,点击下载࿰…...
Graph Representation Learning【图最短路径优化/Node2vec/Deepwalk】
文章目录 Q1:网络性质:1.数据读取与邻接表构建:2.基本特征和连通性: 算法思路:1. 广度优先搜索(BFS)标记前驱:2. 回溯生成所有最短路径: 实验结果:复杂度分析: Q2&#x…...
ZYNQ Overlay硬件库使用指南:用Python玩转FPGA加速
在传统的FPGA开发中,硬件设计需要掌握Verilog/VHDL等硬件描述语言,这对软件开发者而言门槛较高。Xilinx的PYNQ框架通过Overlay硬件库彻底改变了这一现状——开发者只需调用Python API即可控制FPGA的硬件模块,实现硬件加速与灵活配置。本文将深入探讨ZYNQ Overlay的核心概念、…...
Git基础使用方法与命令总结
Git 是一个分布式版本控制系统,用于跟踪代码或文件的修改历史。以下是 Git 的基础使用方法和常用命令,适合快速上手: 1. 安装与配置 安装 Git 下载地址:https://git-scm.com/downloads(支持 Windows/macOS/Linux&…...
rust语言,与c,go语言一样也是编译成二进制文件吗?
是的,Rust 和 C、Go 一样,默认情况下会将代码编译成二进制可执行文件(如 ELF、PE、Mach-O 等格式),但它们的编译过程和运行时特性有所不同: 1. Rust(类似 C,直接编译为机器码&#x…...
从银行排队到零钱支付:用“钱包经济学”重构Java缓存认知
"当你的系统还在频繁访问数据库银行时,聪明的开发者早已学会用钱包零钱策略实现毫秒级响应——本文将用理财思维拆解缓存设计精髓,教你如何让代码学会小额快付的架构艺术。" 【缓存】作为程序员必须理解的概念之一,让我们用 「钱…...
Json rpc 2.0比起传统Json在通信中的优势
JSON-RPC 2.0 相较于直接使用传统 JSON 进行通信,在协议规范性、开发效率、通信性能等方面具有显著优势。以下是核心差异点及技术价值分析: 一、结构化通信协议,降低开发成本 传统 JSON 通信需要开发者自定义数据结构和处理逻辑,…...
无缝部署您的应用程序:将 Jenkins Pipelines 与 ArgoCD 集成
在 DevOps 领域,自动化是主要目标之一。这包括自动化软件部署方式。与其依赖某人在部署软件的机器上进行 rsync/FTP/编写软件,不如使用 CI/CD 的概念。 CI,即持续集成,是通过代码提交创建工件的步骤。这可以是 Docker 镜像&#…...