进程、线程相关知识点整理
什么是進(jìn)程
進(jìn)程是一個(gè)具有獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)。它可以申請(qǐng)和擁有系統(tǒng)資源,是一個(gè)動(dòng)態(tài)的概念,是一個(gè)活動(dòng)的實(shí)體。
進(jìn)程是一個(gè)“執(zhí)行中的程序”。程序是一個(gè)沒有生命的實(shí)體,只有處理器賦予程序生命時(shí),它才能成為一個(gè)活動(dòng)的實(shí)體,我們稱其為進(jìn)程。
進(jìn)程的三種基本狀態(tài)
a. 運(yùn)行狀態(tài):獲得CPU的進(jìn)程處于此狀態(tài),對(duì)應(yīng)的程序在CPU上運(yùn)行著
b. 阻塞狀態(tài):為了等待某個(gè)外部事件的發(fā)生(如等待I/O操作的完成,等待另一個(gè)進(jìn)程發(fā)來消息),暫時(shí)無法運(yùn)行。也稱為等待狀態(tài)
c. 就緒狀態(tài):具備了一切運(yùn)行需要的條件,由于其他進(jìn)程占用CPU而暫時(shí)無法運(yùn)行
進(jìn)程狀態(tài)轉(zhuǎn)換
a. 運(yùn)行狀態(tài) ===> 阻塞狀態(tài):例如正在運(yùn)行的進(jìn)程提出I/O請(qǐng)求,由運(yùn)行狀態(tài)轉(zhuǎn)化為阻塞狀態(tài)
b. 阻塞狀態(tài) ===> 就緒狀態(tài):例如I/O操作完成之后,由阻塞狀態(tài)轉(zhuǎn)化為就緒狀態(tài)
c. 就緒狀態(tài) ===> 運(yùn)行狀態(tài):例如就緒狀態(tài)的進(jìn)程被進(jìn)程調(diào)度程序選中,分配到CPU中運(yùn)行,由就緒狀態(tài)轉(zhuǎn)化為運(yùn)行狀態(tài)
d. 運(yùn)行狀態(tài) ===> 就緒狀態(tài):處于運(yùn)行狀態(tài)的進(jìn)程的時(shí)間片用完,不得不讓出CPU,由運(yùn)行狀態(tài)轉(zhuǎn)化為就緒狀態(tài)
???
進(jìn)程間通信主要包括
?
管道( pipe ):管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng),而且只能在具有親緣關(guān)系的進(jìn)程間使用。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。
?
有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關(guān)系進(jìn)程間的通信。
?
信號(hào)量( semophore ) : 信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來控制多個(gè)進(jìn)程對(duì)共享資源的訪問。它常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問共享資源時(shí),其他進(jìn)程也訪問該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。
?
消息隊(duì)列( message queue ) : 消息隊(duì)列是由消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。
?
信號(hào) ( sinal ) : 信號(hào)是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生。
?
共享內(nèi)存( shared memory ) :共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪問。共享內(nèi)存是最快的IPC方式,它是針對(duì)其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的。它往往與其他通信機(jī)制,如信號(hào)兩,配合使用,來實(shí)現(xiàn)進(jìn)程間的同步和通信。
?
套接字( socket ) : 套解口也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于不同及其間的進(jìn)程通信。
?
注:?
全雙工指在發(fā)送數(shù)據(jù)的同時(shí)也能夠接收數(shù)據(jù),兩者同步進(jìn)行。目前的網(wǎng)卡一般都支持全雙工。
所謂半雙工就是指一個(gè)時(shí)間段內(nèi)只有一個(gè)動(dòng)作發(fā)生,早期的對(duì)講機(jī)、以及早期集線器等設(shè)備都是基于半雙工的產(chǎn)品。
?
什么是線程
線程有可能和其他線程共享一些資源,比如,內(nèi)存,文件,數(shù)據(jù)庫(kù)等。
當(dāng)多個(gè)線程同時(shí)讀寫同一份共享資源的時(shí)候,可能會(huì)引起沖突。這時(shí)候,我們需要引入線程“同步”機(jī)制,即各位線程之間要有個(gè)先來后到,不能一窩蜂擠上去搶作一團(tuán)。
線程同步的真實(shí)意思和字面意思恰好相反。線程同步的真實(shí)意思,其實(shí)是“排隊(duì)”:幾個(gè)線程之間要排隊(duì),一個(gè)一個(gè)對(duì)共享資源進(jìn)行操作,而不是同時(shí)進(jìn)行操作。
進(jìn)程,線程對(duì)比
把進(jìn)程作為分配資源的基本單位,而把線程作為獨(dú)立運(yùn)行和獨(dú)立調(diào)度的基本單位
線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源.
線程同步的方法
(1)wait():使一個(gè)線程處于等待狀態(tài),并且釋放所持有的對(duì)象的lock。
(2)sleep():使一個(gè)正在運(yùn)行的線程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法,調(diào)用此方法要捕捉InterruptedException異常。
(3)notify():喚醒一個(gè)處于等待狀態(tài)的線程,注意的是在調(diào)用此方法的時(shí)候,并不能確切的喚醒某一個(gè)等待狀態(tài)的線程,而是由JVM確定喚醒哪個(gè)線程,而且不是按優(yōu)先級(jí)。
(4)notityAll ():喚醒所有處入等待狀態(tài)的線程,注意并不是給所有喚醒線程一個(gè)對(duì)象的鎖,而是讓它們競(jìng)爭(zhēng)。
?
用戶級(jí)線程和內(nèi)核級(jí)線程
?
1?.內(nèi)核級(jí)線程:切換由內(nèi)核控制,當(dāng)線程進(jìn)行切換的時(shí)候,由用戶態(tài)轉(zhuǎn)化為內(nèi)核態(tài)。切換完畢要從內(nèi)核態(tài)返回用戶態(tài);可以很好的利用多核cpu。
2. 用戶級(jí)線程內(nèi)核的切換由用戶態(tài)程序自己控制內(nèi)核切換,不需要內(nèi)核干涉,少了進(jìn)出內(nèi)核態(tài)的消耗,但不能很好的利用多核Cpu。
?
以下是用戶級(jí)線程和內(nèi)核級(jí)線程的區(qū)別:
(1)內(nèi)核支持線程是OS內(nèi)核可感知的,而用戶級(jí)線程是OS內(nèi)核不可感知的。
(2)用戶級(jí)線程的創(chuàng)建、撤消和調(diào)度不需要OS內(nèi)核的支持,是在語言(如Java)這一級(jí)處理的;而內(nèi)核支持線程的創(chuàng)建、撤消和調(diào)度都需OS內(nèi)核提供支持,而且與進(jìn)程的創(chuàng)建、撤消和調(diào)度大體是相同的。
(3)用戶級(jí)線程執(zhí)行系統(tǒng)調(diào)用指令時(shí)將導(dǎo)致其所屬進(jìn)程被中斷,而內(nèi)核支持線程執(zhí)行系統(tǒng)調(diào)用指令時(shí),只導(dǎo)致該線程被中斷。
(4)在只有用戶級(jí)線程的系統(tǒng)內(nèi),CPU調(diào)度還是以進(jìn)程為單位,處于運(yùn)行狀態(tài)的進(jìn)程中的多個(gè)線程,由用戶程序控制線程的輪換運(yùn)行;在有內(nèi)核支持線程的系統(tǒng)內(nèi),CPU調(diào)度則以線程為單位,由OS的線程調(diào)度程序負(fù)責(zé)線程的調(diào)度。
(5)用戶級(jí)線程的程序?qū)嶓w是運(yùn)行在用戶態(tài)下的程序,而內(nèi)核支持線程的程序?qū)嶓w則是可以運(yùn)行在任何狀態(tài)下的程序。
內(nèi)核線程的優(yōu)點(diǎn):
(1)當(dāng)有多個(gè)處理機(jī)時(shí),一個(gè)進(jìn)程的多個(gè)線程可以同時(shí)執(zhí)行。
缺點(diǎn):
(1)由內(nèi)核進(jìn)行調(diào)度。
用戶線程的優(yōu)點(diǎn):
(1) 線程的調(diào)度不需要內(nèi)核直接參與,控制簡(jiǎn)單。
(2) 可以在不支持線程的操作系統(tǒng)中實(shí)現(xiàn)。
(3) 創(chuàng)建和銷毀線程、線程切換代價(jià)等線程管理的代價(jià)比內(nèi)核線程少得多。
(4)?允許每個(gè)進(jìn)程定制自己的調(diào)度算法,線程管理比較靈活。這就是必須自己寫管理程序,與內(nèi)核線程的區(qū)別
(5) 線程能夠利用的表空間和堆棧空間比內(nèi)核級(jí)線程多。
(6) 同一進(jìn)程中只能同時(shí)有一個(gè)線程在運(yùn)行,如果有一個(gè)線程使用了系統(tǒng)調(diào)用而阻塞,那么整個(gè)進(jìn)程都會(huì)被掛起。另外,頁(yè)面失效也會(huì)產(chǎn)生同樣的問題。
缺點(diǎn):
(1)資源調(diào)度按照進(jìn)程進(jìn)行,多個(gè)處理機(jī)下,同一個(gè)進(jìn)程中的線程只能在同一個(gè)處理機(jī)下分時(shí)復(fù)用
?
?
本貼是博主借鑒多個(gè)網(wǎng)站進(jìn)行的整理,由于過多不在此一一謝過。
?
?最后再給大家推薦兩個(gè)網(wǎng)站
?漫畫教你理解進(jìn)程線程
?我是一個(gè)線程
?
轉(zhuǎn)載于:https://www.cnblogs.com/CZDblog/p/5581073.html
總結(jié)
以上是生活随笔為你收集整理的进程、线程相关知识点整理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Win10】UAP/UWP/通用 开发
- 下一篇: 【SpringMVC学习07】Sprin