一個進程包括由操作系統分配的內存空間,包含一個或多個線程。一個線程不能獨立的存在,它必須是進程的一部分。一個進程一直運行,直到所有的非守護線程都結束運行后才能結束。
多線程能滿足程序員編寫高效率的程序來達到充分利用 CPU 的目的。
一、進程
1、什么是進程
進程(Process) 是計算機中的程序關于某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。 在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。
程序并不能單獨運行,只有將程序裝載到內存中,系統為它分配資源才能運行,而這種執行的程序就稱之為進程。程序和進程的區別就在于:程序是指令的集合,它是進程運行的靜態描述文本;進程是程序的一次執行活動,屬于動態概念。
2、進程的特點
- 進程是程序的一次執行過程。
- 進程是是正在運行程序的抽象。它代表運行的CPU,也稱進程是對CPU的抽象。
- 系統資源(如內存、文件)以進程為單位分配。
- 操作系統為每個進程分配了獨立的地址空間
- 操作系統通過“調度”把控制權交給進程。
二、線程
1、什么是線程
線程(thread) 是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發多個線程,每條線程并行執行不同的任務。
線程由線程ID,程序計數器(PC)[用于指向內存中的程序指令],寄存器集合[由于存放本地變量和臨時變量]和堆棧[用于存放方法指令和方法參數等]組成。
2、為什么引入線程
主要歸咎于兩點. 一個是由實現決定的,一個是由需求決定的.
- 進程是資源調度的單位, 因此進程之間的切換的代價和開銷比較大.
- 一個進程內可能需要多任務并發的執行,實現不同的功能.
3、進程與線程的區別
- 進程是擁有系統資源的,系統會給進程分配一個完整的虛擬地址空間.(不同進程無法共享相同的內存空間)
- 線程除了少量必要的資源外(存放本地變量),幾乎不需要資源,因此它與資源分配無關。
- 進程之間相互獨立,且不能共享資源
- 在同一進程的線程之間,可以共享進程的所有資源。
- 一個線程掛掉,整個進程都會跟著掛掉,而多進程應用,進程掛掉,不會影響到其他進程。多進程的程序要比多線程的程序健壯。
- 線程上下文切換的速度比進程上下文切換的快得多。
- 在多線程系統中,進程不是可執行的實體,線程才是實際的執行單位.
4、線程設計的3個難點
- 在 CPU 密集型任務、I/O 密集型任務以及充分利用多核 CPU 提升程序性能上找到一個平衡點。
- 盡可能支持規模更大的線程數量。
- 減少線程在用戶態(User Mode)和內核態(Kernel Mode)中切換帶來的開銷。
5、并發與并行
并發:一個時間段內有很多的線程或進程在執行,但何時間點上都只有一個在執行,多個線程或進程爭搶時間片輪流執行。
并行:一個時間段和時間點上都有多個線程或進程在執行。