爲什麼js引擎是單線程?

爲什麼js引擎是單線程?

js的主要用途是與用戶互動,以及操作DOM,這決定它只能是單線程。例:一個線程要添加DOM節點,一個線程要刪減DOM節點,容易造成分歧。

爲了更好使用多CPU,H5提供了web Worker 標準,允許js創建多線程,但是子線程受到主線程控制,而且不得操作DOM。

說說進程與線程的區別與聯繫

這問題,估計計算機專業的同學在找研發等工作的時候都會遇到過。前幾天某老牌軟件廠商的電話面試就提到了這一經典問題,今天招聘會上又有不少同學說在面試的時候被問到這點。在這裏我就起個頭,大家有啥想法意見等都歡迎回帖交流。

要了解二者的區別與聯繫,首先得對進程與線程有一個宏觀上的瞭解。

進程,是併發執行的程序在執行過程中分配和管理資源的基本單位,是一個動態概念,竟爭計算機系統資源的基本單位。每一個進程都有一個自己的地址空間,即進程空間或(虛空間)。進程空間的大小 只與處理機的位數有關,一個 16 位長處理機的進程空間大小爲 216 ,而 32 位處理機的進程空間大小爲 232 。進程至少有 5 種基本狀態,它們是:初始態,執行態,等待狀態,就緒狀態,終止狀態。

線程,在網絡或多用戶環境下,一個服務器通常需要接收大量且不確定數量用戶的併發請求,爲每一個請求都創建一個進程顯然是行不通的,——無論是從系統資源開銷方面或是響應用戶請求的效率方面來看。因此,操作系統中線程的概念便被引進了。線程,是進程的一部分,一個沒有線程的進程可以被看作是單線程的。線程有時又被稱爲輕權進程或輕量級進程,也是 CPU 調度的一個基本單位。

說到這裏,我們對進程與線程都有了一個大體上的印象,現在開始說說二者大致的區別。

進程的執行過程是線狀的,儘管中間會發生中斷或暫停,但該進程所擁有的資源只爲該線狀執行過程服務。一旦發生進程上下文切換,這些資源都是要被保護起來的。這是進程宏觀上的執行過程。而進程又可有單線程進程與多線程進程兩種。我們知道,進程有 一個進程控制塊 PCB ,相關程序段 和 該程序段對其進行操作的數據結構集 這三部分,單線程進程的執行過程在宏觀上是線性的,微觀上也只有單一的執行過程;而多線程進程在宏觀上的執行過程同樣爲線性的,但微觀上卻可以有多個執行操作(線程),如不同代碼片段以及相關的數據結構集。線程的改變只代表了 CPU 執行過程的改變,而沒有發生進程所擁有的資源變化。出了 CPU 之外,計算機內的軟硬件資源的分配與線程無關,線程只能共享它所屬進程的資源。與進程控制表和 PCB 相似,每個線程也有自己的線程控制表 TCB ,而這個 TCB 中所保存的線程狀態信息則要比 PCB 表少得多,這些信息主要是相關指針用堆棧(系統棧和用戶棧),寄存器中的狀態數據。進程擁有一個完整的虛擬地址空間,不依賴於線程而獨立存在;反之,線程是進程的一部分,沒有自己的地址空間,與進程內的其他線程一起共享分配給該進程的所有資源。

線程可以有效地提高系統的執行效率,但並不是在所有計算機系統中都是適用的,如某些很少做進程調度和切換的實時系統。使用線程的好處是有多個任務需要處理機處理時,減少處理機的切換時間;而且,線程的創建和結束所需要的系統開銷也比進程的創建和結束要小得多。最適用使用線程的系統是多處理機系統和網絡系統或分佈式系統。


  1. 線程的執行特性。

線程只有 3 個基本狀態:就緒,執行,阻塞。

線程存在 5 種基本操作來切換線程的狀態:派生,阻塞,激活,調度,結束。

  1. 進程通信。

單機系統中進程通信有 4 種形式:主從式,會話式,消息或郵箱機制,共享存儲區方式。

主從式典型例子:終端控制進程和終端進程。

會話式典型例子:用戶進程與磁盤管理進程之間的通信。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章