一讼昆、進(jìn)程
1.什么是進(jìn)程浸赫?
進(jìn)程是操作系統(tǒng)進(jìn)行資源分配和調(diào)度的基本概念,可以說進(jìn)程是線程的容器,一個(gè)進(jìn)程里包括數(shù)據(jù)區(qū)域和堆棧存儲(chǔ)著活動(dòng)過程調(diào)用的指令和本地的變量羡榴,進(jìn)程沒運(yùn)行時(shí)候處于沒有生命的一個(gè)實(shí)體的狀態(tài)校仑,運(yùn)行時(shí)依賴處理器給他活體狀传惠,一個(gè)進(jìn)程至少有一個(gè)線程,如果沒有的話那么這個(gè)線程就是它本身羊瘩。
文末領(lǐng)取并發(fā)編程72道面試題及答案
一盼砍、多進(jìn)程的概念
理論上一個(gè)CPU只能給一個(gè)進(jìn)程浇坐,如果想一個(gè)CPU運(yùn)行多個(gè)進(jìn)程的話,那就是多進(jìn)程侧戴,就要使用并發(fā)技術(shù),實(shí)現(xiàn)并發(fā)技術(shù)非常復(fù)雜,說一下簡(jiǎn)單的并發(fā)技術(shù) "時(shí)間片輪轉(zhuǎn)進(jìn)程調(diào)度算法" 在操作系統(tǒng)的管理下积仗,所有正在運(yùn)行的進(jìn)程輪流使用CPU寂曹,每個(gè)進(jìn)程允許占用CPU的時(shí)間非常短(比如10ms)回右,這樣用戶根本感覺不出來 CPU是在輪流為多個(gè)進(jìn)程服務(wù),但實(shí)際上在任何一個(gè)時(shí)間內(nèi)有且僅有一個(gè)進(jìn)程占有CPU翔烁。 如果一臺(tái)計(jì)算機(jī)有多個(gè)CPU渺氧,情況就不同了,如果進(jìn)程數(shù)大于CPU數(shù)的時(shí)候蹬屹,使用這種并發(fā)技術(shù)侣背。目前都是幾核的CPU都能夠處理。
同時(shí)慨默,這兩種上下文切換的處理都是通過操作系統(tǒng)內(nèi)核來完成的贩耐。內(nèi)核的這種切換過程伴隨的最顯著的性能損耗是將寄存器中的內(nèi)容切換出。
2.什么是線程厦取?
線程是程序執(zhí)行流的最小單元,一個(gè)線程的信息包括(線程ID潮太,指令集合,堆棧組)組成的線程這種單位,上面進(jìn)程提到進(jìn)程是線程的一個(gè)容器铡买,說明線程運(yùn)行在進(jìn)程里面的,那就是運(yùn)行在進(jìn)程里面的一個(gè)實(shí)體台谢,它不擁有系統(tǒng)資源寻狂,但它擁有進(jìn)程的資源。
一朋沮、線程的三種狀態(tài)
1.就緒狀態(tài):
是指線程具備運(yùn)行的所有條件蛇券,邏輯上可以運(yùn)行,在等待處理機(jī)的過程樊拓。
2.阻塞狀態(tài):
是指線程在等待某一個(gè)事件(信號(hào)量)纠亚。
3.運(yùn)行狀態(tài):
是指線程占有處理機(jī)正在運(yùn)行。
二筋夏、多線程
同時(shí)運(yùn)行多個(gè)線程完成不同的工作蒂胞,就叫做多線程,使用多線程的好處有:
1.資源利用率更好: 想象一下条篷,一個(gè)應(yīng)用程序需要從本地文件系統(tǒng)中讀取和處理文件的情景蛤织。比方說指蚜,從磁盤讀取一個(gè)文件需要5秒涨椒,處理一個(gè)文件需要2秒。處理兩個(gè)文件則需要14s免猾,在這段時(shí)間里囤热,CPU非常的空閑,它可以做一些別的事情,那么我們使用多個(gè)線程的話,是不是可以處理文件的同時(shí)去讀取新的文件忧侧,這樣就提高了時(shí)間效率,
2.程序響應(yīng)更快:假設(shè)做某一個(gè)服務(wù)的時(shí)候牌芋,它在某一個(gè)端口監(jiān)聽進(jìn)來的請(qǐng)求躺屁,當(dāng)一個(gè)請(qǐng)求到來時(shí)经宏,它去處理這個(gè)請(qǐng)求,然后再返回去監(jiān)聽耐亏。
3.程序設(shè)計(jì)簡(jiǎn)單
做多線程的時(shí)候運(yùn)用多線程的技術(shù)設(shè)計(jì)非常簡(jiǎn)單易用,遵循好一些規(guī)則沪斟,避免造成阻塞等操作,基本可以很快設(shè)計(jì)程序的需求择吊。
4.使用場(chǎng)景:
多線程:密集I/O任務(wù)(網(wǎng)絡(luò)I/O几睛,磁盤I/O,數(shù)據(jù)庫(kù)I/O)使用多線程合適所森。
三、線程與線程主要依靠什么通信
線程間通信主要通過共享內(nèi)存
3.什么是協(xié)程?
一個(gè)程序可以包含多個(gè)協(xié)程,線程相對(duì)獨(dú)立有自己的上下文,協(xié)程也是,但是協(xié)程由自己控制洪唐,不受操作系統(tǒng)控制凭需,可以不加鎖的訪問全局變量肝匆,所以上下文的切換非常快旗国,可以說是輕量級(jí)的線程能曾,也可以說稱之為用戶級(jí)別的線程就叫協(xié)程,一個(gè)線程可以多個(gè)協(xié)程蕊程,一個(gè)進(jìn)程也可以單獨(dú)擁有多個(gè)協(xié)程驼唱,線程進(jìn)程都是同步機(jī)制,而協(xié)程則是異步辨赐。
1.使用場(chǎng)景:
又稱微線程掀序,在單線程上執(zhí)行多個(gè)任務(wù)惭婿,用函數(shù)切換,開銷極小县袱。不通過操作系統(tǒng)調(diào)度佑力,沒有進(jìn)程、線程的切換開銷暴拄。genventmonkey.patchall
多線程請(qǐng)求返回是無序的,那個(gè)線程有數(shù)據(jù)返回就處理那個(gè)線程乖篷,而協(xié)程返回的數(shù)據(jù)是有序的,處理磁盤的I/O比較慢,處理網(wǎng)絡(luò)I/O性能還是比較高撕蔼。
4.進(jìn)程線程上下文切換
順便說一下上下文切換上下文切換就是從當(dāng)前執(zhí)行任務(wù)切換到另一個(gè)任務(wù)執(zhí)行的過程。但是琳骡,為了確保下次能從正確的位置繼續(xù)執(zhí)行,在切換之前楣号,會(huì)保存上一個(gè)任務(wù)的狀態(tài)炫狱。進(jìn)程上下文切換與線程上下文切換最主要的區(qū)別就是線程的切換虛擬空間內(nèi)存是相同的(因?yàn)槎际菍儆谧约旱倪M(jìn)程),但是视译,進(jìn)程切換的虛擬空間內(nèi)存則是不同的憎亚。同時(shí),這兩種上下文切換的處理都是通過操作系統(tǒng)內(nèi)核來完成的蝶锋。
上面畫了一個(gè)進(jìn)程,線程,協(xié)程的調(diào)用關(guān)系圖慌闭。
最后送福利了驴剔,加群即可獲取并發(fā)編程72題及答案?? 群號(hào):923116658
點(diǎn)擊鏈接加入群聊【Java架構(gòu)解析】:https://jq.qq.com/?_wv=1027&k=5e1QsXb
還有Java工程化粥庄、高性能及分布式、高性能布讹、高架構(gòu)、性能調(diào)優(yōu)白嘁、Spring膘流、MyBatis呼股、Netty源碼分析等多個(gè)知識(shí)點(diǎn)高級(jí)進(jìn)階干貨的相關(guān)視頻資料,還有spring和虛擬機(jī)等書籍掃描版屎开,還有更多面試題等你來拿奄抽。