『JavaWeb』進程

本篇博客主要討論一下操作系統中的進程和線程的簡單概念。

什麼是進程?


我們簡單的認爲,對於操作系統來說,一個任務就是一個進程(Process)

  • 課本概念程序的一個執行實例,正在執行的程序等
  • 內核觀點擔當分配系統資源(CPU時間、內存)的實體

程序和進程的關係

  • 程序靜態資源。程序是指令和數據的集合,可以作爲目標文件保存在磁盤中,或者作爲段存放在內存地址空間中。
  • 進程正在運行的程序進程是程序運行的一個具體的實例,程序總是運行在某個進程的上下文中。

下面,我們嘗試來查看一下系統進程
首先,我們先來寫一個Java程序。

public class Test {
	public static void main(String[] args) {
		while (true) {}
	}
}

打開cmd,編譯運行該程序
在這裏插入圖片描述
然後,我們按下shift + ctrl + esc打開任務管理器,選擇詳細信息,就可以看到剛運行起來的程序
在這裏插入圖片描述
這裏的PID指的是進程標識符,代表這個進程的代號。我們傳說中的Java虛擬機,本質上也只是系統中的進程

時間片


現代操作系統如:Windows、Mac OS、Linux等,都是支持多任務的操作系統。所謂的多任務,就是操作系統可以同時運行多個任務
操作系統的任務調度採用的是時間片輪轉的搶佔式調度方式,也就是說一個任務執行一小段時間後強制暫停去執行下一個任務,每個任務輪流執行
任務執行的一段時間叫做時間片任務正在執行時的狀態叫運行狀態任務執行一段時間後強制暫停去執行下一個任務,被暫停的任務就處於就緒狀態等待下一個屬於它的時間片的到來
這樣每個任務都能得到執行,由於CPU的執行效率非常高,時間片非常短,在各個任務之間快速切換,給人的感覺就是多個任務在“同時運行”

並行和併發


現在,多核CPU已經非常普及了,由於任務數量遠遠多於CPU的核心數量,所以,操作系統也會自動把很多任務輪流調度到每個核心上執行

  • 併發多個進程在一個CPU下采用時間片輪轉的方式,在一段時間之內,讓多個進程都得以推進,稱之爲併發
  • 並行多個進程在多個CPU下分別同時運行,稱之爲並行

用戶態和內核態


爲什麼要有用戶態和內核態
由於需要限制不同的程序之間的訪問能力防止它們獲取別的程序的內存數據或者獲取外圍設備的數據,併發送到網絡CPU劃分出兩個權限等級–用戶態和內核態

  • 內核態CPU可以訪問內存的所有數據,包括外圍設備,例如硬盤、網卡;
    操作系統內核主要完成以下工作進程管理、內存管理、文件管理、驅動管理等
  • 用戶態只能受限的訪問內存,且不允許訪問外圍設備,佔用CPU的能力被剝奪。

用戶態和內核態的切換
所有的用戶程序都是運行在用戶態的,但是有時候程序確實需要做一些內核態的事情,例如從硬盤讀取數據,或者從鍵盤獲取輸入等。而唯一可以做這些事情的就是操作系統,所以此時程序就需要向操作系統請求以程序的名義來執行這些操作
一個進程執行系統調用而陷入內核代碼中執行時,我們就稱進程處於內核運行態(或簡稱內核態)。當進程處於內核態時,執行的內核代碼會使用當前進程的內核棧。每個進程都有自己的內核棧。當進程在執行用戶自己的代碼時,則稱其處於用戶運行態(用戶態)。
內核態和用戶態是操作系統的兩種運行級別。如:Linux進程的4GB地址空間,3G-4G部分大家是共享的,是內核態的地址空間,這裏存放着整個內核的代碼和所以的內核模塊,以及內核所維護的數據用戶運行一個程序,該程序所創建的進程開始是運行在用戶態的,如果要執行文件操作,網絡數據發送等操作,必須通過write、send等系統調用,這些系統調用會調用內核中的代碼來完成操作,這時,必須切換倒內核態,進入3G-4G中的內核地址空間去執行這些代碼完成操作,完成後,回到用戶態。這樣,用戶態的程序就不能隨意操作內核地址空間,具有一定的安全保護作用。

用戶態切換到內核態的三種方式

  • 系統調用:這是用戶態進程主動要求切換到內核態的一種方式,用戶態進程通過系統調用申請使用操作系統提供的服務程序完成工作
  • 異常:當CPU在執行運行在用戶態下的程序時,發生了某些實現不可知的異常,這時會觸發由當前運行進程切換到處理異常的內核相關程序中,也就轉到了內核態,比如缺頁異常
  • 中斷:當外圍設備完成用戶請求的操作後,會向CPU發出相應的中斷信號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷信號對應的處理程序,如果先前執行的指令是用戶態下的程序,那麼這個轉換的過程自然也就發生了由用戶態到內核態的切換。比如硬盤讀寫操作完成,系統會切換到硬盤讀寫的中斷處理程序中執行後續操作等。

三種方式是系統在運行時由用戶態切換到內核態的最主要方式,其中系統調用可以認爲是用戶進程主動發起的異常和外圍設備中斷則是被動的

進程中的上下文


上下文簡單說來就是一個環境,進程在時間片輪轉切換時,由於每個進程運行環境不同,就涉及到轉換前後的上下文環境的切換

  • 一個進程在執行的時候,CPU的所有寄存器的值、進程的狀態以及堆棧上的內容
  • 切換時需要保存當前進程的所有狀態,即保存當前進程的進程上下文,以便再次執行該進程時,能夠恢復切換時的狀態,繼續執行

進程狀態


在這裏插入圖片描述

  • 就緒狀態進程處於可運行的狀態,只是CPU時間片還沒有輪轉到該進程,則該進程處於就緒狀態;
  • 運行狀態進程處於可運行的狀態,而且CPU時間片輪轉到該進程,該進程正在執行代碼,則該進程處於運行狀態;
  • 阻塞狀態進程不具備運行條件,正在等待某個事件的完成

阻塞狀態不能直接轉換到運行狀態就緒狀態轉換到運行狀態由操作系統來決定,用戶只能將進程從阻塞狀態轉換爲就緒狀態

發佈了199 篇原創文章 · 獲贊 365 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章