- 博客(192)
- 收藏
- 关注
原创 深入理解计算机系统书籍 (1)
主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从物理上来说,主存是由一组动态随机存取存储器(DRAM)芯片组成的。从逻辑上来说,存储 器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始 的。一般来说,组成程序的每条机器指令都由不同数量的字节构成。与C程序变量相对应的数据项的大小是根据类型变化的。比如,在运行Linux的x86-64机器上,short类型的数据需要2个字节,int和。
2026-03-29 23:35:36
403
原创 Cmake (4)
CTest 是CMake的⼀个集成测试框架,⽤于⾃动化执⾏项⽬测试。⽀持多种测试类型(如单元测试、性 能测试),并能⽣成详细的测试报告。<name><command><arg>像这个地方我的command就是main当然test也有失败的可能性比如我们把代码改成assert(add(2, 3) == 1);
2026-03-20 08:30:00
217
原创 Protobuf (1)
PackFrom():把一个 Protobuf 对象的所有数据 “打包” 复制到另一个对象中,覆盖目标对象数据;:获取对应复杂类型字段的可修改指针(不存在则创建),用于修改字段内部的子值;核心区分:基础类型字段用set_xxx(),单个复杂类型字段用,数组字段用add_xxx()。
2026-03-19 14:26:01
423
原创 Protobuf (2)
你的 V1 只定义了 id(字段号 1)、name(字段号 2),而 V2 新增了 age(字段号 3)。当 V2 序列化数据(包含 id=1001、name = 张三、age=25)后,会把「字段号 + 字段类型 + 字段值」一起编码成二进制(比如 age=25 会编码成「字段号 3 + 类型 int32 + 值 25」的二进制字节)。能识别字段号 1(id)、字段号 2(name),会正常解析并存储;不认识字段号 3(age),不会丢弃这个字段。
2026-03-19 14:24:49
388
原创 Cmake(3)
CMake 不支持在 if 条件中直接写 a+b 这种表达式,此外 Cmake里面也不支持 >= <= == 这样的比较符号用的是 GREATER LESS EQUAL 分别对应 大于 小于 等于GREATER_EQUAL LESS_EQUAL分别对应 大于等于 小于等于此外CMake 不支持用 = 直接赋值的写法 一般都是是用set此外Cmake 中也不使用&& ||!而是使用 AND OR NOT这段是 CMake if() 条件判断的规则,分三类情况:1. 常量判断。
2026-03-17 07:00:00
394
原创 json 入门
JSON 并不是编程语言,而是一种(全称 JavaScript Object Notation),可以把它理解成 “数据的通用翻译官”。
2026-03-17 07:00:00
57
原创 Cmake (1)
构建树的根目录也就是我执行cmake所在的目录但是要注意 比如当我们在a目录下执行cmake ..此时构建树的根目录是在a目录而不是a目录的上级目录..的意思是去a目录的上级目录找到要执行的CMakeLists.txt文件但是实际Cmake项目的时候 我们会有多个CMakeLists.txt文件因此也会有多个构建树比如向上图我有两个CMakeLists.txt的文件当我在build文件夹执行cmake之后会在build文件夹生成my_project/CMakeLists.txt的中间文件。
2026-03-16 13:22:48
388
原创 Linux 消息队列
这个结构体在// 标准的 msqid_ds 结构体定义// 1. 权限和所有者信息(可通过 IPC_SET 修改)// 核心权限结构体(最重要)// 2. 队列状态信息(只读,内核维护)// 队列中当前的消息数量// 队列允许的最大字节数(默认通常 16384)// 最后发送消息的进程 PID// 最后接收消息的进程 PID// 3. 时间戳信息(只读,内核维护)// 最后调用 msgsnd() 的时间// 最后调用 msgrcv() 的时间。
2026-02-26 02:58:55
887
原创 Linux 信号量
在使用 System V 信号量的任何函数前,必须包含以下头文件:System V 信号量主要由三个函数操作:(创建 / 获取)、(操作)、(控制)。用于创建一个新的信号量集,或获取一个已存在的信号量集的标识符。函数原型:参数说明:返回值:这是最核心的函数,用于改变信号量的值(加、减或等待为 0)。函数原型:参数说明:关键数据结构 :你需要填充这个结构体来告诉内核要做什么操作: : 操作第几个信号量,单个信号量时填 。 : (P 操作):申请资源。如果信号量值 >= n,则减
2026-02-25 23:48:16
527
原创 Linux mmap
length size_t 要解除映射的内存长度,必须和 mmap 时指定的 length 完全一致 若长度不匹配,可能导致部分映射未释放,或解除不属于当前映射的内存(触发段错误)mmap 是 Linux/Unix 系统的核心系统调用,作用是将文件 / 设备映射到进程的虚拟地址空间,让进程可以像操作内存一样直接操作文件,避免传统 read/write 的数据拷贝开销。MAP_PRIVATE:私有映射 —— 进程对映射区的修改是 “私有” 的(写时复制),不会同步到底层文件,其他进。
2026-02-25 00:15:00
463
原创 Linux 网络(8)
HTTP Cookie 是服务器发送到浏览器并本地保存的小块数据,后续向同一服务器发起请求时会自动携带,用于识别请求是否来自同一浏览器(如保持登录状态、记录用户偏好)。HTTP Session 是服务器用于跟踪用户交互期间状态的机制,弥补了 HTTP 协议 “无状态”(每个请求独立)的缺陷,让服务器能记住用户信息。我们写入的是测试数据,如果写入的是用户的私密数据呢?重要的是,除了被盗取,还有就是用户私密数据也就泄漏了。是存储在客户端的,因此存在被篡改或窃取的风险。保存,非常容易被人盗取,更。
2026-02-24 04:14:24
960
1
原创 Linux 网络 (7)
自旋锁是一种多线程同步机制,用于保护共享资源。线程获取锁失败时,会 ** 循环自旋(不断检查锁状态)** 而非进入休眠,以此减少线程切换开销,适用于短时间锁竞争;但不合理使用会造成 CPU 资源浪费。
2026-02-24 01:30:38
1702
原创 Linux select 代码
但实际返回值 > 0 表示 “就绪的 FD 总数”,可能是 1 个(新连接),也可能是多个(多个客户端同时发数据),,未就绪的 FD 会被清空,所以下一次循环必须重新构建集合。的 FD 不会被监听,会导致客户端连接无响应。遍历判断每个 FD 是否就绪是正确的处理方式。,不同值对应不同场景,你的代码中用。常见错误原因(返回 - 1 时):你的代码中每次循环都重新。的核心要求 —— 如果。
2026-02-23 00:15:00
1021
原创 Linux poll代码
参数说明pollfdpollfd-10>0pollfd 结构体pollfd4. 常用事件常量(重点)POLLINPOLLOUTPOLLERRPOLLHUPPOLLNVAL返回值:成功,返回有事件发生的文件描述符数量;:超时,没有任何事件发生;:失败,设置errno(比如EINTR表示被信号中断)。poll 使用步骤(通用流程)初始化pollfd数组,设置要监听的 fd 和关注的events;调用poll()函数等待事件;遍历pollfd数组,检查revents字段,处理对应事件;
2026-02-23 00:15:00
776
原创 Linux 网络(6)
只收到分片 1(偏移 0,MF=1)、分片 2(偏移 10,MF=1)。→ 依据:所有收到的分片 MF 位都是 1(表示还有后续),且始终没收到「同 ID 里片偏移最大、且 MF=0」的分片,等待超时后判定缺失最后部分。MTU = 网络。
2026-02-22 00:23:13
888
原创 Linux 网络 (3)
CA 用私钥给服务端公钥做 “公证签名”,客户端用 CA 公钥验证签名确认公钥合法,再用这个公钥加密对称密钥,实现安全通信。所以就有了方案5。
2026-02-21 05:07:08
967
原创 Linux 网络 (4)
ACK 就是接收方给发送方的 “回执单”,但 TCP 只认按序到达的数据 —— 哪怕后面的数据先到,只要前面的丢了,就会一直要求重传前面的,直到按序补齐,确保数据完整有序。
2026-02-21 05:06:46
976
原创 Linux 网络(1)
OSI 七层模型是国际标准化组织(ISO)制定的网络通信分层架构参考标准,核心是将网络通信的复杂流程拆分为 7 个独立层级,每层负责特定功能,上下层之间通过接口协作,实现跨系统的标准化通信。
2026-02-17 08:00:00
2012
1
原创 Linux 网络(2)
我们前面学过了传输层协议有UDP和TCPUDP就像我们平时互相发消息的时候一次只能发一条消息 但是你不需要对方同意可以找直接发送但是TCP就像打电话我要先给你打电话 你接了 我们才能通话但是只要联通了 我们可以聊很久TCP是面向于字节流的 也就是TCP每次传输的是多少多少字节为单位的它不在乎多少字节是一条消息UDP是面向数据报的 它每次处理一条或者几条消息。
2026-02-17 08:00:00
1523
原创 Python(1)
python中的变量声明和C++中的不一样python中生命变量可以不用显示变化 并且变量类型在执行过程中是动态的同时python也是可以定义类型的 但是和C++不一样python用的是 变量名:类型python中有type函数可以查看变量类型Python 中的变量的类型,不需要在定义变量的时候显式声明.而只是依靠初始化语句,根据初始化的值的类型来进行确定的.在 Python, int 能够表示的数据范围,是 "无穷" 的.
2026-02-16 08:00:00
690
原创 Python (2)
listpython的列表 用起来和C++的vector很相似 是数组只不过C++的vector每个元素是一样的但是python列表每个元素可以是不一样的但是和vector不同的是列表是可以执行切片操作Python 切片遵循「左闭右开」(左包含,右不包含)extend方法,其实是没有返回值的!!拿一个变量来接收一个没有返回值的方法的返回值得到的旧是NoneNone类似于C++中的nullptr 和null。
2026-02-16 08:00:00
756
原创 C++ 线程 (4)
a: 如果 t2 是在 a 状况,t1 又抢到锁,但是 flag 为 true, wait 阻塞 (同时unlock解锁)b、t1 慢一步,但是也分到时间片开始执行了,t1 lock 阻塞 t2wait 时,unlock 会唤醒 t1 获取锁。b、如果 t2 是在 b 状况,t1 解锁,唤醒 t2, t2 获取到锁,flag 是 true, t2 不会阻塞。假设 t1 先运行,t1 先抢到 lock, flag 是 false, t1 先打印。场景 1: t1 先启动,t2 待定。
2025-12-20 00:07:32
251
原创 C++ 线程(1)
C++ 有专门的线程库 它的好处是 我不管在windows Linux unix 还是mac上都可以跑本质上通过条件编译形成的。
2025-12-19 03:45:00
1689
原创 Linux 线程(2)
要了解并发问题我们可以通过一段代码来学习为什么这个代码最后num会到-10???(预期最多到-1)我明明写的是num<0的时候循环就不会接着执行减减呀为什么num会到-10???我们来看这个代码num--;这个代码转换成汇编主要是三件事1.先将内存中的 num 读入到 cpu 的寄存器中2.CPU 内部进行 -- 操作3.将计算结果写回内存但是多线程的时候会有问题首先我们要了解一件事我们线程使用cpu计算的时候 有一个时间片时间片到了cpu就会切换其他线程。
2025-12-18 23:26:08
1009
原创 C++ 线程 (3)
作用:阻塞线程,直到被唤醒(或谓词满足)。参数:lock:std::unique_lock<std::mutex> 的引用(调用时需已持有锁);pred:可调用对象(函数 /lambda 等),返回bool(表示等待的条件)。返回值:无(void)。
2025-12-18 23:25:27
546
原创 Linux 信号 (2)
每个信号都有两个标志位分别表示阻塞(block)和未决(pending),还有一个函数指针表示处理动作(handler)。1.信号 产生时,内核在进程控制块中设置该信号的pending标志为1,直到信号递达才设为0。简单点说 信号产生pening 为1 信号到达后 pending设置为0等下一个信号产生pending 在信号发出到递达之间为1 其他时候都为0SIGHUP信号未阻塞也未产生过当它递达时执行默认处理动作。SIGINT信号产生过但正在被阻塞所以暂时不能递达。
2025-12-14 21:36:35
825
原创 Linux 线程(1)
线程是进程内的最小执行单元,一个进程可以包含多个线程,所有线程共享进程的资源(内存、文件句柄等),但有自己独立的执行栈和程序计数器。结合进程的核心区别可以这样理解:进程是资源分配的基本单位系统给进程分配内存、CPU 时间片等资源,进程像是一个 “独立的工作车间”。线程是 CPU 调度的基本单位线程是车间里的 “工人”,一个车间可以有多个工人,他们共享车间的工具和材料(进程资源),但各自干不同的活,且切换工人的开销远小于切换车间。
2025-12-14 21:36:00
1060
原创 Linux 信号(1)
比如我这个前台指令 当我休眠的时候我依然可以接收终端信号 但是不会立即执行比如 ll ls -l pwd当sleep结束玩后立马执行但是当我把sleep10& 后台执行的时候 我的终端可以接着输入其他指令而不会休眠10秒前台进程只能有一个 但是后台进程可以有多个。
2025-12-10 21:27:59
780
原创 Linux 进程通信
pipe 函数是 进程间通信(IPC) 和 数据流处理 中的核心工具,其核心思想是创建一个 “管道”,实现 单向数据流传递—— 数据从 “写端” 输入,从 “读端” 输出,类似现实中的管道(一端进水、一端出水)。不同编程环境中,pipe 的实现和用途略有差异,但核心逻辑一致。
2025-12-10 08:00:00
971
算法领域蓄水池抽样算法解析:数据流随机采样方法及其概率计算详解
2025-05-29
【数据结构与算法】红黑树变色与旋转
2025-05-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅