多線程和多進(jìn)程通俗解釋 簡(jiǎn)述python進(jìn)程,線程和協(xié)程的區(qū)別及應(yīng)用場(chǎng)景?
簡(jiǎn)述python進(jìn)程,線程和協(xié)程的區(qū)別及應(yīng)用場(chǎng)景?1.線程和進(jìn)程:線程屬于一個(gè)進(jìn)程。線程在進(jìn)程空間運(yùn)行,同一個(gè)進(jìn)程生成的線程共享同一個(gè)內(nèi)存空間。當(dāng)進(jìn)程退出時(shí),進(jìn)程生成的線程將被強(qiáng)制退出并被清除。一個(gè)線
簡(jiǎn)述python進(jìn)程,線程和協(xié)程的區(qū)別及應(yīng)用場(chǎng)景?
1.線程和進(jìn)程:
線程屬于一個(gè)進(jìn)程。線程在進(jìn)程空間運(yùn)行,同一個(gè)進(jìn)程生成的線程共享同一個(gè)內(nèi)存空間。當(dāng)進(jìn)程退出時(shí),進(jìn)程生成的線程將被強(qiáng)制退出并被清除。一個(gè)線程可以與屬于同一個(gè)進(jìn)程的其他線程共享該進(jìn)程擁有的所有資源,但它基本上沒有系統(tǒng)資源,只有一點(diǎn)運(yùn)行中必不可少的信息(如程序計(jì)數(shù)器、一組寄存器和堆棧)。
2.線程、進(jìn)程和協(xié)程:
線程和進(jìn)程的運(yùn)行是由程序觸發(fā)的,最終的執(zhí)行者是系統(tǒng);進(jìn)程的操作者是程序員。
協(xié)程存在的意義:對(duì)于多線程應(yīng)用,CPU通過切片的在線程間切換執(zhí)行,需要時(shí)間(保持狀態(tài),下次繼續(xù))。并發(fā),只使用一個(gè)線程,一個(gè)代碼塊的執(zhí)行順序在一個(gè)線程中指定。
協(xié)程的應(yīng)用場(chǎng)景:當(dāng)程序中有大量不需要CPU (IO)的操作時(shí),適合使用協(xié)程;
一個(gè)進(jìn)程可以創(chuàng)建多少個(gè)線程?
一個(gè)進(jìn)程可以啟動(dòng)的線程受到可用內(nèi)存的限制。如果是32位機(jī)器,一個(gè)進(jìn)程默認(rèn)有2G可用內(nèi)存,每個(gè)線程默認(rèn)分析1M堆??臻g,那么這種情況下理論上最大線程數(shù)超過2000。
一種解決方案是在創(chuàng)建線程時(shí)減小線程堆棧的大小,或者使用64位系統(tǒng)。64位系統(tǒng)應(yīng)該可以忽略這個(gè)問題。當(dāng)然受cpu和磁盤速度以及物理內(nèi)存的限制。你不 你不必達(dá)到上限,你的機(jī)器應(yīng)該像牛車一樣慢。
在多核CPU下,同一進(jìn)程下的多個(gè)線程可以并行運(yùn)行嗎?
CPU在某一時(shí)刻只能執(zhí)行一個(gè)線程,但多線程并不是因?yàn)槎嗪嘶蛘唠p核而被稱為多線程。是因?yàn)楫?dāng)多個(gè)線程并行執(zhí)行時(shí),CPU會(huì)按照一定的線程調(diào)度算法頻繁切換線程。當(dāng)一個(gè)正在執(zhí)行的線程需要IO操作或內(nèi)存訪問時(shí),CPU可以完全放棄該線程,轉(zhuǎn)而調(diào)度線程就緒隊(duì)列上的其他線程,被放棄的線程將進(jìn)入阻塞狀態(tài)。IO操作或內(nèi)存訪問操作完成后,線程可以進(jìn)入線程就緒隊(duì)列。人們通常指的是多線程,因?yàn)镃PU是按照一定的線程調(diào)度算法來(lái)切換線程的,所以在一段時(shí)間內(nèi),可以看到很多線程在并發(fā)執(zhí)行。實(shí)際上,在某個(gè)時(shí)間點(diǎn)只有一個(gè)線程在運(yùn)行。
cpu多線程和jvm多線程?
cpu數(shù)量、內(nèi)核數(shù)量和線程數(shù)量之間的關(guān)系
cpu數(shù)量:指物理和硬件中核心的數(shù)量;
內(nèi)核數(shù):是邏輯上的,簡(jiǎn)單理解為邏輯上模擬的內(nèi)核數(shù);一個(gè)CPU核心數(shù)模擬一個(gè)2線程CPU。
線程數(shù):指設(shè)備可以同時(shí)并行執(zhí)行的程序數(shù),線程數(shù),cpu數(shù)*內(nèi)核數(shù),cpu數(shù)(2) *內(nèi)核數(shù)(2)4。
Windows:·WMIC然后計(jì)算物理CPU的數(shù)量CPU獲取核心數(shù)和CPU核心的數(shù)量為 "CPU獲取邏輯處理器的數(shù)量。
Linux:
檢查CPU數(shù)量cat/proc/CPU info | grep # 34 physical id # 34 | sort | uniq | WC-l。
檢查審計(jì)號(hào)cat/proc/CPU info | grep # 34 pucores # 34 | uniq。
兩個(gè)cpu線程和Java多線程
(1)線程是cpu級(jí)的,一個(gè)線程同時(shí)只能在一個(gè)CPU線程中執(zhí)行。
(2) Java多線程因?yàn)閏pu線程數(shù)是倍數(shù),所以不叫多線程。當(dāng)Java線程數(shù)大于cpu線程數(shù)時(shí),操作系統(tǒng)使用時(shí)間片機(jī)制和線程調(diào)度算法頻繁切換線程。
(3)線程是操作系統(tǒng)的最小調(diào)度單位,進(jìn)程是資源(如內(nèi)存)分配的最小單位。
(4)4)Java中的所有線程都在JVM進(jìn)程中,CPU在進(jìn)程中調(diào)度線程。
線程調(diào)度是指根據(jù)特定的機(jī)制將CPU使用權(quán)分配給多個(gè)線程。有兩種調(diào)度模型:分時(shí)調(diào)度模型和搶占式調(diào)度模型。
分時(shí)調(diào)度模型是指讓所有線程輪流獲得CPU的使用權(quán),平均分配每個(gè)線程占用的時(shí)間片。
Java虛擬機(jī)采用搶占式調(diào)度模型,即讓可運(yùn)行池中處于就緒狀態(tài)的線程優(yōu)先占用CPU。如果runnable池中的線程具有相同的優(yōu)先級(jí),那么隨機(jī)選擇一個(gè)線程占用CPU,正在運(yùn)行的線程將繼續(xù)執(zhí)行,直到它不得不放棄CPU,一個(gè)線程會(huì)因?yàn)橐韵略蚍艞塁PU:。
(1)Java虛擬機(jī)使當(dāng)前線程暫時(shí)放棄CPU,轉(zhuǎn)入就緒狀態(tài),讓其他線程獲得運(yùn)行機(jī)會(huì)。
(2)當(dāng)前線程由于某種原因被阻塞。
(3)螺紋完成。
Java線程屈服了:
()方法
也就是說(shuō),當(dāng)一個(gè)線程使用這個(gè)方法時(shí),它會(huì)放棄自己CPU的執(zhí)行時(shí)間,讓自己或者其他線程運(yùn)行。注意讓自己或者其他線程運(yùn)行(根據(jù)CPU的調(diào)度),而不是簡(jiǎn)單的交給其他線程。
4.等待其他線程完成:join()
當(dāng)前正在運(yùn)行的線程可以調(diào)用另一個(gè)線程的join()方法,當(dāng)前正在運(yùn)行的線程會(huì)進(jìn)入阻塞狀態(tài),直到另一個(gè)線程結(jié)束運(yùn)行(阻塞恢復(fù)到就緒)才會(huì)恢復(fù)運(yùn)行。