一、程序臭笆、進(jìn)程叙淌、線程
任何一門編程語言都需要的知識(shí),區(qū)分出程序愁铺、進(jìn)程鹰霍、線程對(duì)整個(gè)代碼執(zhí)行流程的理解有一定提升,面試中也經(jīng)常問到
1. 程序
計(jì)算機(jī)程序是一組計(jì)算機(jī)能識(shí)別和執(zhí)行的指令茵乱,運(yùn)行于電子計(jì)算機(jī)上茂洒,滿足人們某種需求的信息化工具。--摘自百度百科
程序通俗來講就是我們給計(jì)算機(jī)下發(fā)的任務(wù)似将,由許多計(jì)算機(jī)指令組成获黔,屬于一個(gè)靜態(tài)概念蚀苛。
2. 進(jìn)程
進(jìn)程是程序的運(yùn)行單元,程序在運(yùn)行時(shí)必定會(huì)有一個(gè)或多個(gè)進(jìn)程玷氏,同事進(jìn)程是資源分配的最小單位
進(jìn)程之間的資源是獨(dú)立的堵未;同一進(jìn)程內(nèi)的線程共享本進(jìn)程的資源。
3. 線程
線程是程序執(zhí)行的最小單位盏触,進(jìn)程中必定會(huì)有一個(gè)或多個(gè)線程渗蟹,線程與進(jìn)程一樣也有自己獨(dú)立資源空間
內(nèi)核線程
指cpu的線程,通常情況下赞辩,一個(gè)cpu內(nèi)核一個(gè)內(nèi)核線程
某些特定的cpu具備超線程
3.1 超線程
在一個(gè)cpu里面封裝兩個(gè)邏輯運(yùn)算單元雌芽,模擬可以同時(shí)處理兩個(gè)線程,但并不是真正意義上的同時(shí)處理兩個(gè)線程辨嗽,所以性能提升只有30%左右
3.2 java線程
java 本身有線程對(duì)象Thread世落,java多線程也是java編程語言優(yōu)勢(shì)之一
二、java 內(nèi)存模型
java內(nèi)存模型有線程糟需,工作空間屉佳,內(nèi)存(主存)
1. 線程
運(yùn)行java程序需要有由java線程來執(zhí)行,java線程具備獨(dú)立的工作空間洲押,即線程棧
2. 工作空間
內(nèi)存模型中的工作空間為線程獨(dú)有武花,每次線程讀取數(shù)據(jù)先去工作空間中的數(shù)據(jù),沒有再去主存中取杈帐,取到主存數(shù)據(jù)先工作空間運(yùn)算体箕,完成之后再更新回內(nèi)存
3. 內(nèi)存
屬于程序的獨(dú)立內(nèi)存空間
三、java 虛擬機(jī)內(nèi)存模型
java 虛擬機(jī)模型中包含 方法區(qū)挑童、java堆累铅、vmStack 、PC炮沐、native method stack
其中方法區(qū)在JDK1.8中被移除到內(nèi)存中去了争群,減少了一種內(nèi)存溢出的情況
1. 方法區(qū)
主要存放 class、 method大年、 static修飾的成員變量、 常量玉雾、JIT即時(shí)編譯翔试,線程共享
2. java堆
主要是存放對(duì)象值 ,線程共享
3. VM stack
存放局部變量复旬,對(duì)象引用地址 垦缅,線程獨(dú)有
4. PC
存放線程的下一條指令 線程獨(dú)有
5. native method stack
本地方法棧,調(diào)用一些native方法時(shí)會(huì)用到驹碍,線程獨(dú)有
四壁涎、CPU工作模型
1. 寄存器
指令寄存器凡恍,存放指令等 寄存器除指令寄存器還有很多種
2. 邏輯運(yùn)算單元
主要運(yùn)算邏輯,依靠邏輯運(yùn)算單元來實(shí)現(xiàn)怔球,超線程就是封裝連個(gè)邏輯運(yùn)算單元嚼酝,可以模擬cpu處理兩個(gè)線程
3. L1 L2 L3三級(jí)緩存
一級(jí)緩存在cpu內(nèi)部封裝,一般不會(huì)特別大竟坛,同時(shí)讀取數(shù)據(jù)時(shí)以緩存行讀取
二級(jí)緩存與三級(jí)緩存都是在cpu外部闽巩,速度差異不大
cpu讀取數(shù)據(jù)時(shí)先從一級(jí)緩存中讀取,沒有就讀二級(jí)緩存担汤,再是三級(jí)緩存涎跨,最后是內(nèi)存