摘要: Python 内存管理层次: 众所周知,计算机硬件资源由操作系统负责管理,内存资源也不例外。应用程序通过 系统调用 向操作系统申请内存,而 C 库函数则进一步将系统调用封装成通用的 内存分配器 ,并提供了 malloc 系列函数。 C 库函数实现的通用目的内存管理器是一个重要的分水岭,即内存管理层次 阅读全文
posted @ 2024-02-24 21:19 muzinan110 阅读(12) 评论(0) 推荐(0) 编辑
摘要: GIL 由来 我们先思考一个问题:我们在前面介绍的 list 、 dict 等内建对象是 线程安全 的吗? 在 Python 层面,list 、dict 等内建对象是线程安全的,这是最基本的常识。研究 list、dict 等内建对象源码时,我们并没有看到任何 互斥锁 的痕迹,这多少有点令人意外。以  阅读全文
posted @ 2024-02-24 21:14 muzinan110 阅读(10) 评论(0) 推荐(0) 编辑
摘要: 哈希值 Python 内置函数 hash 返回对象 哈希值 ,哈希表 依赖 哈希值 索引元素: 根据哈希表性质, 键对象 必须满足以下两个条件,否则哈希表便不能正常工作: 哈希值在对象整个生命周期内不能改变; 可比较,且比较相等的对象哈希值必须相同; 满足这两个条件的对象便是 可哈希 ( hasha 阅读全文
posted @ 2024-02-24 21:12 muzinan110 阅读(38) 评论(0) 推荐(0) 编辑
摘要: list 对象是一种 容量自适应 的 线性容器 ,底层由 动态数组 实现。动态数组结构决定了 list 对象具有优秀的尾部操作性能,但头部操作性能却很差劲。 容量调整 当我们调用 append 、pop 、insert 等方法时,列表长度随之发生变化。当列表长度超过底层数组容量时,便需要对底层数组进 阅读全文
posted @ 2024-02-24 21:07 muzinan110 阅读(53) 评论(0) 推荐(0) 编辑
摘要: 面向对象理论中“ 类 ”和“ 对象 ”这两个重要概念,在 Python 内部均以对象的形式存在。 “类”是一种对象,称为 类型对象 ;“类”实例化生成的“对象”也是对象,称为 实例对象 。 根据对象不同特点还可进一步分类: 类别特点 可变对象 对象创建后可以修改 不可变对象 对象创建后不能修改 定长 阅读全文
posted @ 2024-02-24 21:02 muzinan110 阅读(13) 评论(0) 推荐(0) 编辑
摘要: go编译器 Go 语言的编译器完全用 Go 语言本身来实现,它完全实现了从(编译)前端到后端的所有工作 Golang 的生态中相关工具我们能用到的有 pprof 和 trace。pprof 可以看 CPU、内存、协程等信息在压测流量进来时系统调用的各部分耗时情况。而 trace 可以查看 runti 阅读全文
posted @ 2024-02-24 20:58 muzinan110 阅读(6) 评论(0) 推荐(0) 编辑
摘要: 系统调用是指使用类似函数调用的方式调用操作系统提供的API。虽然从概念上来说系统调用和函数调用差不多,但本质上它们有很大的不同(call vs int/syscall) 操作系统的代码位于内核地址空间,而CPU在执行用户代码时特权等级很低,无权访问需要最高优先级才能访问的内核地址空间的代码和数据,所 阅读全文
posted @ 2024-02-24 20:54 muzinan110 阅读(25) 评论(0) 推荐(0) 编辑
摘要: 所有在 UNIX 系统上运行的程序最终都会通过 C 系统调用来和内核打交道。用其他语言编写程序进行系统调用,方法不外乎两个:一是自己封装,二是依赖 glibc、或者其他的运行库。Go 语言选择了前者,把系统调用都封装到了 syscall 包。封装时也同样得通过汇编实现。 当M一旦进入系统调用后,会脱 阅读全文
posted @ 2024-02-24 20:48 muzinan110 阅读(97) 评论(0) 推荐(0) 编辑
摘要: 如果想兼顾开发效率,又能保证高并发,协程就是最好的选择。它可以在保持异步化运行机制的同时,用同步方式写代码(goroutine-per-connection),这在实现高并发的同时,缩短了开发周期,是高性能服务未来的发展方向。 CPU 和 IO 设备是不同的设备,能并行运行。合理调度程序,充分利用硬 阅读全文
posted @ 2024-02-24 20:39 muzinan110 阅读(35) 评论(0) 推荐(0) 编辑
摘要: mutator 申请内存是以应用视角来看问题,我需要的是某一个 struct,某一个 slice 对应的内存,这与从操作系统中获取内存的接口(比如mmap)之间还有一个鸿沟。需要由 allocator 进行映射与转换,将以“块”来看待的内存与以“对象”来看待的内存进行映射。在现代 CPU 上,我们还 阅读全文
posted @ 2024-02-24 20:32 muzinan110 阅读(26) 评论(0) 推荐(0) 编辑
摘要: 性能优化流程理清待优化代码的常用逻辑与场景根据实际场景编写压测用例使用pprof 或者火焰图等工具取得数据找到热点代码重点优化 Profilingpprof 是用于可视化和分析性能分析数据的工具。为什么pprof可以帮助我们分析Go程序性能呢?因为它可以采集程序运行时数据:比如说协程栈,这样服务阻塞 阅读全文
posted @ 2024-02-24 20:25 muzinan110 阅读(29) 评论(0) 推荐(0) 编辑