自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(472)
  • 收藏
  • 关注

原创 自娱自乐代码人的源码分析系列汇总

ptmalloc源码分析/Lua源码分析/Nginx源码分析/Memcache源码分析

2023-09-14 19:31:42 17281

原创 ptmalloc源码分析 - malloc/free函数的实战篇(12)

小内存块分配是是落在fastbin上的,这些内存块没有经过合并整理的操作,所以我们可以尝试从已经被free的chunk中获取得到一些信息,例如。我们将malloc_chunk的结构拷贝过来,以及mem2chunk/chunk2men/chunksize等几个宏定义也拷贝过来。如果与top chunk相邻的那个chunk没有回收,将导致top chunk一下很多的空闲内存都无法返回给操作系统。的方式,获取得到chunk的对象指针地址。因为当前chunk在使用中,所以可以获取得到mchunk_size的值了。

2023-09-27 11:38:42 15825

原创 ptmalloc源码分析 - realloc()函数的实现(11)

老的chunk内存,大于新分配的,空间足够,则可以进行分割。如果nextchunk不是Top chunk ,并且next为空闲状态,则将nextchunk进行合并。函数,检查bytes是否在分配合法区间内,并且将bytes进行对齐,最终得到对齐的nb大小的内存申请容量。如果 nextchunk 是Topchunk ,并且新的chunk大小大于申请的大小,则直接。,并通过_int_free函数,将裁剪出来的剩余chunk释放到bins上管理。1. _int_realloc函数:老chunk足够大,则裁剪。

2023-09-26 22:14:13 15833

原创 ptmalloc源码分析 - free()函数的实现(10)

本章节主要讲解free函数的实现。,该入口函数也在malloc.c的文件中。前几章节我们讲了malloc的具体实现,基本了解了ptmalloc是通过fast bins、unsorted bin、small bin、large bin 和 Top chunk等来管理释放后的内存的。free函数的基本步骤有6步:步骤1:如果是MMAP分配的,则调用munmap_chunk进行chunk的释放操作步骤2:如果释放的内存小于get_max_fast(),则释放的chunk放入fastbin。

2023-09-26 15:53:50 15881

原创 ptmalloc源码分析 - Top chunk的扩容函数sysmalloc实现(09)

当Top chunk内存空间不足的时候,就会调用sysmalloc函数进行内存分配操作。

2023-09-14 15:52:03 17475

原创 ptmalloc源码分析 - _int_malloc函数之largebins和Top chunk(08)

下面我们将一下largebins的实现、扫描bins的方法和Top chunk的实现。top chunk相当于分配区的顶部空闲内存,当bins上都不能满足内存分配要求的时候,就会来top chunk上分配。如果上面都没有合适的chunk,则进行bin的扫描进行chunk的内存分配。chunk的大小也是从小到大排列的,所以往后搜索到的chunk的size都要大于分配内存的大小。如果top chunk的大小 大于分配的内存,则将该Top chunk内存切割后直接分配。三、从Top chunk上去分配一块内存。

2023-09-12 11:59:50 17212

原创 ptmalloc源码分析 - _int_malloc函数之smallbins和unsorted bin(07)

前一章,我们讲解了fastbins的空闲链表的分配逻辑。获取得到的victim就是要操作的内存chunk对象,通过chunk2mem和alloc_perturb函数,初始化对象。如果符合smallbin的大小,则从smallbin的数组上获取一个chunk进行内存分配。,则此次分配失败,需要跳出smallbins上的分配逻辑,往下走其他逻辑的分配方式。如果是smallbin,则通过bins的数组下标获取到对应的chunk双向链表。如果,我们分配的是一个small类型的,遇到合适大小的chunk,则可以将。

2023-09-08 11:15:18 17591

原创 ptmalloc源码分析 - _int_malloc函数之fastbins(06)

当用户释放一块不大于max_fast(默认值64)的chunk(一般小内存)的时候,会默认会被放到fast bins上。因为fastbinsY是一个数组,数组上挂载malloc_chunk是双向链表,当多线程进行同时操作链表的时候就会冲突,需要进行原子操作。_int_malloc函数中,先看申请的内存大小nb是否符合fast bins的限制,符合的话,首先进入fast bin的分配。内存是如何分配的,以及如何将分配的内存关联到malloc_chunk,然后放置到malloc_state的状态机上,则是由。

2023-08-30 15:54:51 18377

原创 ptmalloc源码分析 - 分配区heap_info结构实现(05)

我们讲解了多线程环境下,面对线程之间的竞争,ptmalloc除了主分配区外,还会去创建非主分配区。因为线程在调用malloc的时候,首先会去获取一个分配区,如果当前的分配区都被锁定并且没有新的分配区可用的时候,ptmalloc就会去创建一个新的。中主要是创建一个新的分配区,该分配区主要是非主分配区类型。主分配区在ptmalloc_init中初始化,并且设置了全局变量main_arena的值。(size_t size, size_t top_pad):创建一个新的非主分配区。一、heap_info是什么?

2023-08-29 17:14:03 18477

原创 ptmalloc源码分析 - 主分配区和非主分配区Arena的实现(04)

这里要注意的是,每次有线程调用分配malloc函数,都会对分配区进行加锁操作,多线程情况下竞争的时候没有获得主分配区的,则去freelist里面去找,找不到则创建一个新的非分配区,如果非分配区都创建满了,则需要等待。当arena满了之后就不再创建而是与其他arena共享一个arena,方法为依次给各个arena上锁(查看是否有其他线程正在使用该arena),如果上锁成功(没有其他线程正在使用),则使用该arena,之后一直使用这个arena,如果无法使用则阻塞等待。二、主分配区和非主分配区的数据结构。

2022-11-09 14:15:20 36214 2

原创 业务知识 - 金融知识笔记

目录一、股市的基本概念1. 股市与市场利率的关系一、股市的基本概念1. 股市与市场利率的关系股市和利率关系,是相反的。利率上升,股市下降;利率下降,股市上升利率上升/下降情况:公司经营影响:导致公司筹资困难,公司被迫压缩生产规模或改变原已拟定的生产计划,这将使公司的预期利润减少,导致股价下跌。相反,利率下降会使公司的预期利润增加,从而导致股价上升。 资金流向影响:非金融性公司的境况相对恶化,投资者便会在减少风险的心理驱使下,从股市抽走资金而存人银行,以取得较高的利息。资金的流向

2021-03-29 11:19:41 36528

原创 ptmalloc源码分析 - 内存组织单元malloc_chunk(03)

上一章讲解了ptmalloc的内存的分配器状态机malloc_state的实现。分配器状态机主要管理内存分配过程中的各种状态以及空闲内存的管理。ptmalloc的最小内存组织单元是chunk的数据结构。通过chunk的数据结构,用于管理每次前端程序使用malloc函数调用所产生的在堆上分配的内存。chunk的数据结构先来看一下chunk的数据结构:mchunk_prev_size:该字段记录物理相邻的前一个chunk的大小(低地址chunk)。如果前一个chunk处于空闲,则该字段记录前一个

2020-11-06 17:53:47 36688

原创 ptmalloc源码分析 - 分配区状态机malloc_state(02)

分配器状态机结构malloc_stateptmalloc通过malloc_state的状态机来管理内存的分配。当用户层调用malloc/free等函数的时候,都会通过ptmalloc内核模块进行内存的分配,每一块从操作系统上分配的内存,都会使用malloc_state结构体来管理。/** * 全局malloc状态管理 */struct malloc_state{ /* Serialize access. 同步访问互斥锁 */ __libc_lock_define (, mutex)

2020-11-04 14:33:25 37053 1

原创 ptmalloc源码分析 - ptmalloc的初始化实现(01)

前几年阅读过华庭的《glibc内存管理ptmalloc源代码分析》文章,并做过一篇笔记今年打算重点阅读一下glibc里面,malloc部分的具体实现机制。ptmalloc简介Linux早期的版本,是由Doug Lea实现的,但是早期的版本有一个问题,就是没办法处理多线程下并发分配和回收的高效和正确性。Wolfram Gloger在Doug Lea的基础上改进使得Glibc的malloc可

2020-11-03 16:12:46 36980

转载 转载和积累系列 - L4负载均衡的设计与实现

目录简介一、LVS的局限性1. 数据包转发性能问题2.HA-主备结构的浪费3.转发模式的优缺点二、google maglev负载均衡Maglev Consistent HashGoogle下一步是什么?三、facebook katran第一代 L4LB四、设计高性能负载均衡附录:简介负载均衡分为L4负载均衡(例如LVS)、L7负载均衡(例如nginx),L4负载均衡工作在传输层其主要功能就是转发, 本文讲述的负载均衡为L4。传统上通过采购硬件的..

2020-08-11 09:39:27 36738

原创 业务知识 - 行业笔记

第一章:抖音成为电商流量新宠从电商到微商,再到抖商:电商:通过长期消费类积累信用(淘宝、天猫) 微商:依靠社交关系信任来消费(微商直销、社群运营) 抖商:传播和销售一体化抖商竞争力五点:粉丝接受度高。非直接硬广,通过精美饰品+音乐+情节,让商家产品直观明显 用户更加精准。算法推送,目标用户群体精准 触达更多用户。抖音是去中心化的,内容好就能上热门,覆盖更多用户 抖音平台流量。MAU5亿,一二三线年轻人群。 门槛低。抖音快速成长的原因:快跑的开发迭代模式。前期注重工具属性,有利

2020-07-31 14:50:01 38145

转载 转载和积累系列 - 为什么 HashMap 加载因子是0.75?而不是0.8,0.6?

有很多东西之前在学的时候没怎么注意,笔者也是在重温HashMap的时候发现有很多可以去细究的问题,最终是会回归于数学的,如HashMap的加载因子为什么是0.75?本文主要对以下内容进行介绍: 为什么HashMap需要加载因子? 解决冲突有什么方法? 为什么加载因子一定是0.75?而不是0.8,0.6? 为什么HashMap需要加载因子?HashMap的底层是哈希表,是存储键值对的结构类型,它需要通过一定的计算才可以确定数据在哈希表中的存储位置:static fi

2020-07-22 09:57:52 35574

转载 业务知识 - 结构化思维

"结构化思维”对于技术人员 Coding 能力的升级至关重要,是一线互联网大厂升级为高工及技术专家的关键之一。“结构化思维”对于应对网上甚嚣尘上的“35 岁中年危机”也是关键。表达要有逻辑表达要有逻辑,如公众演讲,转正答辩,晋升评审,严密的逻辑有时可以折服石榴裙等。四种组织思维的逻辑顺序: 演绎(因果)顺序:“大前提、小前提、结论”的演绎推理方式就是演绎顺序。比如,经典三段论:所有人都要死,苏格拉底是人,苏格拉底要死 时间(步骤)顺序:“第一、第二、第三”,“首先、然后、再者”等

2020-06-05 10:20:51 35739

转载 转载和积累系列 - 秒杀系统设计思路

目录前言一:秒杀应该考虑哪些问题1.1:超卖问题1.2:高并发1.3:接口防刷1.4:秒杀url1.5:数据库设计1.6:大量请求问题二:秒杀系统的设计和技术方案2.1:秒杀系统数据库设计2.2:秒杀url的设计2.3:秒杀页面静态化2.4:单体redis升级为集群redis2.5:使用nginx2.6:精简sql2.7:redis预减库存2.8:接口限流2.9:令牌桶算法限流2.10:异步下单2.11:服务降级三:总结

2020-06-05 09:45:24 35795

转载 转载和积累系列 - 分库分表的细节讲解

目录数据库瓶颈分库分表水平分库水平分表垂直分库垂直分表分库分表工具分库分表带来的问题事务一致性问题跨节点关联查询 Join 问题跨节点分页、排序、函数问题全局主键避重问题数据迁移、扩容问题什么时候考虑分库分表能不分就不分数据量过大,正常运维影响业务访问随着业务发展,需要对某些字段垂直拆分数据量快速增长数据库瓶颈不管是 IO 瓶颈还是 CPU 瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载的活跃连接数的阈值

2020-06-03 17:34:17 35497

转载 转载和积累系列 - 缓存穿透、缓存并发、热点缓存之最佳招式

目录一、缓存常见问题缓存穿透缓存并发缓存失效问题汇总二、缓存穿透与并发方案三、热点缓存解决方案一、缓存常见问题我们在用缓存的时候,不管是Redis或者Memcached,基本上会通用遇到以下三个问题: 缓存穿透 缓存并发 缓存失效 缓存穿透注:上面三个图会有什么问题呢?我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。这个时候如果我们查询的某一

2020-06-03 14:28:51 19871

转载 转载和积累系列 - 如何设计一个安全的对外接口

目录前言安全措施如何实现1.数据加密2.数据加签3.时间戳机制4.AppId机制5.限流机制6.黑名单机制7.数据合法性校验前言最近有个项目需要对外提供一个接口,提供公网域名进行访问,而且接口和交易订单有关,所以安全性很重要;这里整理了一下常用的一些安全措施以及具体如何去实现。安全措施个人觉得安全措施大体来看主要在两个方面: 一方面就是如何保证数据在传输过程中的安全性; 另一个方面是数据已经到达服务器端,服务器端如何识别数据,如何不被攻

2020-06-03 10:16:29 19862

转载 转载和积累系列 - HTTPS原理和HTTP缓存机制

HTTPS原理HTTPS随着 HTTPS 建站的成本下降,现在大部分的网站都已经开始用上 HTTPS 协议。大家都知道 HTTPS 比 HTTP 安全,也听说过与 HTTPS 协议相关的概念有 SSL 、非对称加密、 CA证书等,但对于以下灵魂三拷问可能就答不上了:1.为什么用了 HTTPS 就是安全的?2.HTTPS 的底层原理如何实现?3.用了 HTTPS 就一定安全吗?本文将层层深入,从原理上把 HTTPS 的安全性讲透。HTTPS 的实现原理大家可能都听说过 HTTPS 协议

2020-06-03 09:52:33 20221

转载 转载和积累系列 - 微服务(Microservices)和服务网格(Service Mesh)

目录微服务(Microservices)服务网格(Service Mesh)微服务(Microservices)在过去的 2016 年和 2017 年,微服务技术迅猛普及,和容器技术一起成为这两年中最吸引眼球的技术热点。而以 Spring Cloud 为代表的传统侵入式开发框架,占据着微服务市场的主流地位。微服务(Microservices)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务

2020-06-02 16:15:09 18716

转载 转载和积累系列 - Faas,又一个未来?

目录前言一、什么是Faas二、Kubernetes 与 FaaS三、后记前言云计算时代出现了大量XaaS形式的概念,从IaaS、PaaS、SaaS到容器云引领的CaaS,再到火热的微服务架构,以及现在越来越多被谈起的Serverless和FaaS,我们正在经历?一个技术飞速变革的时代。一、什么是Faas云计算时代出现了大量XaaS形式的概念,从IaaS(Infrastructure as a Service)、PaaS(Platform as a Service)、SaaS(

2020-06-02 15:50:28 18733

转载 转载与积累系列 - Docker 核心技术与实现原理

目录Namespaces进程网络Libnetwork挂载点ChrootCGroupsUnionFS存储驱动AUFS其他存储驱动总结提到虚拟化技术,我们首先想到的一定是 Docker,经过四年的快速发展 Docker 已经成为了很多公司的标配,也不再是一个只能在开发阶段使用的玩具了。作为在生产环境中广泛应用的产品,Docker 有着非常成熟的社区以及大量的使用者,代码库中的内容也变得非常庞大。同样,由于项目的发展、功能的拆分以及各种奇怪的改名 PR,

2020-06-01 18:09:38 18670

转载 转载和积累系列 - 三种常见的限流算法

介绍一般做接口限流主要是为了应对突发流量,避免突发流量拖垮服务。如下面一些场景就有可能发生突发流量 微博热搜 恶意刷单 恶意爬虫 促销活动 接口限流的算法有如下几种计数器算法这是最容易理解和实现的算法,假设一个接口1s中最多请求100次。最开始设置一个计数器count=0,来一个请求count+1,1s之内count<=100的请求可以正常访问,count>100的请求则被拒绝,1s之后count被重置为0,重新开始计数当然这种方式有个弊端

2020-05-15 11:57:43 18169

原创 业务知识 - 人群圈层汇总

小镇青年定义 三线、四线及以下城市的90后群体 人群 移动互联网人群渗透:2.12亿 场景 社交、网络K歌、游戏、短视频和照相图片 渗透率高 喜欢类型 小镇青年更喜欢直接、放松的视频类、游戏类等Kill time型休闲娱乐方式 手机情况 终端价格在2000元以上的超六成 ...

2020-05-06 16:05:13 19076 3

原创 业务知识 - 互联网产品/模式研究

1. 哔哩哔哩 B站MAU 1.2亿,次留40% 关键词 二次元、御宅族、弹幕、直播、游戏、视频搬运者、UGC、ACG 核心功能 ACG:(动画、漫画、游戏)、直播、影视 用户核心抓手 弹幕互动(参与感、认同感、归属感) 功能链接 综合性弹幕视频网站 面向人群 二次元用户、御宅族(9...

2020-05-06 11:13:49 18595

原创 Lua源码分析 - 实战篇 - 编写Lua的扩展库(20)

Lua的扩展库编写有三种方式:注册方式:在主体语言里面编写扩展函数,然后通过lua_register方式,注册到Lua全局注册表中 动态调用:编写独立的扩展函数文件,编译成.so动态库文件,然后在lua中动态调用 扩展库编写:按照Lua语言本身的扩展库设计方式进行编写如果忘记了扩展库的实现,可以回顾一下下面两篇文章:《Lua源码分析 - 扩展库篇 - 扩展库Require的实现(12...

2020-04-10 19:44:22 3761 1

原创 Lua源码分析 - 实战篇 - Lua的API使用(19)

目录实战篇 - Lua的安装和Makefile实战篇 - Lua的API使用实战篇 - C语言中实现动态调用Lua实战篇 - Lua的安装和Makefile前面18章,我们详细的介绍了整个Lua语言的架构和实现原理。Lua是一门C语言编写的脚本语言,非常的轻巧,大部分情况下Lua的使用场景是作为宿主语言存在。web脚本、游戏脚本、物联网等场景。通俗点讲,你可以将Lua...

2020-04-10 17:23:14 2793

原创 Lua源码分析 - 虚拟机篇 - 语义解析之Opcode执行(18)

目录虚拟机篇 - 指令执行函数luaV_execute虚拟机篇 - 一个变量赋值操作看实现虚拟机篇 - 指令执行函数luaV_execute在《Lua源码分析 - 主流程篇 - 函数调用栈的实现(08)》我们看到了整个Lua脚本语言的执行主流程。Lua脚本主流程:通过文件解析->解析成语法Token->编译成二进制操作码->执行二进制操作码上一章节我们讲解...

2020-04-09 16:41:46 3553

原创 Lua源码分析 - 虚拟机篇 - 语义解析之Opcode生成(17)

上一篇我们讲解了语义的解析编译过程。我们基本知道了Lua的代码是一遍解析文件,一遍编译成字节码指令的。这一节,我们主要讲一下lcode.c文件,Opcode是如何生成的。虚拟机篇 - 指令集存储数据结构Proto上一篇,我们有讲到Proto是主要用来存储指令集的。指令集存放:解析完毕的指令集,都会放置到Proto->code[n]上,code是一个数组形式存储。FuncState...

2020-04-02 17:57:26 3218

原创 Lua源码分析 - 虚拟机篇 - 语义解析之编译过程(16)

目录虚拟机篇 - 编译过程的核心数据结构虚拟机篇 - 指令集存储结构Instruction上一章节,讲解了语法的解析功能luaX_next,这一章节主要讲解虚拟机代码编译成操作码的过程。虚拟机篇 - 编译过程的核心数据结构我们首先看下,Lua核心虚拟机实现的几个重要文件:llex.c 语义分割器、lparse.c 语法树解析器、lcode.c 可执行代码生成整个Lua代码编...

2020-04-01 17:10:00 2604 4

原创 Lua源码分析 - 虚拟机篇 - 语义解析之Token分割器(15)

上一篇,我们讲到了Lua脚本文件加载和读取的方式。其中luaX_next函数就是用来将Lua脚本字符串逐个切割出Token。虚拟机篇 - 语义分割单位Token结构Token定义:Lua会对脚本语言逐个切分出最小单位Token。例如lua保留字“if”的Token是TK_IF,字符串Token为TK_STRING。Lua通过luaX_next逐个读取字符流字符,直到切割出一个完整...

2020-02-25 20:41:56 2206

原创 Lua源码分析 - 虚拟机篇 - 语义解析之loadfile文件读取(14)

前几章主要讲解了Lua的主流程和Lua的扩展库实现机制。本章开始讲解Lua虚拟机部分的实现机制。虚拟机 - 从Lua的例子入手我们通过一个Lua的例子,来看一下Lua脚本的执行。我们首先顶一个一个lua文件,test.lua,里面是一段协程的简单示例脚本。-- 定义一个协程回调函数function f () print('--启动程序--'); print('--中断...

2020-02-21 19:41:15 3487

原创 Lua源码分析 - 扩展库篇 - 扩展库Open的实现(13)

上一章,我们讲解了如何将Require进来。本章节具体将一下注册扩展库的实现。扩展库 - 注册扩展库的配置注册一个扩展库,首先需要进行两个基础配置:loadedlibs数组配置 & 库名称和回调函数的配置(lualib.h)loadedlibs是一个二维数组。第一个参数为库名称,第二个参数库open函数。 loadedlibs数组中,第一个对象为全局基础方法聚合(luaope...

2020-02-18 19:02:04 1809

原创 Lua源码分析 - 扩展库篇 - 扩展库Require的实现(12)

我们前面几章节讲过,Lua的函数调用有三种类型:C语言闭包函数,C 扩展库API和Lua语言函数。这一章我们主要讲解一下Lua的扩展库Require的实现。

2020-02-15 23:31:57 2796 6

原创 Lua源码分析 - 主流程篇 - 注册表的实现(11)

Lua通过实现全局的注册表,来管理全局变量、C API扩展库的加载等信息。注册表主要通过Table的数据结构进行管理,所以注册表是一个多维数组的结构。本章我们主要讲解Lua的注册表的整体操作方式。Lua注册表 - 实现机制前面我们说过,Lua的注册表是通过Table的结构实现了一个多维数组。而这个全局的多维数组,在global_State全局状态机上进行管理。/*** 'glo...

2020-02-14 20:15:08 3314 1

原创 Lua源码分析 - 主流程篇 - 协程的实现(10)

协程:协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。Lua语言没有独立的线程,所以每次执行Lua脚本的时候,都是单线程执行。同一个执行过程中,Lua没有实现线程,但是实现了协程。相比线程,线程相对资源独立,有自己的上下文,由系统切换调用 协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。协程的实现 - Lua语言...

2020-02-13 16:31:17 4310

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除