java线程切换速度_为什么说线程太多,cpu切换线程会浪费很多时间?
cpu在執行代碼的時候【以下說明只在linux平臺上,win我不會】
該程序已經是ELF executable file 且該文件內部按ELF格式存儲了機器指令+數據
同時該文件必須引用linux 的核心api庫【動態庫】libc.so 及linux-x86-64.so 核心文件。
啟動的時候操作系統會識別該文件的ELF文件頭信息【引入的api庫提供了核心的execve函數用來執行程序】,進行判斷,如果是ELF executable file就會把機器指令+數據裝載到內存中去運行。
如果該文件不是elf executable file就會讀取該文件的第一行數據并當作解釋器來運行。
go,java,python,php都是這種玩意,寫的代碼都是偽代碼【變化的非常騷】,都要go,java,python,php[elf文件如go run xxx.go php xx.php python xxx.py javac xxx.java java xxx運行,前面的這些文件是elf文件,后面的就是大家所認為的源碼文件,通過web來訪問大家所擼的go,java,py,php原理都一個樣]
當程序啟動時[如/bin/java demo],會讀取后面的源碼文件【如java 會execve(bin/java...) 再read 該的elf信息】,后面會打開demo.class文件并讀取內容【做各種所謂的騷處理】
其它語言【go,py,php】同理。
啟動后就是一個進程了并且默認是從主線程開始執行,主線程結束,整個進程結束
如果開啟了多個線程【每個線程都有一個入口函數】,當線程數量小于或等于cpu核心數時,理論上是并發執行,否則則是模擬”并發執行“
當cpu切換到當前進程時執行某個或是某幾個【多核時】線程時,可能會原因阻塞,鎖等情況,被其它線程搶占運行,那么當前的線程的現場執行的上下文數據就要緩存起來以備切換回來時要能還原運行,而這些數據就要暫存到寄存中,如果線程數量過多,切換頻繁,數據來回讀寫,那么當前進程的一堆線程執行性能就會慢慢下降,這些代碼在執行的時候是執行機器指令,大家在源碼里的代碼雖然可能是一行,但是機器指令卻是多條,執行到一半,cpu就切換到其線程中了,那當前線程執行到哪,現在的數據是什么總得存起來,以便后面切換時恢復,來回折騰這樣好嗎?寄存器不會發火嗎?我勸年輕人耗子喂汁。來偷襲我上電好長時間的寄存器這不好。
多線程開得越多,cpu都忙在切換上面了,代碼執行的時間就會越來越少,執行一條指令立馬被人偷襲搶占切換,當前進程啟動的多線程執行時間就會越來越少,等半天才執行幾條指令,還原到各位寫的源碼估計一行都不到,估計你上來就是啪,把電腦砸了。
..............
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java线程切换速度_为什么说线程太多,cpu切换线程会浪费很多时间?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: db2 联邦 mysql_DB2联邦数据
- 下一篇: android按钮旋转,单击一个按钮在a