- 博客(33)
- 收藏
- 关注
原创 项目代码笔记
符号含义等价于示例\d数字[0-9]\d{11}匹配11位数字\D非数字[^0-9]\w单词字符\w+匹配单词\W非单词字符\s空白字符\S非空白字符。
2026-06-27 13:10:04
536
原创 虚拟地址与内存管理底层详解
一、四谈虚拟地址二、进程与线程(开个头):一个运行起来的执行流,一个加载到内存中的程序。从内核角度看,:进程内部的一个执行流,更轻量化三、物理内存管理单元:页框(页帧,物理页)为什么要以4KB为单位?磁盘和物理内存之间的IO以4KB为单位,所以内存也按4KB划分,每个4KB单元称为(或页帧,也叫物理页)。页框的状态管理内存被划分成一个个4KB的页框,每个页框有不同的状态(空闲、忙碌等)。OS需要对每个页框进行管理——。
2026-03-12 12:39:23
377
原创 信号处理中的不可重入函数与 volatile ,以及一些补充
一、不可重入函数与重入问题什么是重入?当和同时(或交替)执行同一个函数时,就发生了为什么不可重入?如果一个函数使用了或如果 main 执行到第 1 步后被信号中断,handler 也调用了inserthandler 修改了global返回 main 后,第 2 步继续执行,global就乱套了:大部分函数都是不可重入的,因为它们或多或少会用到全局数据。二、volatile 关键字编译器优化带来的问题编译器发现flag它flag。但如果 handler 修改了flagmain 循环永远不知道。
2026-03-12 12:22:11
262
原创 软中断--用指令连接系统调用
十四、软中断演示图一、什么是软中断?是 CPU 通过执行特定指令(intsyscall)主动触发的中断,不需要外部硬件参与。:外设发信号给 CPU(如键盘、时钟):程序主动执行一条指令,让 CPU 像处理硬件中断一样去执行内核代码二、int 0x80 是什么?int 0x80是一条汇编指令,意思是:触发 0x80 号软中断。int:interrupt 的缩写0x80:中断号(128)当 CPU 执行这条指令时:暂停当前程序保护现场(保存寄存器等)根据中断号 0x80,去。
2026-03-11 19:58:22
483
原创 Linux 信号机制--最终章-信号处理
因为 pending 是内核的“待办事项清单”,由内核根据事件自动填写。如果用户能随意修改,就可以伪造信号,破坏系统安全。但 handler 执行完后,还要回到内核,再由内核返回用户态的原代码。所以必须等进程准备返回用户态时,内核“顺便”检查一下有没有信号要处理。但是我们也有修改的方式,那就是我们前面讲的5种产生信号的方式。,而是在“合适的时候”才处理。它再次陷入内核,告诉内核“信号处理完了,恢复原进程”内核修改进程的上下文,让 CPU 返回用户态时。handler 是用户代码,必须在用户态执行。
2026-03-11 12:31:39
395
原创 时钟中断与进程调度:从硬件到软件的完整链条
一、问题的起点一、问题的起点在学习操作系统时,你可能会产生一个困惑:操作系统本身也是一个软件,它被谁推动执行?进程被调度、被切换,那 OS 自己什么时候介入?是操作系统的“心脏”,它定期敲醒 OS,让 OS 有机会“插进来”做各种管理维护工作。二、时钟中断的整体流程第 0 步:系统初始化把(汇编函数)注册到中断向量表,告诉 CPU:当时钟中断来时,去执行它。第 1 步:硬件触发中断时钟源(集成在 CPU 内部或外部晶振)以固定频率(如 100Hz)发出电信号CPU 收到中断,
2026-03-11 12:20:30
418
原创 Linux 信号机制--续1
一、信号的核心数据结构每个进程的 PCB(这三张表都是sigset_t:某位为 1 表示该信号被屏蔽(暂时不处理):某位为 1 表示已收到该信号(等待处理):存的是函数指针(SIG_DFL、SIG_IGN 或自定义函数)二、信号的三个核心阶段如果在进程解除对某信号的阻塞之前这种信号产⽣过多次,将如何处理?POSIX.1允许系统递送该信号⼀次或多次。Linux是这样实现的:常规信号在递达之前产⽣多次只计⼀次,⽽实时信号在递达之前产⽣多次可以依次放在⼀个队列⾥。三、信号屏蔽字的操作SIG_BLOCK。
2026-03-10 18:50:59
434
原创 Linux 信号机制
一、信号是什么信号是操作系统向进程发送的,告诉进程“某个事件发生了”。我们可以把信号理解为——它不是帮进程做事,只是告诉进程“该做事了”。信号从产生到处理,经历三个阶段:二、信号的处理方式大部分信号的默认操作都是。就像红灯的默认操作是让车停下来一样,信号的“默认”就是系统预设的动作。但进程也可以自己处理信号:调用signal函数注册一个处理函数(handler)当信号来临时,:信号编号,是数字,其实就是信号的编号,通过可以看到所有信号。
2026-03-10 18:33:58
395
原创 System V IPC 三大件基础
生成一个唯一性很强键值,但注意即便如此也可能会出现相同的key,这时,只需要随意更改ID即可,路径也可以,但是改ID更好。2.消息队列内部函数(各个PIC的函数都很像)实际上就是数组下标,结合序列号防止重用。信号量就是用来保护共享资源的计数器。System V IPC 三大件。将共享内存段与当前进程脱离。五、system V信号量。临界资源的代码(⾮临界区)system V共享内存。system V消息队列。1.获取key(不说了)功能:⽤来创建共享内存。1.并发编程,概念铺垫。2.临界区和临界资源。
2026-03-09 14:37:49
330
原创 从零实现一个进程池(基于管道通信)
进程池是什么?简单说就是预先创建一批子进程,让它们等着,有任务来了就分配一个去执行。这样就不用每次有任务都现fork,省了创建进程的开销。#pragma once // 防止头文件重复包含// 定义任务类型:一个可调用对象,无参数无返回值// 任务1:模拟下载功能std::cout << "我是一个下载任务,进程ID: " << getpid() << std::endl;// 这里可以放真正的下载代码// 任务2:模拟数据库操作。
2026-03-08 10:47:20
367
原创 进程间通信(IPC)
因为当年程序员复用文件代码的时候,文件本身的设计就是单向的——数据写入缓冲区然后被刷新到磁盘,这个过程天然就是单向的。现实中也一样,天然气管道是单向的,下水管道也是单向的,道理相通。比如一个负责读的进程,如果不关写端,它有可能把自己刚写进去的数据又读走了——这就乱套了。这时候读端会阻塞,这是管道的同步机制在工作——有写端在,将来可能还有数据,所以要等。但因为管道是专门设计的,读写位置管理是独立的,不会互相干扰。我们写的代码里,明明打开了文件(有文件描述符),但看不到路径,也看不到文件名。
2026-03-07 15:53:34
370
原创 深入理解动态库:从编译到运行的完整旅程
这也是和静态链接的区别之一,静态链接是直接把库整体拷贝到了程序里,所以不可共享,想要用就得自己有,动态库则是只存在一份,但是他把自己的名片(自己的物理地址以及内部函数的物理地址)发给那些想使用自己的进程。里的库函数去将该进程所有库的起始地址(虚拟地址)加上其内部的库函数的偏移量,用这个结果去修改进程代码区里那些调用了库函数的call后面的实际地址(其实是修改对GOT表中对应的地址),在这个时候才去做。PLT这种即用即读的方式和写时拷贝很像,延迟绑定和写时拷贝有相似的思想:用到时才真正分配/解析,提高效率。
2026-03-05 19:06:02
343
原创 Ext2文件系统下的路径解析
目录本身也是文件,内容是"文件名→inode号"的映射表路径名解析就是不断重复:读目录 inode → 读目录数据块 → 找下一层名字 → 得到下一层 inode内核有 dcache 缓存最近访问的目录项,实际查找更快。
2026-02-23 09:38:38
615
原创 基础-IO
文件描述符fd其实就是文件(struct file)在文件描述符表里的下标进程PCB里存有描述被打开的文件的一个结构体(struct files_struct),这个结构体里有一个指针数组(struct file* fd_array[]),在这个指针数组里,存放着任何一个被当前进程打开的文件的id,而这个id就叫做文件描述符fd每个设备都可以有⾃⼰的read、write,虽然名字一样,但各自实现的方式不同。但通过。
2026-02-20 13:14:18
599
原创 MySQL--事务
特性说明示例Atomocity 原子性要么全成功,要么全失败转账的两个步骤不可分割Consistency 一致性数据状态保持一致转账前后总金额不变Isolation 隔离性事务之间互不干扰两个人同时转账不会乱Durability 持久性一旦提交,永久保存系统重启数据还在维度没有事务有事务程序员关注网络、并发、崩溃、恢复...业务逻辑本身代码复杂度极高,要处理各种异常极低,只有BEGIN/COMMIT错误处理自己写补偿逻辑数据库自动ROLLBACK并发控制自己加锁、解锁。
2026-02-19 17:52:42
291
原创 Liunx-网络
网络协议栈分为五层结构:数据链路层(驱动层)、网络层和传输层(操作系统内核层)、应用层(用户层)。TCP/IP协议栈以核心协议TCP和IP命名,涵盖一组协议,数据封装和解包过程类似栈操作。IP地址标识全局主机,MAC地址标识局域网设备,端口号区分进程通信。Socket包含套接字地址(IP+端口)和内核数据结构,TCP通过双缓冲区实现全双工传输。数据粘包问题需通过序列化解决,网络传输采用大端字节序。
2026-01-22 19:02:37
624
原创 《Волчонок》
对于非指针部分,他们的初始化和赋值属于“内存拷贝”,也就是值拷贝。浅拷贝复制指针,深拷贝递归拷贝指针指向的数据(结果和值拷贝一样)指针则类似于int*、char*或者int&,double&非指针部分包含int、char、double这种类型。1.内置类型包含指针(引用)和非指针两部分。对于指针部分,他们的拷贝分为浅拷贝和深拷贝。
2026-01-01 17:33:00
112
原创 deque,list,vector各自的优缺点
优点:1.极致的下标随机访问2.CPU高速缓存命中率高(当CPU一次读取一定空间的缓存时,如果读取到了vector从内存 放到缓存里的数据时,即为命中)缺点:1.头部或中部的插入效率低下,因为要挪动数据2.扩容存在浪费。
2025-11-26 16:15:58
135
原创 list2
2.initializer_list<T>是 C++11 引入的一个轻量级标准库类模板,用于表示花括号初始化列表。3.用户自定义类型转换,这里比如转换构造函数,list_iterator(Node* node) ://单参数构造函数(转换构造函数)支持类型转换。「1.隐式类型转换,除了基本隐式类型转换,其余隐式的比如用户自定义类型转换这些也属于隐式的转换。1.拷贝构造:auto & m在范围for里的作用,m其实得到的是对象的迭代器的解引用。2.显示类型转化,除了基本显示类型转换,其余.........
2025-11-23 10:36:16
171
原创 位运算的简述
全1为1,有0为05 & 35 的二进制:01013 的二进制:0011进行与运算:0001(十进制 1):x & 1结果为 1 -> 奇数(最后一位是1)结果为 0 -> 偶数(最后一位是0): 例如,取数X的低4位,可以用X & 0xF(0xF的二进制是1111)。: 想让哪一位变为0,就和一個该位为0、其他位为1的数进行与操作。
2025-10-28 13:44:36
328
原创 汉字的特殊
中文字符在统一码中占据两个字节,两个字节用来表示一个汉字,并且对于此时的字符串来说,其第0个和第1个位置的字节都用来表示第一个汉字。并且除了英文字符(字母数字和图形)外的所有字符,其二进制码都是负数,因为他们都是以1作为开头。除此之外还有UTF-16的编码格式,比如中文(也就是要用到两个字节的常用汉字)对于英文字符有对应的ascll码表来表示,英文用的是UTF-8的编码格式。对于非常用汉字,则需要用更广的编码格式来表示。
2025-10-27 16:26:05
194
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1