一、進(jìn)程
進(jìn)程(Process)是計(jì)算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動(dòng)酵紫,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位荤懂,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。
- 在早期面向進(jìn)程設(shè)計(jì)的計(jì)算機(jī)結(jié)構(gòu)中硫眨,進(jìn)程是程序的基本執(zhí)行實(shí)體足淆。
- 在當(dāng)代面向線(xiàn)程設(shè)計(jì)的計(jì)算機(jī)結(jié)構(gòu)中巢块,進(jìn)程是線(xiàn)程的容器。
程序是指令巧号、數(shù)據(jù)及其組織形式的描述族奢,進(jìn)程是程序的實(shí)體。
1.1 進(jìn)程切換
進(jìn)程從硬盤(pán)讀取我們的程序代碼丹鸿,這個(gè)時(shí)候是比較費(fèi)時(shí)的越走,CPU不會(huì)阻塞在這里等著,而是切換到其他進(jìn)程靠欢,當(dāng)數(shù)據(jù)加載完成時(shí)廊敌,CPU會(huì)收到個(gè)中斷,繼續(xù)執(zhí)行這個(gè)請(qǐng)求门怪。
對(duì)于單核CPU而言骡澈,短時(shí)間內(nèi)會(huì)執(zhí)行多個(gè)進(jìn)程,造成并行的錯(cuò)覺(jué)掷空,實(shí)際可以理解為是并發(fā)的操作肋殴。
1.2 內(nèi)核態(tài)與用戶(hù)態(tài)
進(jìn)程分為用戶(hù)進(jìn)程和內(nèi)核進(jìn)程兩種囤锉。
為了安全,用戶(hù)進(jìn)程是受限的护锤,它不能隨意訪(fǎng)問(wèn)資源官地、獲取資源。所以烙懦,由內(nèi)核進(jìn)程負(fù)責(zé)管理和分配資源驱入,它具有最高權(quán)限,而用戶(hù)進(jìn)程使用被分配的資源氯析。且沧侥,操作系統(tǒng)必須能夠在有需要的時(shí)候能立即切換回內(nèi)核進(jìn)程(通過(guò)中斷),只有這樣魄鸦,操作系統(tǒng)才能有安全感宴杀。
1.3 用戶(hù)態(tài)向內(nèi)核態(tài)切換
1、發(fā)生系統(tǒng)調(diào)用時(shí)
2拾因、產(chǎn)生異常時(shí)
3旺罢、外設(shè)產(chǎn)生中斷時(shí)
這里不做過(guò)多解釋了,感興趣同學(xué)自行學(xué)習(xí)linux原理绢记。
二扁达、線(xiàn)程
線(xiàn)程(英語(yǔ):thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。
它被包含在進(jìn)程之中蠢熄,是進(jìn)程中的實(shí)際運(yùn)作單位跪解。一條線(xiàn)程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線(xiàn)程签孔,每條線(xiàn)程并行執(zhí)行不同的任務(wù)叉讥。
2.1 進(jìn)程與線(xiàn)程的關(guān)系
1、一個(gè)進(jìn)程中可以同時(shí)存在多個(gè)線(xiàn)程饥追;
2图仓、各個(gè)線(xiàn)程之間可以并發(fā)執(zhí)行;
3但绕、各個(gè)線(xiàn)程之間可以共享當(dāng)前線(xiàn)程中的地址空間和文件等資源救崔;
4、線(xiàn)程是調(diào)度的基本單位捏顺,而進(jìn)程則是資源擁有的基本單位六孵;
5、當(dāng)進(jìn)程只有一個(gè)線(xiàn)程時(shí)幅骄,可以認(rèn)為進(jìn)程就等于線(xiàn)程劫窒;
2.2 線(xiàn)程內(nèi)存模型
1) 在看線(xiàn)程內(nèi)存模型之前,我們首先看下計(jì)算機(jī)的硬件內(nèi)存模型昌执。
寄存器:寄存器部件烛亦,包括通用寄存器诈泼、專(zhuān)用寄存器和控制寄存器。通用寄存器又可分定點(diǎn)數(shù)和浮點(diǎn)數(shù)兩類(lèi)煤禽,它們用來(lái)保存指令執(zhí)行過(guò)程中臨時(shí)存放的寄存器操作數(shù)和中間(或最終)的操作結(jié)果铐达。 通用寄存器是中央處理器的重要部件之一。
高速多級(jí)緩存:用于解決CPU核心與內(nèi)存的速度差異問(wèn)題檬果,CPU核心速度快瓮孙,內(nèi)存相比要慢很多,而緩存要比內(nèi)存速度快选脊。
緩存協(xié)議:多級(jí)緩存的引入在多核CPU時(shí)代導(dǎo)致了緩存不一致的問(wèn)題杭抠,這里需要引入MESI協(xié)議緩存解決這一問(wèn)題,保證緩存中的信息與內(nèi)存中的信息一致恳啥。MESI協(xié)議緩存這里不做講解偏灿。
2)下一步我們看下java內(nèi)存模型與線(xiàn)程模型的關(guān)系
java程序的一次編寫(xiě)到處運(yùn)行如何體現(xiàn)的?
jvm內(nèi)存模型屏蔽了不同硬件的內(nèi)存模型钝的。jvm內(nèi)存模型規(guī)定翁垂,所有的變量都存儲(chǔ)在jvm主內(nèi)存中,即堆內(nèi)存硝桩,這里指可共享的變量(new出來(lái)的實(shí)例化對(duì)象沿猜,數(shù)組等)。這里提出主內(nèi)存與工作內(nèi)存的概念碗脊,每個(gè)線(xiàn)程有自己的工作內(nèi)存啼肩,保存自己私有的變量,線(xiàn)程從主內(nèi)存獲取變量的副本作為自己的私有變量衙伶,不允許直接操作主內(nèi)存的變量祈坠。線(xiàn)程的工作內(nèi)存也是獨(dú)立的,無(wú)法操作其他線(xiàn)程的變量痕支。
3)硬件內(nèi)存模型與jvm內(nèi)存模型的關(guān)系
如下圖所示颁虐,jvm內(nèi)存模型和硬件內(nèi)存模型相似蛮原,但并不完全相同卧须。但是jvm的數(shù)據(jù)大部分會(huì)存儲(chǔ)到硬件主內(nèi)存中,部分會(huì)存儲(chǔ)到寄存器或緩存中儒陨,這里只做簡(jiǎn)單說(shuō)明花嘶。