自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

并發(fā)編程從操作系統(tǒng)底層工作整體認(rèn)識(shí)開(kāi)始

開(kāi)發(fā) 架構(gòu)
在多線程、多處理器、分布式環(huán)境的編程時(shí)代,并發(fā)是一個(gè)不可回避的問(wèn)題。既然并發(fā)問(wèn)題擺在面前一個(gè)到無(wú)法回避的坎,倒不如擁抱它,把它搞清楚,花一定的時(shí)間從操作系統(tǒng)底層原理到Java的基礎(chǔ)編程再到分布式環(huán)境等幾個(gè)方面深入探索并發(fā)問(wèn)題。先就從原理開(kāi)始吧。

[[349358]]

 前言

在多線程、多處理器、分布式環(huán)境的編程時(shí)代,并發(fā)是一個(gè)不可回避的問(wèn)題。既然并發(fā)問(wèn)題擺在面前一個(gè)到無(wú)法回避的坎,倒不如擁抱它,把它搞清楚,花一定的時(shí)間從操作系統(tǒng)底層原理到Java的基礎(chǔ)編程再到分布式環(huán)境等幾個(gè)方面深入探索并發(fā)問(wèn)題。先就從原理開(kāi)始吧。

計(jì)算機(jī)系統(tǒng)層次結(jié)構(gòu)

早期計(jì)算機(jī)系統(tǒng)的層次

最早的計(jì)算機(jī)用機(jī)器語(yǔ)言編程,機(jī)器語(yǔ)言稱為第一代程序設(shè)計(jì)語(yǔ)言

 

并發(fā)編程從操作系統(tǒng)底層工作整體認(rèn)識(shí)開(kāi)始

 

匯編語(yǔ)言編程

匯編語(yǔ)言編程

 

并發(fā)編程從操作系統(tǒng)底層工作整體認(rèn)識(shí)開(kāi)始

 

現(xiàn)代(傳統(tǒng))計(jì)算機(jī)系統(tǒng)的層次

現(xiàn)代計(jì)算機(jī)用高級(jí)語(yǔ)言編程

  • 第三代程序設(shè)計(jì)語(yǔ)言(3GL)為過(guò)程式 語(yǔ)言,編碼時(shí)需要描述實(shí)現(xiàn)過(guò)程,即“ 如何做”。
  • 第四代程序設(shè)計(jì)語(yǔ)言(4GL) 為非過(guò)程 化語(yǔ)言,編碼時(shí)只需說(shuō)明“做什么”, 不需要描述具體的算法實(shí)現(xiàn)細(xì)節(jié)。

 

并發(fā)編程從操作系統(tǒng)底層工作整體認(rèn)識(shí)開(kāi)始

 

語(yǔ)言處理系統(tǒng)包括:各種語(yǔ)言處理程序(如編譯、匯編、 鏈接)、運(yùn)行時(shí)系統(tǒng)(如庫(kù)函數(shù),調(diào)試、優(yōu)化等功能)

操作系統(tǒng)包括人機(jī)交互界面、 提供服務(wù)功能的內(nèi)核例程

可以看出:語(yǔ)言的發(fā)展是一 個(gè)不斷“抽象”的過(guò)程,因而,相應(yīng)的計(jì)算機(jī)系統(tǒng)也不斷有新的層次出現(xiàn)。

計(jì)算機(jī)系統(tǒng)抽象層的轉(zhuǎn)換

 

并發(fā)編程從操作系統(tǒng)底層工作整體認(rèn)識(shí)開(kāi)始

 

功能轉(zhuǎn)換:上層是下層的抽象,下層是上層的實(shí)現(xiàn) 底層為上層提供支撐環(huán)境!

計(jì)算機(jī)系統(tǒng)的不同用戶

  • 最終用戶工作在由應(yīng)用程序提供的最上面的抽象層
  • 系統(tǒng)管理員工作在由操作系統(tǒng)提供的抽象層
  • 應(yīng)用程序員工作在由語(yǔ)言處理系統(tǒng)(主要有編譯器和匯編器)的抽象層
  • 語(yǔ)言處理系統(tǒng)建立在操作系統(tǒng)之上
  • 系統(tǒng)程序員(實(shí)現(xiàn)系統(tǒng)軟件)工作在ISA層次,必須對(duì)ISA非常了解

編譯器和匯編器的目標(biāo)程序由機(jī)器級(jí)代碼組成

操作系統(tǒng)通過(guò)指令直接對(duì)硬件進(jìn)行編程控制ISA處于軟件和硬件的交界面(接口)

 

并發(fā)編程從操作系統(tǒng)底層工作整體認(rèn)識(shí)開(kāi)始

 

ISA是對(duì)硬件的抽象所有軟件功能都建立在ISA之上

指令集體系結(jié)構(gòu)(ISA)

ISA指 Instruction Set Architecture,即指令集體系結(jié)構(gòu),有時(shí)簡(jiǎn)稱為指令系統(tǒng)

  • ISA是一種規(guī)約(Specification),它規(guī)定了如何使用硬件可執(zhí)行的指令的集合,包括指令格式、操作種類以及每種操作對(duì)應(yīng)的 操作數(shù)的相應(yīng)規(guī)定;指令可以接受的操作數(shù)的類型;操作數(shù)所能存放的寄存器組的結(jié)構(gòu),包括每個(gè)寄存器的名稱、編號(hào)、 長(zhǎng)度和用途;操作數(shù)所能存放的存儲(chǔ)空間的大小和編址方式;操作數(shù)在存儲(chǔ)空間存放時(shí)按照大端還是小端方式存放;指令獲取操作數(shù)的方式,即尋址方式;指令執(zhí)行過(guò)程的控制方式,包括程序計(jì)數(shù)器(PC)、條件碼定義等。
  • ISA在通用計(jì)算機(jī)系統(tǒng)中是必不可少的一個(gè)抽象層,沒(méi)有它,軟件無(wú)法使用計(jì)算機(jī)硬件!沒(méi)有它,一臺(tái)計(jì)算機(jī)不能稱為“通用計(jì)算機(jī)”

ISA和計(jì)算機(jī)組成(微結(jié)構(gòu))之間的關(guān)系

ISA是計(jì)算機(jī)組成的抽象,不同ISA規(guī)定的指令集不同

  • 如,IA-32、MIPS、ARM等 計(jì)算機(jī)組成必須能夠?qū)崿F(xiàn)ISA規(guī)定的功能
  • 如提供GPR、標(biāo)志、運(yùn)算電路等 同一種ISA可以有不同的計(jì)算機(jī)組成
  • 如乘法指令可用ALU或乘法器實(shí)現(xiàn)

現(xiàn)代計(jì)算機(jī)的原型

現(xiàn)代計(jì)算機(jī)模型是基于-馮諾依曼計(jì)算機(jī)模型

1946年,普林斯頓高等研究院(the Institute for Advance Study at Princeton,IAS )開(kāi)始設(shè)計(jì)“存儲(chǔ)程序”計(jì)算機(jī),被稱為IAS計(jì)算機(jī).

  • 馮·諾依曼結(jié)構(gòu)最重要的思想是“存儲(chǔ)程序(Stored-program)”
  • 工作方式:任何要計(jì)算機(jī)完成的工作都要先被編寫成程序,然后將程序和原始數(shù)據(jù)送入主存并啟動(dòng)執(zhí)行。一旦程序被啟動(dòng),計(jì)算機(jī)應(yīng)能在不需操作人員干預(yù)下,自動(dòng)完成逐條取出指令和執(zhí)行指令的任務(wù)。馮·諾依曼結(jié)構(gòu)計(jì)算機(jī)也稱為馮·諾依曼機(jī)器(Von Neumann Machine)。幾乎現(xiàn)代所有的通用計(jì)算機(jī)大都采用馮·諾依曼結(jié)構(gòu),因此,IAS計(jì)算機(jī)是現(xiàn)代計(jì)算機(jī)的原型機(jī)。

計(jì)算機(jī)在運(yùn)行時(shí),先從內(nèi)存中取出第一條指令,通過(guò)控制器的譯碼,按指令的要求,從存儲(chǔ)器中取出數(shù)據(jù)進(jìn)行指定的運(yùn)算和邏輯操作等加工,然后再按地址把結(jié)果送到內(nèi)存中去。接下來(lái),再取出第二條指令,在控制器的指揮下完成規(guī)定操作。依此進(jìn)行下去。直至遇到停止指令。

程序于數(shù)據(jù)一樣存貯,按程序編排的順序,一步一步地取出指令,自動(dòng)地完成指令規(guī)定的操作是計(jì)算機(jī)最基本的工作模型。這一原理最初是由美籍匈牙利數(shù)學(xué)家馮.諾依曼于1945年提出來(lái)的,故稱為馮.諾依曼計(jì)算機(jī)模型。

馮·諾依曼結(jié)構(gòu)是怎樣的?

  • 有主存,用來(lái)存放程序和數(shù)據(jù)
  • 一個(gè)自動(dòng)逐條取 出指令的部件
  • 具體執(zhí)行指令 (即運(yùn)算)的部件
  • 程序由指令構(gòu)成
  • 指令描述如何對(duì)數(shù)據(jù)進(jìn) 行處理
  • 將程序和原始數(shù)據(jù)輸入計(jì)算機(jī)的部件
  • 將運(yùn)算結(jié)果輸出計(jì)算機(jī)的部件

 

并發(fā)編程從操作系統(tǒng)底層工作整體認(rèn)識(shí)開(kāi)始

 

馮·諾依曼結(jié)構(gòu)的主要思想

  • 計(jì)算機(jī)應(yīng)由計(jì)算器(運(yùn)算器)、控制器、存儲(chǔ)器、輸入設(shè)備和輸出設(shè)備 五個(gè)基本部件組成。
  • 各基本部件的功能是:控制器(Control):是整個(gè)計(jì)算機(jī)的中樞神經(jīng),其功能是對(duì)程序規(guī)定的控制信息進(jìn)行解釋,根據(jù)其要求進(jìn)行控制,調(diào)度程序、數(shù)據(jù)、地址,協(xié)調(diào)計(jì)算機(jī)各部分工作及內(nèi)存與外設(shè)的訪問(wèn)等。運(yùn)算器(Datapath):運(yùn)算器的功能是對(duì)數(shù)據(jù)進(jìn)行各種算術(shù)運(yùn)算和邏輯運(yùn)算,即對(duì)數(shù)據(jù)進(jìn)行加工處理。存儲(chǔ)器(Memory):存儲(chǔ)器的功能是存儲(chǔ)程序、數(shù)據(jù)和各種信號(hào)、命令等信息,并在需要時(shí)提供這些信息。輸入(Input system):輸入設(shè)備是計(jì)算機(jī)的重要組成部分,輸入設(shè)備與輸出設(shè)備合并為外部設(shè)備,簡(jiǎn)稱外設(shè),輸入設(shè)備的作用是將程序、原始數(shù)據(jù)、文字、字符、控制命令或現(xiàn)場(chǎng)采集的數(shù)據(jù)等信息輸入到計(jì)算機(jī)。常見(jiàn)的輸入設(shè)備有鍵盤、鼠標(biāo)器、光電輸入機(jī)、磁帶機(jī)、磁盤機(jī)、光盤機(jī)等。輸出(Output system):輸出設(shè)備與輸入設(shè)備同樣是計(jì)算機(jī)的重要組成部分,它把外算機(jī)的中間結(jié)果或最后結(jié)果、機(jī)內(nèi)的各種數(shù)據(jù)符號(hào)及文字或各種控制信號(hào)等信息輸出出來(lái)。微機(jī)常用的輸出設(shè)備有顯示終端CRT、打印機(jī)、激光印字機(jī)、繪圖儀及磁帶、光盤機(jī)等。
  • 內(nèi)部以二進(jìn)制表示指令和數(shù)據(jù)。每條指令由操作碼和地址碼 兩部分組成。操作碼指出操作類型,地址碼指出操作數(shù)的地址。由一串指令組成程序。
  • 采用“存儲(chǔ)程序”工作方式。

現(xiàn)代計(jì)算機(jī)結(jié)構(gòu)模型

基于馮·諾依曼計(jì)算機(jī)理論的抽象簡(jiǎn)化模型,它的具體應(yīng)用就是現(xiàn)代計(jì)算機(jī)當(dāng)中的硬件結(jié)構(gòu)設(shè)計(jì):

 

 

 

 

在上圖硬件結(jié)構(gòu)當(dāng)中,配件很多,但最核心的只有兩部分:CPU、內(nèi)存。所以我們重點(diǎn)學(xué)習(xí)的也是這兩部分。

CPU:中央處理器;PC:程序計(jì)數(shù)器; MAR:存儲(chǔ)器地址寄存器 ALU:算術(shù)邏輯部件; IR:指令寄存器;MDR:存儲(chǔ)器數(shù)據(jù)寄存器 GPRs:通用寄存器組(由若干通用寄存器組成,早期就是累加器)

CPU指令結(jié)構(gòu)

CPU內(nèi)部結(jié)構(gòu)

  • 控制單元
  • 運(yùn)算單元
  • 數(shù)據(jù)單元

 

并發(fā)編程從操作系統(tǒng)底層工作整體認(rèn)識(shí)開(kāi)始

 

控制單元

控制單元是整個(gè)CPU的指揮控制中心,由指令寄存器IR(Instruction Register)、指令譯碼器ID(Instruction Decoder)和 操作控制器OC(Operation Controller) 等組成,對(duì)協(xié)調(diào)整個(gè)電腦有序工作極為重要。它根據(jù)用戶預(yù)先編好的程序,依次從存儲(chǔ)器中取出各條指令,放在指令寄存器IR中,通過(guò)指令譯碼(分析)確定應(yīng)該進(jìn)行什么操作,然后通過(guò)操作控制器OC,按確定的時(shí)序,向相應(yīng)的部件發(fā)出微操作控制信號(hào)。操作控制器OC中主要包括:節(jié)拍脈沖發(fā)生器、控制矩陣、時(shí)鐘脈沖發(fā)生器、復(fù)位電路和啟停電路等控制邏輯。

運(yùn)算單元

運(yùn)算單元是運(yùn)算器的核心??梢詧?zhí)行算術(shù)運(yùn)算(包括加減乘數(shù)等基本運(yùn)算及其附加運(yùn)算)和邏輯運(yùn)算(包括移位、邏輯測(cè)試或兩個(gè)值比較)。相對(duì)控制單元而言,運(yùn)算器接受控制單元的命令而進(jìn)行動(dòng)作,即運(yùn)算單元所進(jìn)行的全部操作都是由控制單元發(fā)出的控制信號(hào)來(lái)指揮的,所以它是執(zhí)行部件。

存儲(chǔ)單元

存儲(chǔ)單元包括 CPU 片內(nèi)緩存Cache和寄存器組,是 CPU 中暫時(shí)存放數(shù)據(jù)的地方,里面保存著那些等待處理的數(shù)據(jù),或已經(jīng)處理過(guò)的數(shù)據(jù),CPU 訪問(wèn)寄存器所用的時(shí)間要比訪問(wèn)內(nèi)存的時(shí)間短。 寄存器是CPU內(nèi)部的元件,寄存器擁有非常高的讀寫速度,所以在寄存器之間的數(shù)據(jù)傳送非???。采用寄存器,可以減少 CPU 訪問(wèn)內(nèi)存的次數(shù),從而提高了 CPU 的工作速度。寄存器組可分為專用寄存器和通用寄存器。專用寄存器的作用是固定的,分別寄存相應(yīng)的數(shù)據(jù);而通用寄存器用途廣泛并可由程序員規(guī)定其用途。

下表列出了CPU關(guān)鍵技術(shù)的發(fā)展歷程以及代表系列,每一個(gè)關(guān)鍵技術(shù)的誕生都是環(huán)環(huán)相扣的,處理器這些技術(shù)發(fā)展歷程都圍繞著如何不讓“CPU閑下來(lái)”這一個(gè)核心目標(biāo)展開(kāi)。

 

并發(fā)編程從操作系統(tǒng)底層工作整體認(rèn)識(shí)開(kāi)始

 

CPU緩存結(jié)構(gòu)

現(xiàn)代CPU為了提升執(zhí)行效率,減少CPU與內(nèi)存的交互(交互影響CPU效率),一般在CPU上集成了多級(jí)緩存架構(gòu),常見(jiàn)的為三級(jí)緩存結(jié)構(gòu)

  • L1 Cache,分為數(shù)據(jù)緩存和指令緩存,邏輯核獨(dú)占
  • L2 Cache,物理核獨(dú)占,邏輯核共享
  • L3 Cache,所有物理核共享

 

并發(fā)編程從操作系統(tǒng)底層工作整體認(rèn)識(shí)開(kāi)始

 

  • 存儲(chǔ)器存儲(chǔ)空間大?。簝?nèi)存>L3>L2>L1>寄存器;
  • 存儲(chǔ)器速度快慢排序:寄存器>L1>L2>L3>內(nèi)存;

注意:緩存是由最小的存儲(chǔ)區(qū)塊-緩存行(cacheline)組成,緩存行大小通常為64byte。

緩存行是什么意思呢? 比如你的L1緩存大小是512kb,而cacheline = 64byte,那么就是L1里有512 * 1024/64個(gè)cacheline

CPU讀取存儲(chǔ)器數(shù)據(jù)過(guò)程

  1. CPU要取寄存器X的值,只需要一步:直接讀取。
  2. CPU要取L1 cache的某個(gè)值,需要1-3步(或者更多):把cache行鎖住,把某個(gè)數(shù)據(jù)拿來(lái),解鎖,如果沒(méi)鎖住就慢了。
  3. CPU要取L2 cache的某個(gè)值,先要到L1 cache里取,L1當(dāng)中不存在,在L2里,L2開(kāi)始加鎖,加鎖以后,把L2里的數(shù)據(jù)復(fù)制到L1,再執(zhí)行讀L1的過(guò)程,上面的3步,再解鎖。
  4. CPU取L3 cache的也是一樣,只不過(guò)先由L3復(fù)制到L2,從L2復(fù)制到L1,從L1到CPU。
  5. CPU取內(nèi)存則最復(fù)雜:通知內(nèi)存控制器占用總線帶寬,通知內(nèi)存加鎖,發(fā)起內(nèi)存讀請(qǐng)求,等待回應(yīng),回應(yīng)數(shù)據(jù)保存到L3(如果沒(méi)有就到L2),再?gòu)腖3/2到L1,再?gòu)腖1到CPU,之后解除總線鎖定。

CPU為何要有高速緩存

CPU在摩爾定律的指導(dǎo)下以每18個(gè)月翻一番的速度在發(fā)展,然而內(nèi)存和硬盤的發(fā)展速度遠(yuǎn)遠(yuǎn)不及CPU。這就造成了高性能能的內(nèi)存和硬盤價(jià)格及其昂貴。然而CPU的高度運(yùn)算需要高速的數(shù)據(jù)。為了解決這個(gè)問(wèn)題,CPU廠商在CPU中內(nèi)置了少量的高速緩存以解決I\O速度和CPU運(yùn)算速度之間的不匹配問(wèn)題。

在CPU訪問(wèn)存儲(chǔ)設(shè)備時(shí),無(wú)論是存取數(shù)據(jù)抑或存取指令,都趨于聚集在一片連續(xù)的區(qū)域中,這就被稱為局部性原理。

  • 時(shí)間局部性(Temporal Locality):如果一個(gè)信息項(xiàng)正在被訪問(wèn),那么在近期它很可能還會(huì)被再次訪問(wèn)。

           比如循環(huán)、遞歸、方法的反復(fù)調(diào)用等。

  • 空間局部性(Spatial Locality):如果一個(gè)存儲(chǔ)器的位置被引用,那么將來(lái)他附近的位置也會(huì)被引用。

           比如順序執(zhí)行的代碼、連續(xù)創(chuàng)建的兩個(gè)對(duì)象、數(shù)組等。

空間局部性案例:

 

 

 

  1. public class TwoDimensionalArraySum { 
  2.     private static final int RUNS = 100; 
  3.     private static final int DIMENSION_1 = 1024 * 1024; 
  4.     private static final int DIMENSION_2 = 6; 
  5.     private static long[][] longs; 
  6.  
  7.     public static void main(String[] args) throws Exception { 
  8.         /* 
  9.          * 初始化數(shù)組 
  10.          */ 
  11.         longs = new long[DIMENSION_1][]; 
  12.         for (int i = 0; i < DIMENSION_1; i++) { 
  13.             longs[i] = new long[DIMENSION_2]; 
  14.             for (int j = 0; j < DIMENSION_2; j++) { 
  15.                 longs[i][j] = 1L; 
  16.             } 
  17.         } 
  18.         System.out.println("Array初始化完畢...."); 
  19.  
  20.         long sum = 0L; 
  21.         long start = System.currentTimeMillis(); 
  22.         for (int r = 0; r < RUNS; r++) { 
  23.             for (int i = 0; i < DIMENSION_1; i++) {//DIMENSION_1=1024*1024 
  24.                 for (int j=0;j<DIMENSION_2;j++){//6 
  25.                     sum+=longs[i][j]; 
  26.                 } 
  27.             } 
  28.         } 
  29.         System.out.println("spend time1:"+(System.currentTimeMillis()-start)); 
  30.         System.out.println("sum1:"+sum); 
  31.  
  32.         sum = 0L; 
  33.         start = System.currentTimeMillis(); 
  34.         for (int r = 0; r < RUNS; r++) { 
  35.             for (int j=0;j<DIMENSION_2;j++) {//6 
  36.                 for (int i = 0; i < DIMENSION_1; i++){//1024*1024 
  37.                     sum+=longs[i][j]; 
  38.                 } 
  39.             } 
  40.         } 
  41.         System.out.println("spend time2:"+(System.currentTimeMillis()-start)); 
  42.         System.out.println("sum2:"+sum); 
  43.     } 

帶有高速緩存的CPU執(zhí)行計(jì)算的流程

  1. 程序以及數(shù)據(jù)被加載到主內(nèi)存
  2. 指令和數(shù)據(jù)被加載到CPU的高速緩存
  3. CPU執(zhí)行指令,把結(jié)果寫到高速緩存
  4. 高速緩存中的數(shù)據(jù)寫回主內(nèi)存

CPU運(yùn)行安全等級(jí)

CPU有4個(gè)運(yùn)行級(jí)別,分別為:

  • ring0
  • ring1
  • ring2
  • ring3

Linux與Windows只用到了2個(gè)級(jí)別:ring0、ring3,操作系統(tǒng)內(nèi)部?jī)?nèi)部程序指令通常運(yùn)行在ring0級(jí)別,操作系統(tǒng)以外的第三方程序運(yùn)行在ring3級(jí)別,第三方程序如果要調(diào)用操作系統(tǒng)內(nèi)部函數(shù)功能,由于運(yùn)行安全級(jí)別不夠,必須切換CPU運(yùn)行狀態(tài),從ring3切換到ring0,然后執(zhí)行系統(tǒng)函數(shù),說(shuō)到這里相信大家明白為什么JVM創(chuàng)建線程,線程阻塞喚醒是重型操作了,因?yàn)镃PU要切換運(yùn)行狀態(tài)。 下面我大概梳理一下JVM創(chuàng)建線程CPU的工作過(guò)程

  • step1:CPU從ring3切換ring0創(chuàng)建線程
  • step2:創(chuàng)建完畢,CPU從ring0切換回ring3
  • step3:線程執(zhí)行JVM程序
  • step4:線程執(zhí)行完畢,銷毀還得切會(huì)ring0

操作系統(tǒng)內(nèi)存管理

執(zhí)行空間保護(hù)

操作系統(tǒng)有用戶空間與內(nèi)核空間兩個(gè)概念,目的也是為了做到程序運(yùn)行安全隔離與穩(wěn)定,以32位操作系統(tǒng)4G大小的內(nèi)存空間為例

 

 

 

 

Linux為內(nèi)核代碼和數(shù)據(jù)結(jié)構(gòu)預(yù)留了幾個(gè)頁(yè)框,這些頁(yè)永遠(yuǎn)不會(huì)被轉(zhuǎn)出到磁盤上。從 0x00000000 到 0xC0000000(PAGE_OFFSET) 的線性地址可由用戶代碼 和 內(nèi)核代碼進(jìn)行引用(即用戶空間)。從0xC0000000(PAGE_OFFSET)到 0xFFFFFFFFF的線性地址只能由內(nèi)核代碼進(jìn)行訪問(wèn)(即內(nèi)核空間)。內(nèi)核代碼及其數(shù)據(jù)結(jié)構(gòu)都必須位于這 1 GB的地址空間中,但是對(duì)于此地址空間而言,更大的消費(fèi)者是物理地址的虛擬映射。

這意味著在 4 GB 的內(nèi)存空間中,只有 3 GB 可以用于用戶應(yīng)用程序。進(jìn)程與線程只能運(yùn)行在用戶方式(usermode)或內(nèi)核方式(kernelmode)下。用戶程序運(yùn)行在用戶方式下,而系統(tǒng)調(diào)用運(yùn)行在內(nèi)核方式下。在這兩種方式下所用的堆棧不一樣:用戶方式下用的是一般的堆棧(用戶空間的堆棧),而內(nèi)核方式下用的是固定大小的堆棧(內(nèi)核空間的對(duì)戰(zhàn),一般為一個(gè)內(nèi)存頁(yè)的大小),即每個(gè)進(jìn)程與線程其實(shí)有兩個(gè)堆棧,分別運(yùn)行與用戶態(tài)與內(nèi)核態(tài)。

由空間劃分我們?cè)僖暌幌拢珻PU調(diào)度的基本單位線程,也劃分為:

  1. 內(nèi)核線程模型(KLT)
  2. 用戶線程模型(ULT)

內(nèi)核線程模型

 

并發(fā)編程從操作系統(tǒng)底層工作整體認(rèn)識(shí)開(kāi)始

 

內(nèi)核線程(KLT):系統(tǒng)內(nèi)核管理線程(KLT),內(nèi)核保存線程的狀態(tài)和上下文信息,線程阻塞不會(huì)引起進(jìn)程阻塞。在多處理器系統(tǒng)上,多線程在多處理器上并行運(yùn)行。線程的創(chuàng)建、調(diào)度和管理由內(nèi)核完成,效率比ULT要慢,比進(jìn)程操作快。

用戶線程模型

 

并發(fā)編程從操作系統(tǒng)底層工作整體認(rèn)識(shí)開(kāi)始

 

用戶線程(ULT):用戶程序?qū)崿F(xiàn),不依賴操作系統(tǒng)核心,應(yīng)用提供創(chuàng)建、同步、調(diào)度和管理線程的函數(shù)來(lái)控制用戶線程。不需要用戶態(tài)/內(nèi)核態(tài)切換,速度快。內(nèi)核對(duì)ULT無(wú)感知,線程阻塞則進(jìn)程(包括它的所有線程)阻塞。

到這里,大家不妨思考一下,jvm是采用的哪一種線程模型?

進(jìn)程與線程

什么是進(jìn)程?

現(xiàn)代操作系統(tǒng)在運(yùn)行一個(gè)程序時(shí),會(huì)為其創(chuàng)建一個(gè)進(jìn)程;例如,啟動(dòng)一個(gè)Java程序,操作系統(tǒng)就會(huì)創(chuàng)建一個(gè)Java進(jìn)程。進(jìn)程是OS(操作系統(tǒng))資源分配的最小單位。

什么是線程?

線程是OS(操作系統(tǒng))調(diào)度CPU的最小單元,也叫輕量級(jí)進(jìn)程(Light Weight Process),在一個(gè)進(jìn)程里可以創(chuàng)建多個(gè)線程,這些線程都擁有各自的計(jì)數(shù)器、堆棧和局部變量等屬性,并且能夠訪問(wèn)共享的內(nèi)存變量。CPU在這些線程上高速切換,讓使用者感覺(jué)到這些線程在同時(shí)執(zhí)行,即并發(fā)的概念,相似的概念還有并行!

線程上下文切換過(guò)程:

 

并發(fā)編程從操作系統(tǒng)底層工作整體認(rèn)識(shí)開(kāi)始

 

虛擬機(jī)指令集架構(gòu)

虛擬機(jī)指令集架構(gòu)主要分兩種:

  1. 棧指令集架構(gòu)
  2. 寄存器指令集架構(gòu)

關(guān)于指令集架構(gòu)的wiki詳細(xì)說(shuō)明:http://zh.wikipedia.org/wiki/指令集架構(gòu)

棧指令集架構(gòu)

  1. 設(shè)計(jì)和實(shí)現(xiàn)更簡(jiǎn)單,適用于資源受限的系統(tǒng);
  2. 避開(kāi)了寄存器的分配難題:使用零地址指令方式分配;
  3. 指令流中的指令大部分是零地址指令,其執(zhí)行過(guò)程依賴于操作棧,指令集更小,編譯器容易實(shí)現(xiàn);
  4. 不需要硬件支持,可移植性更好,更好實(shí)現(xiàn)跨平臺(tái)。

寄存器指令集架構(gòu)

典型的應(yīng)用是x86的二進(jìn)制指令集:比如傳統(tǒng)的PC以及Android的Davlik虛擬機(jī)。

指令集架構(gòu)則完全依賴硬件,可移植性差。

性能優(yōu)秀和執(zhí)行更高效。

花費(fèi)更少的指令去完成一項(xiàng)操作。

在大部分情況下,基于寄存器架構(gòu)的指令集往往都以一地址指令、二地址指令和三地址指令為主,而基于棧式架構(gòu)的指令集卻是以零地址指令為主。

  • Java符合典型的棧指令集架構(gòu)特征,像Python、Go都屬于這種架構(gòu)。

 

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2010-04-20 10:34:33

2021-04-19 11:23:29

操作系統(tǒng)計(jì)算機(jī)DOS

2013-11-05 14:30:45

桌面操作系統(tǒng)Mac OSWindows 8.1

2020-09-11 09:10:42

華為操作系統(tǒng)美國(guó)

2020-09-10 16:12:47

華為操作系統(tǒng)中芯

2009-05-24 14:40:50

2022-08-01 07:09:48

Docker操作系統(tǒng)抽象重組

2022-05-17 12:45:31

LinuxLinux發(fā)行版

2020-08-07 08:15:58

操作系統(tǒng)

2010-04-22 14:53:07

Aix操作系統(tǒng)

2010-04-15 15:46:57

Unix操作系統(tǒng)

2011-01-04 18:15:21

2009-12-22 10:41:22

Linux操作系統(tǒng)

2011-04-06 16:07:44

Delphi

2011-01-04 14:36:39

LinuxGTK編程

2011-04-11 10:01:16

Android谷歌

2010-03-01 14:58:41

Linux操作系統(tǒng)

2022-03-30 08:24:25

操作系統(tǒng)內(nèi)核開(kāi)源軟件

2010-08-02 10:55:29

vSphere 4.1

2009-12-09 17:25:19

Linux操作系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)