浅析ThreadList的runcheckpoint方法

简介: 浅析ThreadList的runcheckpoint方法

作用

threadlist的runcheckpoint方法作用是让所有线程都执行制定的任务。threadlist的dump方法有两种实现方式:

1。打印调用者线程的栈帧情况

2。打印指定thread线程的栈帧情况。

根据上面两个函数相信大家可以猜到可以做哪些骚操作了。接下来继续解释

函数实现

runcheckpoint函数实现:

1。针对已经在运行的线程只需对这个线程设置kcheckpoint标志位,运行中的线程检查到kcheckpoint会自动打印当前线程的信息。而针对不在运行的线程需要先设置suspendrequest标志位让他们暂停运行,防止之后暂停的线程状态变为运行。所以针对已经运行的线程来说只要设置标志位即可,thread运行的时候会在特定指令处进行checkpoint方法进行检查标志位而作出对应的处理。

标记位种类:

1.kcheckpoint的标志位是取出自己tls区域的closure并执行指定run函数最多三个:通过tls区域保存 需要执行的run函数。run函数通过closure闭包封装。一个线程做多可以执行三个closure,也就是可以执行三个run方法。可通过add的方式进行添加对应线程tls区域的closure。

2.suspendrequest标志位是将线程状态设置为suspend暂停不运行。

解释:

threadlist中存放着所有的线程也知道所有运行的线程数是多少

将所有线程都暂停怎么验证呢?

假设当前threadlist中有5个运行的线程数量通过suspendbarrier保存为5,我给所有的线程都设置ksuspendrequest标志位,当它们碰到某些指令时比如循环返回,异常指令处方法返回处等指令处时会运行runcheckpoint检查自己的标志位。而suspendrequest对应的第一步操作就是递减suspendbarrir然后挂起自己修改自己线程状态,当递减为0时代表所有线程都暂停了。这个时候就是所有线程都暂停。递减操作是无锁编程通过循环递减barrry,通过cas原子操作保证线程安全

如果要是不在运行的线程呢?就是说这个线程阻塞了或者已经暂停了他都没有运行那么怎么进行检查标志位呢这个也就是上面说过的dump的第二种实现方式,不需要那个指定的线程运行自己打印自己线程的情况,而是通过调用者线程(你这个线程不运行,调用者线程运行我用调用者线程去打印)进行帮助那些没有运行的线程打印信息,只需要指定对应的thread。

上面第一步设置ksuspendrequest标志位已经让不在运行的线程都已经停止运行了(即使暂停的线程恢复运行也会在检查标志位的时候进行把自己暂停)然后我把一个执行dump函数的run函数封装成closure添加到threadlist中的每一个线程中。而dump函数是打印指定线程的栈帧信息。这里runcheckpoint都是通过指定线程的方式来打印对应指定线程的信息,执行线程是当前线程,但是打印对应线程情况的是指定的线程

为什么呢?因为要保存线程不能发生任何内存上的变化所以只能通过将所有线程都suspend的方式实现,但是线程暂停了怎么能够打印自己的信息呢?所以得留一个活着的线程也就是当前线程去打印他们的信息

总结

检查标志位的操作之后就会检查到自己线程被设置了kcheckpoint标志位从tsl区域中取出closure执行任务;设置失败代表当前线程不在运行状态,那么也不可以直接打印那个线程的信息,因为之后这个线程可能再次运行会改变线程的内存情况,所以针对暂停的线程还需要设置ksuspendpoint保证即使线程之后运行也会再次暂停(递减barrier成功才会返回true),这样就能保证当前是发生情况的现场对应的情况。

思考环节

大家仔细想想是不是我们anr的时候查看trace文件会出现一堆线程的信息不管是native的还是java的都会出现。答案就是通过threadlist的runcheckpoint实现的。

运行的线程保证及时的打印当时虚拟机中所有线程情况,不在运行的线程设置挂起标志位保证即使运行也能保证不会破坏现场。因为线程状态切换时也会进行一次标志位检查所以可以保证是之前那次发出指令时的内存情况。



相关文章
|
IDE 程序员 开发工具
IDEA插件-IKun Progress 坤坤成IDEA进度条了
"IKun Progress"是一款适用于JetBrains IntelliJ IDEA等IDE的插件,该插件能够将标准的进度条替换为一个有趣且独特的篮球动画,其中的角色名为坤坤(Kun Kun)。它旨在为您的IDE使用过程增添一些娱乐和轻松的氛围。 该插件让您可以在执行IDE中的任务时享受到更加视觉上吸引人的进度指示器,例如构建、运行测试或其他涉及进度条的操作。相比传统的普通进度条,您将看到坤坤在打篮球,给您的开发工作流程增添了一份乐趣。
1624 0
IDEA插件-IKun Progress 坤坤成IDEA进度条了
|
Shell Serverless
makefile 函数全解
makefile 函数全解
860 0
makefile 函数全解
|
消息中间件 监控 算法
让 nativePollOnce 不再排名第一 | 钉钉 ANR 治理最佳实践
让 nativePollOnce 不再排名第一 | 钉钉 ANR 治理最佳实践
2275 0
让 nativePollOnce 不再排名第一 | 钉钉 ANR 治理最佳实践
|
算法
【算法实践】| 一步步带你实现寻找最大公约数
在实现之前我们先来了解一下什么是最大公约数,以及我们常用的计算最大公约数的方法或者说数学方法。 概念 最大公约数,也称最大公因数、最大公因子。他是一个能够被若干整数同时整除的整数,如果一个整数同时是几个整数的约数,则称这个整数为他们的公约数,公约数中最大的数成为最大公约数,1是任意若干的正整数的公约数。比如:一个数既是数A的约数,又是数B的约数,称为A,B的公约数,A,B的公约数中最大的一个(可以包括AB自身)称为AB的最大公约数,a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。这么一大段可以概括为: 最大公约数:指两个或
425 1
|
7天前
|
人工智能 运维 安全
|
5天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
579 20