- 博客(63)
- 收藏
- 关注
原创 Linux:UDP Socket API 的 C++ 工程化实践
这一部分我们先不讲太复杂的并发,也不讲各种封装技巧,只把 UDP 服务端最基础的初始化过程和接收过程讲清楚。在开始看代码之前,先想清楚一个问题:网络通信到底在找谁?在互联网里,要找到一台主机,靠的是 IP 地址;要找到这台主机上的某一个进程,靠的是端口号。IP 地址确定互联网中唯一一台主机,端口号确定这台主机里的唯一一个进程。服务端要想被客户端找到,就必须把自己的 IP 和端口固定下来。比如服务端启动时写成:./udp_server 0.0.0.0 8888。
2026-09-16 06:45:30
236
原创 Linux:网络基础
我们先来看一下 TCP/IP 协议与操作系统内核的关系,TCP/IP 协议栈进行了分层部署,其中作为核心的传输层 TCP 协议与网络层 IP 协议直接集成在 Windows、Linux 等操作系统内核当中,数据链路层依靠网卡驱动实现,物理层为网卡硬件,应用层交由上层用户程序实现;
2026-09-09 10:51:11
155
原创 C++项目:高并发内存池
池化技术(Pooling Technique)是一种以“空间换时间”为核心理念的资源管理策略。它颠覆了传统 “按需申请、用完即毁”的瞬态模式,改为“预申请、缓存、复用”的循环模式。简单来说,就是在系统启动或空闲时,提前向操作系统申请一大块资源保存在“池”中,当业务线程真正需要时,直接从池中“借用”而非“新建”,使用完毕后“归还”给池而非“销毁”。1. 初始化:根据预设容量(如最大连接数、内存池总大小),一次性向操作系统申请足量资源。2. 借用:当外部请求到来时,从池中分配一个空闲资源给请求者。
2026-07-31 00:01:45
234
原创 Linux:线程的封装
当 pthrea_create 函数执行完成之后,一个线程的状态就由新建变成正在运行,我们就需要修改 _status 的值,但此时还有一个尴尬的问题,我们刚刚将 ThreadRoutine 函数设置为静态成员函数,此时 ThreadRoutine 不含隐式 this 参数,可如果没有 this 参数,就没有办法访问非 static 修饰的成员函数中的变量,所以在此对 _status 的修改才会报错。另外,当我们实例化的时候,对于我们实例化出来的对象,我肯定想要让它复用性更强,可以传不同的参数。
2026-06-08 12:00:00
237
原创 Linux:System V IPC
是早期 AT&T System V 版本 Unix 提出的一套,和传统 IPC、POSIX IPC 并列,属于方案,Linux 完全兼容。。我们前面提到的管道、匿名和命名管道等,都属于是传统进程间通信,也就是传统 IPC 的体系,而 System V 和 POSIX IPC 是另外两种体系,定位不一样、年代不一样、用法不一样。
2026-05-20 17:39:23
417
原创 Linux:工具Vscode的简单介绍
然后,我们前面的学习历程中,都是使用的CentOS环境,但是在之后我们就要更换使用Ubuntu环境,因为 Ubuntu 作为桌面向 Linux 发行版,软件生态完善、VS Code 原生适配、开发工具链开箱即用,系统内核版本较新,更适合配合 VS Code 进行 C 语言、系统编程、进程通信类实验开发;,支持 Windows、macOS、Linux 全系统,目前是全球最主流的开发工具之一,尤其适合学生、后端、前端、嵌入式、操作系统学习使用。这是我找到的一个VScode的官网,大家直接打开下载安装包即可。
2026-05-18 13:19:39
445
原创 Linux:进程间通信 和 简单进程池
Visual Studio Code,简称VS Code,是微软推出的免费、跨平台、轻量级代码编辑器,支持 Windows、macOS、Linux 全系统,目前是全球最主流的开发工具之一,尤其适合学生、后端、前端、嵌入式、操作系统学习使用。它和我们之前学习C/C++使用的最多的 Visual Studio 开发软件都是微软公司开发的。Visual Studio Code - 开源的 AI 代码编辑器 |你多智能体开发的家园这是我找到的一个VScode的官网,大家直接打开下载安装包即可。
2026-05-18 12:53:57
999
原创 Linux:ELF与库加载
所谓 ELF 文件,就是按照 ELF标准组织、排列的二进制文件。你写的 C 语言代码,编译成机器码(01 二进制指令)、全局变量、字符串、函数名,这些还没被 CPU 执行、没进内存,就以二进制形式存在磁盘里,这就是 ELF 文件。我们日常使用的目标文件.o、静态库内部文件、动态库.so、可执行程序,全部都是 ELF 格式的二进制文件。它本质上就是一套规范的二进制排布规则。
2026-05-13 11:30:00
570
原创 Linux:Ext2 文件系统
我们在上篇文章《基础IO》里面经常提到,磁盘,这个东西。对于不了解电脑的同学来说,它仅仅是停留在一个名词的概念,只知道这玩意儿能用来存储信息,但不知道具体是啥,看不清摸不透的感觉。为了让大家能更深刻的理解,我们需要多了解一些硬件,下面这个就是机械磁盘的照片:机械磁盘(HDD)是的传统存储磁盘,内部主要由盘片、磁头、主轴电机、磁头臂组成,通电后主轴带动盘片高速旋转,磁头悬浮在盘片表面径向移动,依靠磁信号的磁化方向来读写、存储数据。机械磁盘依靠完成读写,有寻道时间、旋转延迟,随机读写速度慢、延迟高;
2026-05-05 09:45:00
432
原创 Linux:基础IO
在C语言中,如果想要写入文件,首先需要打开文件,然后才能执行写入操作。而我们提到过,文件 = 文件内容 + 文件属性,对文件的操作可以直接分为对文件内容的操作和对文件属性的操作,打开文件就需要文件的属性里的路径和文件名。
2026-05-02 09:30:00
433
原创 Linux:模拟实现Shell命令行解释器
在学习过前面的关于进程控制的所有知识之后,我们就可以自主模拟实现一个shell命令行解释器。因为我们在 Xshell 上输出指令,然后由操作系统内核读取到指令再运行。这一过程当中输入的指令,本质上就是在输入字符串。并且因为命令行解释器会不断地读取我们输入的字符串,也就是说命令行解释器本质上是一个死循环的可执行程序文件。
2026-04-27 09:00:00
415
原创 Linux:进程控制
在我们之前的文章当中提到过写实拷贝,但是我们只是简单的了解了一下它大概的运行流程,并不知道其中的细节:我们看到:修改内容之前,父进程的代码段和子进程的代码段通过页表进行映射得到的物理内存是同一块地址。但是这里要注意一个细节就是:父进程的代码段以及各类数据区域,在 fork 执行之前,其页表项中的权限标识均为可读可写。在创建子进程的过程中,内核会首先将父进程所有页面的页表权限修改为只读,之后再完成父进程相关内存信息向子进程的拷贝。
2026-04-23 09:00:00
401
原创 Linux:虚拟地址空间
首先,每一块内存区域的访问权限完全不同,代码段需设置为只读可执行以防止程序指令被篡改,数据段、BSS 段、堆和栈需设置为可读可写以支持数据的存储与修改,共享库映射区则需结合只读与可执行权限,独立的 VMA 节点可单独绑定一套访问权限,内核与 MMU 在进行内存访问校验时,只需定位到地址所属的 VMA,就能快速判断访问行为是否合法,从底层规避非法访问风险。但这段显示的内容,让我们最震惊的是:父子进程的g_val值不一样,但是g_val的地址竟然一样!从前有一个大富翁,他非常的有钱,一共有十亿美元。
2026-04-18 15:34:28
556
原创 Linux:命令行参数和环境变量
首先,我们要解决一个问题:main函数可以有参数吗?答案是,可以的。很多人可能第一次见到main函数还有参数,也有人只知道有参数,但不知道它代表的到底是什么意思。我们用这一段代码先来看看现象:从终端的输出结果可以看出,随着你在命令后面输入的参数增多,argc(参数计数器)不断增加,argv./codeargc: 1argv[0]./code aargc: 2argv[1]a这段现象背后,是:当你在终端输入并回车时,Shell(命令行解释器)会先把这行字符串按。
2026-04-18 09:30:00
424
原创 Linux:进程间切换与调度
进程切换,也叫上下文切换,是指操作系统为了让多个进程 “同时” 运行,的过程。每个进程都有独立的运行信息(如寄存器值、程序计数器、内存地址等),这些信息统称为进程上下文。切换时,内核会先将旧进程的上下文保存到 PCB 中,再从 PCB 里加载新进程的上下文,使 CPU 无缝切换到新进程执行。进程切换是操作系统实现并发、多任务的核心机制,保证了多个进程可以分时复用 CPU,让系统看起来能够同时运行多个程序。进程切换能帮我们解决的最主要问题就是:并发问题。是指多个任务在。
2026-04-16 14:18:52
417
原创 Linux:进程状态和优先级
首先我们要知道,系统中的进程有三个最基本也是最重要的状态:运行、阻塞、挂起。然后要介绍一个概念,操作系统会为 CPU 提供一个调度队列,它是操作系统内核用于管理进程调度的核心队列结构,1里面存放的是所有已经具备运行条件、等待 CPU 分配时间片的进程。大概逻辑就是这样。在我们学校当中的教材里面,绝大部分会将和严格区分开来,,就绪状态是指进程已经获得除 CPU 以外的所有所需资源,完成了运行前的全部准备工作,只等待操作系统调度器分配 CPU 时间片即可立即执行的状态。
2026-04-15 15:42:36
597
原创 Linux:进程的基本理解
在数据层面上CPU不会和外设直接打交道,CPU读写数据只会和内存打交道。那么我们口中的输入和输出是站在谁的角度考虑问题的?其实就是站在内存的角度,更准确的说是:站在加载到内存中的程序的角度。大家在学习C语言和C++的时候,编写代码时都会包含头文件,比如:#include <stdio.h> 、 #include <iostream> ,这两个头文件里面都有 io ,实际上就是 Input 和 Output。从输入设备到存储器的过程就叫 Input ,从存储器到输出设备的过程就叫 Output。
2026-04-12 13:50:30
389
原创 Linux:入门开发工具--Git和GDB调试器
Git 是一款由 Linux 创始人 Linus Torvalds 在 2005 年开发的分布式版本控制系统。当时 Linux 内核社区因商业版本控制工具授权问题被迫更换工具,急需一个高效、分布式、速度极快的管理方案,Git 因此诞生,它凭借强大的分支与合并能力迅速成为全球最主流的。所谓的版本控制工具,简单说就是,专门管理文件的修改历史和多人同时开发的问题。它最核心的作用是记录你每一次对代码的改动,保存每一个版本,方便你随时回看、回退、对比差异。不用你自己复制一堆文件夹命名成,工具会自动帮你管理所有历史。
2026-04-07 16:09:18
446
原创 Linux:第一个系统程序--进度条
在计算机和 Linux 系统里,和\n意思是:光标,但不一定回到行首。Linux 系统里,文本文件的换行就只用这一个字符表示。\r意思是:光标,但不往下走。我们在C语言的代码里就见过 \n 表示换行的语句,但实际上,C语言里面的 \n 表示的其实是两个动作:回车 和 换行。所以此 \n 非彼 \n ,一个是C语言中的 \n ,一个是计算机系统中的换行 \n。
2026-03-30 16:09:51
448
原创 Linux:基础开发工具
软件包是,是操作系统中软件安装、管理、卸载和更新的核心载体,广泛应用于类 Unix 系统(Linux、macOS)、Windows 等平台,目的是简化软件的分发与运维流程。(可以理解成Windows上的安装程序)在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包,放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装。
2026-03-27 15:17:25
394
原创 Linux:权限
Linux 系统中的权限,是对文件、目录等系统资源设定的访问规则,核心是限定不同用户对资源的操作范围。系统将访问者分为三类主体,同时为每类主体分配三种基础操作权限,只有拥有对应权限的用户,才能对资源执行查看、修改、运行等操作,以此规范用户对系统资源的使用行为。
2026-03-25 17:43:48
381
原创 C++:哈希表
我们在官网中可以查看到关于unordered_set的介绍:显而易见,既然是set那肯定是key的结构,它与set的区别在于这两个容器的仿函数不同:unordered_set的第二和第三个仿函数不只是单纯的比较大小了,set的底层是二叉搜索树,而搜索树的底层逻辑是比较大小,所以使用的仿函数叫Compare。但unordered_set的底层是哈希,简单来说就是能实现将key的值转化成整型。另一个Pred是能实现key的比较是否相等。
2026-03-14 15:29:23
404
原创 C++:模拟实现map和set
我们将map、set和红黑树的源码拿出来:通过上图对框架的分析,我们可以看到源码中 rb_tree 用了一个巧妙的泛型思想实现,rb_tree 是实现 key 的搜索场景,还是 key/value 的搜索场景不是直接写死的,而是由第二个模板参数 Value 决定_rb_tree_node 中存储的数据类型。
2026-03-10 15:57:02
371
原创 C++:AVL树的模拟实现
最先发明的,AVL 是一颗空树,或者具备下列性质的二叉搜索树:它的左右子树都是 AVL 树,且。AVL 树是一颗高度平衡搜索二叉树,通过控制高度差去控制平衡。所以说,AVL 树就是一种AVL 树得名于它的发明者 G. M. Adelson-Velsky 和 E. M. Landis 是两个前苏联的科学家,他们在 1962 年的论文《An algorithm for the organization of information》中发表了它。
2026-02-04 19:36:41
636
原创 C++:map和set的使用
set 的声明如下,T 就是 set 底层关键字的类型:set 是一种容器,用于存储唯一的元素,所以set不支持重复数据存储,并会按照特定的顺序排列。在 set 中,元素的值本身就是它的标识(值即为键,类型为 T),并且每个值必须唯一。一旦元素被存入容器,它的值就不能被修改(元素始终是 const 类型),因此其普通迭代器指向的值是不能被修改的,但可以被插入或删除。在内部实现中, set 中的元素始终会按照一个特定的严格弱序规则。
2026-01-30 20:56:13
738
原创 C++:二叉搜索树
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:1. 若它的左子树不为空,则左子树上所有结点的值都小于等于根结点的值。2. 若它的右子树不为空,则右子树上所有结点的值都大于等于根结点的值。3. 它的左右子树也分别为二叉搜索树。
2026-01-25 19:34:38
688
原创 C++:多态
要实现多态效果,第一必须是基类的指针或引用,因为只有基类的指针或引用才能既指向基类对象又指向派生类对象;第二派生类必须对基类的虚函数完成重写 / 覆盖,重写或者覆盖了,基类和派生类之间才能有不同的函数,多态的不同形态效果才能达到。
2026-01-23 15:32:13
743
2
原创 C++:继承
我们来举一个例子,比如现在我需要统计全校师生的信息,那么不管是学生还是老师,都会有年龄、姓名这样的共有信息,但是对于学生来说,学生还有学号这一独有信息,对于老师来说,还有教学科目这一独有信息。那么此时我会创建一个类用来存储个人信息,这个类叫:Person。对于老师和学生分别用一个类来存储各自的独有信息,那就有Student和Teacher这两个类,那么对于继承的格式就是这样的:这里的Student就是派生类,Person就是基类,public就代表继承的方式,由此可见在继承当中一定存在这三个信息。
2026-01-21 21:36:02
638
原创 C++:模板进阶
1. 高效复用代码,提升开发效率模板通过泛型编程实现了代码的一次编写、多类型复用,避免了为不同类型重复编写相似逻辑,大幅节省开发时间与代码维护成本,C++ 标准模板库(STL)正是基于这一特性构建,成为 C++ 开发的核心工具。2. 增强代码灵活性与通用性模板不依赖具体类型,仅通过参数约束即可适配多种场景,既保留了静态类型语言的安全性,又具备动态语言的灵活性,能轻松应对复杂的业务需求与类型变化。3. 编译期优化,保证运行时性能。
2026-01-19 14:14:14
652
原创 C++:stack和queue(3)
大家可以看到priority_queue叫做优先级队列,它也是一个容器适配器,底层是使用vector来进行适配的。它还有第三个模板参数:仿函数,关于仿函数的内容我们一会儿再具体讲。而非遵循普通队列的 “先进先出” 规则。同时它的接口也是非常少,大家仔细观察的话就会发现跟stack差不多。但要注意的是:比如top函数,在栈中的作用是直接取出栈顶,而在priority_queue中,是要取出优先级高的数据,同理pop也是删除优先级高的数据。由此可见,
2026-01-18 16:28:00
641
原创 C++:stack和queue(2)
我们可以看到在栈和队列中,它们两个的底层容器都是deque这个容器,接下来我们就要了解deque到底是什么。deque 是 C++ STL 中的双端队列容器,核心特点是能在两端高效插入 / 删除,同时支持随机访问。我们可以看到,deque中有这样一些函数:push_back、push_front、 pop_back、pop_front,这就意味着deque可以支持头尾两端的插入和删除操作。deque 提供了与 vector 以及 list 类似的功能,但它不仅能在队尾,也能在队首高效地插入和删除元素。
2026-01-17 15:57:58
600
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅