- 博客(116)
- 收藏
- 关注
原创 线程池学习(一) 理解 进程 线程 协程及上下文切换
进程是操作系统进行资源分配的基本单位。当你启动一个应用程序时,操作系统就会为它创建一个或多个进程。每个进程都拥有独立的地址空间、文件描述符、信号处理函数等资源。工厂有自己的厂房(内存空间)有自己的设备和原材料(文件描述符、网络连接等)有自己的工人(线程)不同工厂之间是相互隔离的,一个工厂出问题不会影响其他工厂线程是操作系统进行 CPU 调度的基本单位,也被称为 "轻量级进程"。一个进程可以包含一个或多个线程,这些线程共享进程的所有资源,但每个线程有自己独立的栈和程序计数器。
2026-05-13 21:47:40
189
原创 linux学习进展 网络编程——HTTPS (补充)
本次补充笔记聚焦Linux环境下HTTPS的实操核心,填补前序理论学习的空白,核心要点总结如下,便于快速记忆和实操应用:HTTPS的核心是“HTTP + SSL/TLS”,通过混合加密机制实现安全通信,解决HTTP明文传输的安全隐患;Linux环境中,OpenSSL是生成SSL证书的核心工具,自签名证书用于测试,CA证书用于公网,私钥权限必须设置为600;Nginx配置HTTPS的关键:启用ssl模块、配置证书绝对路径、开放443端口、设置HTTP自动跳转;
2026-05-13 19:11:05
87
原创 linux学习进展 shell编程
在Linux学习过程中,Shell编程是提升效率、实现自动化运维的核心技能。Shell作为Linux内核与用户之间的“翻译官”,不仅是执行单个命令的交互终端,更是一门简洁高效的脚本编程语言,能够将一系列Linux命令组合起来,实现批量处理、自动化部署、定时任务等复杂操作。无论是后端开发、运维工作,还是日常系统管理,掌握Shell编程都能大幅提升工作效率。本笔记将从Shell基础认知、脚本编写规范、核心语法、实战案例到调试排错,全面详解Shell编程,帮助快速入门并能独立编写实用脚本。在学习Shell编程前,
2026-05-13 14:42:32
165
原创 linux学习进展 守护进程
本文详解了Linux守护进程的核心知识,从概念、特征、手动创建,到systemd管理和问题排查,覆盖了学习和实操的全场景,核心要点总结如下:守护进程是独立于控制终端、后台常驻的系统级进程,PPID为1(被init进程接管),名称通常以d结尾;手动创建守护进程需遵循6步标准流程,核心是“脱终端、稳环境”,重点理解fork和setsid的作用;生产环境优先使用systemd管理守护进程,通过.service文件配置服务,用systemctl命令实现启动、停止、开机自启;
2026-05-12 17:54:31
492
原创 linux学习进展 git详解
本文详解了Linux环境下Git的核心知识,从概念到实操,覆盖了基础操作、进阶技巧和常见问题,核心要点如下:Git的核心是“分布式版本控制”,三大区域(工作区、暂存区、本地仓库)的流转是基础工作流;Linux环境下,Git的安装通过包管理器完成,初始配置需设置用户信息,提升使用效率;基础操作围绕“仓库→修改→暂存→提交→推送/拉取”展开,高频命令需熟练记忆;分支管理、版本回退、stash暂存是应对复杂场景的关键,团队协作需遵循分支规范;遇到权限、乱码、连接、冲突等问题,可按对应解决方案快速排查。
2026-05-12 12:24:24
353
原创 linux学习进展 libevent
libevent是一个用C语言编写的轻量级、跨平台、高性能的事件驱动库,核心作用是封装底层I/O复用机制(Linux下的epoll、BSD下的kqueue、Windows下的IOCP等),为开发者提供统一的事件处理接口,无需关注底层不同系统的I/O复用差异,专注于业务逻辑开发。其核心设计理念是“事件驱动”,即程序不再主动轮询事件,而是由libevent监听事件(如I/O事件、定时器事件、信号事件),当事件就绪时,自动触发预设的回调函数,实现高效的异步处理。
2026-05-11 19:07:50
431
原创 linux学习进展 I/O复用函数——epoll详解(ET,IT模式)
只要fd处于就绪状态(如读缓冲区有数据),每次调用epoll_wait,内核都会重复通知进程该fd就绪,直到进程将数据处理完毕。仅当fd的状态从“非就绪”变为“就绪”时,内核才会通知进程一次,后续即使fd仍处于就绪状态(如还有未读取的数据),内核也不会再通知。对比项水平触发(LT)边缘触发(ET)触发时机fd就绪时,重复通知,直到数据处理完毕仅在fd从非就绪→就绪时,通知一次fd类型要求支持阻塞、非阻塞fd必须使用非阻塞fd数据处理要求可分多次处理,无需一次性读完/写完。
2026-05-11 12:28:06
399
原创 linux学习进展 I/O复用函数——poll详解
无最大文件描述符数量限制:相比select的1024(受FD_SETSIZE限制),poll可以监视更多的fd(数量由系统内存决定,但数量过大性能会下降);接口更简洁:无需维护多个文件描述符集合(读、写、异常),只需一个pollfd数组,事件通过结构体成员设置和返回,逻辑更清晰;事件区分更明确:通过revents返回实际发生的事件,无需像select那样重新检查所有fd的状态,且自动检测错误、挂起等事件。
2026-05-10 22:31:16
456
原创 linux学习进展 I/O复用函数——select详解
select是Linux系统中最古老的I/O复用函数,隶属于sys/select.h头文件,核心作用是监听多个文件描述符的就绪状态(可读、可写、异常),由内核负责等待fd就绪,避免进程/线程无效阻塞,从而实现单线程处理多I/O操作。其核心优势的是跨平台兼容性(支持Linux、Unix、Windows),无需依赖系统特有接口,适合入门I/O复用学习和低并发场景开发;缺点是存在fd数量限制、效率偏低等问题,后续会详细讲解。
2026-05-10 16:16:06
333
原创 linux学习进展 I/O复用函数初步
I/O复用(I/O Multiplexing),简单来说,就是一个进程/线程可以同时监听多个文件描述符(fd),当其中任意一个或多个fd就绪(满足可读、可写、出错条件)时,通知进程/线程去处理对应的fd。这里的“文件描述符”,不仅包括Socket的文件描述符(lfd监听fd、cfd客户端fd),还包括普通文件、管道、信号等,但其核心应用场景是网络编程(处理多客户端连接)。对比维度select函数poll函数fd数量限制有(默认1024,可修改)无(仅受系统内存限制)fd管理方式。
2026-05-09 22:57:07
527
原创 linux学习进展 mysql索引详解
索引是 MySQL 中一种特殊的数据结构(类似书籍的目录),存储在表空间(.ibd文件)中,用于快速定位数据,避免全表扫描。无索引→逐行扫全表(慢);有索引→走目录定位(快)。核心本质:索引是 B + 树结构(InnoDB),聚簇索引存数据,二级索引存主键,查询优先走索引减少 I/O。分类选型:主键必建,高频查询建普通 / 联合索引,长文本用前缀索引,文本检索用全文索引。优化关键:遵循最左前缀、避免失效场景、优先覆盖索引、定期维护碎片。实践建议:Linux 环境下,开发阶段用EXPLAIN。
2026-05-09 14:34:54
325
原创 linux学习进展 mysql视图详解
视图是MySQL中一种虚拟表,它本身不存储任何实际数据,仅保存了一段预定义的SQL查询语句(查询逻辑)。当我们查询视图时,MySQL会动态执行这段查询语句,从底层的基表(实际存储数据的表)中获取数据并返回结果,相当于给复杂查询套了一层“逻辑外壳”,用户无需关心底层表的结构和关联关系,只需像操作普通表一样操作视图即可。
2026-05-08 22:34:56
421
原创 linux 学习进展 mysql 事务详解
在数据库应用中,事务是确保数据一致性和可靠性的核心机制。从银行转账到电商订单处理,从社交媒体互动到物联网数据同步,几乎所有需要保证 "要么全成功,要么全失败" 的操作都离不开事务的支持。MySQL 作为最流行的关系型数据库之一,其 InnoDB 存储引擎提供了完整的事务支持,这也是它取代 MyISAM 成为默认引擎的重要原因之一。截至 2025 年,InnoDB 在全球关系型数据库市场的份额已突破 85%,支撑了包括阿里巴巴、京东等大型电商平台每秒百万级的高并发事务处理。
2026-05-08 21:45:00
538
原创 linux学习进展 mysql数据库
MySQL是一款开源的关系型数据库管理系统(RDBMS),基于客户端-服务器(C/S)架构,底层通过TCP协议实现客户端与服务器的通信(默认端口3306),支持多用户、多线程并发访问,能高效存储和管理结构化数据。在Linux网络编程中,MySQL的核心作用:作为网络程序的“数据仓库”,持久化存储业务数据(如TCP服务器的客户端信息、HTTP接口的请求日志、用户账号密码等),避免程序重启后数据丢失。-- 1. 创建数据库(用于存储网络程序数据,如linux_net)-- 2. 查看所有数据库。
2026-05-07 19:35:44
510
原创 linux 学习进展 网络编程 ——HTTP 协议详解
前面我们把TCP 三次握手、四次挥手、TIME_WAIT、UDP 套接字编程全部学完了,TCP/UDP 属于传输层协议。实际上网、浏览器访问网页、接口调用、前后端交互,底层都是 TCP,上层跑的就是HTTP 协议。本节课重点:搞懂 HTTP 是什么、请求报文、响应报文、请求方法、状态码、HTTP 工作流程,最后结合 Linux Socket 手写一个极简 HTTP 服务器,把网络编程真正落地到网页访问。HTTP(HyperText Transfer Protocol,超文本传输协议),是应用层。
2026-05-07 15:25:14
411
原创 linux 学习进展 网络编程 ——TCP 协议 TIME_WAIT 状态详解
TIME_WAIT 是 TCP 连接关闭过程中,主动关闭连接的一方会进入的状态,出现在四次挥手的第四次握手之后。客户端发送 FIN 报文(第一次挥手),进入FIN_WAIT_1状态服务器回复 ACK 报文(第二次挥手),进入CLOSE_WAIT状态;客户端收到 ACK 后,进入FIN_WAIT_2状态服务器发送完剩余数据后,发送 FIN 报文(第三次挥手),进入LAST_ACK状态客户端回复 ACK 报文(第四次挥手),进入 TIME_WAIT 状态;服务器收到 ACK 后,进入CLOSED。
2026-05-06 22:31:02
321
原创 linux学习进展 网络编程——UDP协议详解及客户端服务器实现
UDP(User Datagram Protocol,用户数据报协议),与TCP一样,是TCP/IP五层模型中传输层的核心协议,主要作用是为应用层提供无连接、不可靠、面向数据报的端到端数据传输服务。定位:UDP同样位于应用层和网络层之间,但其设计理念与TCP完全相反——UDP不追求可靠传输,只负责将应用层的数据封装成数据报,交给网络层通过IP协议传输,不做任何额外的可靠性保障(如确认、重传),最大限度降低传输延迟,提升实时性。
2026-05-06 17:20:57
379
原创 linux学习进展 网络编程——TCP协议详解
TCP(Transmission Control Protocol,传输控制协议),是TCP/IP五层模型(或OSI七层模型)中传输层的核心协议之一,与UDP协议并列,主要作用是为应用层提供可靠、面向连接、面向字节流的端到端数据传输服务。定位:TCP位于应用层(如HTTP、FTP)和网络层(IP协议)之间,承接应用层的数据,将其封装成TCP报文,交给网络层通过IP协议传输;同时接收网络层传来的TCP报文,解析后交给应用层,屏蔽底层IP协议的不可靠性(IP协议无连接、不可靠,可能出现数据丢失、乱序、重复)
2026-05-06 15:04:52
568
原创 linux学习进展 网络编程——服务器客户端 及多进程多线程服务器
当一个客户端与服务器通信时,其他客户端只能处于等待状态,无法实现并发服务。本节课,我们将先回顾基础的TCP客户端与服务器实现(巩固上节重点),再重点学习Linux中实现并发服务器的两种核心方案——和,理解其原理、实现流程和优缺点,最终完成能同时处理多个客户端连接的并发服务器,衔接上节知识的同时,提升网络编程的实操能力。核心重点:巩固TCP客户端/服务器基础实现,掌握多进程、多线程服务器的核心原理与代码实现,理解两种并发方案的适用场景与区别。
2026-05-06 12:32:50
330
原创 linux学习笔记 网络编程——Socket入门与TCP客户端/服务器实现
上一节我们学习了网络分层模型(TCP/IP 五层模型),明确了应用层与传输层的核心作用 —— 应用层负责提供具体网络服务,传输层(TCP/UDP)负责端到端的可靠传输。本节课,我们将基于网络分层的基础,正式进入 Linux 网络编程的核心 ——Socket 编程,理解 Socket 的本质、核心概念和基本操作,最终实现一个简单的 TCP 客户端和服务器程序,完成首次网络通信,为后续复杂网络程序开发打下基础。
2026-05-05 19:51:38
788
原创 linux学习笔记 网络编程——网络分层
在Linux网络编程中,网络分层是核心基础,也是理解网络通信原理、排查网络问题、编写高效网络程序的关键。我们日常使用的网络(如浏览网页、远程登录Linux服务器、传输文件),看似是“直接通信”,实则是多个层次协同工作的结果。网络分层的核心思想是“分而治之”,将复杂的网络通信流程拆解为多个独立的功能层,每一层专注解决一类问题,层与层之间通过约定好的接口协作,既降低了开发和维护的复杂度,也保证了不同厂商设备、不同系统之间的兼容性。
2026-05-05 19:35:19
354
原创 C++ 日志 4—— 多线程安全与异步日志优化
本篇基于前序单线程日志系统,完成了多线程异步日志系统的完整实现,核心成果:解决了多线程环境下的日志乱序、文件损坏问题,通过互斥锁和条件变量实现线程安全;通过“生产者-消费者”模型实现异步写入,消除日志写入对业务线程的阻塞,提升系统性能;实现日志切割功能,自动管理日志文件,避免文件过大导致的磁盘问题;保持接口兼容性,业务代码无需修改,即可从单线程日志无缝迁移到多线程异步日志。当前实现的日志系统,已能满足中大型多线程项目、高并发服务的日志需求,是工业级日志系统的核心版本。
2026-05-05 18:58:52
602
原创 C++ 日志 3—— 日志系统的实施和测试
本篇完成了单线程日志系统从代码到项目落地的全流程实施与测试规范实施:统一集成、初始化、等级、书写规范,让日志标准化;全面测试:功能、等级、异常、性能 4 维测试,保证系统稳定;问题排查:提供常见问题解决方案,快速落地使用;最佳实践:指导你在真实项目中正确使用日志。目前我们的日志系统已满足小型项目、单线程服务、工具软件的全部需求。
2026-05-05 18:50:59
533
原创 C++日志 2——实现单线程日志系统
本篇实现的单线程日志系统,是 C++ 日志系统的基础核心,代码简洁、功能实用,完全满足单线程项目的日志需求。通过单例模式、日志分级、格式封装等设计,为后续多线程、异步日志系统打下了坚实基础。
2026-05-05 18:44:06
331
原创 C++日志 1——日志系统的概念与分类
日志系统是C++项目的“晴雨表”,其核心是通过规范的日志记录,为开发、调试、运维提供可靠支撑。本章重点讲解了日志系统的概念、核心作用和组成,以及按「级别、输出方式、实现方式、用途」的4种分类,明确了不同分类的适用场景。后续章节将逐步深入,从自定义简单日志系统入手,讲解日志格式化、文件输出、日志级别过滤等基础功能,再过渡到异步日志、性能优化,以及第三方日志库(如spdlog)的使用,帮助大家掌握C++日志系统的开发和应用。
2026-04-30 21:16:12
440
原创 C++笔记 forward完美转发
万能引用T&&接收参数(支持推导左值 / 右值)引用折叠:编译器自动合并多层引用,决定最终是左值 / 右值:还原参数原始属性,实现完美转发。
2026-04-30 20:42:31
353
原创 C++ STL bitset 位图
bitset// 1. 默认初始化:所有位都置为0// 8位位图,初始值:00000000// 2. 整数初始化:用无符号整数的二进制表示初始化,超出位数部分截断// 7的二进制是00000111,bs2的值:00000111// 十六进制0x0A=10,二进制00001010,bs3的值:00001010// 3. 字符串初始化:用二进制字符串(仅含'0'和'1')初始化,不足位数补0// 字符串长度4,高位补0,结果:00001010// 字符串长度6,正好匹配位数,结果:010101。
2026-04-29 12:28:08
579
原创 C++笔记 STL——set
set// 1. 空 set 定义// 2. 列表初始化(C++11及以上)// 重复元素1会被自动去重,最终元素:1,3,4,5// 3. 拷贝初始化// 4. 自定义排序规则(降序)// 元素:4,3,1STL 中的set是一个有序、唯一、高效的关联式容器,依托红黑树实现了 \(O(log n)\) 级别的核心操作,完美适配去重、排序、快速查找等场景。它的用法简洁、功能强大,是 C++ 开发中处理集合类数据的首选工具之一。掌握set。
2026-04-29 10:38:57
408
原创 C++笔记·-- STL unordered_map
是STL中**无序键值对容器**,键(key)唯一,每个key对应一个value,底层依赖哈希表(哈希桶)实现,不保证键值对的存储顺序,也不支持按键的顺序遍历(与map的有序性形成核心区别)。核心特点:键唯一:同一个key只能出现一次,重复插入会覆盖原有value;无序性:存储顺序与插入顺序无关,取决于key的哈希值;高效查找:平均查找、插入、删除时间复杂度均为O(1),最坏情况O(n)(哈希冲突严重时);不支持随机访问:无法通过下标[i]访问第i个元素(仅支持通过key访问value)。
2026-04-27 20:33:44
416
原创 C++笔记——STL map
mapmap<key类型, value类型>// 1. 空map// 2. 初始化列表(C++11及以上)map<int, string> m2 = {{1, "张三"}, {2, "李四"}, {3, "王五"}};// 3. 拷贝初始化默认map按键升序,可改为降序// 降序 mapmap<int, string, greater<int>> m = {{1, "张三"}, {2, "李四"}};map是有序、键唯一的键值对容器,底层红黑树。[]访问、insert插入、find查找、
2026-04-27 17:55:41
495
原创 C++笔记——STL list
/ 1. 空list// 2. 指定大小,初始值为0// 5个0// 3. 指定大小+初始值// 5个10// 4. 拷贝初始化// 拷贝l3所有元素// 5. 区间初始化// 用数组初始化STL list 是双向循环链表,核心优势是任意位置高效插入 / 删除;不支持随机访问,迭代器仅支持++--;适用频繁增删、无需随机访问的场景,和 vector 互补使用。
2026-04-27 17:50:30
514
原创 C++ 笔记 ——STL deque
用法与vector// 1. 空容器// 2. 指定大小,默认值0// 3. 指定大小+初始值// 4. 列表初始化// 5. 拷贝初始化return 0;deque 是分段连续内存的双端队列,支持随机访问,头尾增删效率为 O (1);push_frontpop_front是区别于 vector 的关键方法;随机访问迭代器,底层封装中控器与分段指针,用法与 vector 一致;底层:无整体扩容,多段内存 + 中控器管理,兼顾访问效率与双端操作;头尾增删不失效。
2026-04-26 22:53:04
407
原创 C++笔记 STL lterator迭代器
迭代器是STL中定义的模板类/结构体,本质是“行为类似指针”的对象,提供了对容器元素的间接访问能力。它屏蔽了不同容器(如vector的连续内存、list的链表内存)的底层差异,让我们可以用统一的语法(如*it取值、++it移动)访问任何容器的元素。迭代器 = 通用版指针,指针是迭代器的一种特殊形式(针对数组),而迭代器可以适配所有STL容器。迭代器类型核心能力支持的容器输入迭代器只读、单向移动输出迭代器只写、单向移动前向迭代器读写、单向移动、可重复遍历双向迭代器读写、双向移动。
2026-04-26 21:14:11
510
原创 C++笔记 STL——vector
/ 1. 空容器初始化(最常用)// 2. 指定容量,初始值为0(数值类型)// 5个元素,值都为0// 3. 指定容量+初始值// 5个元素,值都为10// 4. 列表初始化(C++11及以上)// 5. 拷贝初始化// 拷贝v4所有元素// 6. 区间初始化// 拷贝v4前3个元素return 0;// 自定义结构体int age;Student s1 = {"张三", 18};// 访问自定义类型成员return 0;vector 是。
2026-04-26 17:36:06
386
原创 linux学习进展 网络基础
简单来说,网络是由若干结点和连接这些结点的链路共同组成的集合,结点是网络中的核心设备,链路则是连接结点的物理传输通道,二者协同构成数据传输的基础框架。本节课我们系统学习了计算机网络的基础知识点,核心是掌握“网络-互联网-IP地址-MAC地址-端口-协议”的逻辑关联,结合Linux实操场景,重点回顾:网络由结点和链路组成,核心设备有交换机、路由器,传输介质有双绞线、光纤等,是局域网通信的基础;互联网是多个网络的互联互通,最大的互联网是因特网,路由器是跨网络通信的核心;
2026-04-25 22:56:24
390
原创 linux学习进展——线程安全
多个线程并发执行同一代码段(或调用同一函数)时,无论操作系统如何调度线程(时序如何交替),都能保证程序的执行结果可预期、数据一致,且不会出现异常(如崩溃、死锁、数据错乱)。简单来说,线程安全就是“多线程乱序执行,结果依然正确”。反之,若多线程并发时出现数据错乱、程序崩溃等问题,则称为「线程不安全」。举个最直观的例子:多个线程同时抢购1000张车票,线程安全的程序能保证最终卖出的车票总数不超过1000张,且不会出现负数票数;而线程不安全的程序,会出现超卖、负数票数等异常,这就是典型的线程安全问题。
2026-04-25 22:47:25
501
原创 linux学习进展 线程同步——条件变量
条件变量是Linux线程同步中核心的“等待-通知”机制,它本身不具备互斥能力,必须与互斥锁配合使用,核心作用是避免线程忙等待,提升系统资源利用率,适用于“线程需等待某个条件满足”的场景(如生产者-消费者、线程池任务调度等)。核心要点回顾:条件变量的核心是“等待-通知”,解决线程有序协同问题,依赖互斥锁保护条件和共享资源;核心API:初始化(init/静态初始化)、等待(wait/timedwait)、通知(signal/broadcast)、销毁(destroy);
2026-04-25 22:40:06
390
原创 linux学习进程 线程同步——读写锁
读写锁是Linux线程同步中一种高效的同步机制,核心是“读共享、写独占”,解决了互斥锁在“读多写少”场景下并发效率低的问题。核心要点回顾:读写锁分为读锁(共享)和写锁(独占),读-读不阻塞,读-写、写-写阻塞;常用API:初始化(init)、加读锁(rdlock)、加写锁(wrlock)、解锁(unlock)、销毁(destroy);适合读多写少场景,写频繁场景建议用互斥锁;注意避免死锁、确保锁的正确释放,关注写锁优先级问题。
2026-04-25 22:33:48
400
原创 linux学习进展 线程同步——线程信号量
在前几节的学习中,我们了解了线程的创建、终止以及互斥锁的使用,知道互斥锁可以解决多线程间共享资源的竞争问题,确保同一时刻只有一个线程进入临界区。但互斥锁的功能相对单一,只能实现“互斥”,无法灵活控制多个线程的执行顺序,也不能管理有限数量的共享资源。本节课我们将学习另一种重要的线程同步机制——信号量,它不仅能实现互斥,还能完成线程间的顺序同步和有限资源的分配,是多线程编程中不可或缺的工具。
2026-04-25 15:48:01
413
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅