進程基礎
什么是進程?
為了實現并發的功能,引入了進程的概念。 ? 為了實現并發,需要引入多程序的環境,但是多程序的環境會造成一些單程序時不存在的問題,比如程序的之間沒有了封閉性,程序不可以連續的執行,由于沒有封閉性和連續性(隔離性和安全性),也就失去程序再現的能力。為了解決這些問題,需要進一步的修改操作系統,為達到隔離性與安全性的要求的集合,就稱之為進程,進程就是為了解決這些問題而提出的概念。
名詞解釋:
程序:靜態的,一個指令集合 進程:動態的,一個程序的執行過程;
進程=PCB+程序段+數據段
eg:在 Java 中,當我們啟動 main 函數時其實就是啟動了一個 JVM 的進程,而 main 函數所在的線程就是這個進程中的一個線程,也稱主線程。
線程基礎
進程還是沒有完美解決并發的需求,需要引入線程進一步解決并發出現的上下文切換損耗,引入線程后,使用相近的資源的程序可以使用線程進行開發,因為如果使用進程進行開發,程序切換帶來的開銷是很大的,這些開銷主要是上下文切換。因此可以說是為了減少進程切換帶來的花銷(主要是上下文切換),引入了線程的概念。而同時也會帶來其他的問題,例如死鎖、數據一致性(競爭條件)等。 (競爭條件:多個線程訪問共享數據(資源),并且嘗試改變這些數據(資源)時,它們之間對于該資源的操作順序會影響最終結果的正確性。)
什么是線程?
為了減少進程切換(上下文切換)帶來的效率損耗,引入了線程這個概念。線程是進程的一個實現,不占有資源,但是可以執行相應的代碼指令。有點類似于工程機械公司——老板擁有所有資源,即挖機、修理機械、保養設備等,挖機師傅負責干活,公司有多種挖機,大挖機、小挖機、長臂挖機、水挖機,每次遇到什么問題,不用換專門的公司,只需要換一個挖機師傅就可以了,挖機師傅從老板那里取干活用的挖機(調用進程資源),這樣一來,省了招標的流程了,直接內部解決問題。 ? 線程是輕量級的進程,不擁有資源,線程間切換付出的時空開銷小,對于java而言,線程共享堆與方法區,而pc寄存器、虛擬機棧和本地方法棧都是私有的。
名詞解釋:
上下文切換
Javaguide的回答有問題,上下文不涉及棧信息,上下文指的是cpu周邊的那些寄存器(硬件)里面的信息,計組里面的內容了,上下文切換就是要保存那些寄存器(程序計數器、處理器狀態寄存器等等一系列寄存器的信息)到內存,然后再從內存把之前保存的,另一個線程的上下文拿過來放到cpu里面,讓這些寄存器獲得這個線程的信息,然后跑起來。這樣一來,就達到切換線程的目的了。
什么時候切換上下文? 切換線程的時候切換上下文,進程什么時候會切換?如下:
-
主動讓出 CPU,比如調用了
sleep()
,wait()
等。 -
時間片用完,因為操作系統要防止一個線程或者進程長時間占用 CPU 導致其他線程或者進程餓死。
-
調用了阻塞類型的系統中斷,比如請求 IO,線程被阻塞。
-
被終止或結束運行
并發與并行的區別?
并行是一系列任務在同一時間同時執行;
并發是一系列任務在同一時間段內輪番執行。
同步與異步的區別?
首先要涉及到一個叫做調用的概念,在執行的過程中,執行一條指令,這條指令不是簡單的指令,而是指向另一個程序的接口,通過這個指令會出發另一個程序的執行,并得到返回結果(返回值,有或者沒有)。
-
同步 : 發出一個調用之后,在沒有得到結果之前, 該調用就不可以返回,一直等待。
-
異步 :調用在發出之后,不用等待返回結果,該調用直接返回。