java中進(jìn)程的詳細(xì)解析(含實(shí)例代碼)
一、操作系統(tǒng)
操作系統(tǒng)是計(jì)算機(jī)中的一個(gè)重要軟件。
操作系統(tǒng)是一個(gè)搞管理的軟件:
- 管理各種硬件設(shè)備
- 給各種應(yīng)用程序提供一個(gè)穩(wěn)定的運(yùn)行環(huán)境,
這些應(yīng)用程序在運(yùn)行中,即使有一個(gè)應(yīng)用程序發(fā)生bug崩潰了,也不會(huì)影響其他應(yīng)用程序的執(zhí)行。
操作系統(tǒng)中的重要概念:進(jìn)程
• 運(yùn)行起來(lái)的程序就叫進(jìn)程。
站在操作系統(tǒng)的視角,如何管理進(jìn)程?
先描述
使用結(jié)構(gòu)體,描述出進(jìn)程的核心屬性,
進(jìn)程控制塊(PCB),非常大的結(jié)構(gòu)體,有很多個(gè)屬性。再把多個(gè)進(jìn)程組織起來(lái)
比如:Linux這樣的操作系統(tǒng),使用鏈表這樣的方式,把每個(gè)PCB串一起。
• 操作系統(tǒng)本身也是一個(gè)軟件,也是由一系列指令構(gòu)成的,在啟動(dòng)時(shí),CPU依次執(zhí)行操作系統(tǒng)上的這些指令(引導(dǎo)操作系統(tǒng)起來(lái))
• 所有的軟件本質(zhì)上都是靠CPU來(lái)執(zhí)行的,CPU具體執(zhí)行哪些指令,一定程度上受操作系統(tǒng)的影響。
- 文件描述符
進(jìn)程在運(yùn)行過(guò)程中,很多時(shí)候需要和硬盤(pán)這個(gè)硬件設(shè)備進(jìn)行交互。
硬盤(pán)上的數(shù)據(jù),就是以文件的形式來(lái)組織的。
進(jìn)程在讀寫(xiě)文件的時(shí)候,就需要打開(kāi)文件,每個(gè)打開(kāi)的文件相關(guān)的信息保存到文件描述符中,文件的每一項(xiàng)都對(duì)應(yīng)著打開(kāi)了的一份文件。
操作系統(tǒng)中,會(huì)把很多資源抽象成文件來(lái)表示,所以“文件”不只是硬盤(pán)上的類(lèi)
例:網(wǎng)卡,操作系統(tǒng)管理網(wǎng)卡的時(shí)候,就是當(dāng)作“文件”一樣來(lái)管理
二、進(jìn)程的運(yùn)行
• 進(jìn)程的運(yùn)行,也會(huì)依賴(lài)到硬盤(pán)、網(wǎng)卡等相關(guān)硬件設(shè)備
• 進(jìn)程運(yùn)行,執(zhí)行指令,都是靠CPU的。
進(jìn)程是操作系統(tǒng)中,負(fù)責(zé)分配CPU的基本單位。
分時(shí)復(fù)用:把一個(gè)單位時(shí)間,分成很多份,分別執(zhí)行不同進(jìn)程的指令
第一份,執(zhí)行進(jìn)程1指令
第二份,執(zhí)行進(jìn)程2的指令……
因?yàn)镃PU的運(yùn)行速度是特別快,所以在切換的過(guò)程中,人眼很難察覺(jué)出變化了,像同時(shí)執(zhí)行一樣。把一個(gè)CPU核心上,按照分時(shí)復(fù)用,執(zhí)行多個(gè)進(jìn)程,就叫“并發(fā)執(zhí)行”
多個(gè)進(jìn)程在一個(gè)CPU核心上在不同單位時(shí)間內(nèi)執(zhí)行。把多個(gè)CPU核心上,同時(shí)執(zhí)行多個(gè)進(jìn)程 稱(chēng)為“并行執(zhí)行”
多個(gè)進(jìn)程在多個(gè)CPU核心上同時(shí)執(zhí)行
進(jìn)程狀態(tài),
- New(新建)
- RUNNABLE(可運(yùn)行)
- BLOCKED(阻塞)
- WAITING(等待)
- TIMED_WAITING(超時(shí)等待)
- TERMINATED(終止)
- 進(jìn)程有多種狀態(tài),下面是兩個(gè)典型
1)就緒狀態(tài) → 隨時(shí)可以到CPU上執(zhí)行
2)阻塞狀態(tài) → 進(jìn)程當(dāng)前不適合到CPU上執(zhí)行
- 進(jìn)程有多種狀態(tài),下面是兩個(gè)典型
進(jìn)程有優(yōu)先級(jí)
為了保證需要大量CPU資源能的正常執(zhí)行進(jìn)程的上下文
因?yàn)橛羞M(jìn)程調(diào)度,一個(gè)進(jìn)程執(zhí)行一會(huì),就會(huì)讓出CPU,這期間CPU執(zhí)行它會(huì)保存上次執(zhí)行的狀態(tài),多進(jìn)程繼續(xù)執(zhí)行
進(jìn)程在CPU中運(yùn)行的過(guò)程中
CPU上的各種寄存器,就保存了當(dāng)前進(jìn)程運(yùn)行的“中間狀態(tài)”
寄存器上關(guān)于進(jìn)程的信息,存放在內(nèi)存中(PCB自己也會(huì)有對(duì)應(yīng)空間)
恢復(fù)時(shí):把PCB中剛才保存的屬性,填回CPU的寄存器。
- 進(jìn)程的記賬信息
統(tǒng)計(jì)功能,統(tǒng)計(jì)每個(gè)進(jìn)程在CPU上運(yùn)行了多久
如果發(fā)現(xiàn)某個(gè)進(jìn)程 很久沒(méi)有吃到CPU資源,就會(huì)給它資源傾斜
一點(diǎn)之后,防止這個(gè)進(jìn)程餓死
new(新建),runnable(可運(yùn)行)、blocked(阻塞)、waiting(等待)
timed_waiting(超時(shí)等待) terminated(終止)
三、多線程
進(jìn)程整體是一個(gè)比較“重”的概念
創(chuàng)建進(jìn)程/銷(xiāo)毀進(jìn)程開(kāi)銷(xiāo)比較大
為了解決上述問(wèn)題,引入線程,輕量級(jí)進(jìn)程(創(chuàng)建銷(xiāo)毀開(kāi)銷(xiāo)?。?/p>
- 每個(gè)進(jìn)程都相當(dāng)于一個(gè)要執(zhí)行的任務(wù)
- 每個(gè)線程也是一個(gè)要執(zhí)行的任務(wù)
進(jìn)程包含線程
每個(gè)進(jìn)程中,都會(huì)包含一個(gè)或多個(gè)線程進(jìn)程是操作系統(tǒng)資源分配的基本單位
進(jìn)程內(nèi)部所包含的多個(gè)線程之間,會(huì)共享上述的內(nèi)存資源和硬盤(pán)資源,網(wǎng)絡(luò)帶寬。
進(jìn)程創(chuàng)建,需要申請(qǐng)資源
進(jìn)程的銷(xiāo)毀,需要釋放資源
→ 重量級(jí)事物,(代價(jià)大,時(shí)間消耗)
- 對(duì)于線程來(lái)說(shuō),只是第一個(gè)線程創(chuàng)建的時(shí)候(和進(jìn)程一起創(chuàng)建)申請(qǐng)資源,后續(xù)再創(chuàng)建線程,不再手動(dòng)到資源申請(qǐng)操作(內(nèi)核少,快)
- 只有所有的線程都銷(xiāo)毀(進(jìn)程銷(xiāo)毀)才會(huì)釋放資源,單個(gè)進(jìn)程銷(xiāo)毀某個(gè)線程,也不會(huì)釋放資源。
- 可以理解為:在進(jìn)程創(chuàng)建的時(shí)候給線程創(chuàng)建了一次資源,后續(xù)線程的創(chuàng)建和銷(xiāo)毀都在這一層,只有進(jìn)程被銷(xiāo)毀這一次資源才會(huì)被回收。
關(guān)于線程的調(diào)度,是隨機(jī)的,我們的程序是感知不到,也干預(yù)不了。
那怎么提高效率?
? 引入多個(gè)線程, 確實(shí)可以提升效率, 但是資源一旦 就那么多,引入過(guò)多線程,會(huì)使上下文切換開(kāi)銷(xiāo)增長(zhǎng),因?yàn)檎{(diào)度開(kāi)銷(xiāo)會(huì)拖累程序的性能。
而且其中一個(gè)線程拋出異常,會(huì)帶走整個(gè)進(jìn)程,所有的線程都無(wú)法運(yùn)行。
如果及時(shí)捕獲,也不一定 終導(dǎo)致進(jìn)程終止。
- 創(chuàng)建第一個(gè)線程
class MyThread extends Thread {
@Override
public void run() {
System.out.println("hello");
try{
Thread.sleep(1000);
} catch (InterruptedException e) {
// throw new RuntimeException(e); // 處理異常的手段:拋出異常,導(dǎo)致程序異常終止
break;
}
}
}
public class Test {
public static void main(String[] args) {
Thread t = new MyThread();
t.start(); // 開(kāi)啟線程
}
}
其中 Thread.sleep(); 會(huì)休眠
例:Thread.sleep(0); 這里是 讓此線程放棄當(dāng)前CPU資源,給別的線程用
在 run() 方法內(nèi),Thread.sleep()會(huì)拋出異常,但無(wú)法 throws,只能使用 try{} catch{} 來(lái)捕獲。
- 每個(gè)線程,調(diào)度順序是隨機(jī)的,無(wú)法預(yù)測(cè)。“搶占式執(zhí)行”
創(chuàng)建線程的方法:
繼承 Thread,重寫(xiě) run
實(shí)現(xiàn) Runnable 接口,重寫(xiě) run
例:Runnable runnable = new MyRunnable();
Thread t = new Thread(runnable);
class MyRunnable implements Runnable { @Override public void run() { System.out.println("我自己的 Runnable 的 run 方法"); } } public class Deano01 { public static void main(String[] args) { Runnable r1 = new MyRunnable(); Thread t1 = new Thread(new MyRunnable()); Thread t2 = new Thread(r1); t1.start(); t2.start(); } }class MyThread extends Thread{ @Override public void run() { System.out.println("我自己的 Thread 的 run 方法"); } } public class Deano01 { public static void main(String[] args) { // 1. 自己實(shí)現(xiàn)一個(gè)自己的Threa類(lèi) Thread t = new MyThread(); t.start(); // 2. 使用 lamabda 表達(dá)式 Thread t1 = new Thead(() -> { System.out.println("我自己的 Thread 的 run 方法"); }); } }這個(gè)接口中,只有一個(gè)無(wú)參返回值的 run 方法
可以使用 lambda 表達(dá)式 () -> { 要執(zhí)行的代碼 }
在括號(hào)里沒(méi)有參數(shù)!
總結(jié)
到此這篇關(guān)于java中進(jìn)程詳細(xì)解析的文章就介紹到這了,更多相關(guān)java進(jìn)程詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot項(xiàng)目瘦身之如何將jar包與lib依賴(lài)分開(kāi)打包
這篇文章主要介紹了Springboot項(xiàng)目瘦身之如何將jar包與lib依賴(lài)分開(kāi)打包問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
Java設(shè)計(jì)模式之享元模式(Flyweight Pattern)詳解
享元模式(Flyweight Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式,旨在減少對(duì)象的數(shù)量,以節(jié)省內(nèi)存空間和提高性能,本文將詳細(xì)的給大家介紹一下Java享元模式,需要的朋友可以參考下2023-07-07
Java Runtime類(lèi)詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Runtime類(lèi)封裝了運(yùn)行時(shí)的環(huán)境。每個(gè) Java 應(yīng)用程序都有一個(gè) Runtime 類(lèi)實(shí)例,使應(yīng)用程序能夠與其運(yùn)行的環(huán)境相連接。下面通過(guò)本文給大家分享Java Runtime類(lèi)詳解,需要的朋友參考下吧2017-04-04
Java設(shè)計(jì)模式編程中的工廠方法模式和抽象工廠模式
這篇文章主要介紹了Java設(shè)計(jì)模式編程中的工廠方法模式和抽象工廠模式,設(shè)計(jì)模式的建立有利于團(tuán)隊(duì)協(xié)作時(shí)代碼的共同維護(hù),需要的朋友可以參考下2016-01-01
詳解java實(shí)現(xiàn)遍歷二叉樹(shù)的三種情況
這篇文章主要介紹了java實(shí)現(xiàn)遍歷二叉樹(shù)的三種情況,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
Spring Boot Thymeleaf實(shí)現(xiàn)國(guó)際化的方法詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot Thymeleaf實(shí)現(xiàn)國(guó)際化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
教你怎么用idea創(chuàng)建web項(xiàng)目
好多朋友在使用IDEA創(chuàng)建項(xiàng)目時(shí),總會(huì)碰到一些小問(wèn)題.現(xiàn)在我們就演示一下使用IDEA創(chuàng)建web項(xiàng)目的完整步驟吧.文中有非常詳細(xì)的圖文示例哦,,需要的朋友可以參考下2021-05-05
Hibernate處理多對(duì)多關(guān)系的實(shí)現(xiàn)示例
本文介紹了Hibernate中實(shí)現(xiàn)多對(duì)多關(guān)系的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-01-01
SpringBoot實(shí)現(xiàn)接口參數(shù)加密解密的示例代碼
加密解密本身并不是難事,問(wèn)題是在何時(shí)去處理?SpringMVC?中給我們提供了?ResponseBodyAdvice?和?RequestBodyAdvice,利用這兩個(gè)工具可以對(duì)請(qǐng)求和響應(yīng)進(jìn)行預(yù)處理,非常方便。廢話不多說(shuō),我們一起來(lái)學(xué)習(xí)一下2022-09-09
Calcite使用SQL實(shí)現(xiàn)查詢excel內(nèi)容
因?yàn)閏alcite本身沒(méi)有excel的適配器,?所以本文將模仿calcite-file,?搞一個(gè)calcite-file-excel實(shí)現(xiàn)查詢excel內(nèi)容,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-01-01

