1.1 線程和進程
計算機發(fā)展初期進程既是資源分配也是調(diào)度的最小單位宛瞄,那時候沒有線程的概念浮禾,但是由于CPU性能越來越好,后來為了不浪費cpu資源份汗,才將資源分配和調(diào)度分開盈电,就有了線程。線程是建立在進程的基礎(chǔ)上的一次程序運行單位杯活。多個線程可以共享進程中的絕大部分資源(內(nèi)存等)匆帚。(超線程也是為了充分利用CPU資源而誕生)
定義:進程是OS操作系統(tǒng)資源分配的基本單位,而線程是CPU調(diào)度和執(zhí)行的基本單位(我理解為資源調(diào)度的基本單位)旁钧;
關(guān)系:進程是線程的容器吸重,不存在沒有線程的進程,所以線程也被稱為輕量級進程均践。
內(nèi)存分配:系統(tǒng)會為每個進程分配不同的內(nèi)存空間晤锹;而對線程而言,除了CPU外彤委,系統(tǒng)不會為線程分配內(nèi)存鞭铆,線程組之間共享所屬進程的資源。
進程擁有自己的資源空間焦影,每啟動一個進程车遂,系統(tǒng)就會為它分配地址空間和其他資源;而線程與CPU資源分配無關(guān)斯辰,線程自己基本上不擁有系統(tǒng)資源舶担,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,棧等),進程的其他資源多個線程共享彬呻。(服務(wù)器中我們的JVM就是一個進程衣陶,里面可以創(chuàng)建很多線程)
資源共享和資源同步:進程擁有各自獨立的地址空間,資源闸氮,所以共享復(fù)雜剪况,需要用IPC(進程間通信),同步簡單蒲跨;線程共享所屬進程的資源译断,共享簡單,但同步復(fù)雜或悲,要通過加鎖等措施孙咪。
進程占用內(nèi)存多堪唐,切換復(fù)雜,CPU利用率低翎蹈; 線程占用內(nèi)存少淮菠,切換簡單,CPU利用率高
相互影響: 因為進程擁有各自獨立的地址空間和資源杨蛋,因此不會相互影響兜材;線程共享所屬進程的資源理澎,所以一個線程掛掉可能會導(dǎo)致整個進程掛掉逞力。
1.2 超線程技術(shù)
物理CPU:硬件層面的實際CPU 邏輯CPU:支持超線程的機器邏輯CPU為物理CPU的2倍,不支持超線程的機器邏輯CPU沒用意義糠爬,和物理CPU數(shù)量一樣寇荧。
超線程是英特爾研發(fā)的一種技術(shù)。此技術(shù)實現(xiàn)了在一個實體CPU中执隧,提供兩個邏輯線程揩抡。超線程的目的,是提升處理器的邏輯線程镀琉,進而充分發(fā)揮CPU的資源峦嗤。
超線程技術(shù)把處理器內(nèi)部的兩個邏輯內(nèi)核模擬成兩個物理芯片,讓單個處理器就能同時運行兩個線程屋摔,實現(xiàn)并行計算烁设。超線程技術(shù)可以充分利用空閑CPU資源。但是當兩個線程同時需要CPU內(nèi)相同的某個資源時钓试,沒搶到資源的線程必須暫時掛起装黑,直到另一個線程將該資源釋放以后才能繼續(xù)。因此弓熏,超線程的性能并不等于兩個CPU的性能恋谭。
1.3 協(xié)程
協(xié)程:協(xié)程不是進程,也不是線程挽鞠,它是一個特殊的函數(shù)——可以在某個地方掛起疚颊,并且可以重新在掛起處繼續(xù)運行。現(xiàn)在的java多線程可以充分利用多核資源信认,但是協(xié)程本質(zhì)是一個函數(shù)材义,從函數(shù)層面在一個線程下創(chuàng)建多個協(xié)程,當一個協(xié)程阻塞時(依賴異步回調(diào)模式)去執(zhí)行另一個協(xié)程狮杨,不需要切換CPU母截,因為使用的都是當前線程,具體實現(xiàn)方式我還沒有研究橄教。大佬們可以給我講講清寇,在此謝過喘漏。個人感覺就是會有輪詢?nèi)蝿?wù)一樣,執(zhí)行阻塞直接其他任務(wù)华烟。