一篇文章幫你搞懂什么是java的進(jìn)程和線程
為什么會(huì)有進(jìn)程
在簡(jiǎn)單的批處理操作系統(tǒng)中,作業(yè)時(shí)串行執(zhí)行的,即一個(gè)作業(yè)一旦開(kāi)始執(zhí)行,它就會(huì)計(jì)算機(jī)系統(tǒng)的所有資源,直到運(yùn)行結(jié)束之后,下一個(gè)作業(yè)才可以繼續(xù)執(zhí)行。
在多道程序設(shè)計(jì)批處理的系統(tǒng)中,多個(gè)作業(yè)可以被載入內(nèi)存,從宏觀上看,多個(gè)作業(yè)并行執(zhí)行,他們共享處理器、內(nèi)存等計(jì)算機(jī)資源。
在分時(shí)系統(tǒng)中,為支持多用戶交互,處理器在時(shí)間維度上被劃為若干間隙,在每一時(shí)間間隙,一個(gè)用戶完全占有計(jì)算器資源。由于時(shí)間間隙很短,在宏觀上看,計(jì)算機(jī)任可以同時(shí)為多個(gè)用戶服務(wù)、提高計(jì)算機(jī)與用戶交互的效率。
程序或作業(yè)的并發(fā)執(zhí)行是現(xiàn)代操作系統(tǒng)的一個(gè)基本特征。并發(fā)執(zhí)行的程序必要滿足以下幾個(gè)特征才能稱(chēng)為真正意義上的并發(fā)執(zhí)行:
資源共享的需求、相互隔離的要求、通信和同步的要求
要實(shí)現(xiàn)多個(gè)程序的并發(fā)執(zhí)行,它們必需能夠共享處理器、內(nèi)存以及I/O設(shè)備等計(jì)算機(jī)資源。
盡管多個(gè)程序并發(fā)執(zhí)行,但在邏輯上各個(gè)程序應(yīng)當(dāng)是相互獨(dú)立的,即一個(gè)程序的執(zhí)行結(jié)果不受其它程序執(zhí)行的影響。
有時(shí)候,程序之間不完全是相互隔離的,而是存在依賴(lài)關(guān)系的,即需要進(jìn)行通信和同步。
所以要實(shí)現(xiàn)真正意義上的并發(fā),單純的依靠處理器的指令循環(huán)是遠(yuǎn)遠(yuǎn)不夠的。
進(jìn)程的概念
進(jìn)程是對(duì)一個(gè)計(jì)算任務(wù)的抽象和封裝,使每個(gè)計(jì)算任務(wù)更好地實(shí)現(xiàn)隔離性、資源共享性和同步的需求。
進(jìn)程的說(shuō)法有很多、可以這樣理解進(jìn)程的概念:
1.進(jìn)程是計(jì)算機(jī)程序在處理器上執(zhí)行時(shí)所發(fā)生的活動(dòng),即進(jìn)程時(shí)程序的一次執(zhí)行活動(dòng)
2.進(jìn)程是對(duì)一次計(jì)算任務(wù)的封裝和抽象、它是一個(gè)由執(zhí)行流、一個(gè)數(shù)據(jù)集、和相關(guān)的系統(tǒng)的資源組成的一個(gè)活動(dòng)單元。
3.進(jìn)程是程序執(zhí)行的一次實(shí)例,是動(dòng)態(tài)的概念、而程序本質(zhì)上是一個(gè)規(guī)則(是一個(gè)二進(jìn)制串、也就是機(jī)器指令)、通常以文件的形式存在、是靜態(tài)的概念、一個(gè)計(jì)算機(jī)可以同時(shí)運(yùn)行一個(gè)程序的多個(gè)進(jìn)程。
4.進(jìn)程之間共享計(jì)算機(jī)資源、并在邏輯上相互獨(dú)立、或者通過(guò)同步機(jī)制相互的協(xié)調(diào),共同的完成一項(xiàng)計(jì)算任務(wù)。
進(jìn)程的特征
進(jìn)程是由多程序的并發(fā)執(zhí)行而引出的,它和程序是兩個(gè)截然不同的概念。進(jìn)程的基本特征是對(duì)比單個(gè)程序的順序執(zhí)行提出的,也是對(duì)進(jìn)程管理提出的基本要求。
動(dòng)態(tài)性:進(jìn)程是程序的一次執(zhí)行,它有著創(chuàng)建、活動(dòng)、暫停、終止等過(guò)程,具有一定的生命周期,是動(dòng)態(tài)地產(chǎn)生、變化和消亡的。動(dòng)態(tài)性是進(jìn)程最基本的特征。
并發(fā)性:指多個(gè)進(jìn)程實(shí)體,同存于內(nèi)存中,能在一段時(shí)間內(nèi)同時(shí)運(yùn)行,并發(fā)性是進(jìn)程的重要特征,同時(shí)也是操作系統(tǒng)的重要特征。引入進(jìn)程的目的就是為了使程序能與其他進(jìn)程的程序并發(fā)執(zhí)行,以提高資源利用率。
獨(dú)立性:指進(jìn)程實(shí)體是一個(gè)能獨(dú)立運(yùn)行、獨(dú)立獲得資源和獨(dú)立接受調(diào)度的基本單位。凡未建立PCB的程序都不能作為一個(gè)獨(dú)立的單位參與運(yùn)行。
異步性:由于進(jìn)程的相互制約,使進(jìn)程具有執(zhí)行的間斷性,即進(jìn)程按各自獨(dú)立的、 不可預(yù)知的速度向前推進(jìn)。異步性會(huì)導(dǎo)致執(zhí)行結(jié)果的不可再現(xiàn)性,為此,在操作系統(tǒng)中必須配置相應(yīng)的進(jìn)程同步機(jī)制。
結(jié)構(gòu)性:每個(gè)進(jìn)程都配置一個(gè)PCB對(duì)其進(jìn)行描述。從結(jié)構(gòu)上看,進(jìn)程實(shí)體是由程序段、數(shù)據(jù)段和進(jìn)程控制段三部分組成的。
線程
是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。

線程的結(jié)構(gòu)
線程控制塊:與進(jìn)程控制塊類(lèi)似,包含了描述線程屬性的信息,如線程ID、線程的棧指針、程序計(jì)數(shù)器、條件碼和通用寄存器的值等,以及線程的執(zhí)行狀態(tài)(運(yùn)行、就緒等)。
線程執(zhí)行棧:保存一個(gè)線程執(zhí)行過(guò)程中的活動(dòng)記錄,包括用戶棧和內(nèi)核棧。其中用戶棧用于保存過(guò)程調(diào)用的活動(dòng)記錄,內(nèi)核棧用于保存系統(tǒng)調(diào)用的活動(dòng)記錄。執(zhí)行棧對(duì)于每個(gè)線程來(lái)說(shuō)都是私有的,因此不同線程的執(zhí)行流不會(huì)發(fā)生相互干擾。
線程局部存儲(chǔ)(TLS,Thread Local Storage):是某些操作系統(tǒng)為線程單獨(dú)提供的私有空間,用于存儲(chǔ)每個(gè)線程私有的全局變量,即一個(gè)線程內(nèi)部的各個(gè)過(guò)程調(diào)用都能訪問(wèn)、但其他線程不能訪問(wèn)的變量。
進(jìn)程之中創(chuàng)建線程的優(yōu)點(diǎn)
在一個(gè)進(jìn)程之中創(chuàng)建線程的優(yōu)點(diǎn):
1.在一個(gè)已有的進(jìn)程之中創(chuàng)建一個(gè)線程比創(chuàng)建一個(gè)新的進(jìn)程所需的開(kāi)銷(xiāo)時(shí)間要少許多、Mach開(kāi)發(fā)者的研究表明、創(chuàng)建一個(gè)線程比創(chuàng)建一個(gè)進(jìn)程快10倍。
2.終止一個(gè)線程比終止一個(gè)進(jìn)程所花費(fèi)的時(shí)間要少
3.同一個(gè)進(jìn)程內(nèi)線程之間的切換所花費(fèi)的時(shí)間要比進(jìn)程之間切換所花費(fèi)的時(shí)間要少
4.線程提高了程序之間的通信效率、在大多數(shù)的操作系統(tǒng)中、獨(dú)立的進(jìn)程之間的通信需要內(nèi)核的介入、但是同一個(gè)進(jìn)程之中的線程共享內(nèi)存和文件、同一個(gè)進(jìn)程之中的線程之間的通信不需要內(nèi)核的介入。
進(jìn)程和線程的區(qū)別
地址空間:
線程共享本進(jìn)程的地址空間,而進(jìn)程之間是獨(dú)立的地址空間。
資源:
線程共享本進(jìn)程的資源如內(nèi)存、I/O、cpu等,不利于資源的管理和保護(hù),而進(jìn)程之間的資源是獨(dú)立的,能很好的進(jìn)行資源管理和保護(hù)。
健壯性:
多進(jìn)程要比多線程健壯,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其他進(jìn)程產(chǎn)生影響,但是一個(gè)線程崩潰整個(gè)進(jìn)程都死掉。
執(zhí)行過(guò)程:
每個(gè)獨(dú)立的進(jìn)程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序入口,執(zhí)行開(kāi)銷(xiāo)大。
線程不能獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制,執(zhí)行開(kāi)銷(xiāo)小。
可并發(fā)性:
兩者均可并發(fā)執(zhí)行。
切換時(shí):
進(jìn)程切換時(shí),消耗的資源大,效率高。所以涉及到頻繁的切換時(shí),使用線程要好于進(jìn)程。同樣如果要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程不能用進(jìn)程。
線程是處理器調(diào)度的最小單位,但是進(jìn)程時(shí)操作系統(tǒng)資源分配的最小單位。
進(jìn)程和線程之間的關(guān)系
| 線程:進(jìn)程 | 描述 | 示例系統(tǒng) |
|---|---|---|
| 1:1 | 一個(gè)進(jìn)程中只有一個(gè)線程 | 比如UNIX |
| M:1 | 可以在一個(gè)進(jìn)程之中創(chuàng)建多個(gè)的線程、這些線程共享進(jìn)程用戶的地址空間 | Windows NT、Linux、MACH、Solaris |
| 1:M | 一個(gè)線程可以從一個(gè)進(jìn)程環(huán)境遷移到另一個(gè)進(jìn)程環(huán)境中 | RS、Emerald |
| M:N | 也就是結(jié)合了M:1和1:M的情況 | TRIX |
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
spring @EventListener 事件與監(jiān)聽(tīng)的示例詳解
本文介紹了自定義Spring事件和監(jiān)聽(tīng)器的方法,包括如何發(fā)布事件、監(jiān)聽(tīng)事件以及如何處理異步事件,通過(guò)示例代碼和日志,展示了事件的順序執(zhí)行和異步處理機(jī)制,感興趣的朋友一起看看吧2025-03-03
springboot項(xiàng)目之相互依賴(lài)報(bào)錯(cuò)問(wèn)題(基于idea)
這篇文章主要介紹了springboot項(xiàng)目之相互依賴(lài)報(bào)錯(cuò)問(wèn)題(基于idea),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringMVC的組件之HandlerExceptionResolver詳解
這篇文章主要介紹了SpringMVC的組件之HandlerExceptionResolver詳解,不管是在處理請(qǐng)求映射(HandlerMapping),還是在請(qǐng)求被處理(Handler)時(shí)拋出的異常,DispatcherServlet都會(huì)委托給HandlerExceptionResolver進(jìn)行異常處理,該接口只有一個(gè)方法,需要的朋友可以參考下2023-10-10
Swift洗牌動(dòng)畫(huà)效果的實(shí)現(xiàn)方法
這篇文章主要介紹了Swift洗牌動(dòng)畫(huà)效果的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2016-12-12
Java線程實(shí)現(xiàn)時(shí)間動(dòng)態(tài)顯示
這篇文章主要為大家詳細(xì)介紹了Java線程實(shí)現(xiàn)時(shí)間動(dòng)態(tài)顯示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
Java后臺(tái)Controller實(shí)現(xiàn)文件下載操作
這篇文章主要介紹了Java后臺(tái)Controller實(shí)現(xiàn)文件下載操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
Spring Boot與Kotlin定時(shí)任務(wù)的示例(Scheduling Tasks)
這篇文章主要介紹了Spring Boot與Kotlin定時(shí)任務(wù)的示例(Scheduling Tasks),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
java定時(shí)任務(wù)框架elasticjob詳解
這篇文章主要介紹了java定時(shí)任務(wù)框架elasticjob詳解,Elastic-Job是ddframe中dd-job的作業(yè)模塊中分離出來(lái)的分布式彈性作業(yè)框架。該項(xiàng)目基于成熟的開(kāi)源產(chǎn)品Q(chēng)uartz和Zookeeper及其客戶端Curator進(jìn)行二次開(kāi)發(fā)。,需要的朋友可以參考下2019-06-06
SpringBoot+WebSocket實(shí)現(xiàn)IM及時(shí)通訊的代碼示例
項(xiàng)目中碰到需要及時(shí)通訊的場(chǎng)景,使用springboot集成websocket,即可實(shí)現(xiàn)簡(jiǎn)單的及時(shí)通訊,本文介紹springboot如何集成websocket、IM及時(shí)通訊需要哪些模塊、開(kāi)發(fā)和部署過(guò)程中遇到的問(wèn)題、以及實(shí)現(xiàn)小型IM及時(shí)通訊的代碼,需要的朋友可以參考下2023-10-10

