文章目錄
- 一、關于操作系統
- 一、認識進程 process
- 二、認識線程
- 三、進程和線程的區別(重點!)
- 四、Java的線程和操作系統線程的關系
- 五、第一個多線程編程
一、關于操作系統
【操作系統】
-
驅動程序:
如:我們知道JDBC的驅動程序,就是讓JDBC和各個數據廠商的API進行適配。
由于硬件設備的種類繁多,廠商也各異。所以硬件廠商在開發硬件的同時會提供驅動,電腦裝了對應的驅動,才能讓系統正確識別硬件設備。 -
操作系統內核:
操作系統的核心功能(管理,對上,對下)。 -
系統調用:
操作系統給應用程序提供的API。
比如:有個程序想操作一下硬件設備,就需要先通過系統調用,把操作命令告訴給系統內核,內核調用驅動程序,進一步的操作硬件設備。
一、認識進程 process
1. 概念
一個運行起來的程序,就是一個“進程”,如果沒運行起來,就不算進程,可以叫做“程序”。進程(process)也可以叫做任務(task)。
進程是操作系統對一個正在運行的程序的一種抽象,換言之,可以把進程看做程序的一次運行過程;
同時,在操作系統內部,進程又是操作系統進行資源分配的基本單位。
2. 進程控制抽象塊(PCB Process Control Block)
計算機內部要管理任何現實事物,都需要將其抽象成一組有關聯的、互為一體的數據。在Java語言中,我們可以通過 類/對象 來描述這一特征。
// 以下代碼是 Java 代碼的偽碼形式,重在說明,無法直接運行
class PCB {// 進程的唯一標識 —— pid;// 進程關聯的程序信息,例如哪個程序,加載到內存中的區域等// 分配給該資源使用的各個資源// 進度調度信息(留待下面講解)
}
這樣,每一個PCB對象,就代表者一個實實在在運行著的程序,也就是進程。
操作系統再通過這種數據結構,如:線性表、搜索樹等PCB對象組織起來,方便管理時進行增刪改查的操作。
二、認識線程
1. 線程是什么?
一個線程就是一個“執行流”,每個線程之間都可以按照順序執行自己的代碼,多個線程之間“同時”執行著多份代碼。
2. 為什么要有線程?
(1)“并發編程”成為剛需。
- 單核CPU的發展遇到了瓶頸,要想提高算力,就需要多核CPU。而并發編程能更充分利用多核CPU資源。
- 有些任務場景需要“等待IO”,為了讓等待IO的時間能夠去做一些其他的工作,也需要用到并發編程。
(2)雖然多進程也能實現并發編程,但是線程比進程更輕量。
- 創建線程比創建進程更快;
- 銷毀線程比銷毀進程更快;
- 調度線程比調度進程更快。
(3)雖然線程比進程輕量,但是人們還不滿足,于是有了“線程池” (ThreadPool)和 “協程”(Coroutine)。
三、進程和線程的區別(重點!)
- 進程包含線程。每個進程至少有一個線程存在,即主線程。
- 進程和進程之間不共享內存空間,同一個進程的線程之間共享一個內存空間。
- 進程是系統分配資源的最小單位,線程是系統調度的最小單位。
四、Java的線程和操作系統線程的關系
線程是操作系統中的概念,操作系統內核實現了線程這樣的機制,并且對用戶提供了一些API供用戶使用(例如 Linux 的 pthread庫)
五、第一個多線程編程
【代碼】
//寫一個類,繼承自標準庫的Thread
class MyThread extends Thread {@Overridepublic void run() {System.out.println("hello word!");}
}
public class ThreadDemo1 {public static void main(String[] args) {//創建線程,是希望線程成為一個獨立的執行流(執行一段代碼)//創建線程是相當于雇了個人幫我們干活Thread t = new MyThread(); //這里就不用new標準庫的thread的了,而是剛才創建的子類t.start(); //線程中的特殊方法,啟動一個線程}
}
【運行結果】