- 博客(69)
- 资源 (21)
- 收藏
- 关注
原创 Go 运行时与内存模型:HB、原子/屏障、栈管理与写屏障
本文深入探讨了Go运行时与内存模型的核心机制。主要内容包括:1) Go内存模型的happens-before关系及原子操作/内存屏障原理,通过代码示例演示数据竞争问题及解决方案;2) Goroutine栈管理机制(分裂/收缩/复制)及其与GC的交互,分析栈增长触发条件和性能影响;3) 混合写屏障技术实现及演进,解释其在并发GC中的作用原理。文章还提供了实践建议,如正确使用同步原语、控制GC压力等,并推荐了相关调试工具(如-race检测、GC日志分析)。这些内容为深入理解Go并发编程和运行时行为提供了技术参考
2025-09-17 10:18:19
97
原创 Go语言三色标记算法(Tri-color Marking Algorithm)解析
摘要:Go语言的三色标记算法是其垃圾回收(GC)系统的核心部分,用于标记可达对象并回收不可达的内存。该算法将对象分为白色(未访问)、灰色(正在处理)和黑色(已处理),通过逐步扫描对象图,确保并发GC的正确性。Go的GC实现采用该算法以减少停顿时间(STW),结合写屏障(Write Barrier)优化并发标记过程,提高垃圾回收效率。
2025-09-17 10:14:22
210
原创 Go语言垃圾回收器深入解析
本文深入解析了Go语言垃圾回收器(GC)的设计与实现。Go的GC采用并发标记-清除算法,结合三色标记和混合写屏障技术,实现了低延迟(暂停时间<1ms)和高并发性能。文章详细介绍了GC的生命周期、触发机制、核心算法以及性能优化策略,包括GOGC参数调整、sync.Pool使用等。通过分析Go 1.20源码(runtime/mgc.go),揭示了GC启动、对象标记、写屏障等关键实现细节。文章也指出了Go GC的优缺点,为开发者提供了调优建议,帮助构建高性能Go应用。
2025-09-17 10:10:42
1109
原创 Go语言内存管理的底层机制和原理
Go语言内存管理机制摘要 Go语言采用自动内存管理机制,主要包含栈和堆两种内存区域。栈内存为每个goroutine私有,初始2KB,可动态增长至1GB,通过copystack实现扩容。堆内存由全局mheap管理,采用分层结构:每个P线程有本地mcache缓存,中央mcentral管理不同大小类span,大对象直接从mheap分配。垃圾回收使用并发三色标记-清除算法,通过写屏障实现并发标记,STW时间控制在毫秒级。编译器通过逃逸分析决定变量分配在栈还是堆,优化内存使用。整体设计兼顾高效并发和自动管理,避免开发
2025-09-17 10:06:04
1403
原创 Go语言并发模型深入分析
本文深入解析Go语言的并发模型,重点介绍goroutine和GMP调度器的核心机制。goroutine作为轻量级线程(初始栈2KB),由用户态调度器管理,成本远低于OS线程。GMP调度器通过G(goroutine)、M(OS线程)和P(逻辑处理器)的协作实现高效调度,采用工作窃取算法平衡负载。文章详细剖析了channel通信、同步原语、动态栈管理等特性,并给出性能优化建议。Go并发模型支持百万级goroutine,通过CSP模型简化编程,但需注意goroutine泄漏和调度延迟问题。最后提供了源码级分析和工
2025-09-16 23:22:11
152
原创 Go(Golang)底层机制与原理详解
Go(Golang)底层机制解析 Go语言通过tcmalloc内存分配器(小对象本地缓存+大对象堆分配)和动态栈(2KB~1MB)管理内存,采用并发标记-清除GC(三色标记+写屏障)实现低延迟回收。其核心并发模型GMP调度器(Goroutine+Machine+Processor)结合工作窃取和抢占式策略,通过Channel和Sync包支持高效并发。编译器优化包括逃逸分析和内联,接口采用动态分派(itable),核心数据结构如切片(ptr/len/cap)、哈希表(开放寻址)和字符串(不可变)均高效设计。工
2025-09-16 22:06:51
458
原创 【面试高频问题】一道经典C++网络编程问题的备忘录
近日,在重温C++网络编程相关资料的过程中发现一道经典问题,该问题是关于原始Socket API局限性方面的,笔者分析发现该问题基本上覆盖了面试题目中关于socket的所有知识点,同时也暴露了原始Socket API的某些缺陷。笔者先晒一晒该问题的代码,读者可以先自己找找里面有多少bug,后续本文分享笔者所收集的答案,^_^,开始试试你的“法眼”吧!#include #include c
2012-05-13 18:57:24
7292
4
原创 简单的程序诠释C++ STL算法系列之十九:replace
替换算法将指定元素值替换为新值,使用原型如下,将迭代器[first,last)中值为old_value的元素全部替换为new_value值。 函数原型:template void replace ( ForwardIterator first, ForwardIterator last, const T& old_value, const T&
2012-04-29 22:14:34
5703
2
原创 简单的程序诠释C++ STL算法系列之十八:transform
前篇我们已经了解了一种区间元素交换swap_ranges函数,现在我们再来学习另外一种区间元素交换transform。该算法用于实行容器元素的变换操作。有如下两个使用原型,一个将迭代器区间[first,last)中元素,执行一元函数对象op操作,交换后的结果放在[result,result+(last-first))区间中。另一个将迭代器区间[first1,last1)的元素*i,依次与[firs
2012-04-29 22:09:48
22923
1
原创 简单的程序诠释C++ STL算法系列之十七:swap_ranges
前面我们已经熟悉了swap和iter_swap,接下来我们来看看区间元素交换算法:swap_ranges,该算法用于进行两个迭代器区间元素的交换。它的使用原形如下,将迭代器区间[first1,last1)的元素,与迭代器区间[first2,first2+(last1-first1))迭代器区间元素交换其中*first1和*first2交换、*(first+1)和*(first2+1)交换、...*
2012-04-29 21:59:23
4531
原创 纵横中“初品”Boost程序库探秘
一、话说“初品”Boost程序库探秘 C++最新标准C++11的公布,对一直游走在C++98的C++开发者(包括我自己)来说是福音亦是挑战。C++11引入的新特性让C++更具魅力变得更加友好易用,这是福音;但随之而来的语言复杂度的增加,无疑是一种挑战。面对魅力的诱惑和全新的挑战,我们如何从沉迷已久的C++98平滑地过度到C++11呢,罗剑锋老师教了我们一招“杀手锏”:探秘Boost程序
2012-04-28 01:39:45
6982
原创 简单的程序诠释C++ STL算法系列之十六:iter_swap
上文中阐述了元素交换算法swap以及容器中swap成员函数的使用,尤其是通过vector成员函数的交换技巧实现容器内存的收缩,今天,我们要看到的是另一个变易算法,迭代器的交换算法iter_swap,顾名思义,该算法是通过迭代器来完成元素的交换。首先我们来看看函数的原型:函数原型:template void iter_swap( ForwardIterator1 _
2012-03-27 00:20:07
7585
原创 简单的程序诠释C++ STL算法系列之十五:swap
相信大家看到swap这个词都一定不会感到陌生,甚至会有这样想法:这不就是简单的元素交换嘛。的确,swap交换函数是仅次于Hello word这样老得不能老的词,然而,泛型算法东风,这个小小的玩意儿却在C++ STL中散发着无穷的魅力。本文不仅详细地阐述STL泛型算法swap,并借助泛型算法这股东风,展现STL容器中swap成员函数的神奇魅力。注意哦,泛型算法swap和容器中的swap成员函数,这是
2012-03-24 05:41:39
32919
2
原创 简单的程序诠释C++ STL算法系列之十四:copy_backward
前文中展示了copy的魅力,现在我们来看一下它的孪生兄弟copy_backward,copy_backward算法与copy在行为方面相似,只不过它的复制过程与copy背道而驰,其复制过程是从最后的元素开始复制,直到首元素复制出来。也就是说,复制操作是从last-1开始,直到first结束。这些元素也被从后向前复制到目标容器中,从result-1开始,一直复制last-first个元素。举个简单的
2012-03-22 00:44:16
15914
4
原创 简单的程序诠释C++ STL算法系列之十三:copy
前面十二个算法所展现的都属于非变易算法(Non-mutating algorithms)系列,现在我们来看看变易算法。所谓变易算法(Mutating algorithms)就是一组能够修改容器元素数据的模板函数,可进行序列数据的复制,变换等。 我们现在来看看第一个变易算法:元素复制算法copy。该算法主要用于容器之间元素的拷贝,即将迭代器区间[first,last)的元素复制到由复
2012-03-20 23:43:59
23699
6
原创 C++经典书目索引及资源下载
C++经典书目索引: 严重申明 : 本博文未经原作者(jerryjiang)允许,任何人不得转载和抄袭 !Essential C++ 中文版层次:初级导读:《Essential C++中文版》以4个方面来表现C++的本质:procedural(程序性的)、generic(泛型的)、object-based(个别对象的)、object-oriented(面向对
2012-03-15 22:10:07
35201
42
原创 简单的程序诠释C++ STL算法系列之十二:find_end
C++STL的非变易算法(Non-mutating algorithms)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。 find_end算法在一个序列中搜索出最后一个与另一序列匹配的子序列。有如下两个函数原型,在迭代器区间[first1, last1)中搜索出与迭代器区间[first2, last2)元素匹配的子序列,返回首元素的迭
2011-10-12 20:38:07
6641
原创 简单的程序诠释C++ STL算法系列之十一:search_n
C++STL的非变易算法(Non-mutating algorithms)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。 重复元素子序列搜索search_n算法:搜索序列中是否有一系列元素值均为某个给定值的子序列,它有如下两个函数原型,分别在迭代器区间[first, last)上搜索是否有count个连续元素,其值均等于value(或者
2011-10-11 23:24:56
6663
原创 简单的程序诠释C++ STL算法系列之十:search
C++STL的非变易算法(Non-mutating algorithms)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。 search算法函数在一个序列中搜索与另一序列匹配的子序列。它有如下两个原型,在迭代器区间[first1, last1)上找迭代器区间[first2, last2)完全匹配(或者满足二元谓词binary_pred)子
2011-10-10 23:46:52
9895
原创 简单的程序诠释C++ STL算法系列之九:equal
C++STL的非变易算法(Non-mutating algorithms)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。 equal算法类似于mismatch,equal算法也是逐一比较两个序列的元素是否相等,只是equal函数的返回值为bool值true/false,不是返回迭代器值。它有如下两个原型,如果迭代器区间[first1,las
2011-10-10 23:11:16
7626
原创 简单的程序诠释C++ STL算法系列之八:mismatch
C++STL的非变易算法(Non-mutating algorithms)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。 mismatch算法是比较两个序列,找出首个不匹配元素的位置。它有如下两个函数原型,找出迭代器区间[first1, last1) 上第一个元素 *i , 它和迭代器区间[first2, first2 + (last1
2011-10-09 22:01:00
7603
1
原创 简单的程序诠释C++ STL算法系列之七:count_if
C++STL的非变易算法(Non-mutating algorithms)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。 count_if算法是使用谓词判断pred统计迭代器区间[first , last) 上满足条件的元素个数n,按计数n是否引用返回,有如下两种函数原型:函数原型:template typename it
2011-10-09 20:58:07
8938
原创 简单的程序诠释C++ STL算法系列之六:count
C++STL的非变易算法(Non-mutating algorithms)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。 count算法用于计算容器中的某个给定值的出现次数。它有两个使用原型,均计算迭代器区间[first, last)上等于value值的元素个数n,区别在于计数n是直接返回还是引用返回。 函数原型:templa
2011-10-07 21:30:36
4169
原创 Beep也疯狂,让你的主板也Happy起来吧
主板能唱歌,而且能根据简谱播放出美妙的旋律,你信吗?不管你信不信,反正我是信啦,^_^。 Windows API 就提供了一个这样奇妙的发音函数,它就是Beep函数。Beep可以通过控制主板扬声器的发声频率和节拍来演奏美妙的旋律,本文根据音乐简谱来演奏几首优美的歌曲,
2011-10-07 14:47:28
12168
7
原创 简单的程序诠释C++ STL算法系列之五:find_first_of
C++STL的非变易算法(Non-mutating algorithms)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。 find_first_of算法用于查找位于某个范围之内的元素。它有两个使用原型,均在迭代器区间[first1, last1)上查找元素*i,使得迭代器区间[first2, last2)有某个元素*j,满足*i =
2011-10-02 14:40:46
10022
原创 简单的程序诠释C++ STL算法系列之四:adjacent_find
C++STL的非变易算法(Non-mutating algorithms)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。 adjacent_find算法用于查找相等或满足条件的邻近元素对。其有两种函数原型:一种在迭代器区间[first , last)上查找两个连续的元素相等时,返回元素对中第一个元素的迭代器位置。另一种是使用二元谓词判断
2011-09-30 22:49:41
7267
原创 简单的程序诠释C++ STL算法系列之三:find_if
C++STL的非变易算法(Non-mutating algorithms)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。 find_if算法 是find的一个谓词判断版本,它利用返回布尔值的谓词判断pred,检查迭代器区间[first, last)上的每一个元素,如果迭代器iter满足pred(*iter) == true,表示找到元素并
2011-09-29 22:39:59
5864
原创 简单的程序诠释C++ STL算法系列之二:find
C++STL的非变易算法(Non-mutating algorithms)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。 find算法用于查找等于某值的元素。它在迭代器区间[first , last)上查找等于value值的元素,如果迭代器iter所指的元素满足 *iter == value ,则返回迭代器iter,未找则返回last。
2011-09-29 00:24:31
4649
1
原创 简单的程序诠释C++ STL算法系列之一:for_each
C++STL的非变易算法(Non-mutating algorithms)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。 for_each用于逐个遍历容器元素,它对迭代器区间[first,last)所指的每一个元素,执行由单参数函数对象f所定义的操作。 原型:template Function for_each(
2011-09-27 20:24:18
20228
3
原创 size_type、size_t、different_type以及ptrdiff_t
size_type 在标准库string类型中,最容易令人产生误解就是size()成员函数的返回值了,如果不深入分析的话,大多人都会认为size()的返回值为int类型,其实不然。事实上,size操作返回的是string::size_type类型的值。 那怎样理解size_type这一类型呢,我引用《C++ Primer》一段原文简单解释一下: string类类型和许多其他
2011-08-20 23:41:53
6090
原创 存储过程实现SQL2005查询Access数据库
创建存储过程RemoteJetQuery: CREATEPROCEDURE [dbo].[RemoteJetQuery]@TableOrQueryStringint=1,@Provider_Namenvarchar(30)=N'Microsoft.Jet.
2010-06-05 10:58:00
2172
4
原创 浅谈SQL游标
游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力。我们可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。游标允许你选择一组数据,通过翻阅这组数据记录——通常被称为数据集,检查每一个游标所在的特定的行。你可以将游标和局部变量组合在一起对每一个记录进行检查,当游标移动到下一个记
2010-03-25 17:00:00
2390
2
原创 SQL Server数据库查询优化50妙计(下篇)
26、MIN()和MAX()能使用到合适的索引。 27、数据库有一个原则是代码离数据越近越好,所以优先选择Default,依次为Rules,Triggers, Constraint(约束如外健主健CheckUNIQUE……,数据类型的最大长度等等都是约束),Procedure.这样不仅维护工作小,编写程序质量高,并且执行的速度快。 28、如果要插入大的二进制值到Ima
2009-11-28 21:12:00
1626
3
原创 图解SQL Server 2000和SQL Server 2005定期自动备份数据库(SQL Server 2005篇)
SQL Server 2005定期自动备份详细图解 SQLServer2005的定期备份是通过创建“维护计划”来实现的。主要有两种方式: 1、维护计划向导。 2、新建维护计划(用户手工创建) 如果想在SQLServer2005中使用维护计划来设计维护备份数据库任务时,有一个前提条件:“SQL Server 代理”服务必须是启用状态
2009-11-22 14:33:00
5180
17
原创 图解SQL Server 2000和SQL Server 2005定期自动备份数据库(SQL Server 2000篇)
SQL Server 2000定期自动备份详细图解企业管理器中的Tools,Database Maintenance Planner,可以设置数据库的定期自动备份计划。并通过启动Sql server Agent来自动运行备份计划。具体步骤如下: 1、打开企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器;2、然后
2009-11-22 14:21:00
3921
4
原创 SQL Server数据库查询优化50妙计(上篇)
优化查询50妙计:(看看哪一计适合您) 1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要. 2、纵向、横向分割表,减少表的尺寸(sp_spaceuse) 3、升级硬件 4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(
2009-11-22 01:01:00
1452
3
原创 SQL SERVER 2005中全新的OUTPUT子句添加数据记录详解(实战篇)
实战篇A. 将 OUTPUT INTO 用于简单 INSERT 语句以下示例将行插入 ScrapReason 表,并使用 OUTPUT 子句将语句的结果返回到 @MyTableVar table 变量。由于 ScrapReasonID 列使用 IDENTITY 属性定义,因此未在 INSERT 语句中为该列指定一个值。但请注意,将在列 INSERTED.ScrapReasonID
2009-11-20 01:14:00
1436
原创 SQL SERVER 2005中全新的OUTPUT子句添加数据记录详解(理论篇)
也许大家在数据库开发的时候,会发现这样一个现象:添加数据记录后想查看其结果都必须通过select表达式来查询实现。一定都要多此一举才可以看到被添加的数据记录吗?答案是否定的。SQL SERVER 2005新提供的OUTPUT子句就帮您解决这个难题,它以比触发器更简洁的方式,在添加数据记录的同时或者事后显示所添加的数据记录内容。下面是作者通过查找帮助文档MSDN和章立民老师的《SQL Server
2009-11-20 00:23:00
2598
原创 用SQL Server 2005 CTE简化查询
SQL Server 2005引进了一个很有价值的新的Transact-SQL语言组件:一个通用表表达式(Common Table Expression,CTE),它是派生表和视图的一个便捷的替代。通过使用CTE,我们可以创建一个命名结果集来在SELECT、INSERT、UPDATE和DELETE语句中引用,而无须保存结果集结构的任何元数据。在本文中,我将阐述如何在SQL Server 20
2009-11-19 01:45:00
4320
More Effective C++中文版
2012-03-15
Exceptional C++ Style中文版
2012-03-15
C++ 编程思想
2012-03-15
Essential C++ 中文版
2012-03-15
Exceptional C++中文版
2012-03-15
SQL SERVER参考手册
2009-07-24
设计模式精解-GoF 23种设计模式解析附C++实现源码
2011-09-17
2009年必会的十大SQL Server 开发技巧
2009-07-27
ASP.NET完全入门经典
2009-07-24
C语言程序设计题典和常见算法150例
2009-07-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅