Go源码--sync库(3):sync.Pool(2)

回收

回收其实就是将 pool.local 置为空 可以让垃圾回收器回收
我们来看下 源码

func init() {
	// 将 poolCleanup 注册到 gc开始前的准备工作处理器中在 STW时执行
	runtime_registerPoolCleanup(poolCleanup)
}

这里注册了清理程序到GC前准备工作 也就是发生GC前需要执行这段代码 具体细节可以自行追踪下

我们来看下 poolCleanup的源代码

// 清理pools 将pools中的数据清理掉
// 具体逻辑 将 主缓存数据 移到 受害者缓存中 然后等GC清理 上次的 受害者缓存数据
// 也就是说 发生GC后 清理的是 上个GC时 放在 pools里的数据 而这次GC只是将pools里的数据放在受害者缓存里
func poolCleanup() {
	// This function is called with the world stopped, at the beginning of a garbage collection.
	// It must not allocate and probably should not call any runtime functions.

	// Because the world is stopped, no pool user can be in a
	// pinned section (in effect, this has all Ps pinned).

	// Drop victim caches from all pools.
	for _, p := range oldPools {
		p.victim = nil
		p.victimSize = 0
	}

	// Move primary cache to victim cache.
	for _, p := range allPools {
		p.victim = p.local
		p.victimSize = p.localSize
		p.local = nil
		p.localSize = 0
	}

	// The pools with non-empty primary caches now have non-empty
	// victim caches and no pools have primary caches.
	oldPools, allPools = allPools, nil
}

可以看到 我们前面提到的受害者缓存在这里赋值的。

疑问点

**问题一: ** runtime_procUnpin和runtime_procPin有什么作用
答:runtime_procPin 的作用
在 Go 运行时中,runtime_procPin 是一个内部函数,主要用于绑定当前 goroutine 到当前的 P(Processor)。其作用包括以下几点:

  1. 防止 goroutine 被调度到其他 P 上:调用 runtime_procPin 后,当前 goroutine 会被固定在当前的 P 上,直到调用 runtime_procUnpin。这对于某些需要固定在同一线程上的操作特别有用,例如与线程相关的外部库交互。
  2. 确保本地缓存的一致性:在某些高性能应用中,使用 runtime_procPin 可以确保本地缓存的一致性,从而提高性能。这对于涉及大量并发和线程间通信的程序特别重要。
  3. 优化性能:在某些情况下,固定 goroutine 到特定的 P 可以减少上下文切换和调度开销,优化程序性能。

runtime_procUnpin的作用
作用和机制
4. 解除绑定:runtime_procUnpin 解除 runtime_procPin 所做的绑定,使得 goroutine 可以再次在不同的 P 之间迁移。
5. 恢复调度灵活性:解除绑定后,调度器可以将 goroutine 迁移到其他 P,以更好地平衡负载和资源利用。
6. 清理和释放资源:在某些需要固定资源或特定线程的操作完成后,通过 runtime_procUnpin 可以释放这些资源,使系统恢复正常的调度。

问题二: sync.Pool如何保证并发安全
我们首先来看下 Put()调用集 和 Get()调用集 同时发生时 可能存在的情况 如下图:

在这里插入图片描述
可以看到 正常情况下 (没有偷数据发生)Put Get操作运行在不同P上 且访问的内存各自独立 所以并发安全,有偷操作加进来后 采用了 for+cas的方式 使得同一时刻 只有一个协程可以取得数据 保证了并发安全

总结

还是有一些细节没想清楚,等有时间再补充,小弟水货,还望各位大神指教,共同进步。
感想:不敢想
csdn老是报错,本来一篇搞定 老是报超时啥的,只能拆分了 抱歉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/714615.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【每日随笔】摩托车控车 ① ( 油离配合 | 落脚油离配合 - 不给油 | 落脚油离配合 - 给油 | 正式油离配合 | 骑行姿态注意事项 )

文章目录 一、找 " 离合结合点 "二、落脚油离配合 ( 不给油 )1、该科目练习目的2、起步姿态3、开始练习 三、落脚油离配合 ( 给油 )1、练习目的2、熟悉油门转速3、练习步骤 四、正式油离配合1、练习目的2、练习步骤3、练习效果 五、骑行姿态注意事项1、基本骑行姿态2…

正能量情感语录热门素材文案去哪里找?文案素材网站分享

正能量情感语录热门素材文案去哪里找?文案素材网站分享 想为你的作品注入正能量和情感温度?不知如何获取热门情感语录素材?别担心,今天我将为大家推荐一些海外知名的素材网站,让你轻松找到受欢迎的文案素材&#xff…

对不起了,QQ和微信,我选择用它!

哈喽,各位小伙伴们好,我是给大家带来各类黑科技与前沿资讯的小武。 每当我们需要在电脑和手机之间传输文件、在学习和工作时与朋友/同事传输文件,相信大多都会使用微信或者QQ。 但是在分享一些软件apk等安装包时,微信和QQ会将其…

.gitignore文件忽略的内容不生效问题解决

文章目录 ①:现象②:原因③:解决 ①:现象 在已经提交过的git管理的项目中, 新增加一个.gitignore文件,文件内忽略内容不生效或者修改.gitignore文件之后,文件内新增的忽略内容不生效 ②&#…

ImageNet-1k 测试集 两大坑

1、官方网站提交test set标签时,千万不能提交zip文件,即便明文说可以 https://image-net.org/challenges/LSVRC/eval_server.php 不然就会浪费一次提交机会,直接提交submission.txt就可以,注意每排5个预测结果,用于计…

第 2 章:Spring Framework 中的 IoC 容器

控制反转(Inversion of Control,IoC)与 面向切面编程(Aspect Oriented Programming,AOP)是 Spring Framework 中最重要的两个概念,本章会着重介绍前者,内容包括 IoC 容器以及容器中 …

【UML用户指南】-16-对高级结构建模-构件

目录 1、概念 2、构件与接口 3、可替换性 4、组织构件 5、端口 6、内部结构 6.1、部件 6.2、连接件 7、常用建模技术 7.1、对结构类建模 7.2、对API建模 构件是系统中逻辑的并且可替换的部分,它遵循并提供对一组接口的实现。好的构件用定义良好的接口来定…

nginx全解

一、Nginx配置文件 1.1 主配置文件 主配置文件位置:nginx.conf tip:安装方式不同,路径不同 #主配置文件格式 ​ main block:主配置段,即全局配置段,对http,mail都有效 ​ #配置Nginx服务器的事件模块相…

Gstreamer学习3----灌数据给管线之appsrc

参考资料 Basic tutorial 8: Short-cutting the pipeline gstreamer向appsrc发送帧画面的代码_gst appsrc可变帧率-CSDN博客 在官网教程Basic tutorial 8: Short-cutting the pipeline 里面,讲了一个例子,push音频数据给管线,视频的例子更…

DP读书:《半导体物理学(第八版)》(四)半导体的导电性-玻尔兹曼-电导率

第四章 半导体的导电性 4.1 载流子的漂移运动和迁移率4.1.1欧姆定律4.2.2漂移速度和迁移4.1.3半导体的电导率和迁移率 4.2 载流子的散射4.2.1载流子散射的概念4.2.2半导体主要散射机构 4.3迁移率与杂质浓度和温度的关系4.3.1平均自由时间混合和散射概率的关系4.3.2电导率、迁移…

[C++]使用yolov10的onnx模型结合onnxruntime和bytetrack实现目标追踪

【官方框架地址】 yolov10yolov10框架:https://github.com/THU-MIG/yolov10 bytetrack框架:https://github.com/ifzhang/ByteTrack 【算法介绍】 Yolov10与ByTetrack:目标追踪的强大组合 Yolov10和ByTetrack是两种在目标追踪领域具有显…

算法体系-21 第二十一 暴力递归到动态规划(三)

一 最长回文子串 1.1 描述 给定一个字符串str,返回这个字符串的最长回文子序列长度 比如 : str “a12b3c43def2ghi1kpm” 最长回文子序列是“1234321”或者“123c321”,返回长度7 1.2 分析 1.2.1 先将原传逆序,求原串和反转后的…

代理IP协议有何区别?深入了解 SOCKS5、HTTP 代理

在数字通信领域,数据安全和匿名性都是非常重要的指标。互联网的不断发展催生了几种协议,每种协议都有独特的优势和挑战。其中,SOCKS5 代理、HTTP代理最为广泛使用,下面给大家一起讨论,HTTP代理与 SOCKS5代理&#xff0…

基于微信小程序的在线答题小程序设计与实现

个人介绍 hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的…

MySQL基础——SQL语句

目录 1.SQL通用语法 2.SQL分类 3 DDL 3.1数据库操作 3.1.1查询 3.1.2创建 3.1.3删除 3.1.4使用 3.2表操作 3.2.1查询 3.2.2创建 3.2.3数据类型 3.2.4表修改(alter打头) 3.2.5表删除(drop/truncate打头) 3.3 DDL总结…

C#联合Halcon机器视觉框架源码—升级版

相较于之前的NxtVision,本软件代码架构更加合理,且新增ui设计器、原来的vb脚本改为C#脚本,并尝试将视觉与运动控制相结合,是一体化的框架。 对源码有需求的,订阅本专栏后,私信我领取。

用python纯手写一个日历

一、代码 # 月份名称数组 months ["January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", &qu…

JVM如何确定方法调用

方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定调用哪一个方法,不涉及方法内部的具体运行过程。在程序运行时,进行方法调用是最普遍、最频繁的操作,但Class文件的编译过程中不包含传统编译中的连接步骤,一…

Python | 中心极限定理介绍及实现

统计学是数据科学项目的重要组成部分。每当我们想从数据集的样本中对数据集的总体进行任何推断,从数据集中收集信息,或者对数据集的参数进行任何假设时,我们都会使用统计工具。 中心极限定理 定义:中心极限定理,通俗…

英语学习笔记36——Where ... ?

Where … ? ……在哪里? 词汇 Vocabulary beside prep. 在……旁边 同义词: near by 构成:be side side n. 边 搭配:side walk 人行道 例句:Bobby在我旁边。    Bobby is beside me. off prep. 离开&#xff…