線程進程是怎樣使用多核的


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM