- 博客(158)
- 收藏
- 关注
原创 深入理解线程:从基本概念到内核实现与内存管理
摘要:本文深入探讨了Linux系统中线程的概念、实现原理与控制方法。线程是进程内的执行分支,作为CPU调度的基本单位,在Linux中通过轻量级进程(LWP)实现,复用进程的task_struct结构。文章分析了进程与线程的资源共享关系,介绍了Linux通过clone系统调用创建线程的机制,并详细讲解了线程控制相关的POSIX函数(如pthread_create、pthread_join等)。特别指出Linux线程具有用户态(pthread_t)和内核态(LWP)两种ID,前者是线程控制块在共享区的地址。
2025-12-08 22:04:47
1250
原创 Linux进程信号
摘要:Linux信号机制是进程间通信的重要方式,本质是异步事件通知。信号可由键盘输入、硬件异常、系统命令或软件条件触发,通过内核写入进程PCB中的位图保存。信号处理包括默认终止、忽略或自定义捕捉三种方式。内核通过三张表(Block、Pending、Handler)管理信号状态,确保信号递达的可靠性。信号处理流程涉及用户态与内核态的切换,通过中断机制实现异步响应。开发者需注意可重入函数、volatile变量优化等问题,并合理处理SIGCHLD信号以回收子进程资源。深入理解信号机制对Linux系统编程和异常处理
2025-12-01 23:06:08
1018
原创 System V 消息队列与信号量
消息队列与SystemV IPC机制解析 消息队列是一种进程间通信机制,基于内核管理的链表结构,通过消息类型实现选择性通信。关键点包括:1)使用ftok生成唯一key标识队列;2)提供msgget/msgsnd/msgrcv等系统调用接口;3)消息结构需包含mtype字段实现类型过滤。SystemV IPC还包括信号量(用于同步互斥)和共享内存,三者采用统一管理架构:内核通过kern_ipc_perm基类结构实现多态管理,具体资源(如msg_queue)通过嵌套基类实现继承,并使用ipc_ids全局数组统一
2025-11-22 22:41:05
986
原创 从管道到共享内存:深入理解 Linux 进程间通信
本文深入探讨了Linux系统中的三种关键进程间通信(IPC)机制。首先介绍了匿名管道,它仅适用于有亲缘关系的进程间通信,具有单向性;随后讲解命名管道(FIFO),通过文件系统路径实现无关进程间的通信;最后重点分析了最高效的共享内存方式,它通过内存映射实现零拷贝通信。文章详细阐述了每种机制的原理、特点和使用场景,并提供了具体的代码实现示例,包括管道封装类和共享内存管理类。特别强调了共享内存的创建、挂接、使用和释放流程,以及其无保护机制带来的并发问题,为后续同步机制讨论奠定了基础。
2025-11-19 19:00:11
1003
原创 【深入理解】动静态库的制作、使用与加载原理(附详细操作指南)
本文介绍了编程中两种库类型:静态库和动态库。静态库在编译时嵌入可执行文件,生成较大但独立的程序;动态库在运行时加载,实现多程序共享。文章详细讲解了两种库的制作使用方式、ELF文件格式结构,以及链接加载过程。通过对比分析,静态库适合独立部署,动态库利于资源共享和更新。还介绍了readelf、objdump等工具用于分析库文件结构。理解这些概念能帮助开发者选择适当的库类型,提升程序效率和维护性。
2025-11-15 21:16:34
761
原创 Linux进程池与管道通信详解:从原理到实现
本文详细介绍了基于管道通信的Linux进程池实现方案。系统通过预先创建多个子进程和管道来实现高效任务处理,包含四个核心模块:1) 任务函数定义,使用函数指针数组统一管理;2) 子进程任务处理逻辑,通过阻塞读取管道获取任务;3) Channel类封装进程通信通道;4) ProcessPool类管理整个进程池生命周期。重点解决了文件描述符泄漏等关键问题,并提供了完整的代码实现和测试流程。该方案通过轮询调度和管道通信机制,有效降低了频繁创建进程的开销,为Linux系统高并发编程提供了实用参考。
2025-11-15 19:02:16
717
原创 Acwing--并查集、堆、哈希表
本文介绍了三种常用数据结构的Python实现方法。1.并查集:使用树结构表示集合,支持合并和查询操作,通过路径压缩优化时间复杂度至O(1)。2.堆:实现小根堆的插入、删除、修改等操作,使用up和down函数维护堆性质,堆排序通过从中间建堆优化时间复杂度。3.哈希表:包括开放寻址法和字符串哈希,后者将字符串视为P进制数进行快速比较。这些实现均采用数组存储数据,并包含必要的优化技巧,如路径压缩、堆化调整等,代码简洁高效。
2025-09-23 10:16:28
795
原创 Trie应用
Trie树是一种高效处理字符串和二进制数据的数据结构。摘要介绍了两种Trie树的应用:1) 字符串统计,通过共享前缀实现高效插入和查询;2) 最大异或对问题,将数字转为31位二进制处理。相比暴力解法O(n²)的时间复杂度,Trie树将最大异或对优化到O(n),同时详细分析了两种场景下Trie数组的空间分配策略。
2025-09-18 10:59:12
369
原创 VS Code和Cursor扩展主机在过去5分钟内意外终止了3次问题解决方案
VS Code/Cursor关闭遥测数据的正确方法:无需删除插件或回退版本。在Mac系统下,进入Preferences的VSCode Settings,搜索"telemetry"选项,将最后的下拉菜单设置为"off"即可完成设置。该方法同样适用于VSCode用户,具体可参考GitHub相关issue讨论。
2025-09-17 20:11:03
999
原创 Acwing算法基础课--链表
本文介绍了单链表和双向链表的实现方法。单链表部分详细讲解了头指针的作用、节点插入/删除操作,以及如何通过数组模拟链表结构。双向链表部分则说明了如何利用左右指针实现更灵活的插入删除,并介绍了使用哨兵节点简化边界处理的技巧。两种实现都采用静态数组存储,通过索引值模拟指针操作,具有内存连续、访问高效的特点。文章还特别解释了数组下标与逻辑位置的关系,以及哨兵节点的设计原理,为理解链表操作提供了清晰的技术解析。
2025-09-14 14:24:21
513
原创 Acwing算法基础课--离散化、区间合并
本文介绍了两种区间处理算法:1. 离散化算法将稀疏大范围数据映射为紧凑区间,通过排序去重后使用前缀和计算区间和,时间复杂度为O(nlogn)。2. 区间合并算法先按左端点排序,然后用双指针方法扫描区间,分三种情况合并重叠区间,最终输出合并后的区间数量。两种算法都适用于处理大规模区间数据,离散化适合求和操作,合并算法适合区间整合。
2025-09-13 13:20:50
363
原创 Acwing算法基础课--前缀和与差分
本文介绍了前缀和与差分的算法实现及应用。前缀和部分包含一维和二维前缀和的计算方法,通过预处理数组实现O(1)时间复杂度的区间查询。差分部分则作为前缀和的逆运算,详细展示了一维和二维差分的构建及区间更新操作,最后通过差分数组重构原始数组。两种算法都提供了Python代码实现,并附有核心公式说明,适用于需要频繁进行区间查询或更新的场景。
2025-09-09 10:02:43
224
原创 Acwing算法基础课--高精度加减乘除
这是一组Python实现的高精度运算代码,包含加减乘除四种基本运算。加法采用逆序处理、逐位相加并处理进位;减法先比较大小,再逆序逐位相减处理借位;乘法通过逆序处理,逐位相乘并累加上一步的余数;除法则顺序处理,逐位计算商和余数。所有运算都包含去除前导零的处理,减法和除法还涉及结果符号的判断。这些算法都采用列表存储数字,通过反转列表实现逆序处理,最终输出时将结果再反转回正常顺序。这是处理大数运算的典型实现方式。
2025-09-08 22:36:25
369
原创 Acwing算法基础课--二分算法
这篇文章介绍了两种二分查找的应用:整数区间查找和浮点数三次方根求解。第一部分讲解如何在一个升序数组中查找某元素的起始和终止位置,提供了两种二分模板——左端点查找和右端点查找,分析了指针移动规则和边界条件。第二部分演示了用二分法求浮点数的三次方根,重点说明了精度控制方法,并与整数二分模板进行了对比。两部分的代码实现都附有详细注释,展示了二分查找在不同场景下的应用技巧。
2025-09-07 13:46:13
842
原创 Acwing算法基础课--快速排序和归并排序
本文介绍了两种经典排序算法及其应用。快速排序通过选取基准值x(常用中间值)分割数组,递归处理左右子区间,时间复杂度平均O(nlogn)。归并排序采用分治策略,先递归分割数组,再合并有序子序列,时间复杂度稳定O(nlogn)。在逆序对问题中,巧妙利用归并排序的合并过程统计逆序数:当右元素小于左元素时,左半剩余元素均构成逆序对。两算法均适用于大规模数据(n≤1e5),提供了Python实现模板,其中快速排序需注意边界条件,归并排序需要额外空间。逆序对计算展示了排序算法的拓展应用。
2025-09-06 22:56:52
519
原创 EventEmitter--Node.js 事件驱动的核心
net.Server对象在每次有新连接时触发事件。对象在文件被打开时触发事件。所有这些事件对象都是的实例。是 Node.js 中用于创建、注册和触发事件的核心模块,实现了事件驱动编程的基础。
2025-03-25 10:17:44
559
原创 关于《Hands-On Large Language Models: Language Understanding and Generation》各章节博客目录汇总
《Hands-On Large Language Models: Language Understanding and Generation》一书的博客目录,共整理了12篇博客,对应书中12章的内容。每篇博客都提供了详细的地址,方便您快速查阅与学习。
2025-02-28 16:42:46
883
原创 第十二章:生成模型微调
在本章中,我们探讨了微调预训练LLM的不同步骤。我们通过低秩适应(LoRA)技术利用参数高效微调(PEFT)进行微调。我们解释了如何通过量化扩展LoRA,这是一种减少表示模型和适配器参数时内存约束的技术。我们探讨的微调过程分为两个步骤。在第一步中,我们使用指令数据对预训练的LLM进行监督微调,通常称为指令调优。这样得到了一个具有聊天行为且能紧密遵循指令的模型。在第二步中,我们通过在对齐数据上进一步微调模型,数据表示了哪些类型的回答优于其他回答。
2025-02-28 16:29:39
984
原创 第十一章:微调表示模型用于分类
在本章中,我们探索了如何对预训练表示模型进行微调,适应不同的分类任务。我们首先演示了如何对一个预训练的 BERT 模型进行微调,然后将这些例子扩展到冻结部分模型层的情况。接着,我们实验了一种少样本分类技术——SetFit,它通过仅使用有限的标记数据来微调预训练的嵌入模型与分类头,并生成了与前面章节中探索的模型相似的性能。然后,我们深入探讨了继续预训练的概念,使用一个预训练的 BERT 模型作为起点,继续用不同数据进行训练。这种基于掩码语言模型的方法不仅用于创建表示模型,还可以用于继续预训练模型。
2025-02-28 15:46:52
1461
原创 第十章:创建文本嵌入模型
对比学习是训练和微调文本嵌入模型的一种重要技术。对比学习的目标是训练嵌入模型,使得相似文档在向量空间中彼此更接近,而不相似的文档则距离更远。如果这听起来很熟悉,那是因为它与第二章中提到的word2vec方法非常相似。我们在图10-2和图10-3中已经看到过这个概念。对比学习的基本思想是,学习和建模文档之间的相似性/不相似性的最佳方式是向模型提供相似和不相似的文档对。为了准确捕捉文档的语义特征,通常需要将其与另一篇文档进行对比,以便模型学习什么使它们相似或不同。这种对比过程非常强大,且与文档的写作背景相关。
2025-02-28 11:04:28
1495
1
原创 第九章:多模态大语言模型
在本章中,我们探索了多种方法,通过弥合文本和视觉表示之间的差距,使大型语言模型(LLMs)具备多模态能力。我们首先讨论了用于视觉的 Transformer,这些模型可以将图像转换为数值表示。这是通过使用图像编码器和 patch embedding 实现的,它们使得模型能够在不同尺度上处理图像。接着,我们探讨了如何通过 CLIP 创建嵌入模型,将图像和文本都转换为数值表示。我们看到 CLIP 如何通过对比学习将图像和文本嵌入对齐到一个共享空间中,从而实现零样本分类、聚类和搜索等任务。
2025-02-27 21:34:56
1824
原创 文本预处理时Resource punkt/stopwords/averaged_perceptron_tagger_eng/wordnet not found报错解决方式--亲测有效
Resource punkt/stopwords/averaged_perceptron_tagger_eng/wordnet not found报错解决方式
2025-02-02 22:05:31
484
原创 PyTorch 快速入门
本文介绍了PyTorch的基本使用,包括数据处理、模型创建、参数优化、模型保存与加载,通过FashionMNIST数据集的示例,展示了如何快速上手PyTorch进行机器学习任务。
2025-01-30 23:18:16
959
原创 Pytorch框架从入门到精通
本文介绍了PyTorch中张量的初始化、操作、优化模型参数、保存和加载模型等内容,涵盖了从基础张量操作到神经网络训练、模型保存与预测的全流程。
2025-01-30 23:05:09
1878
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅