自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一名在 Linux 与 C/C++ 世界里打怪升级的开发者。持续输出系统编程、网络编程、数据结构与算法的高质量学习笔记与实战总结

专注 C/C++ 底层开发与 Linux 系统/网络编程。用代码丈量世界,用博客记录从零到一的打怪升级之路。

  • 博客(130)
  • 收藏
  • 关注

原创 [LangChain] 学习笔记(04):手搓 ChatGPT 打字机——流式输出(SSE)与模型初始化选型

流式输出基于SSE协议,实现边生成边推送,消除用户等待焦虑。推荐使用ChatOpenAI+base_url对接兼容OpenAI的国内模型(如DeepSeek),兼容性强、依赖少。同步场景用stream(),Web后端必须用astream()异步处理,避免阻塞。通过configurable_fields和config_prefix可动态配置模型参数,多模型时需加前缀隔离。Windows下需设置WindowsSelectorEventLoopPolicy解决异步报错。关键:print(chunk, flush=

2026-11-07 00:03:55 163

原创 [LangChain] 学习笔记(补充篇):大模型开发必知的底层细节与参数详解

ChatOpenAI可无缝对接DeepSeek等国产模型,仅需修改base_url至根路径(如https://api.deepseek.com),无需加/v1。temperature控制输出随机性,R1推理模型忽略该参数;max_tokens限制输出长度,过小易导致结构化输出截断。StrOutputParser剥离AIMessage元数据,提取纯文本。SystemMessage设人设,HumanMessage传问题,AIMessage维持上下文。上下文裁剪用len计数避免报错,session_id必须唯一以

2026-11-07 00:02:55 86

原创 [LangChain] 学习笔记(03):打破失忆症——对话机制与上下文管理

大模型无记忆,多轮对话依赖应用层传递历史消息。受限于上下文窗口,需通过trim_messages智能裁剪(如保留最近对话),并结合RunnableWithMessageHistory与session_id实现用户间记忆隔离。使用token_counter=len可规避非OpenAI模型的Token统计报错,确保稳定运行。注意:生产环境务必保证session_id唯一,避免数据串台;本地Ollama需确认服务已启动。

2026-11-07 00:02:26 340

原创 Linux 学习笔记(六十一):网络编程毕业设计——Reactor 反应堆模式

Reactor模式通过事件驱动实现网络I/O与业务逻辑解耦,核心由EventLoop、Reactor(分发器)和Handler(处理器)构成。单Reactor单线程适用于短连接场景,主从Reactor多线程则支持高并发(如Netty、Nginx)。其精髓在于利用epoll_data.ptr绑定Connection对象,实现就绪事件的自动回调。本文手写极简版Reactor,封装Connection与Reactor类,通过面向对象思想将epoll变为黑盒引擎,只需注册回调即可处理连接与读写,体现“控制反转”优势

2026-11-06 23:42:12 41

原创 Linux 学习笔记(六十):单线程的逆袭——epoll 高并发服务器实战

本文基于epoll的LT模式,实现了一个单线程高并发字典服务器。通过epoll_wait事件驱动,统一处理新连接(accept)与客户端数据读写,无需多线程或进程,即可高效支持上万并发连接。代码结构清晰,结合C++与标准库完成英汉词典查询功能,实测支持多终端并发查询,响应迅速且资源占用极低。为后续引入Reactor模式及主从架构奠定基础。

2026-11-06 23:41:56 44

原创 Linux 学习笔记(五十九):epoll 的生死抉择——LT 与 ET 模式

摘要(≤150字): epoll支持LT(水平触发)与ET(边缘触发)模式。LT默认,数据未读完则持续通知,安全但效率低;ET仅在数据到达时通知一次,性能高,但必须非阻塞IO+循环读至EAGAIN,否则数据丢失。实战表明,ET模式下若使用阻塞IO会导致线程阻塞,需配合非阻塞I/O和while循环确保缓冲区清空,避免事件丢失。Nginx等高性能服务器采用ET模式以提升并发处理能力。

2026-11-06 23:41:32 81

原创 Linux 学习笔记(五十八):IO 多路复用封神——epoll 底层原理揭秘

epoll通过红黑树(仅注册时拷贝)和就绪队列(中断回调触发),彻底解决select/poll的全量拷贝与遍历问题。其复杂度为O(1),即使十万个连接中仅一个活跃,也能瞬时定位。实战中,epoll_wait直接返回就绪fd数量,只需循环处理这些有效连接,无需遍历所有fd,实现高效事件驱动,是高性能网络服务器的核心利器。

2026-11-05 11:31:59 275

原创 Linux 学习笔记(五十七):IO 多路复用——poll 的改良与局限

poll通过使用struct pollfd数组取代select的位图,突破1024连接限制,并分离events与revents,避免重复设置,代码更清晰。但其仍为O(N)复杂度,需全量拷贝和遍历所有文件描述符,在高并发、低活跃场景下性能瓶颈明显,难以胜任大规模连接需求,最终被epoll取代。

2026-11-05 11:31:34 297

原创 Linux 学习笔记(五十六):IO 多路复用初探——select 的“三宗罪”

IO多路复用通过单线程监控多个文件描述符,解决阻塞IO和多线程的瓶颈。select机制虽能实现,但存在三大缺陷:全量拷贝位图、遍历所有fd、最多支持1024个连接。更致命的是,select会清空未就绪fd,必须每次调用前备份fd_set。实战中若不使用临时变量,第二次调用将失效。高并发下性能急剧下降,已被poll、epoll取代。

2026-11-05 11:31:12 145

原创 Linux 学习笔记(五十五):五种 IO 模型与非阻塞 IO 实战

本文详解IO操作瓶颈及五种IO模型:阻塞、非阻塞、信号驱动、IO多路复用(epoll)与异步IO,以“钓鱼”比喻形象阐释。通过fcntl设置O_NONBLOCK可将阻塞IO转为非阻塞,但盲目轮询会导致CPU飙升。实战演示阻塞与非阻塞IO差异,强调非阻塞需配合epoll避免忙等待,提升高并发性能。

2026-11-04 12:15:50 179

原创 Linux 学习笔记(五十四):内网穿透实战——用 frp 让外网访问你的私人电脑

本文围绕 frp 内网穿透展开,先说明 NAT 环境下外网无法直接访问内网私有 IP 的问题,再介绍由公网 frps 与内网 frpc 组成的反向代理架构及其隧道建立流程。随后给出 frps.toml 与 frpc.toml 的完整配置示例,并通过 SSH 端口映射的实战演示验证穿透效果,最后总结安全组放行、后台常驻与安全加固等关键避坑要点。

2026-11-04 12:15:30 216

原创 Linux 学习笔记(五十三):NAT 技术与代理服务——正反向代理的本质区别

将私有 IP 替换为公网 IP,利用端口号区分不同主机(NAPT),拯救了 IPv4。:代表,隐藏客户端身份。如翻墙、加速器。:代表,隐藏服务器真实 IP。如 Nginx 负载均衡、CDN。:NAT 工作在网络层,代理工作在应用层。正向代理防服务器查你,反向代理防你查服务器。由于 IPv4 地址枯竭,家里和公司内部普遍使用私有 IP(如 192.168.x.x)。当你上网时,NAT 路由器会把你的私有 IP 替换成公网 IP。如果家里有多台设备,路由器会使用。

2026-11-04 12:15:11 60

原创 Linux 学习笔记(五十二):网络探路者——DNS 域名解析与 ICMP 诊断协议

DNS将域名解析为IP,依次查询浏览器缓存、hosts文件、本地DNS、根服务器、顶级域及权威域。ICMP作为网络层协议,用于差错报告与探测(如ping、traceroute)。ping无端口,因工作在IP层;traceroute利用TTL递减机制,通过ICMP超时报文追踪路由路径。实战中,dig可查看详细解析记录(含CNAME、A记录),traceroute则揭示数据包经过的每一跳路由器,助力网络故障排查。

2026-11-03 08:48:14 300

原创 Linux 学习笔记(五十一):数据链路层与 ARP 协议——局域网寻址与黑客骗局

IP地址用于跨网段通信,终点不变;MAC地址为局域网内“下一跳”目标,每经一路由器即变。以太网帧最大1500字节,超则分片损性能。ARP协议通过广播求MAC,单播回应并缓存,但因无认证易遭欺骗,黑客可伪造网关MAC实施中间人攻击。防范需静态绑定或DAI技术。实战中,ip link show查MAC,arp -a或ip neigh看ARP缓存,删缓存后重发ping可触发新ARP请求,验证链路二层连通性。云环境禁ping不等于不通,二层可达即表明链路正常。

2026-11-03 08:47:51 173

原创 Linux 学习笔记(五十):网络层——IP 协议、子网划分与 NAT 魔法

IP协议核心:TTL防环路,分片字段支持大包传输。CIDR取代传统分类,通过子网掩码划分网络与主机号,提升地址利用率。私有IP(如10.x、172.16-31.x、192.168.x)限于局域网,依赖NAT实现多设备共享公网IP。路由表决定数据转发路径,iproute查看默认网关。实战中,ping和traceroute可验证TTL与路由跳数,云服务器普遍使用私有IP+NAT架构,代码需绑定INADDR_ANY以兼容动态公网映射。

2026-11-03 08:47:23 293

原创 Linux 学习笔记(四十九):TCP 粘包问题深度剖析与异常断线处理

TCP面向字节流,无边界导致粘包,表现为多次发送数据被合并接收;UDP面向数据报,有边界,不会粘包。解决粘包需应用层自定义协议,推荐使用“长度+数据”方式。异常断开时,TCP保活机制(如Keep-Alive)响应慢,建议应用层实现心跳检测,及时发现并清理死连接。通过实战代码可复现粘包现象,并验证解决方案的有效性。

2026-11-02 14:42:56 255

原创 Linux 学习笔记(四十八):TCP 封神之路——滑动窗口、流量控制与拥塞控制

TCP通过滑动窗口提升吞吐量,流量控制防止接收端过载,拥塞控制保障网络稳定。发送窗口大小由接收方窗口与拥塞窗口共同决定。实战中,ss -tin可查看cwnd、ssthresh等关键参数,tcpdump能捕捉快重传现象。这套机制使TCP在可靠与高效间达成完美平衡,堪称计算机科学经典设计。

2026-11-02 14:37:11 260

原创 [Python/LangChain] 开发避坑:如何安全优雅地管理大模型 API Key(环境变量与 .env 实战)

摘要(148字): 切勿将API Key硬编码于代码中,否则一旦上传至GitHub等平台,密钥将被黑客秒级盗取,导致巨额账单。推荐使用环境变量或.env文件管理密钥。通过系统环境变量或python-dotenv加载.env文件,实现代码与敏感信息解耦。务必在.gitignore中忽略.env文件,并重启IDE确保环境变量生效。避免因未重启或依赖未安装导致的报错,确保开发安全与高效。

2026-11-02 08:42:04 1630

原创 Linux 学习笔记(四十七):TCP 状态机与 tcpdump 抓包排雷实战

本文通过抓包实战解析TCP三次握手、四次挥手机制,揭示其设计原理:三次握手防止历史连接干扰,四次挥手因全双工特性需分步关闭。重点剖析CLOSE_WAIT泄漏根源——未调用close()导致连接无法释放,引发文件描述符耗尽;详解TIME_WAIT状态意义:保障连接可靠关闭并清除网络旧数据。结合tcpdump与netstat实操,验证连接生命周期,提供排查网络资源泄漏的实用方法。

2026-11-01 13:06:10 339

原创 Linux 学习笔记(四十六):传输层基石——UDP 极限与 TCP 报文头剖析

UDP单包最大64KB,超限则sendto报错“Message too long”,需应用层切片;TCP通过seq、ack、SYN、FIN等字段实现可靠传输,端口号标识进程,五元组唯一确定连接。实战验证UDP大包限制及netstat端口排查,凸显协议层设计对应用开发的关键影响。

2026-11-01 12:55:52 166

原创 [Git 实战] 学习笔记:从生成 SSH 密钥到解决 TortoiseGit 推送报错全指南

推荐使用Ed25519生成SSH密钥,配置时直接回车跳过路径与密码设置;TortoiseGit需将SSH客户端改为Git自带的ssh.exe以避免兼容问题;gitclone遇“目录非空”报错时,切勿覆盖,应根据情况清空、备份或执行gitpull;项目根目录必须配置.gitignore,忽略.venv、.idea等无关文件,防止仓库臃肿。

2026-11-01 11:31:51 323

原创 Linux 学习笔记(四十五):Web 安全基石——Cookie、Session 与 HTTPS 原理解析

HTTP无状态特性导致需引入Cookie与Session实现用户状态管理。Cookie存储于客户端,易被篡改;Session则将数据存于服务器,仅传递安全的SessionID。HTTPS通过TLS/SSL加密保障通信安全,结合非对称加密协商密钥、对称加密传输数据,并依赖CA证书防中间人攻击。浏览器内置CA公钥验证证书真伪,确保公钥可信。实战中,服务端通过Set-Cookie响应头设置Cookie,客户端自动携带,服务器可捕获并验证。注意expires时间必须为RFC1123标准的UTC格式,否则失效。

2026-10-31 20:34:00 177

原创 Linux 学习笔记(四十四):HTTP 协议解析与极简 Web 服务器实战

HTTP协议核心:报文由请求/状态行、头域、空行(\r\n)和正文组成。GET参数在URL,POST在Body。状态码200成功,301/302重定向,404资源不存在,500服务器错误。极简服务器只需按规范拼接响应报文,通过write发送。关键点:必须包含\r\n分隔头与正文,且Content-Length准确,否则浏览器会无限等待。实战中用C语言编写短连接服务器,手动构造响应,验证格式正确性即可成功显示页面。

2026-10-31 19:05:06 219

原创 Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程

TCP为字节流无边界,易产生粘包/半包问题。解决核心:应用层自定义协议,采用“长度+回车换行+数据”格式,通过编码/解码实现边界划分。数据需序列化(如JSON)传输,接收端反序列化还原。为使服务长期运行,需转为守护进程:fork脱离终端、setsid创建新会话、重定向I/O至/dev/null。实战中手写协议编解码与守护进程代码,验证了粘包处理与后台服务可行性。

2026-10-31 13:51:14 172

原创 [LangChain] 学习笔记(02):LCEL 链式调用与动态模型配置实战

LCEL通过重载管道符|,实现模型、解析器等组件的链式串联,支持动态切换大模型(如OpenAI→DeepSeek)与参数配置,提升代码复用性与可维护性。核心依赖Runnable协议,确保组件具备invoke、batch、stream能力。使用init_chat_model结合configurable_fields可在运行时灵活调整模型与参数,避免硬编码。注意版本更新、base_url正确性及链末尾添加StrOutputParser()以获取纯文本输出。

2026-10-30 23:42:08 559

原创 Linux 学习笔记(四十二):网络编程高阶——基于状态机的 TCP 客户端断线重连

本文提出基于状态机的TCP客户端自愈机制,应对网络波动或服务器重启导致的断连问题。通过定义NEW、CONNECTED、DISCONNECTED、CLOSED等状态,实现连接管理与自动重连。当read()返回0时判定为掉线,触发重连逻辑(最多5次,间隔1秒),超限则进入CLOSED状态。核心在于状态驱动的主循环,确保连接具备自恢复能力。

2026-10-30 23:36:34 235

原创 [LLM/LangChain] 学习笔记(01):从大模型底层原理到 LangChain 极速接入实战

大语言模型本质是基于概率的“文字接龙机”,通过自监督学习涌现智能,但存在幻觉与无记忆缺陷。LangChain作为中间件,通过标准化组件为模型接入记忆、工具与知识库,解决多轮对话、实时数据与格式控制等痛点。企业推荐使用兼容OpenAI接口的云端API(如DeepSeek),兼顾效率与成本;对数据隐私要求高的场景,可本地部署Ollama,选用7B以下量化模型避免显存溢出。实战中需注意代理配置、API鉴权及上下文长度限制,合理排雷保障稳定运行。

2026-10-30 19:04:17 331

原创 Linux 学习笔记(四十一):TCP 并发演进——从单进程到多线程服务器

多线程并发服务器通过主从模式实现高并发:主线程专注accept,子线程负责read/write。核心要点:必须调用pthread_detach避免僵尸线程,主线程需关闭conn_fd防止文件描述符泄漏。虽开销小、并发高,但海量连接仍会压垮系统,后续可引入线程池优化。

2026-10-29 00:20:28 253

原创 Linux 学习笔记(四十):TCP 编程——从理论到 EchoServer 实战

TCP核心特性为面向连接、可靠传输与面向字节流。服务端流程:socket→bind→listen→accept→read/write。accept返回新文件描述符conn_fd,专用于通信,原listen_fd持续监听。read()返回0表示客户端主动关闭连接。解决重启时报“Address already in use”需设置SO_REUSEADDR。当前单进程服务器因阻塞在accept后无法并发处理多客户端,需进一步优化。

2026-10-29 00:19:44 323

原创 Linux 学习笔记(三十九):网络基石——TCP/IP 模型与 UDP 实战

本文系统阐述了网络通信本质为跨主机进程通信,依托IP+Port(Socket)标识。重点解析了网络字节序、IP与MAC区别、UDP无连接特性及核心API使用。通过实战代码实现UDP回显服务器与客户端,强调服务器需bind、客户端可自动分配端口。特别提醒云服务器需配置安全组放行UDP端口,否则通信将被防火墙拦截。

2026-10-29 00:19:07 186

原创 Linux 学习笔记(三十八):从实模式到分页——处理器内存管理的发展史

8086实模式通过“段基址左移4位+偏移量”实现1MB寻址,但缺乏安全。80386引入保护模式,用GDT和段选择子实现权限隔离(Ring0–Ring3)。32位地址空间使分段冗余,系统采用平坦模型(段基址为0),实质废除分段。为解决内存碎片,引入分页机制:将内存划分为4KB页,通过页表实现虚拟地址到物理地址映射,支持虚拟内存与内存管理。

2026-10-28 22:15:40 390

原创 Linux 学习笔记(三十七):System V IPC 进阶——用建造者与责任链模式重构底层接口

SystemV IPC接口设计繁琐且易致资源泄漏。通过建造者模式优雅封装信号量,实现链式初始化;用责任链模式处理消息流水线(格式化→落盘→备份),提升代码可读性与扩展性。关键提醒:资源生命周期随内核,必须使用ipcs查看、ipcrm手动清理,否则造成内存泄漏。

2026-10-28 22:15:10 637

原创 Linux 学习笔记(三十六):并发进阶——读写锁 vs 自旋锁,到底怎么选?

选型口诀:多读少写用读写锁,极短临界区且多核用自旋锁,复杂逻辑用互斥锁。读写锁遵循“读读共享、读写互斥、写写互斥”三大铁律,但可能引发写者饥饿;自旋锁忙等待,锁持有时间长会浪费CPU。实战中,读写锁实现并发读取,自旋锁适用于极短临界区,合理选型提升并发性能。

2026-10-28 22:14:42 302

原创 Linux 学习笔记(三十五):深入 mmap——比共享内存更强大的存在

mmap将文件直接映射到进程虚拟内存,实现零拷贝,提升性能。通过MAP_SHARED可共享内存,实现高效进程通信;MAP_PRIVATE触发写时拷贝,保障隔离。其底层用于malloc大块内存分配,亦可构建大文件LRU缓存。理解mmap,即掌握Linux内存管理核心。

2026-10-27 12:40:54 292

原创 Linux 学习笔记(三十四):线程同步——条件变量与生产消费者模型

互斥锁解决数据竞争,但无法控制线程执行顺序。条件变量通过阻塞与唤醒机制,避免忙等待,提升CPU利用率。pthread_cond_wait需配合互斥锁,确保锁释放与睡眠的原子性;判断条件必须用while循环,防止伪唤醒或多个线程同时唤醒导致错误。生产者消费者模型遵循“321原则”:三类关系、两角色、一阻塞队列。通过手写阻塞队列,实现生产快、消费慢时的自动暂停,有效解耦并发逻辑,提升程序健壮性与效率。

2026-10-27 12:19:41 302

原创 Linux 学习笔记(三十三):线程互斥——互斥锁(Mutex)与死锁

多线程修改全局变量因操作非原子性导致竞态条件,引发数据错误。通过互斥锁(Mutex)保护临界区可避免冲突。利用C++ RAII机制封装锁守卫(LockGuard),在作用域结束时自动解锁,防止死锁。实战表明,加锁后票数正确递减至0,有效解决并发问题。

2026-10-27 08:52:34 353

原创 Linux 学习笔记(三十二):线程控制——创建、等待与分离

本文系统讲解线程的终止(return、pthread_exit、pthread_cancel)、等待(pthread_join)与分离(pthread_detach)机制,并通过实战代码验证线程ID本质为虚拟地址,指向TCB。强调线程使用后必须join或detach,否则导致资源泄漏。四个实验分别演示了带参返回、强制取消、分离线程及线程地址空间特性,深入理解多线程编程基础。

2026-10-26 00:01:08 267

原创 Linux 学习笔记(三十一):线程概念、底层分页机制与初体验

本文详解了Linux线程的本质——轻量级进程(LWP),阐述其共享资源(如全局变量、堆区)与私有资源(如栈、线程ID)的特性。通过实战代码演示创建线程、验证全局变量共享,并结合ps -aL查看LWP,证实线程与进程在内核中均以task_struct表示,仅共享程度不同。同时解析虚拟内存与多级页表机制,揭示缺页中断与延迟分配原理,深入理解线程高效切换背后的底层支撑。

2026-10-26 00:00:41 192

原创 Linux 学习笔记(三十):深入进程信号——屏蔽、未决与 volatile 关键字

信号在进程PCB中通过Block(阻塞)、Pending(未决)和Handler(处理)三张位图管理。阻塞阻止信号递达,忽略则允许递达但不处理。通过sigprocmask屏蔽信号,可观察到信号被暂存于未决表;sigpending可实时查看未决状态。实战中发现,编译优化使全局变量缓存至寄存器,导致信号处理无法生效——需用volatile关键字强制内存访问,确保多线程与信号处理的正确性。信号递达发生在从内核态返回用户态时,体现操作系统权限隔离机制。

2026-10-26 00:00:11 516

原创 Linux 学习笔记(二十九):进程信号(上)—— 信号捕捉与异步魔法

本文详解Linux信号机制,介绍信号作为异步通知的三种处理方式:默认动作、忽略与自定义捕捉。通过终端按键、系统调用(kill、raise、abort)、软件定时器(alarm)及硬件异常(如除零、野指针)等途径产生信号。实战演示了自定义信号处理、pause()函数实现无消耗挂起,以及信号捕捉在优雅退出中的应用。重点说明:虽可拦截部分信号,但SIGKILL(9号)不可捕,段错误(SIGSEGV)即使捕捉仍难挽回崩溃。掌握信号是编写健壮服务程序的基础。

2026-10-25 09:42:33 211

空空如也

空空如也

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

TA关注的人

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