一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 關于進程、線程、協程的概念以及Java中的應用

關于進程、線程、協程的概念以及Java中的應用

2023-06-13 01:01未知服務器之家 Java教程

進程、線程、協程 本文將從“操作系統”、“Java應用”上兩個角度來探究這三者的區別。 一、進程 在我本人的疑惑中,我有以下3個問題。 1.1為什么要引入進程? 在“多道程序環境下”,允許多個程序并發執行,此時它們將失去

進程、線程、協程

本文將從“操作系統”、“Java應用”上兩個角度來探究這三者的區別。

一、進程

在我本人的疑惑中,我有以下3個問題。

1.1為什么要引入進程?

在“多道程序環境下”,允許多個程序并發執行,此時它們將失去封閉性,并具有間斷性以及不可再現性的特征,因此需要引入進程的概念。

1.2什么是進程?進程由什么構成。

進程是程序執行的過程 ,包括了動態創建、調度和消亡的的整個過程,進程是程序資源管理的最小單位。好比下列匯編代碼代碼所示,包含對程序資源的調度。

_add_a_and_b:
   push   %ebx
   mov    %eax, [%esp+8] 
   mov    %ebx, [%esp+12]
   add    %eax, %ebx 
   pop    %ebx 
   ret  

_main:
   push   3
   push   2
   call   _add_a_and_b 
   add    %esp, 8
   ret

進程由三部分組成。

  • 進程控制塊(PCB),是進程存在的唯一標識,
  • 程序段
  • 數據段

1.3Liunx進程實現

Linux 并沒有為線程準備特定的數據結構,因為 Linux只有task_struct這一種描述進程的結構體。在內核看來只有進程而沒有線程,線程調度時也是當做進程來調度的。Linux所謂的線程其實是與其他進程共享資源的輕量級進程

為什么說是輕量級呢?在于它只有一個最小的執行上下文和調度程序所需的統計信息,它只帶有進程執行相關的信息,與父進程共享進程地址空間

二、線程

2.1線程是什么?

線程是操作操作系統能夠運行運算調度的最小單位。線程被包含在進程之中,是進程中的實際運作的單位,一個進程內可以包含多個線程,線程是資源調度的最小單位。

在Liunx中,線程沒有特定的數據結構,如何區別開來線程與進程的創建呢,這根據創建時參數的不同來決定,例如線程只有一個最小的執行上下文和調度程序所需的統計信息。

2.2線程擁有什么?

同一進程中的多條線程共享該進程中的 全部系統資源,如

  • 虛擬地址空間
  • 文件描述符號
  • 信號處理

但是同一個進程的不同線程也有各自的信息,如

  • 調用棧
  • 寄存器環境
  • 線程本次存儲

3.3線程分類

3.4 Java如何啟動一個線程

start– > start0 …..Native方法(由JVM中的c++調用)----> Liunx內核的 pthread_create方法

三、協程

3.1 既然有多線程操作,為什么還要引入協程?

操作系統在線程等待IO的時候,會阻塞當前線程,切換到其他線程,這樣在當前線程等待IO的過程中,其他線程可以繼續執行。這樣操作在系統線程較少的時候沒有多大問題,可是當線程數量非常多的時候,卻產生了問題。一是系統線程會占用非常多的內存空間,二是過多的線程切換占用大量的系統時間

而協程剛好可以解決上述的兩個問題。

3.2 協程的概念

協程就是把原來每個線程分別負責的任務壓縮到少量線程中,每個線程中用協程來實現原來線程級別的任務,因為包裝了系統io導致協程內遇到io不會導致當前線程被掛起,以起到最大化利用時間片,減少線程調度開銷的作用。

協程運行在線程之上,當一個協程運行完成后,可以選擇主動讓出,讓另一個協程運行在當前線程之上。

  1. 協程并沒有增加線程數量,只是在線程的基礎之上通過分時復用的方式運行多個協程
  2. 協程的切換在用戶態完成,切換的代價比線程從用戶態到內核臺的代價小很多。

3.3 協程的注意事項

實際上協程并不是什么銀彈,協程只有在等待IO的過程中才能重復利用線程,線程在等待IO的過程中會陷入阻塞狀態。

假設協程運行在線程之上,并且協程調用了一個阻塞IO操作,這時候會發生什么?實際上操作系統并不知道協程的存在,它只知道線程,因此在協程調用阻塞IO操作的時候,操作系統會讓線程進入阻塞狀態,當前的協程和其它綁定在該線程之上的協程都會陷入阻塞而得不到調度,這往往是不能接受的。

3.4 Java中的應用--虛擬線程

Java 19 已經預2022年9月20日發布,虛擬線程是其中的一項預覽功能。

虛擬線程是輕量級的線程,它們不與操作系統線程綁定,而是由 JVM 來管理。它們適用于“每個請求一個線程”的編程風格,同時沒有操作系統線程的限制。我們能夠創建數以百萬計的虛擬線程而不會影響吞吐。這與 Go 編程語言(Golang)的協程(如goroutines)非常相似。

Thread.startVirtualThread(() -> {
    System.out.println("Hello, Project Loom!");
});

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女禁区视频免费观看精选 | sese在线观看 | 日本黄大片影院一区二区 | 60老妇性xxxxhd | 亚洲卡一卡2卡三卡4麻豆 | 亚洲精品九色在线网站 | 成人永久免费 | 午夜爽喷水无码成人18禁三级 | 亚洲国产一区二区三区青草影视 | 皇上好大好硬好涨好深好爽 | 天天视频官网天天视频在线 | 亚洲精品欧洲久久婷婷99 | 精品国产区一区二区三区在线观看 | 91po国产在线高清福利 | 丝瓜黄瓜茄子西红柿秋葵榴莲 | jizzjizz大学生 | 国内剧情麻豆 | 沉沦艳妇杨幂肉体小说 | 免费一级毛片完整版在线看 | 99免费精品 | 国产精品久久久久久 | tube69中国露脸 | 91精品国产麻豆国产自产在线 | 女教师的一级毛片 | 天天综合天天色 | 美女的隐私无遮挡的网页 | 亚洲国产成人在人网站天堂 | 嗯啊视频在线观看 | 欧美日韩一区二区三区在线视频 | 美女校花被调教出奶水 | 爽爽窝窝午夜精品一区二区 | 国产婷婷高清在线观看免费 | 男人天堂网av | 91av爱爱| 欧美va免费精品高清在线 | 欧美a级v片在线观看一区 | 亚洲成人国产精品 | 98免费视频 | 日本高清动作片www欧美 | 国产日韩成人 | 美女牲交毛片一级视频 |