1. 預(yù)備知識(shí)
2. 容器技術(shù)原理
1. 核心
物理核:CPU中包含的物理內(nèi)核(核心)個(gè)數(shù),比如多核CPU,單核CPU。cpu cores記錄了對(duì)應(yīng)的物理CPU有多少個(gè)物理核;
邏輯核:所謂的4核8線程,4核指的是物理核心。用Intel的超線程技術(shù)(HT, Hyper-Threading)將物理核虛擬而成的邏輯處理單元。用一個(gè)物理核模擬兩個(gè)虛擬核,即每個(gè)核兩個(gè)線程,總數(shù)為8線程;
多核CPU:多核CPU是多個(gè)單核CPU的替代方案,多核CPU減小了體積,同時(shí)也減少了功耗。
2. 進(jìn)程和線程
| 對(duì)比 | 進(jìn)程 | 線程 |
|---|---|---|
| 定義 | 進(jìn)程是程序運(yùn)行的一個(gè)實(shí)體的運(yùn)行過(guò)程,是系統(tǒng)進(jìn)行資源分配和調(diào)配的一個(gè)獨(dú)立單位 | 線程是進(jìn)程運(yùn)行和執(zhí)行的最小調(diào)度單位 |
| 系統(tǒng)開(kāi)銷(xiāo) | 創(chuàng)建撤銷(xiāo)切換開(kāi)銷(xiāo)大,資源要重新分配和收回 | 僅保存少量寄存器的內(nèi)容,開(kāi)銷(xiāo)小,在進(jìn)程的地址空間執(zhí)行代碼 |
| 擁有資產(chǎn) | 資源擁有的基本單位 | 基本上不占資源,僅有不可少的資源(程序計(jì)數(shù)器,一組寄存器和棧) |
| 調(diào)度 | 資源分配的基本單位 | 獨(dú)立調(diào)度分配的單位 |
| 安全性 | 進(jìn)程間相互獨(dú)立,互不影響 | 線程共享一個(gè)進(jìn)程下面的資源,可以互相通信和影響 |
| 地址空間 | 系統(tǒng)賦予的獨(dú)立的內(nèi)存地址空間 | 由相關(guān)堆棧寄存器和和線程控制表TCB組成,寄存器可被用來(lái)存儲(chǔ)線程內(nèi)的局部變量 |
- 線程切換:CPU給線程分配時(shí)間片(也就是分配給線程的時(shí)間),執(zhí)行完時(shí)間片后會(huì)切換都另一個(gè)線程。從保存線程A的狀態(tài)再到切換到線程B時(shí),重新加載線程B的狀態(tài)的這個(gè)過(guò)程就叫上下文切換。
- 線程開(kāi)銷(xiāo):上下文切換消耗、線程創(chuàng)建和消亡的開(kāi)銷(xiāo)、線程需要保存維持線程本地棧,會(huì)消耗內(nèi)存。
- 線程數(shù)量選擇:計(jì)算密集型,CPU的利用率高,不用開(kāi)太多的線程;IO密集型,因?yàn)镮O操作會(huì)阻塞線程,CPU利用率不高,可以開(kāi)多點(diǎn)線程。
- java程序是跑在JVM實(shí)例上的。JVM本身是一個(gè)多線程的程序,當(dāng)JVM啟動(dòng)執(zhí)行時(shí)就是在操作系統(tǒng)中啟動(dòng)了一個(gè)JVM進(jìn)程。我們編寫(xiě)的java單線程或多線程應(yīng)用進(jìn)程都是在JVM這個(gè)程序中作為一個(gè)或多個(gè)線程運(yùn)行。
JVM啟動(dòng)時(shí),必然會(huì)創(chuàng)建以下5個(gè)線程:- main:主線程,執(zhí)行我們指定的啟動(dòng)類(lèi)的main方法
- Reference Handler:處理引用的線程
- Finalizer:調(diào)用對(duì)象的finalize方法的線程,就是垃圾回收的線程
- Signal Dispatcher:分發(fā)處理發(fā)送給JVM信號(hào)的線程
- Attach Listener:負(fù)責(zé)接收外部的命令的線程
3. 虛擬化
-
虛擬化(技術(shù))(Virtualization)是一種資源管理技術(shù),是將計(jì)算機(jī)的各種實(shí)體資源(CPU、內(nèi)存、磁盤(pán)空間、網(wǎng)絡(luò)適配器等),予以抽象、轉(zhuǎn)換后呈現(xiàn)出來(lái)并可供分割、組合為一個(gè)或多個(gè)電腦配置環(huán)境。
- 按虛擬的對(duì)象分類(lèi):虛擬機(jī)、虛擬內(nèi)存、存儲(chǔ)虛擬化、網(wǎng)絡(luò)虛擬化等等;
- 按照抽象程度分類(lèi):指令集架構(gòu)等級(jí)的虛擬化、硬件抽象層等級(jí)的虛擬化、操作系統(tǒng)等級(jí)的虛擬化等等。
虛擬技術(shù)按抽象程度來(lái)分為五個(gè)層次
- 虛擬機(jī)(Virtual machine或VM)可以像真實(shí)機(jī)器一樣運(yùn)行程序的計(jì)算機(jī)的軟件實(shí)現(xiàn)。廣義來(lái)說(shuō),虛擬機(jī)是一種模擬系統(tǒng),即在軟件層面上通過(guò)模擬硬件的輸入和輸出,讓虛擬機(jī)的操作系統(tǒng)得以運(yùn)行在沒(méi)有物理硬件的環(huán)境中(也就是宿主機(jī)的操作系統(tǒng)上),其中能夠模擬出硬件輸入輸出,讓虛擬機(jī)的操作系統(tǒng)可以啟動(dòng)起來(lái)的程序,被叫做hypervisor。
虛擬機(jī)也被稱(chēng)為guest OS
虛擬機(jī)也被稱(chēng)為guest OS
- 單純模擬硬件的輸入輸出,效率是很差的。如果我們不模擬硬件輸入輸出,只是做下真實(shí)硬件輸入輸出的搬運(yùn)工,那么虛擬機(jī)的指令執(zhí)行速度,就可以和宿主機(jī)一致了。當(dāng)然這前提是宿主機(jī)的硬件架構(gòu)必須和虛擬硬件架構(gòu)一致。
- 在linux上模擬windows,這個(gè)windows的運(yùn)行速度基本上和原生裝一個(gè)windows速度差不多,因?yàn)閣indows也能被直接安裝在電腦上。但對(duì)于在windows系統(tǒng)中運(yùn)行android系統(tǒng)不管用,因?yàn)閍ndroid系統(tǒng)的運(yùn)行硬件一般是手機(jī)(arm系統(tǒng),不同的硬件架構(gòu)體系和cpu指令集),所以android模擬機(jī)還是一樣的慢。
- 其實(shí)我們創(chuàng)建虛擬機(jī)也不一定需要模擬硬件的輸入和輸出,假如宿主機(jī)和虛擬機(jī)他們的kernel是一致的,就不用做硬件輸入輸出的搬運(yùn)工了,只需要做kernel輸入輸出的搬運(yùn)工即可,為了有別于硬件層面的虛擬機(jī),這種虛擬機(jī)被命名為「操作系統(tǒng)層虛擬化」,也被叫做容器。

