一、進程
進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。
- 在早期面向進程設計的計算機結構中,進程是程序的基本執行實體。
- 在當代面向線程設計的計算機結構中,進程是線程的容器。
程序是指令、數據及其組織形式的描述,進程是程序的實體。
1.1 進程切換
進程從硬盤讀取我們的程序代碼,這個時候是比較費時的,CPU不會阻塞在這裏等着,而是切換到其他進程,當數據加載完成時,CPU會收到箇中斷,繼續執行這個請求。
對於單核CPU而言,短時間內會執行多個進程,造成並行的錯覺,實際可以理解爲是併發的操作。
1.2 內核態與用戶態
進程分爲用戶進程和內核進程兩種。
爲了安全,用戶進程是受限的,它不能隨意訪問資源、獲取資源。所以,由內核進程負責管理和分配資源,它具有最高權限,而用戶進程使用被分配的資源。且,操作系統必須能夠在有需要的時候能立即切換回內核進程(通過中斷),只有這樣,操作系統纔能有安全感。
1.3 用戶態向內核態切換
1、發生系統調用時
2、產生異常時
3、外設產生中斷時
這裏不做過多解釋了,感興趣同學自行學習linux原理。
二、線程
線程(英語:thread)是操作系統能夠進行運算調度的最小單位。
它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以併發多個線程,每條線程並行執行不同的任務。
2.1 進程與線程的關係
1、一個進程中可以同時存在多個線程;
2、各個線程之間可以併發執行;
3、各個線程之間可以共享當前線程中的地址空間和文件等資源;
4、線程是調度的基本單位,而進程則是資源擁有的基本單位;
5、當進程只有一個線程時,可以認爲進程就等於線程;
2.2 線程內存模型
1) 在看線程內存模型之前,我們首先看下計算機的硬件內存模型。
寄存器:寄存器部件,包括通用寄存器、專用寄存器和控制寄存器。通用寄存器又可分定點數和浮點數兩類,它們用來保存指令執行過程中臨時存放的寄存器操作數和中間(或最終)的操作結果。 通用寄存器是中央處理器的重要部件之一。
高速多級緩存:用於解決CPU核心與內存的速度差異問題,CPU核心速度快,內存相比要慢很多,而緩存要比內存速度快。
緩存協議:多級緩存的引入在多核CPU時代導致了緩存不一致的問題,這裏需要引入MESI協議緩存解決這一問題,保證緩存中的信息與內存中的信息一致。MESI協議緩存這裏不做講解。
2)下一步我們看下java內存模型與線程模型的關係
java程序的一次編寫到處運行如何體現的?
jvm內存模型屏蔽了不同硬件的內存模型。jvm內存模型規定,所有的變量都存儲在jvm主內存中,即堆內存,這裏指可共享的變量(new出來的實例化對象,數組等)。這裏提出主內存與工作內存的概念,每個線程有自己的工作內存,保存自己私有的變量,線程從主內存獲取變量的副本作爲自己的私有變量,不允許直接操作主內存的變量。線程的工作內存也是獨立的,無法操作其他線程的變量。
3)硬件內存模型與jvm內存模型的關係
如下圖所示,jvm內存模型和硬件內存模型相似,但並不完全相同。但是jvm的數據大部分會存儲到硬件主內存中,部分會存儲到寄存器或緩存中,這裏只做簡單說明。