欢迎来到我的个人博客 👋这里是我记录学习心得、技术分享与生活点滴的小天地,希望能为你带来有价值的内容 🙌
关于网站访问
由于网站没有进行备案,诸多加速优化及提升阅读体验的功能和服务受相关规定限制无法启用,主要是个人感觉备案繁琐 😡,暂时没有考虑备案的想法,但后续也会持续对网站进行各方面的优化,感谢理解呀~🤪
为提供最佳访问体验,本站提供三个常用访问域名,均通过 edgeone CDN 加速:
cn.minbit.top:采用 EdgeOne Pages 部署,中国大陆用户优先使用此域名,访问体验更佳!
minbit.top:Vercel 部署版本,通常需要稳定访问 GitHub(挂 V)。
huangcancan-xbc.github.io:GitHub Pages 默认域名,永久有效且稳定(确保无 404 问题)。
注:minbit.top 域名将于 2027/04/06 到期,目前还在考虑是否续费,到期时这里会更新。若 minbit.top 系列出现访问异常,建议切换至 GitHub 域名访问。
内容与资源说明
图片资源:本站的图片均存储于 ...
原作者在这里!本文是基于行码棋的文章进行的翻改!
[!NOTE]
相关好文推荐,这篇 STL 我也觉得非常不错!分享给你!
简单分享一下:起初入门 C++,我特别幸运地找到了这篇超级适合 STL 入门和竞赛的文章!一开始只是随便翻了翻,没想到 内容不仅全面详细,而且非常实用,只记得那天下午用了两个小时,从头到尾仔细的看了一遍,结果越看越上头,不靠视频也能高效、快速的学习(对当时完全没阅读习惯的我来说,简直是个奇迹)。后来的几天时间也是断断续续的在看,一周时间就可以 快速上手 STL 了。相信屏幕前的你比我更快!
这篇文章最大的优点就是 实用,不是那种光讲理论、没法落地的内容。在后来的刷题和深入学习的过程中,每次遇到不会的地方,我也时不时的会翻出来查,就像一本随身的 STL 字典。某些地方反复看了很多遍,每次都会有新的收获。随着不断 实践 + 回顾,相关知识越来越清晰,使用起来也越来越顺手,简直就像高中查笔记一样,真的让我受益匪浅!希望也能帮到你~
[!TIP]
实践才是检验真理的唯一标准!
1 vector1.1 介绍1.1.1 简介vector 为可变长 ...
数学相关函数
算法数据范围初定:单数据 10 的 9 次方以内无脑用 int,单数据 10 的 18 次方以内无脑 long long,更高的数据量需要考虑 long double(10 的 308 次方左右),但是注意:long double 虽然能表示很大的数,但精度不够稳定,误差较大!对准确性要求极高的场景下,就不太靠谱了。这时就需要考虑高精度算法和计算库了。还有在多数据涉及加法和乘法操作时,注意边界溢出!
1. 基本数学函数(<cmath>)
功能
函数原型
使用示例
注意事项
平方根
double sqrt(double x)
sqrt(16.0) = 4.0
参数需非负
幂运算 (b e )
double pow(double b, double e)
pow(2.0, 3.0) = 8.0
效率低于位运算
浮点数绝对值
double abs(double x)
abs(-3.14) = 3.14
整数用 <cstdlib> 的 abs()
浮点数绝对值
double fabs(double x)
fabs(-2.5) = ...
线程控制1. POSIX 线程库1. 什么是 POSIX 线程库(pthread)POSIX(Portable Operating System Interface)线程库,又称(简称) pthread(POSIX Threads),是 Unix 系统下的标准化多线程编程接口(IEEE POSIX 标准(IEEE 1003.1c)定义的线程接口)。它提供了一组函数,用于在同一进程内创建、管理和同步多个线程,实现并发和并行处理。
pthread 线程库是应用层的原生线程库: 应用层指的是这个线程库并不是系统接口直接提供的,而是由第三方帮我们提供的。大部分 Linux 系统都会默认带上该线程库(原生的)。与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以 pthread_ 打头的。要使用这些函数库,要通过引入头文件 <pthreaad.h>,链接这些线程函数库时,要使用编译器命令的 -lpthread 选项。
2. 特点
与操作系统紧密集成,性能开销小。
接口统一,可移植性好。
支持线程同步(互斥锁、条件变量)、线程属性设置等丰富功能。
线程共享同一进程的内存空间( ...
线程概念1. 什么是线程?它和进程的关系?1. 粒度:执行的“颗粒大小”粒度(Granularity) 是个比喻术语,表示一个单位在调度或执行上的“精细程度”。举例说明:
进程 是一个较大单位(粗粒度):拥有独立地址空间、资源。
线程 是进程内部的小单位(细粒度):共享地址空间,调度更轻便。
比喻一下:一个公司(进程)可能有多个部门(线程),每个部门是公司内部的执行单位,共享同一个资源(办公室、资金)。
线程执行进程的代码(粒度细)
多线程可以同时执行同一个进程的多个代码分支,这比进程切换效率高。
一个进程内部多个线程共同完成任务,就像车间里多个工人一起干活。
2. 线程的定义线程是操作系统调度的最小执行单位。
在用户/开发者角度看:线程是进程中的“执行分支”,多个线程可以并发执行进程中的不同任务。
在内核角度看:内核调度的是线程(Linux 称为“轻量级进程”),不是传统意义上的进程。
CPU 视角:只有“执行流”,每个 task_struct(无论是进程还是线程)在 CPU 看来都是“可调度实体”。因此 Linux 把线程干脆叫“轻量级进程”——名 ...
Linux
未读进程信号 —— 信号的处理
Linux 进程信号【信号处理】 | CSDN
1. 捕捉/处理信号(进程地址空间)1. 内核空间与用户空间每一个进程都有自己的进程地址空间,该进程地址空间由内核空间和用户空间组成:
用户所写的代码和数据位于用户空间,通过用户级页表与物理内存之间建立映射关系。
内核空间存储的实际上是操作系统代码和数据,通过内核级页表与物理内存之间建立映射关系。
内核级页表是一个全局的页表,它用来维护操作系统的代码与进程之间的关系。因此,在每个进程的进程地址空间中,用户空间是属于当前进程的,每个进程看到的代码和数据是完全不同的,但内核空间所存放的都是操作系统的代码和数据,所有进程看到的都是一样的内容。
操作系统本质上就是一个“基于时钟中断的死循环” ,它通过中断机制不断调度任务,实现多任务并发的“假象”。 OS 本身并没有“结束”的时候,它一直在“看有没有事要做”。 它开机后就进入一个大循环:看有没有进程要运行(调度)、看有没有中断发生、处理完后继续循环,这个循环不会退出,除非关机。
时钟中断就像是操作系统的心跳,每隔一段时间就“敲一下操作系统”:“该换 ...
Linux
未读进程信号 —— 信号的保存1. 信号的其他相关概念
概念
含义
例子
信号产生(Generate)
内核决定给进程发送一个信号
比如你按了 Ctrl+C,系统决定给你的程序发一个 SIGINT 信号,就像同事敲了你的门说“有事”
信号未决(Pending)
信号已经产生,但还没被处理,只能排队等着
你正在开会,同事敲了门,但你没理他,他的请求被记下来了,等你有空再处理
信号阻塞(Blocked)
你设置了“我暂时不想处理这些信号”
你提前设置了“开会期间不接电话”,这些信号来了也只能排队等待,不会立刻打断你
信号递达(Delivery)
信号从 pending 状态变为被处理的状态
你开完会,系统发现有一个 SIGINT 在排队,于是开始处理它,触发你设置的处理函数
信号处理(Handler)
你决定怎么处理这个信号(默认、忽略、自定义函数)
你决定怎么处理这个信号:1. 默认处理(系统帮你处理)2. 忽略处理(假装没发生)3. 自定义函数(你写好逻辑来处理)
阻塞 ≠ 忽略 ≠ 未决:
阻塞 是控制递达的时机,信号仍然会记录下来(进入 pending) ...
Linux
未读进程信号 —— 信号的产生
首先,本节的信号和上一节的信号量没有任何关系!它们的关系就像老婆饼和老婆,没有任何关系!后面的内容主要是根据 信号的产生 → 信号的保存 → 信号的处理 来进行讲解。
Linux 中的 31 个普通信号
1. 信号的概念1. 生活中的信号生活中常见的信号,比如:
闹钟:闹钟响 = 通知你该起床了。
红绿灯:红灯亮 = 告诉你该停下来了。
电话:响铃 = 通知你有人呼叫你,需要你接听。
警报器:火警 = 紧急中断,要求人立刻撤离。
可见,信号本质就是“通知 + 响应”,核心思想是:不需要你一直盯着,只要有事就异步提醒你。
2. 信号的定义与理解信号是一种 异步通知机制。用来 通知进程 发生了某种 异步事件。本质:操作系统向一个进程发送一个整数编号(信号编号),告诉它“发生了某件事”,要求它“采取行动”或“做出响应”。
Q:你怎么认识这些信号?A:有人教我 → 我记住了。认识:① 识别信号 ② 知道信号的处理方法。即便现在没有信号产生,我们也知道信号产生后该干什么。那么我们是谁?站在 OS 层面,我们自然是进程 ...
System V 消息队列和信号量(了解)
【Linux】进程间通信 4——system V 消息队列,信号量 | CSDN
System V IPC —- 消息队列详解 | CSDN 博客
消息队列的视频 & 博文 | YouTobe
System V 消息队列(编程接口指南)
信号量机制讲解
1. 消息队列的原理System V 消息队列 是 UNIX/Linux 下的一种 进程间通信(IPC)机制,它允许不同进程以 消息(message)为单位交换数据,消息以 先进先出 的队列形式组织。异步通信:发送者发送后可以立即返回,接收者可随时读取。
System V 消息队列通过在内核中维护一个带有类型标记(mtype)的 FIFO 队列,实现了同一物理队列内多逻辑队列的分发能力,所有消息存在内核缓冲区,进程间通过 msgsnd/msgrcv 异步收发,OS 负责元数据管理与调度。
“如果只是一味地读数据,进程怎么知道哪些才是应该要读取的数据?” 这就是 mtype 的意义——把“一个大 FIFO”变成“多条逻辑子队列”。这也是 System V ...
进程间通信 —— System V 共享内存
传统的 System V IPC 主要包括三种:共享内存、消息队列、信号量,我们后面主要涉及其 System v 共享内存,消息队列和信号量仅作为了解。 现代开发和教学中,共享内存 作为重点和常用技术,而 消息队列 和 信号量 相对被弱化,主要有以下原因(了解,信息来自网络):
共享内存的独特优势(不可替代性):
极致性能(说白了就是快): 它是所有 IPC 方式中 速度最快 的。一旦建立映射,数据交换直接在内存中进行,没有内核到用户空间的数据拷贝开销。
灵活性: 共享内存本身只是提供了一块共享区域,进程可以在上面构建任何复杂的数据结构和通信协议。消息队列则限制了消息的结构和大小。
消息队列的局限性(逐渐被替代):
性能瓶颈: 每次发送和接收消息都涉及 系统调用 和 数据在内核与用户空间之间的拷贝。对于大量或高频小消息的开销非常明显。
灵活性限制: 消息有最大长度限制,且通常是 FIFO 的,虽然支持优先级,但模型相对固定。
注: 老方案,API 麻烦,扩展性差,写多进程服务时不如直接用 socket。大厂一般直接上 Rabb ...