問(wèn):假設(shè)此刻有任務(wù)A和任務(wù)B,有以下兩種執(zhí)行方式伏尼,請(qǐng)問(wèn)哪種方式執(zhí)行更快呢?
- 方式一:一個(gè)線程尉尾,先執(zhí)行A爆阶,執(zhí)行完后再執(zhí)行B
- 方式二:兩個(gè)線程,一個(gè)線程執(zhí)行A沙咏,另一個(gè)線程執(zhí)行B
答:方式一更快辨图。CPU在切換線程的時(shí)候,有一個(gè)上下文切換的事件肢藐,這個(gè)上下文切換是非常耗時(shí)的故河,假設(shè)一個(gè)CPU主頻是2.6GHz,這意味著每秒可以執(zhí)行2.6 * 10^9 個(gè)指令, 那么每個(gè)指令的時(shí)間大概是0.38ns吆豹!而一次上下文切換鱼的,就將近需要耗時(shí)2000ns理盆!在這個(gè)時(shí)間內(nèi),CPU什么都干不了凑阶,只是做了保存上下文的動(dòng)作猿规。
問(wèn): 為什么一般是在I/O操作的時(shí)候要用多線程呢?
答: 因?yàn)镮/O操作一般可以分為兩個(gè)階段晌砾,即等待I/O準(zhǔn)備就緒和真正操作I/O資源坎拐!以磁盤(pán)為例,磁盤(pán)上的數(shù)據(jù)是分磁道养匈,分簇存儲(chǔ)的哼勇,但是數(shù)據(jù)往往不是連續(xù)排列在同一磁道上的,所以磁頭在讀取數(shù)據(jù)時(shí)往往需要在磁道之間反復(fù)移動(dòng)呕乎,這里就有一個(gè)尋道耗時(shí)积担,盤(pán)面旋轉(zhuǎn)將請(qǐng)求數(shù)據(jù)所在扇區(qū)移至讀寫(xiě)頭下方也是需要時(shí)間的,同時(shí)這里還包含一個(gè)旋轉(zhuǎn)耗時(shí)猬仁,所以在這一段時(shí)間內(nèi)帝璧,線程是阻塞著等待磁盤(pán)的,此時(shí)操作系統(tǒng)可以將那個(gè)空閑的CPU核心用于服務(wù)其他線程湿刽。因此I/O操作的情況下的烁,使用多線程,效率會(huì)更高诈闺。
因?yàn)閞edis不涉及I/O操作渴庆,所以設(shè)計(jì)為單線程的效率是最高的!
問(wèn): redis的性能和CPU無(wú)關(guān)雅镊,那redis的性能瓶頸在哪呢襟雷?
答:redis的性能瓶頸在于:
1. 網(wǎng)絡(luò)帶寬
2. 機(jī)器內(nèi)存大小
redis客戶端執(zhí)行一條命令分為四個(gè)過(guò)程,發(fā)送命令仁烹,命令排隊(duì)耸弄,命令執(zhí)行,返回結(jié)果卓缰。其中發(fā)送命令+返回結(jié)果這一過(guò)程被稱(chēng)為Round Trip Time(RTT,往返時(shí)間)redis的客戶端和服務(wù)器计呈,可能部署在不同的機(jī)器上,例如客戶端在北京征唬,服務(wù)端在上海震叮,兩地直線距離約為1300公里,那么1次RTT時(shí)間=1300×2/300000×2/3)= 13毫秒(光在真空中傳輸速度為每秒30萬(wàn)公里鳍鸵,這里假設(shè)光纖為光速的2/3),那么客戶端在1秒內(nèi)大約只能執(zhí)行80次左右的命令尉间。
參考:https://blog.csdn.net/u010122604/article/details/92829855