- 博客(74)
- 收藏
- 关注
原创 channel 底层剖析
看清数据流向:谁发送、谁接收、数据现在在哪、谁在等待。底层hchanbuf保存数据,保存等待中的 goroutine,lock保护内部状态;则负责环形缓冲区中的读写位置。有 Receiver 等待→ 直接完成数据交接否则 buffer 有空间→ 写入 buffer否则→ Sender 进入 sendq,gopark 挂起有 Sender 等待→ 完成数据交接否则 buffer 有数据→ 从 buffer 读取否则→ Receiver 进入 recvq,gopark 挂起状态读写。
2026-08-28 19:33:16
159
原创 interface 的使用和底层分析
struct 描述一个类型拥有什么数据method 描述这个类型具有什么能力interface 描述调用方需要什么能力。Go 不要求类型显式声明实现某个 interface,只要它的 method set 满足接口要求,就自动实现该接口,因此业务代码可以依赖能力而不是具体类型。空接口主要通过动态类型信息和data描述“装了什么”非空接口则通过进一步建立“接口、具体类型、方法实现”之间的关系,使同一个接口方法能够根据不同动态类型调用不同的具体实现,这也是 interface 实现多态的基础。
2026-08-28 19:32:19
190
原创 Cookie、Session、Token、JWT 这些事儿
Cookie 是服务器通过Set-Cookie响应头发给浏览器的一段键值数据,浏览器保存后,后续匹配域名和路径的请求会自动带上对应 Cookie 给服务器。Session 是服务器为每个登录用户保存一份状态,然后给客户端一个随机 ID。Redis:Web 应用通常使用 Cookie 来交换 Session ID;Session ID 本身应该足够随机,避免被猜到。用户提交账号密码服务器校验成功服务器生成一个随机 session_id。
2026-08-27 19:32:05
215
原创 GMP 调度分析
程序启动阶段OS 启动程序runtime 启动创建 m0 和 g0调度器启动初始化 runtime创建 P创建 main Gm0 + P 进入调度循环执行 main G创建普通 Gmain / 其它 Ggo func()意味着创建新的 G新的 G 成为 runnable 状态新的 G 进入 P 的本地队列等待执行若本地队列满,抽取队列中前一半的 G 和新建的 G 一块进入全局队列调度循环。
2026-08-27 19:30:38
230
原创 MySQL 内连接和外连接:从匹配关系到业务查询
本文通过任务表(tasks)和消息投递表(outbox)的示例,解析MySQL中inner join和left join的核心原理与应用场景。join通过on条件匹配两表的关联行,inner join仅保留匹配成功的行,而left join会保留左表全部数据,右表无匹配时补null。主从表的区分取决于查询目标(如查任务需保留tasks为主表)。典型场景包括: inner join:查询双向匹配的数据(如已有投递记录的任务)。 left join:查询主表全部数据及关联信息(如所有任务及其投递状态)。
2026-07-24 20:30:17
223
原创 MySQL 事务详解:从 tasks / outbox 一口气吃透 InnoDB 事务
MySQL事务是确保一组SQL操作要么全部成功,要么全部失败的关键机制,解决了业务中需要原子性操作的场景(如订单创建、银行转账)。本文通过tasks和outbox表的案例,说明事务如何保证数据一致性,避免"半截成功"状态。InnoDB通过ACID特性(原子性、一致性、隔离性、持久性)实现事务可靠性,其中原子性依赖undo log实现回滚,隔离性通过MVCC和锁机制处理并发访问。事务设计需要结合业务规则和数据库约束,确保数据状态合法,避免并发场景下的数据不一致问题。
2026-07-24 20:28:31
351
原创 MySQL 数据类型和约束:从字段设计到表结构建模
本文介绍了MySQL表结构设计中的数据类型和约束选择要点。主要内容包括: 整数类型选择:根据数据范围选择tinyint、int或bigint,建议ID类字段优先使用bigint。 小数类型区分:精确计算如金额用decimal,科学计算用float/double。 字符串类型选择:短文本用varchar,固定长度用char,长文本用text。 日期时间类型:区分date、datetime和timestamp,注意时区影响。 约束使用:通过主键、外键、非空等约束保证数据完整性。
2026-07-21 21:04:35
162
原创 MySQL 基础模型:从数据库、表到基础 DDL 操作
本文摘要:MySQL学习应从基础模型入手,理解服务器、数据库和表的关系。数据库是结构化数据集合,MySQL以二维表形式组织数据。使用流程包括创建数据库、选择数据库、建表和操作数据。SQL分为DDL、DML等类别,本文重点介绍DDL操作。创建数据库需注意字符集和排序规则,推荐使用utf8mb4。表操作包含字段定义、约束设置等,实际开发应包含主键、注释等元素。通过show/desc命令可查看数据库和表结构。掌握这些基础概念是学习MySQL的重要前提。
2026-07-21 21:03:29
196
原创 使用golang重温堆结构
堆是一种用数组存储的完全二叉树结构,父节点与子节点保持固定大小关系(大根堆父节点≥子节点,小根堆父节点≤子节点)。堆在动态获取最大/最小值场景中高效,插入和删除操作时间复杂度为O(log n)。堆的核心操作包括:查看堆顶(O(1))、元素入堆(向上调整)、堆顶出堆(交换后向下调整)和批量建堆(从非叶子节点开始向下调整)。堆通过父子节点下标公式实现快速访问,无需指针存储,具有内存连续性和高效性。文章详细介绍了堆的实现原理和Go语言代码示例,包括Push、Pop、建堆等关键操作。
2026-07-10 21:18:07
274
原创 Claude Code 使用指南:从入门到高效协作
本文介绍了Claude Code(cc)命令行AI编程助手的使用方法和技巧。主要内容包括:1)三种工作模式(默认模式、Auto-accept模式和Plan模式)的特点及适用场景;2)通过构建贪吃蛇游戏的完整demo,展示如何利用cc进行需求分析、方案规划和代码实现;3)Skill扩展机制的作用,如安装UI设计能力提升输出美观度。文章强调合理使用Plan模式进行需求梳理,以及建立工作流信任后再使用Auto-accept模式的重要性,为开发者提供了从安装到进阶使用的完整指导。
2026-06-26 20:16:40
424
原创 快速掌握Python之基础语法和数据结构
本文总结了Python与C++在编程思维和基础语法上的主要差异,并详细介绍了Python的基础语法要点。文章首先对比了两者在变量声明、布尔值、空值、代码块等方面的不同写法,然后重点讲解了Python的变量类型、输入输出、条件判断、循环结构等基础语法,特别指出了常见的小坑和推荐写法。此外,还详细介绍了字符串和列表的操作方法,包括创建、索引、切片、常用函数等实用技巧,并提供了自动化脚本和回文判断等实际应用示例。全文旨在帮助有C++背景的开发者快速掌握Python的核心语法和最佳实践。
2026-04-26 11:07:46
490
原创 快排的两种写法和一些思考
本文介绍了两种快速排序的实现方法:对撞双指针法和三指针划分法。两种方法的核心思想都是通过选取基准值(key)来划分区间,递归处理子区间。对撞双指针法使用i和j指针从两端向中间扫描交换元素;三指针划分法则通过i、l、r三个指针将数组分为小于、等于和大于key的三部分。文章分析了时间复杂度,良好情况下为O(nlogn),最坏情况下退化为O(n²)。最后提出通过随机选取基准值来优化性能,并强调快排的本质是通过分治策略将复杂问题分解为子问题来解决。
2026-04-21 16:01:39
346
原创 深刻理解智能指针特性
RAII(资源获取即初始化)是一种C++编程技术,通过将资源生命周期与对象生命周期绑定来实现自动资源管理。智能指针是RAII的典型应用,包括三种类型:unique_ptr(独占所有权,禁止拷贝但允许移动)、shared_ptr(共享所有权,通过引用计数管理资源)和weak_ptr(弱引用,解决循环引用问题)。文章详细介绍了它们的实现原理、使用场景及线程安全性,并提供了手写实现代码。其中重点分析了shared_ptr的循环引用问题及weak_ptr的解决方案。
2026-04-06 12:58:45
365
原创 深刻理解进程、线程、程序
本文辨析了程序、进程与线程的概念差异:程序是静态的二进制文件,进程是程序运行的动态实例(资源容器),线程则是进程内的执行流(CPU调度实体)。多进程强调隔离性但开销大,多线程共享资源方便但同步复杂。Linux内核将线程和进程统一抽象为task,仅通过资源共享程度区分。选择多进程或多线程需权衡隔离性与轻量化需求。
2026-04-04 21:55:44
547
原创 深刻理解C++内存管理
本文系统讲解了C++指针的核心概念与应用。首先定义指针为存储内存地址的变量,其大小由系统架构决定。详细解析了指针的基本操作(取地址&和解引用*),强调指针类型决定了内存解释方式和步长。重点区分了空指针、野指针和悬空指针的特性与风险。对比了指针与引用的本质区别:初始化要求、指向可变性和是否可为空。深入剖析了指针与数组的关系,包括数组名的退化特性和指针数组/数组指针的区别。最后介绍了函数指针的定义方法和指针函数的特性。全文涵盖了指针的关键知识点,为理解内存操作机制提供了系统指导。
2026-04-04 17:09:22
420
原创 深刻理解指针
本文系统讲解了C++指针的核心概念与应用。首先定义指针为存储内存地址的变量,其大小由系统架构决定。详细解析了指针的基本操作(取地址&和解引用*),强调指针类型决定了内存解释方式和步长。重点区分了空指针、野指针和悬空指针的特性与风险。对比了指针与引用的本质区别:初始化要求、指向可变性和是否可为空。深入剖析了指针与数组的关系,包括数组名的退化特性和指针数组/数组指针的区别。最后介绍了函数指针的定义方法和指针函数的特性。全文涵盖了指针的关键知识点,为理解内存操作机制提供了系统指导。
2026-04-04 12:31:44
416
原创 std::bind和lambda的使用
本文详细介绍了C++中std::bind和lambda表达式的用法。std::bind用于延迟函数调用,支持参数预填和成员函数绑定,需注意this指针和占位符的使用。Lambda作为匿名函数,通过捕获列表访问外部变量,需区分按值/引用捕获,特别注意引用捕获的生命周期问题。文章对比了两者差异,推荐优先使用lambda(更清晰、支持重载、优化更好),并总结了捕获方式的选择口诀,强调传出作用域时务必按值捕获局部变量以避免悬空引用。
2026-03-29 19:33:08
187
原创 基于CSAPP深刻理解编译链接过程
文章摘要 本文详细解析了C++程序从源代码到可执行文件的编译链接过程。首先通过示例代码展示了一个简单的swap函数和主程序,随后阐述了g++编译器驱动程序的四个关键阶段:预处理、编译、汇编和链接。重点分析了可重定位目标文件swap.o的ELF格式结构,包括其头部信息和各段(section)的组成与功能。通过readelf工具展示了文件内部的具体组织结构,如.text代码段、.data数据段等,并解释了这些段在程序运行时的作用。文章还区分了编译错误和链接错误的本质区别,为理解程序构建过程提供了系统性的视角。
2026-03-26 22:30:48
444
原创 深刻理解继承和多态
本文介绍了C++继承的核心概念:1)继承语法与初始化顺序,子类需先完整初始化父类;2)方法调用规则,包括覆盖(override)和隐藏(hide)的区别;3)对象赋值时的切片问题及指针/引用解决方案;4)生命周期管理中析构函数必须声明为虚函数以避免内存泄漏。重点阐述了子类对象赋值给父类对象时发生的切片现象,以及如何通过指针/引用实现多态。最后强调了基类析构函数虚函数化的必要性。
2026-03-18 20:52:49
389
原创 深刻理解HTTP
HTTP是超文本传输协议,用于规范客户端与服务器间的通信格式。HTTP报文分为请求和响应两类,包含请求行/状态行、头部字段、空行和正文。常见状态码如200(成功)、404(未找到)等指示请求结果。头部字段如Host指定域名,Content-Length标识正文长度。GET方法获取资源,Host字段确定目标服务器。HTTP版本从1.0短连接发展到1.1长连接,再到2.0多路复用和3.0采用QUIC协议,逐步提升传输效率。HTTP协议作为应用层标准,与底层TCP/IP配合完成网络通信。
2026-03-16 21:58:22
504
原创 muduo网络服务器项目篇:服务器模块设计
本文主要探讨了网络编程中的关键组件实现原理与优化策略。首先分析了日志宏中localtime线程不安全的原因及可重入函数的重要性,指出线程安全≠可重入。然后介绍了Buffer模块如何通过读写指针分区和内存整理解决TCP粘包问题。在Socket模块中解释了端口复用的必要性,并详细解析了非阻塞IO下recv/send的返回值含义。核心事件驱动层部分阐述了Channel作为中介的作用,以及Poller如何与epoll配合实现高效事件监控。最后介绍了时间轮算法如何以O(1)复杂度管理定时任务。全文通过多个技术难点解析
2026-03-14 22:28:32
459
原创 五大IO模型和多路转接详解
摘要:本文通过钓鱼案例形象类比五种IO模型,重点解析了epoll的底层原理。阻塞IO和非阻塞轮询IO存在效率问题,而IO多路转接(如epoll)通过内核事件通知机制显著提升性能。epoll采用红黑树存储监控的fd,双向链表记录就绪事件,避免了select/poll的遍历开销。核心API包括epoll_create创建监控结构、epoll_ctl管理fd、epoll_wait获取就绪事件。真正的异步IO需由OS完成数据拷贝,其他模型在数据搬运阶段仍属同步。理解这些模型对开发高性能网络服务至关重要。
2026-03-02 15:54:24
669
原创 UDP原理和极简socket编程demo
本文介绍了UDP协议的核心概念和编程实现。主要内容包括:1)TCP/IP通信连接的五元组标识(源/目的IP和端口号、协议号);2)UDP报文结构(8字节头部)及其16位长度限制(最大64KB),需要应用层手动分包;3)UDP特点:面向数据报、无连接、不可靠;4)通过C++代码示例展示了UDP服务端和客户端的编程实现流程,包括socket创建、绑定、收发数据等关键步骤。文章提供了从协议原理到实际编程的完整UDP知识框架。
2026-02-11 21:00:25
558
原创 基于线程池从零实现TCP计算器网络服务
本文介绍了C++中封装线程安全工具的实现方法。第一部分封装了RAII风格的互斥锁,通过Mutex类管理原生锁资源,使用LockGuard类实现自动加解锁,避免了手动管理锁资源带来的死锁风险。第二部分封装了线程池,通过Thread类将C风格的线程接口转化为面向对象形式,利用静态成员函数作为跳板解决C与C++函数签名不匹配的问题。重点讲解了如何通过引用传递确保锁的有效性,以及如何通过this指针在静态函数中访问对象成员。这些封装提高了多线程编程的安全性和易用性,让编译器自动管理资源生命周期,减少了常见并发问题的
2026-02-05 22:44:13
831
原创 TCP Socket编程详解
本文介绍了一个TCP服务器的实现方案,主要包括两个核心类:InetAddr地址转换类和TcpServer服务器类。InetAddr类封装了网络字节序与主机字节序之间的转换,提供IP地址和端口的统一管理,支持从内核地址结构体构造和本地端口监听两种场景。TcpServer类实现了服务器核心功能,包括socket创建、bind绑定、listen监听和accept接受连接等网络操作流程,采用饭店迎宾员和服务员的比喻形象说明了监听套接字和服务套接字的分工。代码中通过日志模块记录关键操作状态,并处理了端口复用等细节问题
2026-02-04 18:04:02
649
原创 网络编程前你需要知道的网络基础知识
本文系统介绍了计算机网络的基本原理与传输流程。主要内容包括:1)网络发展史与协议定义,指出协议是双方认可的结构体;2)OSI七层模型与TCP/IP五层模型对比,解释分层协议解决异构系统通信、长距离传输和物理差异屏蔽的问题;3)网络传输流程分析,详细说明局域网内基于MAC地址的广播通信机制和跨网络传输时IP地址与MAC地址的协同工作方式,其中IP地址决定宏观路径而MAC地址负责微观传输;4)关键概念总结,包括路由器功能、数据封装与分用过程等。通过快递运输的类比,生动阐释了网络分层和地址转换机制。
2026-01-31 18:05:47
661
原创 基于生产者-消费者模型下的线程同步综述
文章摘要: 本文深入探讨了线程同步与互斥的区别及实现方式。互斥解决资源竞争问题,保证数据安全;同步解决执行时序问题,避免线程饥饿。通过厕所坑位和奶茶店出杯的生动例子,解释了生产者-消费者模型的321原则(3种关系、2个角色、1个交易场所)。重点分析了条件变量的使用,包括wait等待和signal唤醒机制,并提供了基于阻塞队列的生产者-消费者模型实现代码。文章还强调wait必须原子性地释放锁并进入等待,以及signal与broadcast的适用场景差异,最后通过RAII封装实现了自动资源管理。
2026-01-27 19:28:25
1010
原创 基于抢票系统的线程互斥详解
本文展示了两种C++线程封装实现:版本一采用静态成员函数处理线程回调,支持线程创建、启动、停止、连接和分离操作;版本二引入模板支持参数传递。文章重点演示了使用版本一模拟火车票抢购场景,通过全局变量tickets实现多线程共享资源访问,每个线程循环检查剩余票数并模拟抢票过程。代码片段展示了线程初始化、票数递减及并发访问控制的基本实现,为理解多线程编程提供了实践案例。
2026-01-26 22:26:35
626
原创 线程概念和线程控制
线程概念与Linux实现 线程是进程内部的执行流,Linux内核中通过轻量级进程(LWP)实现线程。与传统进程不同,线程共享进程的地址空间、文件描述符等资源,但拥有独立的栈和寄存器上下文。Linux内核使用task_struct统一管理进程和线程,线程创建时通过clone()系统调用共享父进程资源,而非创建全新地址空间。这使得线程调度更高效,CPU只需处理独立的执行流task_struct。 线程控制与创建 使用pthread_create()创建线程时,需注意: 线程函数参数应为堆内存或全局变量,避免栈变
2026-01-24 22:50:49
1054
原创 分页式存储管理——内存高效管理的基石
分页机制与内存管理 分页机制通过将内存划分为固定大小的页框(通常4KB),解决了内存碎片问题。虚拟内存和物理内存被分割为相同大小的页和页框,通过页表建立映射关系,使程序看到的连续虚拟地址可以映射到离散的物理内存空间。 多级页表设计(如二级页表)减少了连续内存需求,通过页目录和二级页表的分层管理,将大页表拆分为多个小页表分散存储。地址转换过程由MMU硬件完成,通过CR3寄存器定位页目录,结合虚拟地址的高10位和中10位索引查找物理页框。 页表项包含关键控制位(如有效位、读写权限、脏位等),用于内存管理和访问控
2026-01-24 18:59:28
1098
原创 进程间通信之管道
进程间通信(IPC)核心机制 摘要:本文阐述了进程间通信(IPC)的基本原理和实现方式。重点分析了管道机制,包括匿名管道和命名管道的底层实现、使用场景及编程接口。通过父子进程通信示例展示了匿名管道的实际应用,并介绍了基于匿名管道的进程池设计方案。文章还详细讲解了管道文件描述符管理、读写特性等关键技术点,为理解操作系统进程通信机制提供了实践参考。 (148字) 核心要点: IPC通过内核共享资源实现进程间数据交换 匿名管道仅限亲缘进程通信,命名管道支持任意进程 管道本质是内核缓冲区,需合理管理文件描述符 进程
2026-01-20 18:46:49
877
原创 基于inode的文件系统
持久化存储演进与磁盘技术 摘要:本文系统梳理了持久化存储技术的发展历程,从远古石刻到现代磁盘技术。重点分析了机械硬盘的物理结构(盘片、磁头、磁头臂等)及其工作原理,详细解释了磁盘的存储层级(柱面、磁道、扇区)和CHS/LBA寻址方式。同时介绍了文件系统的基本概念,包括块设备、分区机制和inode数据结构。通过技术演进的分析,展现了存储设备如何从简单的数据保存发展到支持高效随机访问的现代存储系统。
2026-01-11 21:28:13
799
原创 进程控制详解
本文介绍了Linux进程控制的相关知识,主要包括进程创建和终止两个部分。在进程创建方面,详细讲解了fork函数的工作原理、写时拷贝机制以及fork的常见用法和失败原因。在进程终止部分,阐述了进程终止的本质、三种终止场景(正常成功、正常失败、异常终止),并具体说明了进程退出的方法(main返回、exit、_exit)和退出码的含义。文章通过代码示例和图示,清晰展示了父子进程的执行流程和内存管理机制,帮助读者深入理解Linux进程控制的核心概念。
2025-12-25 22:42:08
777
原创 Linux 进程底层拆解:从 “先描述再组织” 到 O (1) 调度,程序员必备 OS 知识
本文介绍了Linux系统中进程的基本概念、管理方式及相关操作。主要内容包括:1)进程本质是内核数据结构与程序代码数据的组合,内核通过PCB(进程控制块)进行管理;2)详细解析了PCB的内部结构,包括标识符、状态、优先级等核心属性;3)介绍了查看进程的三种方法:/proc文件系统、ps指令和top指令;4)深入讲解了fork函数的原理,通过代码示例展示了父子进程的数据独立性。文章通过理论讲解与实例演示相结合的方式,系统性地介绍了Linux进程管理的核心知识。
2025-12-21 20:34:27
623
原创 Linux常见工具使用
本文介绍了Makefile的基本结构和规则,通过一个简单的C++项目演示了Makefile的使用方法。主要内容包括: 项目结构:展示了一个包含add.h、add.cpp和main.cpp的简单C++项目 Makefile解析: 变量定义:使用SRC、OBJ、BIN变量管理源文件和目标文件 默认目标:定义可执行文件的生成规则 编译规则:使用模式规则将.cpp文件编译为.o文件 清理规则:使用.PHONY声明伪目标 构建过程: 详细解释了make命令的依赖推导过程 说明了目标文件和依赖文件的时间戳比较机制 演示
2025-12-17 22:17:34
822
原创 初识操作系统
本文介绍了冯诺依曼体系结构和操作系统的基本概念。冯诺依曼体系结构规定计算机由输入设备、输出设备、存储器和CPU组成,所有数据必须经过内存与CPU交互,这种设计通过内存作为高速缓存解决了外设与CPU效率不匹配的问题。操作系统作为中间层,向上为用户程序提供简单接口,向下统一管理硬件资源,其核心思想是"先描述,再组织",通过封装系统功能和抽象硬件操作,使整个系统有序运行。文章还通过实例说明了数据在冯诺依曼体系中的流动过程。
2025-12-17 21:00:51
899
原创 g++演示如何从C++代码到可执行程序
本文介绍了C++代码从编写到生成可执行文件的完整编译过程。文章通过示例代码演示了预处理、编译、汇编和链接四个关键阶段:预处理阶段处理宏替换和头文件展开;编译阶段进行语法分析、语义检查和模板实例化;汇编阶段生成机器码目标文件;最后链接阶段合并目标文件并解析符号依赖。文中特别强调了模板实例化的时机、符号表的作用以及重定位信息的重要性,并通过实际命令操作展示了每个阶段的输出结果,帮助读者直观理解C++程序的编译流程。
2025-12-14 18:52:24
1076
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅