- 博客(101)
- 收藏
- 关注
原创 IO模型IO模型
IO模型实际上描述的是操作系统(或程序)和设备(如网络、硬盘等)之间数据传输的方式和策略。在网络编程里,常常涉及等待数据的到来,处理请求的效率是关键。不同的IO模型决定了程序在等待数据时的表现。阻塞IO简单但效率低,适合小型应用。非阻塞IO允许程序自己轮询,适合短连接。IO复用用select或epoll监控多个连接,是网络服务器的基础。信号驱动和异步IO更复杂,但效率更高,适合高性能场景。
2025-06-02 22:45:19
923
原创 从单机到集群,再到分布式,再到微服务
是的,完全可以;要注意选择成熟的网络库(gRPC、Boost.Asio等);设计良好的接口(REST、gRPC);配合容器化工具(Docker等)进行部署;建立完善的运维监控体系。利用C++实现核心性能敏感部分;结合其他语言或工具实现某些辅助服务;或者逐步拆分,先做好通信和服务的接口部分。
2025-06-01 16:34:34
1071
1
原创 Reactor 和 Preactor
Reactor 模式其实是一种I/O事件通知的设计思想,通常用在高性能网络程序中,比如服务器端处理大量连接请求时。这种模式让程序能够在单个线程或少量线程中,优雅、高效地处理多个并发的I/O事件(比如:网络请求、文件读写等)。Preactor 有点像“提前准备”的调度框架,它在事件发生之前就会提前规划或调度任务的执行顺序。Preactor管理着一组预先设定的调度策略;它会根据事件的优先级、调度策略,提前安排好任务什么时候应该执行。Reactor更像是**“反应式”**的,它在事件到达时通知和调度处理。
2025-05-31 21:59:00
1154
原创 CMake
想象一下,你在做一道菜,不同的厨房(Windows、Mac、Linux)可能需要不同的准备工具(Visual Studio、Xcode、Makefile等)。如果每个厨房都自己编写一套菜谱,工作太繁琐。CMake, 就像一个“统一的菜谱生成器”,你只写一个通用的菜谱(CMakeLists.txt),它可以帮你自动生成适合不同厨房的“菜谱”——比如Makefile、VS工程文件、Xcode项目等。目的:自动生成各种平台的项目构建文件作用:简化跨平台开发的工程配置。
2025-05-24 21:48:31
437
原创 gdb调试
GDB(GNU Debugger)是GNU项目提供的一个强大、免费且开源的调试工具,主要用于调试C、C++程序。运行程序或暂停在某个特定位置(断点)查看变量值(包括局部变量和全局变量)逐步执行代码(逐行、逐函数)设置断点与条件断点(满足某些条件时暂停)跟踪崩溃、段错误和其他异常的发生位置检查调用栈(backtrace),找出程序崩溃、异常发生的具体调用路径简而言之,GDB就像程序的“医生”,可以帮你诊断出代码哪里出了问题。步骤操作内容编译带调试信息g++ -g ...运行程序。
2025-05-23 14:17:38
313
原创 Linux中的文件介绍
Linux的“万能钥匙”是文件系统,一切皆文件文件不仅仅是存数据的容器,还代表设备、管道和网络连接操作文件的方法基本一致,从创建、修改到权限管理都可以用统一的接口完成理解文件系统的底层架构和机制,有助于排查问题、优化性能、写出更高效的程序让我们详细拆解一下你这个场景:你用VSCode远程连接到CentOS服务器,在那边创建文件和写代码。那么,文件存放在哪里、路径会是什么样的呢?我会从几个角度帮你全面解答。内容本地文件(Windows端)远程文件(CentOS端)保存位置。
2025-05-21 22:36:38
686
原创 什么是 Muduo
简单介绍Muduo是一个用C++写的高性能网络库,主要用于开发高并发的服务器程序,比如聊天服务器、股票交易系统、游戏服务器等等。它的目标是让开发者更方便地写出高效、稳定的服务器程序。什么是 Boost?Boost是C++的一组开源的、经过严格测试的库,它提供了很多实用的工具和功能,类似C++的“标准库的增强版”。Boost的许多组件都在不断被C++标准采纳(比如智能指针、正则表达式、线程支持等),它也为开发者提供了丰富的工具来简化编程。Boost:像一把瑞士军刀,里面有许多工具帮你处理复杂的事情。
2025-05-19 17:33:48
916
原创 线程和进程
你列出的方式基本准确,涵盖了主要的通信手段和同步机制。可以补充说明:进程通信和线程同步虽然有交集(比如信号量既用于通信也用于同步),但都在不同的层面使用。这些机制在实际开发中经常配合使用,保证多任务环境下的正确性和效率。管道是通信的“管子”,简单而高效,但它的单向限制意味着需要配合设计。在实际应用中,匿名管道多用于父子进程的简单通信。有名管道可以实现更灵活的通信,但管理上略复杂。
2025-05-16 15:30:00
643
原创 进程1111
进程是“正在跑”的程序实例,有ID和状态。由“创建”函数(如fork())产生,父子关系明确。状态包括:就绪、运行、阻塞、停止、僵尸。调度决定谁用CPU,有优先级。进程的管理和切换,是操作系统的核心技术之一。面试中除了了解原理,还要熟悉常用命令(pstopkill等)以及常问的“描述进程状态变迁”的场景。虚拟地址空间:每个进程拥有自己“想象中的内存空间”,象征着独立且庞大的“虚拟内存”。页面(Page):内存的基本划分单位。页表(Page Table)
2025-05-16 15:04:17
587
原创 进程1111
操作系统可以被比作“硬件的管理者”和“资源的组织者”。它的主要工作就是“管理硬件”和“组织资源”。想象你家里有一堆杂乱的物品(硬件,比如CPU、内存、硬盘、鼠标、键盘等),每个物品都有自己的属性(存储器容量、连接状态等)。操作系统就像一个管理员,把这些物品用“结构体struct”描述,把它们组织成不同的数据结构,比如链表、树等。将硬件描述为一个“硬件结构体”,里面包括硬件的类型、状态、连接的接口等属性。这些硬件用链表(比如所有硬盘连接在一条链表里)管理,方便“增删查改”。
2025-05-16 13:38:43
832
原创 线程111111
这些工具都是用来解决竞争(多个线程访问共享资源时的冲突)同步(线程间等待某个条件满足)线程协调(通知、传递信息)核心目标:保证多线程程序的正确性、安全性,以及提升并发性能。
2025-05-16 11:07:49
677
原创 “this”这个关键字
简单来说,“this”是每个非静态成员函数隐含的指针,它指向调用该成员函数的那个对象本身。换句话说,当你调用对象的方法时,编译器会自动传入一个指针,指向你调用的“那个对象”,这个指针就是“this”。**“this”**始终指向调用的对象在成员函数中可用,但不能在静态成员函数中使用常用于名字冲突解决和链式调用使用“*this”可以获得“对象本身”,但要小心存储或返回对象引用,避免悬空指针或引用(比如返回“this”的引用时,必须保证调用者不要销毁对象)
2025-05-15 14:47:05
296
原创 有关多线程
方法比喻优点缺点直接创建新线程雇用一个临时工简单直观管理繁琐,成本高线程池固定工人池高效、管理方便比较复杂的实现过程异步任务提交任务到后台编写代码更简单、逻辑清晰依赖队列和同步机制事件驱动/回调让事件“触发”处理非阻塞,响应快编码复杂,维护难想象你有个“邮箱”或“留言板”。不同的程序(生产者)把信息写进去,另一些程序(消费者)轮流取出来处理。这个“邮箱”就是消息队列,它解决了生产者和消费者之间的“异步通信”和“解耦合”问题。信号在操作系统中就像是一种“远程通知”。
2025-05-14 22:39:32
622
原创 map和unordered_map
map:用“红黑树”实现,有序存储查找复杂度O(log n),适合需要排序、稳定排序结果的场景;:用“哈希表”实现,无序存储平均查找O(1),用于追求极限速度的场景。
2025-05-14 22:34:00
387
原创 Vector和list
就像指针一样的东西,用来看“容器”里的元素。比如,用it可以遍历所有元素。Vector:就像把所有房子(元素)堆在一排(连续内存)里。搬家(扩容)时,可能要找个更大的车(新空间),搬出来所有房子(大量移动元素),旧的地址都不能用了(迭代器失效)List:像一串串珠子,每个珠子用线串起来(指针连接)。插入或删除珠子,只要调转指针就行,不会影响其他珠子。
2025-05-14 22:28:18
1203
原创 c++和c的不同
诞生年代:20世纪70年代,Dennis Ritchie在贝尔实验室开发。主要特点过程式、结构化编程面向系统底层开发(操作系统、嵌入式系统)高效、灵活、接近硬件标准库较小,功能有限编程思想:强调“做什么”——步骤清晰,硬件级别操作C:适合系统底层、硬件开发,追求极致性能和简洁C++:适合开发大型复杂应用、游戏引擎、数据库、插件,代码更易维护和复用。
2025-05-14 21:11:37
740
原创 “堆”和“栈”
堆就像一个灵活的大仓库或仓库的货架,任何时候你都可以存放或取出你需要的东西,没有限制你放在哪里。想象你在超市买了好多东西,堆满了你的购物车。想象你在厨房里做饭,有一堆碗盘,一次只拿一个放进去,拿出来也是“后进先出”的(后放进去的先拿出来),这就像“栈”。
2025-05-14 21:08:30
387
原创 volatile是什么
主题内容描述volatile作用告诉编译器不要优化变量,强制每次操作都从内存中读写。遇到的问题编译器会“缓存”读操作,导致多线程中一个线程修改的值,另一个线程看不到(死循环、程序卡死等)。使用场景主要用于硬件状态寄存器、特殊情况的标志变量,但不替代同步工具。更好的方案使用保证线程安全和易维护。
2025-05-13 22:25:43
951
原创 什么是Git?
Git是一种版本控制系统它的主要作用是帮助开发者管理“代码的不同版本”。版本控制像是一个“时间胶囊”,每次你对代码做出改变,都可以“保存一个快照”。Git让你可以随时“回到过去”某个版本,也可以“合作开发”,多人共享代码而不冲突。比喻:想象你在写一篇作文,写到一半可以按“保存”键,想恢复到之前的某个版本就可以找回。“Git”就是帮你管理这些“保存点”的工具。Git是现代软件开发中不可或缺的工具,就像“时间管理”和“备份”的神器。它帮助你安全、轻松、高效地管理代码的每个变化,支持多人合作,避免混乱。
2025-05-13 18:38:23
893
原创 gdb调试
*GDB(GNU Debugger)**是一个调试工具,类似于程序的“监控器”和“助手”。暂停程序在某个位置(设置断点)逐句运行程序(单步执行)查看变量的值改变变量的值跟踪程序的调用栈(函数调用顺序)发现程序崩溃的原因(核心转储分析)简单说,GDB帮你观察和操控程序的执行流程,找出问题所在。操作命令作用说明启动调试环境打开调试工具,载入程序设置断点在函数开头设置断点(比如break main在特定源文件的某一行设置断点运行程序run开始运行程序,遇到断点停止继续运行。
2025-05-13 14:51:03
447
原创 动态库和静态库
静态库(.a)像做菜时,把所有用到的调料都“装”在菜里结果是“菜”很丰富,但“菜”变大,部署时打包也更大一旦做完菜,调料都在菜里,吃完不用担心调料“丢失”动态库(.so)像调料包,做菜时才打开用菜的大小比较小,可以多菜共享调料(库)如果调料包丢了或变了,做菜可能出问题好处是“调料”只存一份,节省空间,升级方便。
2025-05-13 14:36:36
870
原创 makefile和make
make是一个“自动化工具”,就像一个勤快的“管家”或“工人”,它可以帮你根据“任务清单”自动完成一堆繁琐的事情。编译多个源文件,生成一个可执行的程序只重新编译那些“变化了”的源文件(节省时间)管理依赖关系,确保所有步骤都按顺序做,得到正确的结果Makefile我要做什么(目标)怎样做(命令)依赖关系(哪些文件是我做这个目标的前提)编写Makefile,定义好目标、依赖和命令在终端运行make好帮手“make”自动判断哪些文件需要更新自动执行命令,完成目标。
2025-05-13 14:21:57
916
原创 vim,gcc/g++,makefile,cmake
工具作用你可以怎么用?作用的“粒度”vim写代码的“笔记本”把程序写在里面代码编辑gcc/g++把源代码“翻译”成可运行的程序编译你的程序编译、连线(最终生成可执行文件)Makefile“自动化任务清单”,帮你自动编译多个文件简化复杂工程的构建自动化编译流程CMake“智能构建管理工具”,跨平台,支持多环境配置大型跨平台项目生成Makefile或工程文件vim:写程序的工具,帮你把代码写得漂亮、快捷gcc/g++:把写好的代码“变成机器能跑的东西”Makefile。
2025-05-13 12:47:12
789
原创 gcc和g++
gcc:用来编译C语言(后缀名通常是.cg++:用来编译C++语言(后缀名可以是.cpp.cc.cxx它们的作用就是把你的源代码(写的程序)变成可以运行的“机器指令”。Linux系统没有像Windows那样的“点后缀名就是C或C++”的规则,但文件后缀名帮助我们识别。
2025-05-13 12:39:20
825
原创 什么是Vim
Vim,全名“Vi IMproved”,就是“改良版的Vi”。Vi是Unix/Linux系统中最经典的文本编辑器,非常基础,但操作复杂且强大。Vim在Vi的基础上加入了很多新功能,让编辑变得更方便、更强大。简单说:Vim就是一个超级强大的文本编辑工具,你可以用它写代码、修改配置文件、编辑各种文本内容。了解基本操作:进入文件、插入文本、保存退出熟练移动光标和删除操作学习搜索、替换和复制粘贴尝试配置文件,个性化Vim多练习,逐步熟悉操作。
2025-05-12 21:56:58
808
原创 仿函数和函数对象
核心概念一句话总结仿函数(Functor)函数对象(Function Object)它们本质是一个对象(Object),但可以像函数(Function)一样被调用。函数(Function)我们调用add(3, 4)就能得到结果7。函数对象(Function Object)看起来像“函数”,其实它是一个“对象”。它是通过定义一个类,并在这个类中实现了operator()(“调用操作符”)的方法,变成了可以像函数一样用的“对象”。为什么要用它?
2025-05-12 21:43:20
495
原创 c++面向对象:接口设计
在面向对象编程中,接口可以理解为一种“规范”或“约定”。它定义了“某个对象”应该具备哪些功能(方法、行为)但不关心这些功能的具体实现细节接口就像一个“合同”,告诉别人:“你必须实现这个合同上的所有条件”。而具体的实现,你可以自己定义。在C++中,没有专门的接口关键字(像Java里的interface),但我们可以用纯虚函数定义“接口”。接口就是约定:告诉别人“必须实现这些功能”。在C++里用抽象类(纯虚函数)实现接口。接口带来柔韧性和扩展性:可以更方便地替换不同实现,不影响调用者。
2025-05-11 19:48:20
510
原创 RAII是什么?
自动资源释放:不需要显式调用释放函数异常安全:异常时也能保证资源正确释放简洁、清晰的代码结构:资源管理逻辑内聚在对象中易于维护和扩展就像你用一个包装盒装东西(资源),让这个包装盒在被使用时自动“包装起来”,用完后自动“拆开”。这样,你就不用担心忘记关闭水龙头(释放资源)或锁(解锁),因为它都由包装盒(对象)的生命周期来控制。RAII是一种利用对象的生命周期自动管理资源的设计思想,是现代C++编程的重要基础。它大大增强了代码的安全性和可维护性,是实现资源安全管理、异常安全和简洁代码的核心原则。
2025-05-11 19:39:13
801
原创 llfc项目分布式即时总结(应对面试)
这是一个全栈的分布式即时通讯项目(服务之间用grpc通信,server和client之间用asio通信)前端介绍:前端基于QT实现气泡聊天对话框,通过QListWidget实现好友列表,利用GridLayout和QPainter封装气泡聊天框组件,基于QT network模块封装http和tcp服务。支持添加好友,好友通信,聊天记录展示等功能,仿微信布局并使用qss优化界面。
2025-05-10 21:06:01
451
原创 boost.asio到底是什么
Boost.Asio是C++的一个跨平台库,用来实现异步网络编程(如建立TCP连接、发送接收数据等)。它是“Boost”库的一部分,但也可以独立使用。为什么叫“Asio”?“Async IO”——异步输入输出的缩写。意味着程序可以在等待I/O操作完成的同时,去处理其他事情,不会被阻塞。章节内容定义Boost.Asio是支持异步网络编程和IO操作的C++库核心概念io_context(事件循环);socket(端点);异步操作;handler工作流程解析域名、连接、读写、事件驱动,全部异步进行,提升性能。
2025-05-08 10:24:39
809
原创 grpc到底是啥! ! !!
RPC是一种让程序可以像调用本地函数一样去调用远程机器上的函数或方法。它的目标:让分布式系统中的不同计算机可以透明地互相通信,实现远程服务调用的封装。gRPC是一个开源的高性能远程过程调用(RPC)框架,由谷歌开发。它让不同的服务(可能在不同的机器上)可以像调用本地函数一样相互调用。它支持多种语言(比如C++、Java、Python等),特别适合微服务架构和分布式系统。先定义服务接口,例如:复制代码这里定义了一个的方法。protoc工具会根据.proto。
2025-05-07 22:35:30
957
原创 二叉查找树,平衡二叉树(AVL),b树,b+树,红黑树
每个节点最多有两个子节点(左、右)对于任意一个节点:它左子树的所有节点值都比它小它右子树的所有节点值都比它大AVL树是最早被提出的自平衡二叉查找树。和BST一样,但它会在插入/删除时自动调整结构,保持树尽量“平衡”。红黑树是一种稍微放松平衡要求的自平衡二叉查找树。红色或黑色通过颜色规则来控制“树的平衡”B树是一种多路搜索树(多叉树),适合在磁盘/数据库中使用。(因为每访问一次磁盘所用时间长,所以就在一个节点多包涵几个key,这样访问一次可以查找到多个key,value)
2025-05-07 18:52:03
931
原创 什么是原子变量
在多线程程序中,多个线程可能会同时访问和修改同一个变量。例如,两个线程都想给一个计数器加1,如果没有妥善处理,就可能出现“丢失更新”的情况:两个线程都读取到相同的数值,然后都+1,最后就只有一个加了1,实际上应该加了2。原子变量就像“神奇的变量”,保证在多个线程同时操作时,每次操作都完整、不可被打断,就像是一只看得见的透明“锁”,不让其他操作干涉。原子变量确保在多线程环境下,每次读/写操作都是完整不可中断的,避免竞态条件。内容说明原子变量(Atomic)
2025-05-06 20:49:58
592
原创 什么是“系统调用”
可以把“系统调用”比作你(用户)向“管理员”请求帮助完成某件事情的过程。你想借书,去图书馆(操作系统)找管理员(内核)帮你拿。你不能直接去拿书(直接操作硬件或系统资源),只能通过管理员(系统调用)来操作。系统调用就是用户程序请求操作系统(内核)提供服务的接口。程序不能直接操作硬件或者底层资源,只能通过系统调用由操作系统中转。定义:用户程序请求操作系统服务的接口。作用:保护系统安全、实现资源管理、提供便利操作。实现方式:由陷入指令切换上下文,内核处理请求后返回用户空间。分类。
2025-05-05 21:01:59
443
原创 动态链接库(DLL)
动态链接库(Dynamic-Link Library,DLL)是一种存放可被多个程序共享,且在运行时按需加载的代码库。在Windows环境中,DLL的扩展名通常是.dll。**动态加载:**程序运行时通过系统API(如)载入DLL。**代码共享:**多个进程可以同时使用同一份DLL,减少内存占用。**功能扩展:**方便程序后续升级,不必重新编译整个程序。DLL是实现模块化、重用、升级的基础,同时也是操作系统提供的机制。在C++中,导出函数和动态加载是其核心使用方式。
2025-05-05 20:55:52
1033
原创 “Copy-On-Write” (COW)
定义“Copy-On-Write”是一种延迟复制策略,用于优化资源管理,特别是在复制大对象或数据时。它的核心思想是:当多个对象共享同一份数据时,不立即复制数据,而是等到其中某个对象需要修改数据时,才进行实际的复制。形象比喻就像几个人共用一份资料,只有当有人想改动时,才让他的那份资料变成自己的副本,避免不必要的复制,节省时间和空间。“Copy-On-Write”是一种延迟复制策略,用以优化大对象复制的性能;它的思想是在数据被修改之前共享数据,只有在修改时才进行复制;
2025-05-05 20:25:13
238
原创 TCP和UDP
TCP和UDP的区别?重点讲安全性对比、连接状态、效率、应用场景。“TCP如何保证可靠传输?通过序列号、确认应答、重传机制、窗口控制。“UDP的应用场景?实时性要求高的场景,如视频会议、网络游戏等。
2025-05-05 19:24:31
353
原创 C++11新特性
C++98/03是传统标准,已使用多年。而C++11(之前叫C++0x)是为了应对现代硬件多核、多任务的需求,加入了许多新功能,提升了语言的性能、表达力和安全性。特性类别关键点作用/意义语法简化autodecltypenullptrconstexpr提升代码简洁性和表达力内存安全智能指针(shared_ptrunique_ptr避免内存泄漏,管理动态资源性能优化移动语义(rvalue引用、移动构造/赋值)资源转移,避免不必要的复制多线程支持threadmutex搭建多核多任务环境的基础。
2025-05-05 19:14:58
973
原创 std::move()详解
本质:并不像字面意思“搬走”那些对象,而是:在源码层面:复制代码简单理解就是:这就允许你用“偷取资源”或者“快速转移”的方式实现更高效的传递,而不是耗时的复制。你提到的例子:这里,把变成了一个右值引用,调用类中定义的移动构造函数,从“窃取”资源(比如堆内存、句柄等)。这就是你之前提到的用法。比如std::vector、std::string等具有移动构造的容器,复制代码用途:例如:在调用时:5. 结合实现完美转发(高级用法)这是模板编程中的技巧,用于保持参数的值类别
2025-05-05 19:11:22
384
原创 rvalue引用(&&)
&:代表“右值引用”,专门用来绑定临时对象或字面量。作用:让我们可以“窃取”临时值的资源(资源转移),提高性能(减少复制)。类似:用“右值引用”打开了一个“窗口”,让你“直接拿走”临时产生内容,而不用复制。引用类型可以绑定到不能绑定到说明int&左值(比如变量)右值(比如字面量5,临时对象)普通左值引用int&&右值(临时对象、字面量)左值(变量a等)右值引用,用于“窃取”资源,提升效率&&就是“专门用来抓住临时值、实现快速转移的桥梁”那么这个“符号”就会变得十分通俗易懂。
2025-05-05 19:05:15
666
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人