- 博客(58)
- 收藏
- 关注
原创 Linux网络(二)——socket编程
端口号是16位无符号整数(0-65535),用于标识主机上的特定网络进程。网络通信本质是进程间通信,通过"IP地址+端口号"唯一确定进程位置。知名端口号(0-1023)固定分配给常用服务,其余由系统动态分配。与进程ID不同,端口号专用于网络通信。TCP提供可靠传输,UDP效率更高但不可靠。网络字节序采用大端模式,需使用转换函数处理主机/网络字节序转换。socket编程接口区分本地与网络通信,通过sockaddr结构体中的地址类型字段实现。IP地址需从字符串转换为网络字节序的32位整数形式
2025-11-05 21:42:53
626
原创 Linux网络基础(一)
文章摘要 本文系统介绍了计算机网络协议和分层结构。协议本质是计算机间的约定,用于降低通信成本。网络采用分层结构(OSI七层/TCP/IP五层)实现松耦合和易维护。重点分析了局域网通信原理,通过MAC地址实现精准投递,并解释了碰撞检测机制。文章还阐述了数据在网络传输中的封装过程,以及各层核心功能如应用层协议、传输层可靠性、网络层路由选择等。最后从编程角度指出协议本质是双方可识别的数据结构。
2025-11-03 21:34:21
1132
原创 Linux线程同步(四)
本文介绍了线程同步中的条件变量机制及其应用。主要内容包括: 条件变量基础概念:条件变量=通知+队列,用于实现线程间同步 关键接口说明: pthread_cond_init/destroy:初始化/销毁条件变量 pthread_cond_wait:线程等待条件变量并释放关联锁 pthread_cond_signal/broadcast:唤醒一个/所有等待线程 pthread_cond_t类型及其初始化方式 生产消费模型: 解决数据并发传递问题 核心要素包括3种关系(互斥/同步)、2种角色、1个交易场所 优势:
2025-10-31 23:32:25
710
原创 Linux线程互斥(三)
本文通过抢票系统示例演示了多线程访问共享资源时的数据竞争问题。当多个线程同时操作全局变量g_tickets时,由于判断余量和减票操作不具备原子性,导致出现负数票的情况。文章详细分析了问题根源:1)if判断和减票操作被拆分为多条汇编指令,线程切换可能导致中间状态被覆盖;2)usleep放大了竞争条件。通过汇编代码和时序表格展示了两个线程如何交错执行导致数据不一致,最终得出必须对共享资源进行保护的结论。
2025-10-19 18:07:18
1022
原创 线程原生库的简单封装(二)
摘要:本文实现了一个通用线程封装类Thread<T>,支持模板参数T。通过std::function封装线程函数,提供start()、join()、detach()、stop()等接口。关键点包括:1) 使用static成员函数作为pthread入口,避免this指针问题;2) 通过间接调用Execute()方法访问成员变量;3) 采用模板化设计支持不同类型参数。该实现解决了C++类成员函数作为线程入口时的this指针问题,同时保持了线程操作的完整功能。
2025-10-18 18:53:33
247
原创 专题四 综合练习(一)
本文摘要: LeetCode两道回溯算法题目解析: 子集异或总和求和:计算数组所有子集的异或值之和。通过回溯法遍历所有子集,维护当前异或值path和总和sum。关键点:使用异或性质进行回溯,递归时需从i+1开始避免重复。 全排列II:处理含重复元素的排列问题。核心在于剪枝策略:先排序数组,在递归时跳过已选元素和"相同元素在前一位置未被选"的情况。提出两种剪枝条件:通过check数组标记使用状态,避免生成重复排列。 两题均采用深度优先搜索框架,但剪枝策略不同:子集问题无需剪枝,排列问题需要
2025-10-10 19:27:24
746
原创 专题三 穷举,暴搜,深搜,回溯,剪枝
本文介绍了两种经典回溯算法题目的解法。全排列问题通过决策树设计和剪枝策略,使用全局变量记录路径和元素使用情况,递归生成所有排列。子集问题提供了两种解法:解法一通过选择/不选元素的决策树,解法二通过逐步构建子集的方式。两种解法都利用了回溯思想,通过递归和手动恢复现场避免重复,最终生成所有可能的子集或排列。代码实现中详细展示了递归过程、回溯操作和全局变量的使用。
2025-09-20 00:59:52
1091
原创 专题二 二叉树中的深度优先搜索
本文摘要: 四道二叉树算法题解:1)计算布尔二叉树值:递归处理非叶子节点的逻辑运算;2)求根到叶节点数字之和:前序遍历累加路径值;3)二叉树剪枝:后序遍历移除全0子树;4)验证二叉搜索树:中序遍历检查严格递增性。均采用递归思想,明确函数头设计、函数体实现和递归终止条件,代码简洁高效。
2025-09-18 23:38:32
815
原创 专题一递归算法
本文摘要:文章通过三个经典算法问题(汉诺塔、合并有序链表、反转链表)探讨递归的应用。详细解析了汉诺塔问题的递归解法,将复杂问题分解为子问题;展示了合并有序链表时递归与迭代的对比;最后讨论了递归与循环的适用场景,指出递归适合树状结构问题,循环适合线性过程。每个问题都包含算法原理、代码实现和逻辑图解,帮助理解递归思想的本质及其在不同场景下的应用优势。
2025-09-16 15:21:37
598
原创 递归,搜索与回溯算法
文章摘要:递归是函数自调用解决问题的过程,本质是将问题分解为相同子问题。理解递归可通过展开图或将其视为黑盒。搜索包括深度优先(DFS)和广度优先(BFS)两种方式,都是暴力遍历所有情况。回溯本质是DFS,常用于解决排列组合问题,通过剪枝优化效率。典型应用包括二叉树遍历、快速排序、归并排序和全排列问题等。
2025-09-13 23:21:45
462
原创 C++实战:搜索引擎项目(二)
本文介绍了C++搜索引擎项目的Searcher模块实现思路。该模块主要功能包括:1)初始化时获取单例索引对象并构建索引;2)搜索处理时对查询词分词、触发倒排索引、结果排序并构建JSON响应。关键点:统一转小写保证索引一致性,按权重降序排序,动态生成摘要(关键词前后截取片段)。文章提供了核心代码结构,包括索引初始化、分词处理、倒排检索和JSON结果封装等关键实现。
2025-09-12 14:09:21
1032
原创 Git远程操作(三)
本文介绍了Git远程仓库的基本使用方法。主要内容包括:1)如何建立远程仓库并配置Issue和Pull Request模板;2)使用.gitignore文件忽略不需要提交的文件;3)通过git clone命令克隆远程仓库,包括HTTPS和SSH两种方式;4)git remote指令查看远程仓库信息;5)使用git push向远程仓库推送代码;6)通过git pull从远程仓库拉取更新。文章详细说明了各命令的使用场景和注意事项,特别是SSH密钥配置、分支跟踪关系建立等关键操作,为开发者提供了完整的远程仓库协作指
2025-09-11 22:47:34
963
原创 Git分支管理:从创建到合并冲突解决(二)
本文介绍了Git分支的基本概念和操作。主要内容包括:master分支作为默认主分支,保存最新提交ID;创建、切换和删除分支的方法;分支合并的快速模式与--no-ff强制创建合并提交的区别;以及合并冲突的产生和解决方法。文章通过具体示例演示了如何查看分支历史、创建dev分支、合并分支时处理冲突等常见操作,并强调了使用分支开发任务再合并的安全性优势。最后说明了删除分支的注意事项和恢复误删分支的方法。
2025-09-11 16:04:38
1002
原创 Git入门及基础操作(一)
版本库(.git)存储所有历史数据工作区存放当前编辑文件暂存区作为提交缓冲区对象库(object)存储四种对象:blob(文件内容)tree(目录结构)commit(提交记录)tag(版本标签)基本工作流程:git init初始化仓库git add将文件加入暂存区git commit提交到版本库git log查看提交历史
2025-09-10 01:14:15
1074
原创 C++实战:搜索引擎项目(一)
本文介绍了一个基于C++技术栈的网页数据处理项目,使用C++11标准库、Boost库、Jsoncpp等工具。项目运行在Ubuntu云服务器环境,通过处理Boost官网HTML文件构建搜索引擎。核心流程包括:用户输入关键词→倒排索引查找→文档提取→结果摘要生成。数据处理阶段需去除HTML标签并按特定格式(title\3content\3url\3)存储,使用Boost库实现文件递归遍历和标签清洗功能。项目采用模块化设计,包含数据清洗、索引构建等组件,最终为用户返回格式化的搜索结果。
2025-09-07 00:46:48
755
原创 Linux线程详解
本文主要探讨操作系统中的线程概念及其实现机制。线程是进程内部的执行分支,作为CPU调度的基本单位。在Linux系统中,线程通过多个task_struct(PCB)共享同一虚拟地址空间、页表和物理内存来实现,降低了创建成本。进程与线程的关系可理解为线程是执行流的子集,而进程是资源分配的单位。Linux采用轻量级进程模型,复用进程管理机制来模拟线程。文中还详细解析了虚拟地址空间与页表机制,说明32位系统如何通过20位页号和12位偏移量实现4GB寻址。最后介绍了pthread_create函数的用法,以及Linu
2025-09-04 15:43:30
1035
原创 Linux信号——信号的保存(2)
关于core和term两种终止方式core是什么?为什么要有core?core的使用如何打开Linux中的core功能?信号的保存关于三张位图匹配的操作信号集数据类型--sigset_t操作block表sigprocmask-sigpending--操作pending表signal--操作handler表一个场景
2025-04-03 15:29:17
742
原创 Linux信号——信号的产生(1)
信号是什么?为什么要有信号?信号的具体知识信号的产生常见信号信号的处理的方式--signal产生信号的第一种方式:kill命令1.默认行为--进程自己终止2.自定义处理信号--捕捉3.忽略信号产生信号的第二种方式:键盘产生信号产生信号的第三种方式:系统调用kill系统调用函数raise 系统调用函数abort系统调用函数产生信号的第四种方式:软件条件产生信号的第五种方式:异常关于信号产生的各种情况的理解对于异常问题的解释
2025-03-31 21:01:47
898
原创 Linux信号量
1.对于共享资源进行保护,是一个多执行流场景下,比较常见和重要的话题。2.:在访问一部分共享资源的时候,任何时刻只允许一个人访问,就叫互斥。:在安全的前提下,访问资源具有一定的顺序性,就叫同步。3.被保护起来的,任何时刻只允许一个执行访问的公共资源——临界资源4.访问临界资源的代码,叫做临界区。所谓的保护公共资源(临界资源)本质:是程序员保护临界区。5.:操作对象的时候,只有两种状态,要么还没开始,要么已经结束。
2025-03-30 15:01:00
770
原创 Linux进程间通信
两个进程之间,可以进行数据的直接传递吗?不能。进程具有独立性。为什么进程间要进行通信?:一个进程需要将它的数据发送给另一个进程。:多个进程之间共享同样的资源。:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。进程间通信是什么?怎么进行进程间通信?a.要有交换数据的空间(内存)
2025-03-29 16:34:00
1053
原创 Linux消息队列
IPC_NOWAIT:如果队列中没有符合条件的消息,立即返回错误(ENOMSG)。:获取消息队列的信息,保存到 buf 指向的 msqid_ds 结构。:与 IPC_CREAT 一起使用时,若消息队列已存在,则返回错误。指向 msqid_ds 结构体的指针,用于传递或接收消息队列的信息。消息缓冲区的最大容量(以字节为单位),不包括 mtype 字段。0:默认行为,如果队列中没有符合条件的消息,则阻塞直到有消息。消息内容的长度(以字节为单位),不包括 mtype 字段。指向消息缓冲区的指针。
2025-03-01 21:22:59
864
原创 Linux共享内存
简而言之,就是两个进程指向了同一块物理空间。共享内存在内核中同时可以存在,OS要管理所有的共享内存。如何保证两个不同进程看到的是同一个共享内存呢???(后文提到的key)!!!使用共享内存通信,一定是一个进程创建新的shm,另一个直接获取共享内存即可。,如果进程结束,我们没有主动释放它,则共享内存一直存在。——(除非重启系统,否则共享内存一直存在)。,一个进程打开一个文件,进程退出时,这个被打开的文件就会被系统自动释放掉。——
2025-02-28 22:07:34
1062
原创 C语言——指针(2)
1.字符指针这是一个简单的字符指针的用法int main() { char a = 'b'; char* p = &a; *p = 'c'; return 0;}那如果一个字符串赋给指针数组会怎么样呢?int main() { char* p = "abcdef"; return 0;}在32位机器下,指针大小为4个字节,那这个指针肯定无法将这个字符串的所有元素地址保存下来调试起来我们发现p指针实际上存了常量字符串的首元素‘a’的地
2025-02-27 20:08:48
420
原创 Linux文件系统----内存级文件
什么叫当前路径? 程序默认打开的文件流 系统调用接口——open,write,close,read 通过系统调用接口open模拟实现c语言中fopen的功能 FILE是c语言封装的结构体,里面封装了文件描述符(fd) 为什么C语言要封装?认识fd 文件描述符fd的分配规则 利用分配规则来实现重定向。另一种简单的重定向方法缓冲区问题 C语言的缓冲区具体在哪里?通过例子证明c语言存在缓冲区
2025-02-23 20:22:50
1031
原创 Linux文件系统----磁盘级文件
1.磁盘的简单构成 2.磁盘的物理存储 3.磁盘的逻辑存储 以一个组为例 inode table inode Bitmap Date Block Block Bitmap文件属性inode与文件数据内容block是如何关联的?关于block数组 通过inode编号查找一个文件Group Descriptor Table Super Block关于文件名
2025-02-23 16:11:40
889
原创 Linux动静态库
动静态库的制作和使用 静态库文件的制作 静态库文件的使用 动态库文件的制作 动态库文件的使用 解决运行时动态库找不到问题的四种方法 关于同时存在动静态库时链接问题 理解动态库加载1.系统角度理解动态库加载2.关于编址3.理解动态库动态链接和加载的问题a.一般程序加载b.动态库的加载
2025-02-23 15:31:31
936
原创 各种地址(绝对地址,相对地址,线性地址,虚拟地址,物理地址,逻辑地址)
└─── 虚拟地址(进程视角)───────┘ 绝对地址(硬件固定地址)采用平坦内存模型(段基址设为0),逻辑地址直接等于线性地址,再通过分页映射到物理地址。逻辑地址(段选择符:偏移量) → 分段机制 → 线性地址 → 分页机制 → 物理地址。如果没有分段,线性地址等于逻辑地址。中的地址空间,由操作系统通过内存管理机制(如分页、分段)映射到物理地址。可能通过分页动态映射,而绝对地址是物理地址的子集(静态映射部分)。芯片(如RAM)上的实际地址,CPU通过总线直接访问的物理位置。
2025-02-23 13:39:00
3445
原创 生成正交表方法
在Excel表格中输入因素,和其对应的水平。注:推荐使用Microsoft Office的,其他版本可能会导致格式错误,这一步的目的是保持格式正确。使用命令行提示符,先进入allpairs.exe的目录,然后输入allpairs.exe test.txt > test01.txt。在allpairs.exe同级目录下创建一个txt文件,将Excel表格的内容复制到txt文件中,直接保存文件。使用allpairs.exe工具对txt文件生成正交表。需要软件allpairs.exe。
2025-02-19 13:45:56
413
原创 哈希表及其实现
哈希表概念,哈希冲突常见的哈希函数,直接定值法,除留余数法,解决Hash冲突,闭散列的开放定值法,线性探测法,哈希表结构,开散列法,开散列法的哈希表结构,关于key值的不同类型进行转化
2024-03-21 20:05:06
1351
原创 Linux中的环境变量
环境变量概念,环境变量相关的命令,命令行参数,main函数带参数,main第三个参数,getenv手动传入环境变量,常见环境变量举例,PATH环境变量
2024-03-03 18:00:12
871
原创 搜索二叉树
搜索二叉树的概念,搜索二叉树的功能介绍及实现,搜索二叉树的遍历,搜索二叉树的插入,搜索二叉树的删除中托孤法删除,替换法删除,以及搜索二叉树功能实现的递归非递归版本
2024-03-01 17:53:23
762
原创 C++继承
继承的概念,继承的定义,继承关系与访问限定符,基类和派生类对象赋值转换,继承中的作用域,派生类的默认成员函数,构造函数,默认的构造函数,显示的构造函数,析构函数,拷贝构造函数,赋值重载函数,继承与友元,继承与静态成员,菱形继承
2024-02-27 11:53:33
968
原创 strstr函数——一个字符串是否是另一个字符串的子串
头文件:string.h函数的声明:char *strstr( const char *str1, const char *str2) 字符串 可能的子串返回值:如果str2在str1中出现,返回str2第一次出现在str1的位置的地址如果str2没有在str1中出现,返回NULL空指针用法:给两个字符串,第一个为字符串,第二个为要判断的子串实例:...
2022-04-04 00:00:34
1991
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅