自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(83)
  • 收藏
  • 关注

原创 【操作系统原理】线程预热

本文介绍了操作系统虚拟地址到物理地址的转换机制,重点讲解了分页管理、两级页表结构和缺页异常处理。主要内容包括:1)4KB分页的优势在于统一内存管理粒度和实现虚拟内存;2)物理内存通过页框和struct page管理;3)32位系统两级页表将地址拆分为10位页目录索引、10位页表索引和12位页内偏移;4)地址转换采用移位和掩码操作;5)页表项包含权限和状态信息;6)缺页异常时CR2寄存器保存出错地址;7)多线程共享页表,缺页异常会影响线程执行。理解这些机制是掌握多线程并发的基础。

2025-12-20 00:36:06 714

原创 【操作系统原理】信号

本文介绍了Linux信号机制的核心概念与应用。信号是Linux提供的异步事件通知机制,本质是操作系统向进程发送的"紧急通知"。文章详细讲解了信号的分类(1-31为普通信号,34-64为实时信号)、三种处理方式(默认/忽略/自定义)以及信号的常见来源(终端按键、命令调用、硬件异常等)。重点剖析了内核管理信号的机制,包括block(阻塞表)、pending(未决表)和handler(处理表)三张表的概念。文章推荐使用sigaction而非signal进行信号处理,并提供了SIGINT、SIG

2025-12-20 00:24:55 905

原创 【操作系统原理】IPC之命名管道、共享内存、消息队列、信号量

IPC 的核心思路(非常重要)进程不能直接“互相读写内存”,系统的做法是:让不同进程去访问同一份 OS 管理的共享资源(内核缓冲区 / 共享内存段 / 消息队列对象 / 信号量对象 / 文件对象)所以 IPC 本质就是:借助 OS 提供的系统调用 + 通信媒介

2025-12-20 00:11:42 743

原创 【操作系统原理】进程间通信之管道

本文介绍了操作系统中的进程间通信(IPC)机制,重点分析了管道(pipe/FIFO)的工作原理和应用场景。文章首先阐述了进程隔离性导致直接内存访问不可行,必须通过OS提供的共享资源实现通信。详细讲解了匿名管道的核心模型、四种关键情形(空读阻塞、满写阻塞、写端关闭读EOF、读端关闭写SIGPIPE)以及五大特征(亲缘限制、同步机制、生命周期、字节流特性、半双工)。命名管道FIFO解决了非亲缘进程通信问题。文章还探讨了进程池的管道应用模式,对比了不同IPC方式的适用场景,并强调工程实践中需注意关闭无用文件描述符

2025-12-20 00:03:13 951

原创 【操作系统原理】软硬链接与动静态库

本文深入解析了软链接与硬链接的本质区别、静态库与动态库的生成与链接机制,以及程序从可执行文件到运行的完整链路。硬链接共享inode,删除不影响数据;软链接独立存储目标路径,可跨文件系统。静态库通过ar打包.o文件,链接时拷贝代码;动态库采用位置无关代码,运行时加载共享内存。程序运行流程包括ELF文件映射、mm_struct地址空间创建、PC指向入口点等关键步骤,动态库通过LD_LIBRARY_PATH或系统路径加载。全文通过技术对比和流程拆解,系统性地阐述了Linux文件链接与程序加载的核心机制。

2025-12-19 23:48:27 1018

原创 【操作系统原理】重定向和文件系统

本文深入剖析了Linux文件系统与文件描述符(fd)的底层实现原理。从用户态的简单文件操作出发,揭示了内核态的完整处理链路:fd→task_struct→files_struct→fd_array→struct file→VFS→具体文件系统。详细讲解了fd分配机制、0/1/2标准流的由来、文件系统磁盘结构(inode、data block等)、路径解析过程,以及文件创建/删除的本质。重点强调了fd只是进程私有的索引,struct file才是内核中的"打开文件对象",并通过VFS的多态

2025-12-19 23:37:04 966

原创 【C++11】Lambda 表达式、可变参数、emplace_back 系列

本文摘要: Lambda表达式本质是编译器生成的匿名函数对象,通过捕获列表管理外部变量访问,支持按值/引用捕获和mutable修饰。 堆上对象可通过私有构造函数+静态工厂方法实现,禁用拷贝构造确保只能通过new创建。 可变参数模板提供类型安全的参数传递,C++17折叠表达式简化了可变参数处理。 emplace_back相比push_back能避免临时对象构造,直接在容器内存中创建元素。 (字数:150字)

2025-11-21 22:45:12 822

原创 【操作系统原理】文件fd

本文介绍了Linux系统中文件与文件描述符(fd)的底层实现机制。从应用层视角看,文件操作通过open/read/write等系统调用完成;内核视角则涉及struct file、fd数组、VFS等关键结构。文章详细解析了open调用时内核如何创建struct file对象并分配fd,解释了标准输入/输出/错误(0/1/2)的初始化过程,并阐述了VFS通过file_operations实现"一切皆文件"的多态机制。核心内容包括文件描述符本质是进程fd数组的下标,struct file代表打

2025-11-21 22:31:28 1294

原创 【C++11】右值引用

本文从C++的左右值概念切入,系统讲解了右值引用、移动语义和完美转发的原理与应用。首先区分了左值(可寻址)和右值(临时值),然后通过字符串类的移动构造实现,展示了如何通过"偷指针"减少拷贝开销。接着以list容器为例,说明需要为push_back同时提供左值和右值版本,让临时对象走移动构造的"绿色通道"。文章深入浅出,通过string和list两个典型案例,将右值引用相关概念串联成完整知识体系,为理解现代C++性能优化提供了清晰路径。

2025-11-19 18:48:50 971

原创 【操作系统原理】Linux 进程控制

本文系统梳理了Linux进程控制的三大核心问题:进程本质、终止机制和父子进程协作。内核视角下,进程由task_struct(PCB)、mm_struct(内存管理)和代码数据三部分组成。fork系统调用通过复制父进程结构和COW机制创建子进程。进程终止流程包括释放资源、保留退出状态和等待父进程回收。重点区分了exit(用户态清理)和_exit(直接终止)的差异,并解析了僵尸进程的成因与危害。最后详解了wait/waitpid系统调用,包括阻塞/非阻塞等待模式(WNOHANG)和状态信息解析宏,为理解进程生命

2025-11-19 18:11:10 1300 1

原创 【操作系统原理】进程调度的O(1)算法之双140队列

Linux O(1)调度器核心机制解析 本文深入讲解了Linux 2.6内核采用的O(1)调度器核心原理。该系统通过巧妙的数据结构设计,实现了恒定时间的进程调度: 优先级架构:将进程分为实时(0-99)和普通(100-139)共140个优先级队列,每个优先级对应独立队列 高效调度结构: 使用runqueue管理CPU的就绪进程 采用active/expired双数组结构:active存放当前调度队列,expired存放时间片耗尽的进程 通过bitmap快速定位最高优先级非空队列 调度流程: 从active数

2025-11-18 23:06:43 967

原创 【操作系统原理】进程地址空间初识

本文深入解析了进程地址空间的核心概念,包括虚拟地址与物理地址的转换机制、多级页表结构、缺页中断处理以及COW写时复制技术。文章详细介绍了Linux内存管理的关键数据结构mm_struct和VMA,并阐述了进程切换时CR3寄存器的作用。同时分析了虚拟地址的来源(编译-链接-加载流程)和虚拟内存的必要性。最后通过总图总结了整个虚拟内存系统的工作原理,并列出高频面试考点,帮助读者系统掌握操作系统内存管理机制。

2025-11-17 06:00:00 1103

原创 【操作系统原理】进程优先级与命令行参数、环境变量详解

本文聚焦Linux系统中三个核心概念:进程优先级、命令行参数和环境变量。首先介绍进程优先级的本质与作用,包括NI和PRI值的含义及调整方法。其次解析命令行参数argc/argv的传递机制,展示从用户输入到程序执行的完整调用链。最后详解环境变量的继承特性、PATH搜索规则以及内建命令与外部命令的关键区别。文章通过代码示例、对比表格和流程图,帮助读者掌握进程调度、程序启动和环境配置的基础原理,并提供了可直接运行的实验清单。

2025-11-10 23:50:01 766

原创 【数据库初阶】事务

锁定索引记录之间的间隙(RR 隔离级别特有)。:确保查询命中索引,避免锁升级为表锁。:事务快照,判断数据版本可见性。:尽快提交事务,减少锁持有时间。

2025-03-23 15:56:08 553

原创 【数据库初阶】索引(1)

索引的主要作用是为了提高数据库查询的性能;不用加内存,不用改程序,不用调sql,只要执行正确的,查询速度就可能提高成百上千倍;但是会增加删除、更新、插入的效率。

2025-03-02 00:59:22 961

原创 【数据库初阶】表的查询语句和聚合函数

聚合函数用于对一组值执行计算,并返回单个汇总值。它们通常与GROUP BY子句结合使用,实现分组统计,但也可以直接用于整张表的汇总。

2025-01-27 00:18:39 1881 8

原创 【数据库初阶】表的增删改语句

特性 DELETE TRUNCATE删除方式 逐行删除 删除所有行是否可以删除特定行 可以,通过 WHERE 子句指定条件 不能,删除表中的所有数据是否触发触发器 会触发 DELETE 触发器 不会触发触发器是否重置自增列 不会 会重置自增列计数器操作类型 DML(数据操作语言) DDL(数据定义语言)性能 较慢,逐行删除 更快,通过删除和重新创建表实现能否回滚 可以,适用于支持事务的存储引擎 不可以,删除操作不可回滚表结构是否改变 不改变表结构 不改变表结构操作对日志的影响 会占用 un

2025-01-11 00:21:15 1524 18

原创 【数据库初阶】MySQL中表的约束(下)

2. 唯一键 UNIQUE KEY2.1 基本概念唯一性:唯一键确保每一行数据在指定的列(或列组合)中是唯一的,即不允许存在两个或更多相同的值。NULL 值:与主键不同,唯一键允许列中有 NULL 值。多个 NULL 值在唯一键列中是允许的(这与主键不同,主键列不允许有 NULL 值)。2.2 语法格式唯一键可以通过 UNIQUE 关键字在创建表时定义,或者在已经存在的表中使用 ALTER TABLE 来添加。2.2.1 创建表时使用唯一键CREATE TABLE employees (

2025-01-07 00:14:02 1317 18

原创 【数据库初阶】MySQL中表的约束(上)

`primary key`用来 **唯一的** 约束该字段里面的数据,**不能重复,不能为空**; - 主键要求表中每一行记录的值都是唯一的,也就是说,主键字段的值不能重复。每行数据的主键值都是唯一的,确保数据的唯一性。 - 主键字段不能为 `NULL`。也就是说,在定义主键时,`MySQL` 会自动给该字段添加 `NOT NULL` 约束。每一行数据在插入时,主键字段必须提供一个有效的、非空的值。 - 一张表中最多只能有 **一个主键**,但可以由一个列或多个列组成(复合主键)。 - 主键可

2025-01-03 18:51:10 1295 20

原创 【数据库初阶】MySQL数据类型

| 数据类型 | 字节数 | 带符号最小值 首先,因为类型是 1Byte1Byte1Byte,范围是 ;所以很明显,123451234512345 超出范围了;但是一般情况下编译器不会直接报错,而是会在编译阶段发生截断操作;这就意味着编译器只会读取 123451234512345 转化成 二进制的低八位:123451234512345的二进制: 001100110011 000000000000 001100110011 100110011001截断:0011

2024-12-31 18:04:49 1345 16

原创 【数据库初阶】Linux中表的基础操作

实际开发中,我们需要向表中插入删除内容;也会修改表的结构,例如字段名字、语法说明: 表示列名; 表示列的类型(关于类型下一篇文章会细讲); 表示字符集,如果没有指定字符集,则以所在数据库的字符集为准; 校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准。🎧1.2 创建案例🎧我们可以先查看一下系统的默认存储引擎,进入中然后输入以 MyISAM 为存储引擎创建表输入下面代码,创建表:这里的括号可以省略,但是如果省略的话一定要按照你定义的顺序插入!

2024-12-30 01:03:07 1232

原创 【数据库初阶】Linux中库的基础操作

数据库的创建方法很简单,首先输入 `mysql -uroot -p`, 然后输入密码进入到数据库;- 然后输入:`CREATE DATABASE [IF NOT EXISTS] db_name [create_spec创建 数据库:执行删除后的结果:查看数据库的语法:;查看当前我在哪个数据库中:,这个相当于是函数,功能类似于;查看创建数据库细节的语法:,例如:如何同时备份多个数据库呢?如果备份一个数据库时,没有带上参数, 在恢复数据库时,需要先创建空数据库,然后使用数据库,再使用来还原

2024-12-28 20:25:55 933

原创 【数据库初阶】数据库基础知识

在操作系统中,有文件管理,为什么还需要数据库呢?可以想象一下,有一个包含十万行IP地址的文件,如果现在要找出IP地址是120开头的,且要统计一下出现的次数;作为程序员,我们可以在cpp或者java等语言中一行行读取文件内容,并进行比对,稍微有点麻烦;但是数据库,是在磁盘或者内存中存储的特定结构组织的数据,我们只需要输入特定的指令,数据库就知道我们想要干什么,然后它就会把我们想要的结果告知我们;所以,可以在磁盘或者内存中找到存储数据库的方案;那么我们应该如何让数据库知道我们想要做什么呢?

2024-12-25 18:28:23 1192

原创 【数据库初阶】Ubuntu 环境安装 MySQL

**说明 :**>> - **安装和卸载过程中,用户全部切换为 root,安装成功,普通用户是可以使用的;**> - **我们在初期学习 MySQL 时先用 root,尽快掌握 MySQL 语句,之后在学习用户管理**

2024-12-25 14:51:26 1150 1

原创 【Linux网络】详解TCP协议(3)

1. 流量控制🎉博主首页:有趣的中国人🎉专栏首页:Linux网络🎉其它专栏:C++初阶 |C++进阶 |初阶数据结构小伙伴们大家好,本片文章将会讲解TCP的流量控制和滑动窗口的相关内容。您的支持是我最大的动力,让我们一起努力,共同成长!

2024-09-28 16:15:52 940

原创 【Linux网络】详解TCP协议(2)

1. 三次握手🎉博主首页:有趣的中国人🎉专栏首页:Linux网络🎉其它专栏:C++初阶 |C++进阶 |初阶数据结构小伙伴们大家好,本片文章将会讲解TCP协议的三次握手和四次挥手的相关内容。您的支持是我最大的动力,让我们一起努力,共同成长!

2024-09-28 01:09:04 1302 1

原创 【Linux网络】详解TCP协议(1)

🎉博主首页:有趣的中国人🎉专栏首页:Linux网络🎉其它专栏:C++初阶 |C++进阶 |初阶数据结构小伙伴们大家好,本片文章将会讲解TCP协议的相关内容。您的支持是我最大的动力,让我们一起努力,共同成长!

2024-09-08 00:43:44 1273

原创 【Linux网络】应用层协议HTTP(1)

🎉博主首页:有趣的中国人🎉专栏首页:Linux网络🎉其它专栏:C++初阶 |C++进阶 |初阶数据结构小伙伴们大家好,本片文章将会讲解应用层协议HTTP的相关内容。您的支持是我最大的动力,让我们一起努力,共同成长!

2024-09-03 23:38:11 1552

原创 【C++11】详谈隐式类型转换

`initializer_list` 是 `C++11` 引入的一种标准库类型,用于方便地初始化同一种类型的元素列表。`initializer_list` 允许通过大括号 `{ }` 语法进行初始化,例如: std::initializer_list my_list = {1, 2, 3, 4, 5};这里 `my_list` 是一个包含了整数元素 `{1, 2, 3, 4, 5}` 的 `initializer_list` 对象。==

2024-06-19 22:47:13 943 44

原创 【Linux操作系统】进程状态(1)

1. **R 运行状态(running)**: 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。2. **S 睡眠状态(sleeping)**:意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。3. **D 磁盘休眠状态(Disk sleep)**:有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。4. **T 停止状态(stopped)**: 可以通过发送 SIG

2024-06-07 01:38:50 963 18

原创 【Linux】操作系统之冯诺依曼体系

冯·诺伊曼体系是 **计算机体系结构的一种基本设计范式**,以美国数学家兼计算机科学家约翰·冯·诺伊曼(John von Neumann)的名字命名。该体系结构是20世纪40年代末和50年代初期发展起来的,并且至今仍然是现代计算机设计的基础之一。

2024-05-31 20:53:45 2292 25

原创 【哈希】用哈希桶封装unordered_map & unordered_set

由于`unordered_map`和`unordered_set`的分别是 `KV` 类型和 `K` 类型,存储的数据类型是不相同的, 但是底层的哈希桶只有一份,这个时候我们得想到用模板的方法来解决此问题。(这块类似于红黑树那的封装)1. 我们用哈希表来实现`unordered_map`和`unordered_set`,因此他们两个的成员变量就是用哈希桶实现出的哈希表的对象;2. 哈希表的前两个模板参数是 `K` 和 `V`(`Key: 关键字` 和

2024-05-31 00:14:13 1030 34

原创 【哈希】闭散列的线性探测和开散列的哈希桶解决哈希冲突(C++两种方法模拟实现哈希表)(2)

**开散列法又叫链地址法(开链法)**,**首先对关键码集合用** **散列函数计算散列地址**,**具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来**,**各链表的头结点存储在哈希表中。**很明显,**这个哈希表中存储了一个指针数组**,我们可以用`vector`来实现,数组中的**每个位置存储了一个节点类型的指针**,**每个节点相当于是链

2024-05-29 00:34:33 1423 23

原创 【哈希】闭散列的线性探测和开散列的哈希桶解决哈希冲突(C++两种方法模拟实现哈希表)(1)

哈希函数是一种将输入数据(例如字符串、数字等)转换为固定长度的输出数据的函数。这个输出通常称为哈希值或哈希码。哈希函数的特点是,对于相同的输入,它总是生成相同的输出,而且通常无法根据输出反推出输入。这种特性使得哈希函数在==密码学、数据验证和数据检索==等领域中非常有用。哈希表是一种数据结构,它利用哈希函数来快速定位存储和检索数据。哈希表由一个数组组成,每个数组元素称为桶($bucket$)或槽($slot

2024-05-28 18:13:00 1678 32

原创 【map、set】C++用红黑树来封装map、set容器

我们在模拟红黑树的时候一律用了`pair`的`KV`模型来进行实现。但是由于`map`是`KV`模型的而`set`是`K`型的,但是底层都是用的红黑树,那么应该如何进行调整呢?

2024-05-23 20:24:02 1078 43

原创 【平衡二叉搜索树】红黑树

红黑树,是一种二叉搜索树,==它在每个结点上增加一个存储位表示结点的颜色,可以是 Red 或 Black。== 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,==红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。==>>> 它在插入和删除节!

2024-05-17 18:44:56 1006 38

原创 【平衡二叉树】AVL树(双旋)

左右双旋后,实际上就是让`subLR`的左子树和右子树,分别作为`subL`和`parent`的右子树和左子树,再让`subL`和`parent`分别作为`subLR`的左右子树,最后让`subLR`作为整个子树的根。> 1. `subLR`的左子树当中的结点本身就比`subL`的值大,因此可以作为`subL`的右子树。> 2. `subLR`的右子树当中的结点本身就比`parent`的值小,因此可以

2024-05-14 22:21:04 1503 26

原创 【Linux】简易进度条的实现

缓冲区(`Buffer`)是计算机内存中的一块特定区域,用于==临时存储数据==。它在许多计算机系统和应用程序中发挥着重要作用,通常用于==临时存储输入数据、输出数据或在内存和其他设备之间进行数据传输。==编写简易的进度条。

2024-05-10 22:50:14 1387 29

原创 【Linux】项目自动化构建工具make/makefile

当谈到在`Linux`中进行项目构建时,`make`和`makefile`是两个非常重要的工具。它们提供了一种自动化构建的方法,使得开发者能够轻松地编译和构建复杂的软件项目。下面我会分别介绍一下`make`和`makefile`。

2024-05-10 01:28:32 1339 37

原创 【Linux】gcc/g++的使用

GCC(GNU Compiler Collection)是一套由GNU计划开发的编译器集合,它是一种开源的编译器套件,用于编译和运行C、C++、Fortran、Ada、以及其他一些编程语言的程序。其中,g++是GCC中专门用于编译C++程序的工具。由于其开放源代码的特性,GCC已经成为许多操作系统和平台上的标准编译器,例如Linux、GNU Hurd、Mac OS X等。g++是GCC中用于编译C++源代码的前端工具。

2024-05-08 21:05:34 1628 34

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除