Java線程之多線程與多進程(1)——以操作系統的角度述說線程與進程

任務調度

線程是什么?要理解這個概念,須要先了解一下操作系統的一些相關概念。大部分操作系統(WindowsLinux)任務調度是采用時間片輪轉的搶占式調度方式,也就是說一個任務執行一小段時間后強制暫停去執行下一個任務每個任務輪流執行。任務執行的一小段時間叫做時間片,任務正在執行時的狀態叫運行狀態,任務執行一段時間后強制暫停去執行下一個任務,被暫停的任務就處于就緒狀態等待下一個屬于它的時間片的到來。這樣每個任務都能得到執行,由于CPU的執行效率非常高,時間片非常短,在各個任務之間快速地切換,給人的感覺就是多個任務在“同時進行”,這也就是我們所說的并發(別覺得并發有多高深,它的實現很復雜,但它的概念很簡單,就是一句話:多個任務同時執行)。多任務運行過程的示意圖如下:


圖?1操作系統中的任務調度

進程

????????我們都知道計算機的核心是CPU,它承擔了所有的計算任務;而操作系統是計算機的管理者,它負責任務的調度、資源的分配和管理,統領整個計算機硬件;應用程序側是具有某種功能的程序,程序是運行于操作系統之上的。

????????進程是一個具有一定獨立功能程序在一個數據集上的一次動態執行的過程,是操作系統進行資源分配調度的一個獨立單位,是應用程序運行的載體。進程是一種抽象的概念,從來沒有統一的標準定義。進程一般由程序、數據集合和進程控制塊三部分組成。程序用于描述進程要完成的功能,是控制進程執行的指令集;數據集合是程序在執行時所需要的數據和工作區;程序控制塊(Program?Control?Block,簡稱PCB)包含進程的描述信息控制信息,是進程存在的唯一標志。

進程具有的特征:

動態性:進程是程序的一次執行過程,是臨時的,有生命期的,是動態產生,動態消亡的;

并發性:任何進程都可以同其他進程一起并發執行;

獨立性:進程是系統進行資源分配和調度的一個獨立單位;

結構性:進程由程序、數據和進程控制塊三部分組成。

線程

????????在早期的操作系統中并沒有線程的概念,進程是能擁有資源和獨立運行的最小單位,也是程序執行的最小單位。任務調度采用的是時間片輪轉的搶占式調度方式,而進程是任務調度的最小單位,每個進程有各自獨立的一塊內存,使得各個進程之間內存地址相互隔離。

????????后來,隨著計算機的發展,對CPU的要求越來越高,進程之間的切換開銷較大,已經無法滿足越來越復雜的程序的要求了。于是就發明了線程,線程是程序執行中一個單一的順序控制流程,是程序執行流的最小單元,是處理器調度和分派的基本單位。一個進程可以有一個或多個線程,各個線程之間共享程序的內存空間(也就是所在進程的內存空間)。一個標準的線程由線程ID、當前指令指針(PC)、寄存器和堆棧組成。而進程由內存空間(代碼、數據、進程空間、打開的文件)和一個或多個線程組成

??

進程與線程的區別

前面講了進程與線程,但可能你還覺得迷糊,感覺他們很類似。的確,進程與線程有著千絲萬縷的關系,下面就讓我們一起來理一理:

1.線程是程序執行的最小單位,而進程是操作系統分配資源的最小單位;

2.一個進程由一個或多個線程組成,線程是一個進程中代碼的不同執行路線;

3.進程之間相互獨立,但同一進程下的各個線程之間共享程序的內存空間(包括代碼段、數據集、堆等)及一些進程級的資源(如打開文件和信號),某進程內的線程在其它進程不可見;

4.調度和切換:線程上下文切換比進程上下文切換要快得多。

線程與進程關系的示意圖:


圖?2進程與線程的資源共享關系

?


圖?3:單線程與多線程的關系

?

總之,線程和進程都是一種抽象的概念,線程是一種比進程更小的抽象,線程和進程都可用于實現并發。

多線程與多核

??上面提到的時間片輪轉的調度方式說一個任務執行一小段時間后強制暫停去執行下一個任務,每個任務輪流執行。很多操作系統的書都說“同一時間點只有一個任務在執行”。那有人可能就要問雙核處理器呢?難道兩個核不是同時運行嗎?

??其實“同一時間點只有一個任務在執行”這句話是不準確的,至少它是不全面的。那多核處理器的情況下,線程是怎樣執行呢?這就需要了解內核線程。

??多核()處理器是指在一個處理器上集成多個運算核心從而提高計算能力,也就是有多個真正并行計算的處理核心,每一個處理核心對應一個內核線程。內核線程(Kernel?Thread,?KLT)就是直接由操作系統內核支持的線程,這種線程由內核來完成線程切換,內核通過操作調度器對線程進行調度,并負責將線程的任務映射到各個處理器上。一般一個處理核心對應一個內核線程,比如單核處理器對應一個內核線程,雙核處理器對應兩個內核線程,四核處理器對應四個內核線程。

??現在的電腦一般是雙核四線程、四核八線程,是采用超線程技術將一個物理處理核心模擬成兩個邏輯處理核心,對應兩個內核線程,所以在操作系統中看到的CPU數量是實際物理CPU數量的兩倍,如你的電腦是雙核四線程,打開“任務管理器\性能”可以看到4CPU的監視器,四核八線程可以看到8CPU的監視器。

? ?

????????????????圖?6 :雙核四線程在 Windows10 下查看的結果

????????超線程技術就是利用特殊的硬件指令,把一個物理芯片模擬成兩個邏輯處理核心,讓單個處理器都能使用線程級并行計算,進而兼容多線程操作系統和軟件,減少了CPU的閑置時間,提高的CPU的運行效率。這種超線程技術(如雙核四線程)由處理器硬件的決定,同時也需要操作系統的支持才能在計算機中表現出來。

??程序一般不會直接去使用內核線程,而是去使用內核線程的一種高級接口——輕量級進程(Light?Weight?ProcessLWP),輕量級進程就是我們通常意義上所講的線程(我們在這稱它為用戶線程),由于每個輕量級進程都由一個內核線程支持,因此只有先支持內核線程,才能有輕量級進程。用戶線程與內核線程的對應關系有三種模型:一對一模型、多對一模型、多對多模型,在這以4個內核線程、3個用戶線程為例對三種模型進行說明。

一對一模型

??對于一對一模型來說,一個用戶線程就唯一地對應一個內核線程(反過來不一定成立,一個內核線程不一定有對應的用戶線程)。這樣,如果CPU沒有采用超線程技術(如四核四線程的計算機),一個用戶線程就唯一地映射到一個物理CPU的線程,線程之間的并發是真正的并發。一對一模型使用戶線程具有與內核線程一樣的優點,一個線程因某種原因阻塞時其他線程的執行不受影響;此處,一對一模型也可以讓多線程程序在多處理器的系統上有更好的表現。

但一對一模型也有兩個缺點:1.許多操作系統限制了內核線程的數量,因此一對一模型會使用戶線程的數量受到限制;2.許多操作系統內核線程調度時,上下文切換的開銷較大,導致用戶線程的執行效率下降。

?

?

圖?7:一對一模型

多對一模型

多對一模型將多個用戶線程映射到一個內核線程上,線程之間的切換由用戶態的代碼來進行,因此相對一對一模型,多對一模型的線程切換速度要快許多;此外,多對一模型對用戶線程的數量幾乎無限制。但多對一模型也有兩個缺點:1.如果其中一個用戶線程阻塞,那么其它所有線程都將無法執行,因為此時內核線程也隨之阻塞了;2.在多處理器系統上,處理器數量的增加對多對一模型的線程性能不會有明顯的增加,因為所有的用戶線程都映射到一個處理器上了。

?

圖?8:多對一模型

多對多模型

??多對多模型結合了一對一模型和多對一模型的優點,將多個用戶線程映射到多個內核線程上。

??多對多模型的優點有:1.一個用戶線程的阻塞不會導致所有線程的阻塞,因為此時還有別的內核線程被調度來執行;2.多對多模型對用戶線程的數量沒有限制;3.在多處理器的操作系統中,多對多模型的線程也能得到一定的性能提升,但提升的幅度不如一對一模型的高。

??在現在流行的操作系統中,大都采用多對多的模型。

?

圖?9:多對多模型

查看進程與線程

一個應用程序可能是多線程的,也可能是多進程的,如何查看呢?在Windows下我們只須打開任務管理器就能查看一個應用程序的進程和線程數。按“Ctrl+Alt+Del”或右鍵快捷工具欄打開任務管理器。

查看進程數和線程數:

?

圖?10:查看線程數和進程數

在“進程”選項卡下,我們可以看到一個應用程序包含的線程數。如果一個應用程序有多個進程,我們能看到每一個進程,如在上圖中,Googlechrome瀏覽器就有多個進程。同時,如果打開了一個應用程序的多個實例也會有多個進程,如上圖中我打開了兩個cmd窗口,就有兩個cmd進程。如果看不到線程數這一列,可以在點擊“查看\選擇列”菜單,增加監聽的列。

查看CPU和內存的使用率:

在性能選項卡中,我們可以查看CPU和內存的使用率,根據CPU使用記錄的監視器的個數還能看出邏輯處理核心的個數,如我的雙核四線程的計算機就有四個監視器。

?

圖?11:查看CPU和內存的使用率

線程的生命周期

當線程的數量小于處理器的數量時,線程的并發是真正的并發,不同的線程運行在不同的處理器上。但當線程的數量大于處理器的數量時,線程的并發會受到一些阻礙,此時并不是真正的并發,因為此時至少有一個處理器會運行多個線程。

在單個處理器運行多個線程時,并發是一種模擬出來的狀態。操作系統采用時間片輪轉的方式輪流執行每一個線程。現在,幾乎所有的現代操作系統采用的都是時間片輪轉的搶占式調度方式,如我們熟悉的UnixLinuxWindowsMac?OS?X等流行的操作系統。

我們知道線程是程序執行的最小單位,也是任務執行的最小單位。在早期只有進程的操作系統中,進程有五種狀態,創建、就緒、運行、阻塞(等待)、退出。早期的進程相當于現在的只有單個線程的進程,那么現在的多線程也有五種狀態,現在的多線程的生命周期與早期進程的生命周期類似。

?

圖?12:早期進程的生命周期

進程在運行過程有三種狀態:就緒、運行、阻塞,創建和退出狀態描述的是進程的創建過程和退出過程。

創建:進程正在創建,還不能運行。操作系統在創建進程時要進行的工作包括分配和建立進程控制塊表項、建立資源表格并分配資源、加載程序并建立地址空間;

就緒:時間片已用完,此線程被強制暫停,等待下一個屬于他的時間片到來;

運行:此線程正在執行,正在占用時間片;

阻塞:也叫等待狀態,等待某一事件(IO或另一個線程)執行完;

退出:進程已結束,所以也稱結束狀態,釋放操作系統分配的資源。

?

圖?13:線程的生命周期

創建:一個新的線程被創建,等待該線程被調用執行;

就緒:時間片已用完,此線程被強制暫停,等待下一個屬于他的時間片到來;

運行:此線程正在執行,正在占用時間片;

阻塞:也叫等待狀態,等待某一事件(IO或另一個線程)執行完;

退出:一個線程完成任務或者其他終止條件發生,該線程終止進入退出狀態,退出狀態釋放該線程所分配的資源。



----------------------------結束-------->



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274023.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274023.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274023.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用 PS 調整服務器時間

用 PS 調整服務器時間 Powershell 有一個命令用來調整計算機的時間, Set-Date -Adjust,但是,只能調整本地時間,不能調整遠程的計算機時間。 function AdjustDCTime ( $Server, $addTime ){ $Svr Get-WmiObject Win32_Operatin…

Java線程之多線程與多進程(2)——線程優先級與線程安全

線程優先級 現在主流操作系統(如Windows、Linux、Mac OS X)的任務調度除了具有前面提到的時間片輪轉的特點外,還有優先級調度(Priority Schedule)的特點。優先級調度決定了線程按照什么順序輪流執行,在具有優先級調度的系統中,線程擁有各自的…

mahout貝葉斯算法開發思路(拓展篇)1

首先說明一點,此篇blog解決的問題是就下面的數據如何應用mahout中的貝葉斯算法?(這個問題是在上篇(。。。完結篇)blog最后留的問題,如果想直接使用該工具,可以在mahout貝葉斯算法拓展下載&#…

Java線程之多線程與多進程(3)——Java中的多線程

單線程 任何程序至少有一個線程,即使你沒有主動地創建線程,程序從一開始執行就有一個默認的線程,被稱為主線程,只有一個線程的程序稱為單線程程序。如下面這一簡單的代碼,沒有顯示地創建一個線程,程序從mai…

幾種常用控件的使用方法

1.UIActivityIndicatorView的使用 UIActivityIndicatorView *activity[[[UIActivityIndicatorViewalloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]autorelease]; z [activity setFrame:CGRectMake(150,150, 50, 50)]; [self.window addSubview:activ…

Java-正則表達式

什么是正則表達式? 正則表達式(Regular Expression)就是用某種模式去匹配一類字符串的公式。如你要在一篇文章中查找第一個字是“李”最后一個字是“建”的三個字的姓名,即“李*建”;那么“李*建”就是公式,也稱作模式(Pattern)&a…

tab標簽的另一種寫法

<div class"good"><ul><li><span>歌曲精選</span></li><li class"other"><span>MV精選</span></li></ul><div class"music_good"><p><span>丁當</span…

java 中 if與while的區別

if&#xff1a;就是一個判斷的&#xff0c;如果滿足后面的條件就繼續運行if語句里面的東西的&#xff0c;要是不滿足就跳出來&#xff0c;執行else語句或執行下面的語句的 。while&#xff1a;就是循環語句的&#xff0c;當滿足while里面的條件時&#xff0c;就會執行里面的循環…

install yael on the ubuntu 12.04

1. bits/predefs.h no such file or directory ??? sudo apt-get install gcc-multilib 2. sudo gedit /etc/profile PATH$PATH:/usr/local/MATLAB/R2012a/bin source /etc/profile 3.ubuntu 切換gcc 版本 1&#xff09;sudo apt-get install gcc-4.4 g-4.4 g-4.4-multi…

Java 線程多線程編程3---線程同步之生產者與消費者問題

生產者與消費者問題&#xff1a; 第一步&#xff1a;把架子搭起來 package com.zhj.www;public class ProceduerConsumer {public static void main(String[] args) {} }//饅頭實體 class wotou{int id;wotou(int id) {this.id id;}public String toString() {return "wo…

windows 服務實例

參考來源:http://blog.csdn.net/morewindows/article/details/6858216 參考來源: http://hi.baidu.com/tfantasy/item/aefa43d66b470a2b38f6f76c 剩下的都是我自己整理的。 在VS2012中新建一個Windows 服務的項目。然后在解決方案目錄下找到Services1.cs&#xff0c;切換到代碼…

Java 線程多線程編程2---線程同步

來模擬一個死鎖&#xff08;互相等待&#xff09;&#xff1a; TestDeadLock.java package com.zhj.www;public class TestDeadLock implements Runnable {public int flag 1;static Object o1 new Object();static Object o2 new Object();public void run() {System.out.p…

Java網絡編程1---基礎

TCP/IP:事實上的標準 自己編的應用程序&#xff1a;應用層 TCP/UDP層 IP層 物理層 數據封裝&#xff1a;第五層只與第四層打交道。 數據拆封《TCP/IP詳解》網絡底層 IP巨大的貢獻&#xff1a;提供了獨一無二的IP地址。 內網IP&#xff1a;虛假的 子網掩碼&#xff1a;255.255.2…

Java網絡編程2---Socket-TCP編程

Sockct:插座Socket是關于TCP的。 端口號&#xff1a;兩個字節->65536個端口號&#xff0c;一個應用程序占多個端口號&#xff1b; 但是假設一個應用程序占一個端口號&#xff1b;一臺電腦會有65535個應用程序。 自己編寫程序要占用端口號1024以上后的。 80端口&#xff1a;網…

winform綁定多張圖片

開發winform程序的時候經常設計到要顯示多張圖片的問題&#xff0c;其解決思路一般是先遍歷文件夾中的所有圖片&#xff0c;然后再把這些圖片添加到ImageList控件中&#xff0c;最后再綁定顯示出來。這里我們介紹兩種綁定的方法&#xff1a; &#xff08;一&#xff09;動態生成…

Java網絡編程3---Socket-UDP編程

栗子&#xff1a;TestUDPServer.java 服務器端&#xff1a; package com.zhj.www;import java.net.DatagramPacket; import java.net.DatagramSocket;public class TestUDPServer {public static void main(String[] args)throws Exception {byte buf[] new byte[1024];Datagr…

iOS 6 自動布局入門

http://www.raywenderlich.com/zh-hans/22873/ios-6-自動布局-入門&#xff0d;1轉載于:https://www.cnblogs.com/ihojin/p/auto-layout.html

Java GUI 基礎知識

這部分主要包含AWT、組件和容器、布局管理器Component&#xff1a;所有可以和用戶交互的圖形元素&#xff0c;他的子類有&#xff1a;輸入框… Java.awt及其子包 Container&#xff1a;容器&#xff0c;容納其他各種各樣的Component的元素。 Panel&#xff1a;可以容納其他元素…

UVA11300

初步解題原理:代數運算單元素極值 代數運算: xi表示第i個給i-1的數量&#xff0c;正負表示給或得 c(a1a2a3....an)/n a1-x1x2c -->x2x1-a1c a2-x2x3c -->x3x1-a1-a22c a3-x3x4c -->x4x1-a1-a2-a33c ...... an-xnx1c -->xnx1-a1-a2-a3....-a(n-1)(n-1)c ansmax{|x1|…

Java GUI 基礎知識2 監聽機制

TestActionEvent.java沒有調用方法&#xff0c;但是有反應。反應自己要編寫程序有反應。 事件模型&#xff1a;一定要有某些反應。 寫程序&#xff0c;監聽的操作是自動發生的&#xff0c;一直監聽。鉤子函數&#xff0c;&#xff08;回調函數&#xff09; 怎么讓它自動執行&am…