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