成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java 并發(fā)編程:理解進(jìn)程和線程

開發(fā) 前端
進(jìn)程是應(yīng)用程序在內(nèi)存中分配的空間,即正在運(yùn)行的程序。例如,運(yùn)行一個(gè) Java 程序的本質(zhì)就是啟動(dòng)一個(gè) Java 虛擬機(jī)進(jìn)程,這意味著一個(gè)正在運(yùn)行的 Java 程序就是一個(gè) Java 虛擬機(jī)進(jìn)程。

最早的計(jì)算機(jī)只有每次用戶給出指令,計(jì)算機(jī)就執(zhí)行一次,沒有指令時(shí)就會(huì)停止運(yùn)行。很多時(shí)候,計(jì)算機(jī)就這樣閑置著。

批處理操作系統(tǒng)

后來,批處理操作系統(tǒng)出現(xiàn)了,它能夠一次接受一系列指令,然后按順序執(zhí)行。用戶可以將想要執(zhí)行的程序?qū)懺诖艓希缓笞層?jì)算機(jī)讀取并執(zhí)行,將輸出結(jié)果寫在另一盤磁帶上。

批處理操作系統(tǒng)在一定程度上提高了計(jì)算機(jī)的效率,但由于批處理操作系統(tǒng)的指令執(zhí)行模式仍然是串行的,內(nèi)存中始終只有一個(gè)程序在運(yùn)行,后續(xù)程序需要等待前一個(gè)程序執(zhí)行完成后才能開始執(zhí)行。而前一個(gè)程序有時(shí)會(huì)因 I/O 操作、網(wǎng)絡(luò)等原因阻塞,所以批處理操作效率并不高。

進(jìn)程

隨著技術(shù)的發(fā)展,人們對(duì)計(jì)算機(jī)性能的要求越來越高,現(xiàn)有的批處理操作系統(tǒng)已無法滿足人們的需求。批處理操作系統(tǒng)的瓶頸在于內(nèi)存中只有一個(gè)程序,那么內(nèi)存中能否有多個(gè)程序呢?顯然這是可以的。于是就提出了進(jìn)程的概念。

進(jìn)程是應(yīng)用程序在內(nèi)存中分配的空間,即正在運(yùn)行的程序。例如,運(yùn)行一個(gè) Java 程序的本質(zhì)就是啟動(dòng)一個(gè) Java 虛擬機(jī)進(jìn)程,這意味著一個(gè)正在運(yùn)行的 Java 程序就是一個(gè) Java 虛擬機(jī)進(jìn)程。

例如,以下是一個(gè)簡單的 Java 程序:

public class SimpleJavaApp {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}

操作系統(tǒng)可以同時(shí)運(yùn)行多個(gè)進(jìn)程,如 chrome、QQ 等,它們互不干擾。同時(shí),進(jìn)程會(huì)保存程序在每個(gè)時(shí)刻的運(yùn)行狀態(tài)。

此時(shí),CPU 使用時(shí)間片輪轉(zhuǎn)調(diào)度算法來運(yùn)行進(jìn)程:CPU 為每個(gè)進(jìn)程分配一個(gè)時(shí)間段,稱為時(shí)間片。如果時(shí)間片結(jié)束時(shí)進(jìn)程仍在運(yùn)行,則將該進(jìn)程掛起,并將 CPU 分配給另一個(gè)進(jìn)程(這個(gè)過程稱為上下文切換)。如果進(jìn)程在時(shí)間片結(jié)束前阻塞或完成,則 CPU 立即切換,無需等待時(shí)間片用完。

當(dāng)一個(gè)進(jìn)程被掛起時(shí),它會(huì)保存當(dāng)前進(jìn)程的狀態(tài)(進(jìn)程標(biāo)識(shí)、進(jìn)程使用的資源等)。下次切換回來時(shí),會(huì)根據(jù)之前保存的狀態(tài)進(jìn)行恢復(fù)并繼續(xù)執(zhí)行。

使用進(jìn)程和時(shí)間片輪轉(zhuǎn)調(diào)度算法的操作系統(tǒng)在宏觀層面上似乎在同一時(shí)間段內(nèi)運(yùn)行多個(gè)進(jìn)程;雖然并發(fā)在宏觀層面上看起來有多個(gè)任務(wù)在執(zhí)行,但實(shí)際上,對(duì)于單核 CPU,在任何特定時(shí)刻只有一個(gè)任務(wù)占用 CPU 資源。

并發(fā)與并行

剛剛提到了并發(fā),這里簡要解釋一下并發(fā)與并行的區(qū)別。

并行:在同一時(shí)刻,多個(gè)任務(wù)在多個(gè) CPU 上同時(shí)執(zhí)行。

并發(fā):在同一時(shí)刻,多個(gè)任務(wù)在單個(gè) CPU 上交替執(zhí)行。

線程

雖然進(jìn)程的出現(xiàn)大大提高了操作系統(tǒng)的性能,但隨著時(shí)間的推移,人們不滿于一個(gè)進(jìn)程一次只能做一件事。如果一個(gè)進(jìn)程有多個(gè)子任務(wù),這些子任務(wù)只能一個(gè)接一個(gè)地執(zhí)行,這極大地影響了效率。

例如,當(dāng)你使用瀏覽器瀏在下載文件時(shí)不能繼續(xù)瀏覽其他網(wǎng)頁,這顯然無法滿足人們的需求。

這些子任務(wù)能否同時(shí)執(zhí)行呢?因此,人們提出了線程的概念,讓一個(gè)線程執(zhí)行一個(gè)子任務(wù)。這樣一個(gè)進(jìn)程就可以包含多個(gè)線程,每個(gè)線程負(fù)責(zé)一個(gè)單獨(dú)的子任務(wù)。

例如,在以下用 Java 實(shí)現(xiàn)的多線程代碼中,在主線程中開啟了兩個(gè)線程,分別負(fù)責(zé)兩個(gè)任務(wù),一個(gè)打印“Hello world”,一個(gè)打印“Hello java”。

class SayHelloThread extends Thread {
    public void run() {
        System.out.println("Hello");
    }
}

class SayJavaThread extends Thread {
    public void run() {
        System.out.println("Java");
    }
}

public class MultiThreadJavaApp {
    public static void main(String[] args) throws InterruptedException {
        SayHelloThread sayHelloThread = new SayHelloThread();
        SayJavaThread sayJavaThread = new SayJavaThread();
        sayHelloThread.start();
        sayJavaThread.start();
        // 主線程睡眠
        Thread.sleep(5000);
    }
}

輸出:

Hello
Java

上述輸出結(jié)果并不總是相同,因?yàn)閟ayHelloThread并不總是先獲得執(zhí)行機(jī)會(huì)。

在使用線程后,下載文件時(shí),讓負(fù)責(zé)下載功能的線程執(zhí)行下載。用戶瀏覽網(wǎng)頁時(shí),執(zhí)行負(fù)責(zé)瀏覽網(wǎng)頁功能的線程。然后,通過時(shí)間片輪轉(zhuǎn),用戶可以感覺到兩個(gè)功能同時(shí)在運(yùn)行。

進(jìn)程與線程的區(qū)別

進(jìn)程和線程的引入極大地提高了操作系統(tǒng)的性能,那么它們之間有什么區(qū)別呢?

  • 資源占用:進(jìn)程是操作系統(tǒng)分配資源的基本單位,它包含程序執(zhí)行的一個(gè)實(shí)例,包括代碼、數(shù)據(jù)和系統(tǒng)資源(如內(nèi)存、文件、設(shè)備等)。每個(gè)進(jìn)程都有獨(dú)立的內(nèi)存空間和系統(tǒng)資源,互不干擾。線程是操作系統(tǒng)調(diào)度的基本單位,即 CPU 分配時(shí)間的單位。多個(gè)線程共享同一進(jìn)程的內(nèi)存空間和系統(tǒng)資源。
  • 數(shù)據(jù)交換:進(jìn)程獨(dú)立執(zhí)行,有自己的地址空間和系統(tǒng)資源,通過進(jìn)程間通信(IPC)進(jìn)行數(shù)據(jù)交換。線程是進(jìn)程內(nèi)的一條執(zhí)行路徑。同一進(jìn)程中的多個(gè)線程共享內(nèi)存空間和系統(tǒng)資源,所以線程之間的數(shù)據(jù)交換更簡單、快速。
  • 開銷:由于進(jìn)程有獨(dú)立的內(nèi)存空間和系統(tǒng)資源,創(chuàng)建和銷毀進(jìn)程的開銷相對(duì)較大,需要保存和恢復(fù)更多的上下文信息。線程共享進(jìn)程的內(nèi)存空間和系統(tǒng)資源,所以創(chuàng)建和銷毀線程的開銷較小,只需要保存和恢復(fù)少量上下文信息。
  • 并發(fā):進(jìn)程是獨(dú)立的執(zhí)行單元,有自己的調(diào)度算法,在并發(fā)條件下更穩(wěn)定可靠。由于線程共享進(jìn)程資源,線程之間的調(diào)度和同步更復(fù)雜,需要更多注意處理并發(fā)條件。這也是我們后續(xù)文章將重點(diǎn)關(guān)注的問題。

基于上述差異,我們可以看到,對(duì)于一個(gè)進(jìn)程內(nèi)的多個(gè)任務(wù)實(shí)現(xiàn)并發(fā),最好的方法是使用多個(gè)線程而不是多個(gè)進(jìn)程,但需要特別注意并發(fā)邏輯的處理。

上下文切換

上下文切換(有時(shí)也稱為進(jìn)程切換或任務(wù)切換)是指 CPU 從一個(gè)進(jìn)程(或線程)切換到另一個(gè)進(jìn)程(或線程)。上下文是指在某個(gè)時(shí)間點(diǎn) CPU 寄存器和程序計(jì)數(shù)器的內(nèi)容。

其中,寄存器是 CPU 內(nèi)部少量的訪問速度很快的存儲(chǔ),通常用于存儲(chǔ)和訪問計(jì)算過程中的中間值,以提高計(jì)算機(jī)程序的運(yùn)行速度。

程序計(jì)數(shù)器是一個(gè)專用寄存器,用于指示 CPU 當(dāng)前正在執(zhí)行的指令序列中的位置,存儲(chǔ)的值是正在執(zhí)行的指令的位置或下一條要執(zhí)行的指令的位置,具體實(shí)現(xiàn)取決于特定系統(tǒng)。

CPU 通過為每個(gè)線程分配 CPU 時(shí)間片并通過時(shí)間片輪轉(zhuǎn)調(diào)度算法執(zhí)行任務(wù)來實(shí)現(xiàn)多線程機(jī)制。當(dāng)一個(gè)任務(wù)執(zhí)行完一個(gè)時(shí)間片時(shí),它將切換到下一個(gè)任務(wù),在切換之前,會(huì)保存前一個(gè)任務(wù)的狀態(tài),以便下次切換回該任務(wù)時(shí)可以重新加載該任務(wù)的狀態(tài)。因此,從保存到重新加載一個(gè)任務(wù)的過程就是一次上下文切換。

例如,現(xiàn)在線程 A 的時(shí)間片已執(zhí)行完,需要切換到線程 B,需要以下三個(gè)步驟:

  • 先掛起線程 A,并將其狀態(tài)從 CPU 保存到內(nèi)存中。
  • 在內(nèi)存中,獲取下一個(gè)線程 B 的上下文,并將其恢復(fù)到 CPU 的寄存器中以執(zhí)行線程 B。
  • 當(dāng)線程 B 執(zhí)行完畢,根據(jù)程序計(jì)數(shù)器指向的位置恢復(fù)線程 A。

上下文切換通常計(jì)算密集,這意味著此操作會(huì)消耗大量 CPU 時(shí)間,所以線程不是越多越好。如何減少系統(tǒng)中的上下文切換次數(shù)是提高多線程性能的關(guān)鍵問題。我們將在未來的文章中討論這個(gè)問題。

責(zé)任編輯:趙寧寧 來源: 程序猿技術(shù)充電站
相關(guān)推薦

2023-10-08 09:34:11

Java編程

2024-12-31 09:00:12

Java線程狀態(tài)

2017-01-10 13:39:57

Python線程池進(jìn)程池

2025-02-17 00:00:25

Java并發(fā)編程

2025-02-19 00:05:18

Java并發(fā)編程

2011-12-29 13:31:15

Java

2020-12-08 08:53:53

編程ThreadPoolE線程池

2019-06-03 09:13:11

線程進(jìn)程多線程

2023-09-26 10:30:57

Linux編程

2025-02-06 03:14:38

2020-12-10 07:00:38

編程線程池定時(shí)任務(wù)

2021-07-10 08:37:36

Notify機(jī)制Java

2019-11-07 09:20:29

Java線程操作系統(tǒng)

2020-12-11 07:32:45

編程ThreadLocalJava

2020-11-13 08:42:24

Synchronize

2024-12-27 08:11:44

Python編程模式IO

2025-02-03 08:23:33

2010-03-16 18:40:59

Java多線程編程

2023-12-11 18:18:24

Python編程線程

2022-10-12 07:53:46

并發(fā)編程同步工具
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 欧美视频成人 | 精品久久av | 精品亚洲一区二区三区四区五区高 | 澳门永久av免费网站 | 高清国产午夜精品久久久久久 | 国产精品欧美一区喷水 | 免费在线视频一区二区 | 国产精品一区二区三区在线 | 成人在线视频看看 | 日韩欧美国产不卡 | 97av视频在线观看 | 国产中文字幕亚洲 | 国产国语精品 | 亚洲日本欧美日韩高观看 | 人人擦人人 | 国产精品一区二区无线 | 日韩中文一区 | 国产精品亚洲二区 | 国产视频一区二区在线观看 | 一区二区国产精品 | 成人亚洲网站 | 亚洲伊人久久综合 | 91精品久久久 | 中文在线一区二区 | 草草影院ccyy| 亚州无限乱码 | 日韩欧美视频在线 | 色综合久久天天综合网 | 日韩高清成人 | 精品av久久久久电影 | 久久躁日日躁aaaaxxxx | 国产精品毛片一区二区在线看 | 国产一级成人 | 欧美精品一区二区三区蜜桃视频 | 色婷婷一区二区三区四区 | 欧美天堂 | 国产视频在线观看一区二区三区 | 在线伊人网 | 在线视频日韩 | 黑人一级片视频 | 久久久国产一区二区三区 |