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 = nilp.victimSize = 0}// Move primary cache to victim cache.for _, p := range allPools {p.victim = p.localp.victimSize = p.localSizep.local = nilp.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)。其作用包括以下几点:
- 防止 goroutine 被调度到其他 P 上:调用 runtime_procPin 后,当前 goroutine 会被固定在当前的 P 上,直到调用 runtime_procUnpin。这对于某些需要固定在同一线程上的操作特别有用,例如与线程相关的外部库交互。
- 确保本地缓存的一致性:在某些高性能应用中,使用 runtime_procPin 可以确保本地缓存的一致性,从而提高性能。这对于涉及大量并发和线程间通信的程序特别重要。
- 优化性能:在某些情况下,固定 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老是报错,本来一篇搞定 老是报超时啥的,只能拆分了 抱歉
相关文章:
Go源码--sync库(3):sync.Pool(2)
回收 回收其实就是将 pool.local 置为空 可以让垃圾回收器回收 我们来看下 源码 func init() {// 将 poolCleanup 注册到 gc开始前的准备工作处理器中在 STW时执行runtime_registerPoolCleanup(poolCleanup) }这里注册了清理程序到GC前准备工作 也就是发生GC前需要执行这段代…...
Go如何在本地引用以及发布并引用自定义工具包
如何引用本地自定义工具包 我们首先要准备两个项目,分别为需要引入的工具包和当前项目。 myutils、myproject1. myutils为我们的项目1-工具包 package mypakgeimport "strings"func IsContains(s string) bool {if strings.Contains(s, "a")…...
使用了代理IP怎么还会被封?代理IP到底有没有效果
代理IP作为一种网络工具,被广泛应用于各种场景,例如网络爬虫、海外购物、规避地区限制等。然而,很多用户在使用代理IP的过程中却发现自己的账号被封禁,这让他们不禁产生疑问:使用了代理IP怎么还会被封?代理…...
在WSL2的Ubuntu中安装和使用Docker/Podman
在WSL2的Ubuntu中安装和使用Docker/Podman 0. 目的 当网络环境良好(例如在公司,能直接访问Google等)时, Docker/Podman 安装和使用不是问题。 当网络环境不佳(例如在家里),要把 WSL2 的 Ubun…...
【WEEK16】Learning Objectives and Summaries【Spring Boot】【English Version】
Learning Objectives: Learning SpringBoot Learning Content: Reference video tutorials【狂神说Java】SpringBoot最新教程IDEA版通俗易懂Dubbo and Zookeeper Integration Learning time and outputs: Week16 TUE~FRI 2024.6.11【WEEK16】 【DAY2】Dubbo和Zookeeper集成第…...
AI大模型会让搜索引擎成为历史吗?
AI大模型会让搜索引擎成为历史吗? 随着人工智能技术的不断发展,AI大模型已经在许多领域展现出了强大的能力。从自然语言处理到图像识别,AI大模型的应用越来越广泛。在这种背景下,有人开始提出一个问题:AI大模型是否可…...
SpringSecurity6从入门到实战之SpringSecurity6自定义认证规则
SpringSecurity6从入门到实战之SpringSecurity6自定义认证规则 Spring Security 中默认所有的 http 请求都需要先认证通过后,才能访问。那么, 如何指定不需要认证就可以直接访问的资源呢?比如 用户的登录页面和注册页面,都是不需要…...
Java IO:byte[]、char[]、String三种对象的转换
String与byte[]对象进行转换时应指定编码格式,否则有潜在的乱码问题。byte[] b s.getBytes(“utf-8”); String s new String(b,“utf-8”); Java的IO库提供了专门的管道来对这3个对象进行读写,他们是StringReader/Writer CharArrayReader/Writer Byt…...
Elasticsearch:简化数据流的数据生命周期管理
作者:来自 Elastic Andrei Dan 今天,我们将探索 Elasticsearch 针对数据流的新数据管理系统:数据流生命周期,从版本 8.14 开始提供。凭借其简单而强大的执行模型,数据流生命周期可让n 你专注于数据生命周期的业务相关方…...
Verilog综合出来的图
Verilog写代码时需要清楚自己综合出来的是组合逻辑、锁存器还是寄存器。 甚至,有时写的代码有误,vivado不能识别出来,这时打开综合后的schematic简单查看一下是否综合出想要的结果。 比如:误将一个always模块重复一遍,…...
KT-H6测距模块标品,测距范围1500m,demo报价1000RMB,批量报价500RMB
激光测距传感器是一种用于测量距离的模块,通常由传感器和相关电子设备组成,测距模块可以集成到各种设备和系统中,以实现准确的测距和定位功能。KT-H6系列激光测距模块,为自主研发,激光波长905nm的激光器,专为热成像、夜视仪、无人机、安防、瞄具等产品定身打造,其优点是…...
C数据结构:排序
目录 冒泡排序 选择排序 堆排序 插入排序 希尔排序 快速排序 hoare版本 挖坑法 前后指针法 快速排序优化 三数取中法 小区间优化 快速排序非递归 栈版本 队列版本 归并排序 归并排序非递归 编辑 计数排序 各排序时间、空间、稳定汇总 冒泡排序 void Bub…...
【Python】在 Pandas 中使用 AdaBoost 进行分类
我们都找到天使了 说好了 心事不能偷藏着 什么都 一起做 幸福得 没话说 把坏脾气变成了好沟通 我们都找到天使了 约好了 负责对方的快乐 阳光下 的山坡 你素描 的以后 怎么抄袭我脑袋 想的 🎵 薛凯琪《找到天使了》 在数据科学和机器学习的工作…...
持续总结中!2024年面试必问 20 道并发编程面试题(九)
上一篇地址:持续总结中!2024年面试必问 20 道并发编程面试题(八)-CSDN博客 十七、请解释什么是Callable和FutureTask。 Callable和FutureTask是Java并发API中的重要组成部分,它们用于处理可能产生结果的异步任务。 …...
Linux:线程池
Linux:线程池 线程池概念封装线程基本结构构造函数相关接口线程类总代码 封装线程池基本结构构造与析构初始化启动与回收主线程放任务其他线程读取任务终止线程池测试线程池总代码 线程池概念 线程池是一种线程使用模式。线程过多会带来调度开销,进而影…...
集成学习方法:Bagging与Boosting的应用与优势
个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] 📱…...
JEnv-for-Windows 2 java版本工具的安装使用踩坑
0.环境 windows11pro 1.工具下载 GitHub - Mu-L/JEnv-for-Windows: Change your current Java version with one line or JEnv-for-Windows:Change your current Java version with one line - GitCode 2.执行jenv 初始化 2.1 问题:PowerShell 未对文件\XXX.…...
linux中: IDEA 由于JVM 设置内存过小,导致打开项目闪退问题
1. 找到idea安装目录 由于无法打开idea,只能找到idea安装目录 在linux(debian/ubuntu)中idea的插件默认安装位置和配置文件在哪里? 默认路径: /home/当前用户名/.config/JetBrains/IntelliJIdea2020.具体版本号/options2. 找到jvm配置文件 IDEA安装…...
d3.js获取流程图不同的节点
在D3.js中,获取流程图中不同的节点通常是通过选择SVG元素并使用数据绑定来实现的。流程图的节点可以通过BPMN、JSON或其他数据格式定义,然后在D3.js中根据这些数据动态生成和选择节点。 以下是一个基本的示例,展示如何使用D3.js选择和操作流…...
MFC socket编程-服务端和客户端流程
MFC 提供了一套丰富的类库来简化 Windows 应用程序的网络编程。以下是使用 MFC 进行 socket 编程时服务端和客户端的基本流程: 服务端流程: 初始化 Winsock: 调用 AfxSocketInit 初始化 Winsock 库。 创建 CSocket 或 CAsyncSocket 对象&am…...
从测试开发到智能体工程师,我的转型全流程,全是避坑指南
文章目录 前言一、为什么我要从测试开发转智能体工程师1.1 测试开发的职业天花板,比我想象的还要低1.2 AI正在以惊人的速度,吞噬传统测试的工作1.3 智能体赛道,是程序员最后的红利期 二、转型前我踩过的那些致命大坑2.1 坑1:上来就…...
激光器核心光路解析:单模与多模光纤的选型、耦合与系统设计实战
1. 光纤基础:从全反射到模式传输 第一次接触光纤时,我被那根比头发还细的玻璃丝能传光的现象震撼到了。后来才知道,这背后的核心原理是全内反射——当光从高折射率介质(纤芯)射向低折射率介质(包层…...
3分钟魔法:把化学分子变成3D艺术品的秘密武器
3分钟魔法:把化学分子变成3D艺术品的秘密武器 【免费下载链接】blender-chemicals Draws chemicals in Blender using common input formats (smiles, molfiles, cif files, etc.) 项目地址: https://gitcode.com/gh_mirrors/bl/blender-chemicals 还在为枯燥…...
Java-Thread-Affinity源码解析:深入理解IAffinity接口的跨平台设计
Java-Thread-Affinity源码解析:深入理解IAffinity接口的跨平台设计 【免费下载链接】Java-Thread-Affinity Bind a java thread to a given core 项目地址: https://gitcode.com/gh_mirrors/ja/Java-Thread-Affinity Java-Thread-Affinity是一个专注于线程亲…...
告别Labelme!用Roboflow快速标注你的UNet语义分割数据集(附完整代码)
告别Labelme!用Roboflow快速标注你的UNet语义分割数据集(附完整代码) 还在为手动标注图像数据而头疼?传统工具如Labelme虽然功能强大,但面对团队协作和大批量数据时,效率瓶颈明显。本文将带你体验Roboflow这…...
MySQL 比较规则(Collation)详解
一、概述 比较规则(Collation) 是一组定义如何比较和排序字符集中字符的规则。它决定了: 字符串的大小写是否敏感(A a?)重音符号是否敏感( e?)多语言字符的排序顺序&…...
游戏交易税、年龄锁与拒付账单:APP出海全球合规风暴
上周,监管与平台的合规重拳,密集落在了游戏交易、未成年人保护和支付链条上。几项变化直接且锋利,对出海游戏厂商而言,已不再是远期预警,而是迫在眉睫的执行项。 美国州级监管:直指游戏内购与停服责任 科…...
唐山暖气片测评:河北卓兴材质散热佳但价格略高,适合这类人群
在唐山暖气片市场,众多厂家各展风采。本次测评旨在为对唐山暖气片感兴趣的人群,提供客观、真实的产品信息。参与本次测评的产品来自河北卓兴散热器有限公司。本次测评主要基于以下几个核心维度:1. 材质质量(40%)&#…...
如何在C++中使用标准库的智能指针
使用标准库的智能指针* 注意,在使用数组的时候需要使用数组的特化版本。#include <iostream> #include <memory>std::unique_ptr<char[]> division(int x, int y) {std::unique_ptr<char[]> sp(new char[100]{});if (y 0) {throw "Pl…...
从零构建可视化爬虫管理平台:ClawPanel架构设计与实战
1. 项目概述与核心价值最近在折腾一个自动化数据采集的小项目,偶然在GitHub上看到了一个名为“ClawPanel”的开源项目,作者是zhaoxinyi02。这个项目名字直译过来是“抓取面板”,光看标题就让我这个老爬虫工程师眼前一亮。在数据驱动的今天&am…...
