完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>
標簽 > 多線程
多線程(英語:multithreading),是指從軟件或者硬件上實現多個線程并發執行的技術。具有多線程能力的計算機因有硬件支持而能夠在同一時間執行多于一個線程,進而提升整體處理性能。
多線程(英語:multithreading),是指從軟件或者硬件上實現多個線程并發執行的技術。具有多線程能力的計算機因有硬件支持而能夠在同一時間執行多于一個線程,進而提升整體處理性能。具有這種能力的系統包括對稱多處理機、多核心處理器以及芯片級多處理(Chip-level multithreading)或同時多線程(Simultaneous multithreading)處理器。在一個程序中,這些獨立運行的程序片段叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理(Multithreading)”。具有多線程能力的計算機因有硬件支持而能夠在同一時間執行多于一個線程(臺灣譯作“執行緒”),進而提升整體處理性能。
多線程(英語:multithreading),是指從軟件或者硬件上實現多個線程并發執行的技術。具有多線程能力的計算機因有硬件支持而能夠在同一時間執行多于一個線程,進而提升整體處理性能。具有這種能力的系統包括對稱多處理機、多核心處理器以及芯片級多處理(Chip-level multithreading)或同時多線程(Simultaneous multithreading)處理器。在一個程序中,這些獨立運行的程序片段叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理(Multithreading)”。具有多線程能力的計算機因有硬件支持而能夠在同一時間執行多于一個線程(臺灣譯作“執行緒”),進而提升整體處理性能。
硬件支持
多線程硬件支持的目標,即支持快速進行就緒態線程、執行態線程間的切換。為達成這個目標,需要硬件實現保存、恢復程序看得見的寄存器以及一些對程序執行有影響的控制寄存器(如程序計數器PC、程序狀態寄存器SR)。從一個線程切換到另一個線程對硬件來講意味著保存當前線程的一組寄存器的值,并恢復即將執行線程的一組寄存器的值。
新增這些功能的硬件有以下優勢:
線程切換能夠在一個 CPU 周期內完成(有些硬件甚至沒有開銷,上個周期在運行線程A,下個周期就已在運行線程B)。
每個線程看起來就像是獨自運行的,即沒有與其他線程共享硬件資源。對操作系統來說,通常每個線程都被視做獨占一個處理器,這樣將簡化系統軟件的設計(尤其是對于支持多線程的操作系統)。
為了在各個線程間有效率的進行切換,每個線程需要保存自己的一組寄存器集(register set)。有些硬件設計成每個處理器核心具有兩組寄存器文件,以實現在多個線程間快速切換。
多線程有什么用?
這么解釋問題吧:
1。單進程單線程:一個人在一個桌子上吃菜。
2。單進程多線程:多個人在同一個桌子上一起吃菜。
3。多進程單線程:多個人每個人在自己的桌子上吃菜。
多線程的問題是多個人同時吃一道菜的時候容易發生爭搶,例如兩個人同時夾一個菜,一個人剛伸出筷子,結果伸到的時候已經被夾走菜了。。。此時就必須等一個人夾一口之后,在還給另外一個人夾菜,也就是說資源共享就會發生沖突爭搶。
1。對于 Windows 系統來說,【開桌子】的開銷很大,因此 Windows 鼓勵大家在一個桌子上吃菜。因此 Windows 多線程學習重點是要大量面對資源爭搶與同步方面的問題。
2。對于 Linux 系統來說,【開桌子】的開銷很小,因此 Linux 鼓勵大家盡量每個人都開自己的桌子吃菜。這帶來新的問題是:坐在兩張不同的桌子上,說話不方便。因此,Linux 下的學習重點大家要學習進程間通訊的方法。
--
補充:有人對這個開桌子的開銷很有興趣。我把這個問題推廣說開一下。
開桌子的意思是指創建進程。開銷這里主要指的是時間開銷。
可以做個實驗:創建一個進程,在進程中往內存寫若干數據,然后讀出該數據,然后退出。此過程重復 1000 次,相當于創建/銷毀進程 1000 次。在我機器上的測試結果是:
UbuntuLinux:耗時 0.8 秒
Windows7:耗時 79.8 秒
兩者開銷大約相差一百倍。
這意味著,在 Windows 中,進程創建的開銷不容忽視。換句話說就是,Windows 編程中不建議你創建進程,如果你的程序架構需要大量創建進程,那么最好是切換到 Linux 系統。
大量創建進程的典型例子有兩個,一個是 gnu autotools 工具鏈,用于編譯很多開源代碼的,他們在 Windows 下編譯速度會很慢,因此軟件開發人員最好是避免使用 Windows。另一個是服務器,某些服務器框架依靠大量創建進程來干活,甚至是對每個用戶請求就創建一個進程,這些服務器在 Windows 下運行的效率就會很差。這“可能”也是放眼全世界范圍,Linux 服務器遠遠多于 Windows 服務器的原因。
--
再次補充:如果你是寫服務器端應用的,其實在現在的網絡服務模型下,開桌子的開銷是可以忽略不計的,因為現在一般流行的是按照 CPU 核心數量開進程或者線程,開完之后在數量上一直保持,進程與線程內部使用協程或者異步通信來處理多個并發連接,因而開進程與開線程的開銷可以忽略了。
另外一種新的開銷被提上日程:核心切換開銷。
現代的體系,一般 CPU 會有多個核心,而多個核心可以同時運行多個不同的線程或者進程。
當每個 CPU 核心運行一個進程的時候,由于每個進程的資源都獨立,所以 CPU 核心之間切換的時候無需考慮上下文。
當每個 CPU 核心運行一個線程的時候,由于每個線程需要共享資源,所以這些資源必須從 CPU 的一個核心被復制到另外一個核心,才能繼續運算,這占用了額外的開銷。換句話說,在 CPU 為多核的情況下,多線程在性能上不如多進程。
因而,當前面向多核的服務器端編程中,需要習慣多進程而非多線程。
作者:京東科技 文濤 全文較長共6468字,語言通俗易懂,是一篇具有大綱性質的關于多線程的梳理,作者從歷史演進的角度講了多線程相關知識體系,讓你知其然知...
自旋鎖和互斥鎖是兩種常見的同步機制,用于在多線程程序中保護共享資源。它們的主要區別在于等待鎖的方式和適用場景。 自旋鎖 自旋鎖(Spinlock)是一種...
鴻蒙OS開發實例:【ArkTS類庫多線程@Concurrent裝飾器校驗并發函數】
在使用TaskPool時,執行的并發函數需要使用該裝飾器修飾,否則無法通過相關校驗。從API version 9開始,該裝飾器支持在ArkTS卡片中使用。
鴻蒙OS開發實例:【ArkTS類庫多線程CPU密集型任務TaskPool】
CPU密集型任務是指需要占用系統資源處理大量計算能力的任務,需要長時間運行,這段時間會阻塞線程其它事件的處理,不適宜放在主線程進行。例如圖像處理、視頻編...
鴻蒙OS開發案例:【ArkTS類庫多線程CPU密集型任務Worker】
通過某地區提供的房價數據訓練一個簡易的房價預測模型,該模型支持通過輸入房屋面積和房間數量去預測該區域的房價,模型需要長時間運行,房價預測需要使用前面的模...
鴻蒙OS開發實例:【ArkTS類庫多線程I/O密集型任務開發】
使用異步并發可以解決單次I/O任務阻塞的問題,但是如果遇到I/O密集型任務,同樣會阻塞線程中其它任務的執行,這時需要使用多線程并發能力來進行解決。 ...
使用RISC-V進行高效數據處理的方法涉及多個方面,包括處理器內核與DSA(領域特定加速器)之間的通信優化、內存管理優化、多線程性能提升等。以下是一些具...
? 在數字時代,算力,在加速千行百業的發展中成為了生產力的源泉。AMD秉承一路創新的精神,一直關注客戶所需,專注于打造業內一流的數據中心處理器,為眾多行...
從多線程設計模式到對 CompletableFuture 的應用
最近在開發 延保服務 頻道頁時,為了提高查詢效率,使用到了多線程技術。為了對多線程方案設計有更加充分的了解,在業余時間讀完了《圖解 Java 多線程設計...
CPU 性能方面,第三代驍龍 8s 平臺搭載高通 Kryo CPU,沿襲全新 CPU 架構,包括 1 個 3.0GHz 的超級內核、4 個 2.8GHz...
Java實現多線程的幾種方式 多線程是指程序中包含了兩個或以上的線程,每個線程都可以并行執行不同的任務或操作。Java中的多線程可以提高程序的效率和性能...
你還是分不清多進程和多線程嗎?一文搞懂! 多進程和多線程是并發編程中常見的兩個概念,它們都可以用于提高程序的性能和效率。但是它們的實現方式和使用場景略有...
這表明在IPC性能方面,龍芯3A6000處理器超出了i3-10100F至少30%以上,差不多可以媲美13代酷睿處理器。
天璣7200和天璣1100哪個好?天璣7200和天璣8200哪個好?
天璣7200和天璣1100哪個好? 天璣7200好一些。聯發科天璣 7200 采用第二代臺積電 4 納米工藝,與天璣 9200 系列相同。配備了兩個峰值...
可以發現子線程組執行時,有一個線程執行失敗,其他線程也會拋出異常,但是主線程中執行的刪除操作,沒有回滾,@Transactional注解沒有生效。
$ python3 PmWebDirScan.py -u "baidu.com" -d "專業備份掃描.txt,綜合目錄....
編輯推薦廠商產品技術軟件/工具OS/語言教程專題
電機控制 | DSP | 氮化鎵 | 功率放大器 | ChatGPT | 自動駕駛 | TI | 瑞薩電子 |
BLDC | PLC | 碳化硅 | 二極管 | OpenAI | 元宇宙 | 安森美 | ADI |
無刷電機 | FOC | IGBT | 逆變器 | 文心一言 | 5G | 英飛凌 | 羅姆 |
直流電機 | PID | MOSFET | 傳感器 | 人工智能 | 物聯網 | NXP | 賽靈思 |
步進電機 | SPWM | 充電樁 | IPM | 機器視覺 | 無人機 | 三菱電機 | ST |
伺服電機 | SVPWM | 光伏發電 | UPS | AR | 智能電網 | 國民技術 | Microchip |
開關電源 | 步進電機 | 無線充電 | LabVIEW | EMC | PLC | OLED | 單片機 |
5G | m2m | DSP | MCU | ASIC | CPU | ROM | DRAM |
NB-IoT | LoRa | Zigbee | NFC | 藍牙 | RFID | Wi-Fi | SIGFOX |
Type-C | USB | 以太網 | 仿真器 | RISC | RAM | 寄存器 | GPU |
語音識別 | 萬用表 | CPLD | 耦合 | 電路仿真 | 電容濾波 | 保護電路 | 看門狗 |
CAN | CSI | DSI | DVI | Ethernet | HDMI | I2C | RS-485 |
SDI | nas | DMA | HomeKit | 閾值電壓 | UART | 機器學習 | TensorFlow |
Arduino | BeagleBone | 樹莓派 | STM32 | MSP430 | EFM32 | ARM mbed | EDA |
示波器 | LPC | imx8 | PSoC | Altium Designer | Allegro | Mentor | Pads |
OrCAD | Cadence | AutoCAD | 華秋DFM | Keil | MATLAB | MPLAB | Quartus |
C++ | Java | Python | JavaScript | node.js | RISC-V | verilog | Tensorflow |
Android | iOS | linux | RTOS | FreeRTOS | LiteOS | RT-THread | uCOS |
DuerOS | Brillo | Windows11 | HarmonyOS |