线程进程是怎样使用多核的
最近由于有抢票的需求,对于一个用户而言,用一个死循环,一个刷票就好了,刷到了就break退出。但是现在我要考虑同时给很多人抢,那么必须要考虑并发。但是这是一个耗时的任务,很可能几天都不能结束这个任务,所以这个和普通的java web并发不同。我在思考如何设置这个线程模型时引出了一个问题,之前还一直都没思考过这个。
多核时,一个线程是始终由一个cpu核运行还是每个cpu核都会运行该线程呢?
先来看看进程的三种状态
对于这个问题,先假设第一种情况成立(线程始终由某一个核执行)
那么对于一个四核cpu来说,一个线程A假如第一次是有cpu0执行,那么后续直到执行完毕,A永远由cpu0执行。
再假设第二种情况成立(线程由不同的核执行)。
那么对于一个四核cpu来说,一个线程A假如第一次是有cpu0执行,那么第二次可能由cpu1执行,第三次可能由cpu2执行,第四次可能由cpu3执行,每个cpu交替执行,直到A执行完成。
那么,到底哪种假设是正确的呢?,为此我做了一个简单的测试。
我用xcode写了一个简单的oc代码
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
while (1) {
//死循环用来查看cpu利用率
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
工程命名cputest,运行模拟器,打开mac上活动监视器观察
可以看到cpu使用率达到了98.3%,咋一看像是使用了一个cpu核,如果这时候你认为假设一是正确的那就错了。可能你会很诧异,明明都快到100%,为什么不是!!!我来告诉你答案,接下来我用查看多核cpu的每个核使用率方法(见我上篇文章mac查看多核cpu利用率)
是不是很惊讶,这个双核四线程里没有一个核达到了98.3%,最高也才50%吧。那么由此我们可以得出结论了,第二种假设是正确的,多核cpu情况下,一个线程不是由某一个核一直执行完成的。
此处需要解释下%cpu = 98.3%是怎么来的, 它是由四核(有两个核是虚拟的)的利用率相加得来的。
但是在实际工作中,你可能会有某些特殊要求,为了优化项目,不得不让某个进程一直由cpu的某一个核执行直到完成。事实上这样也是可以的,你可以指定进程由某一cpu核来完成执行。详情可以搜索 taskset 命令。
另附上知乎 “一个进程能不能在多个核上跑?” 的链接 https://www.zhihu.com/question/31683094
---------------------
作者:Lonely_Devil
来源:CSDN
原文:https://blog.csdn.net/Lonely_Devil/article/details/81115344
版权声明:本文为博主原创文章,转载请附上博文链接!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南