最近由於有搶票的需求,對於一個用戶而言,用一個死循環,一個刷票就好了,刷到了就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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!