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