国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

大話javascript 4期:事件循環(huán)(1)

codergarden / 3111人閱讀

摘要:腳本執(zhí)行,事件處理等。引擎線程,也稱為內(nèi)核,負(fù)責(zé)處理腳本程序,例如引擎。事件觸發(fā)線程,用來控制事件循環(huán)可以理解為,引擎線程自己都忙不過來,需要瀏覽器另開線程協(xié)助。異步請求線程,也就是發(fā)出請求后,接收響應(yīng)檢測狀態(tài)變更等都是這個線程管理的。

一、進(jìn)程與線程

現(xiàn)代操作系統(tǒng)比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任務(wù)”的操作系統(tǒng)。

什么叫“多任務(wù)”呢?簡單地說,就是操作系統(tǒng)可以同時運(yùn)行多個任務(wù)。打個比方,你一邊在用瀏覽器上網(wǎng),一邊在聽MP3,一邊在用Word趕作業(yè),這就是多任務(wù),至少同時有3個任務(wù)正在運(yùn)行。還有很多任務(wù)悄悄地在后臺同時運(yùn)行著,只是桌面上沒有顯示而已。

現(xiàn)在,多核CPU已經(jīng)非常普及了,但是,即使過去的單核CPU,也可以執(zhí)行多任務(wù)。由于CPU執(zhí)行代碼都是順序執(zhí)行的,那么,單核CPU是怎么執(zhí)行多任務(wù)的呢?

答案就是操作系統(tǒng)輪流讓各個任務(wù)交替執(zhí)行,任務(wù)1執(zhí)行0.01秒,切換到任務(wù)2,任務(wù)2執(zhí)行0.01秒,再切換到任務(wù)3,執(zhí)行0.01秒……這樣反復(fù)執(zhí)行下去。表面上看,每個任務(wù)都是交替執(zhí)行的,但是,由于CPU的執(zhí)行速度實(shí)在是太快了,我們感覺就像所有任務(wù)都在同時執(zhí)行一樣。

真正的并行執(zhí)行多任務(wù)只能在多核CPU上實(shí)現(xiàn),但是,由于任務(wù)數(shù)量遠(yuǎn)遠(yuǎn)多于CPU的核心數(shù)量,所以,操作系統(tǒng)也會自動把很多任務(wù)輪流調(diào)度到每個核心上執(zhí)行。

對于操作系統(tǒng)來說,一個任務(wù)就是一個進(jìn)程(Process),比如打開一個瀏覽器就是啟動一個瀏覽器進(jìn)程,打開一個記事本就啟動了一個記事本進(jìn)程,打開兩個記事本就啟動了兩個記事本進(jìn)程,打開一個Word就啟動了一個Word進(jìn)程。

有些進(jìn)程還不止同時干一件事,比如Word,它可以同時進(jìn)行打字、拼寫檢查、打印等事情。在一個進(jìn)程內(nèi)部,要同時干多件事,就需要同時運(yùn)行多個“子任務(wù)”,我們把進(jìn)程內(nèi)的這些“子任務(wù)”稱為線程(Thread)

由于每個進(jìn)程至少要干一件事,所以,一個進(jìn)程至少有一個線程。當(dāng)然,像Word這種復(fù)雜的進(jìn)程可以有多個線程,多個線程可以同時執(zhí)行,多線程的執(zhí)行方式和多進(jìn)程是一樣的,也是由操作系統(tǒng)在多個線程之間快速切換,讓每個線程都短暫地交替運(yùn)行,看起來就像同時執(zhí)行一樣。當(dāng)然,真正地同時執(zhí)行多線程需要多核CPU才可能實(shí)現(xiàn)。

如果我們要同時執(zhí)行多個任務(wù)怎么辦?

有兩種解決方案:

一種是啟動多個進(jìn)程,每個進(jìn)程雖然只有一個線程,但多個進(jìn)程可以一塊執(zhí)行多個任務(wù)。

還有一種方法是啟動一個進(jìn)程,在一個進(jìn)程內(nèi)啟動多個線程,這樣,多個線程也可以一塊執(zhí)行多個任務(wù)。

當(dāng)然還有第三種方法,就是啟動多個進(jìn)程,每個進(jìn)程再啟動多個線程,這樣同時執(zhí)行的任務(wù)就更多了,當(dāng)然這種模型更復(fù)雜,實(shí)際很少采用。

總結(jié)一下就是,多任務(wù)的實(shí)現(xiàn)有3種方式:

多進(jìn)程模式;

多線程模式;

多進(jìn)程+多線程模式。

同時執(zhí)行多個任務(wù)通常各個任務(wù)之間并不是沒有關(guān)聯(lián)的,而是需要相互通信和協(xié)調(diào),有時,任務(wù)1必須暫停等待任務(wù)2完成后才能繼續(xù)執(zhí)行,有時,任務(wù)3和任務(wù)4又不能同時執(zhí)行,所以,多進(jìn)程和多線程的程序的復(fù)雜度要遠(yuǎn)遠(yuǎn)高于我們前面寫的單進(jìn)程單線程的程序。

因?yàn)閺?fù)雜度高,調(diào)試?yán)щy,所以,不是迫不得已,我們也不想編寫多任務(wù)。但是,有很多時候,沒有多任務(wù)還真不行。想想在電腦上看電影,就必須由一個線程播放視頻,另一個線程播放音頻,否則,單線程實(shí)現(xiàn)的話就只能先把視頻播放完再播放音頻,或者先把音頻播放完再播放視頻,這顯然是不行的。

總結(jié):
1) 進(jìn)程是cpu資源分配的最小單位(是能擁有資源和獨(dú)立運(yùn)行的最小單位)
2) 線程是cpu調(diào)度的最小單位(線程是建立在進(jìn)程的基礎(chǔ)上的一次程序運(yùn)行單位,一個進(jìn)程中可以有多個線程)

二、瀏覽器是多進(jìn)程的 瀏覽器包含哪些進(jìn)程

1) Browser進(jìn)程:瀏覽器的主進(jìn)程(負(fù)責(zé)協(xié)調(diào)、主控),只有一個。作用有

負(fù)責(zé)瀏覽器界面顯示,與用戶交互。如前進(jìn),后退等

負(fù)責(zé)各個頁面的管理,創(chuàng)建和銷毀其他進(jìn)程

將Renderer進(jìn)程得到的內(nèi)存中的Bitmap,繪制到用戶界面上

網(wǎng)絡(luò)資源的管理,下載等

2) 第三方插件進(jìn)程:每種類型的插件對應(yīng)一個進(jìn)程,僅當(dāng)使用該插件時才創(chuàng)建
3) GPU進(jìn)程:最多一個,用于3D繪制等
4) 瀏覽器渲染進(jìn)程(瀏覽器內(nèi)核)(Renderer進(jìn)程,內(nèi)部是多線程的):默認(rèn)每個Tab頁面一個進(jìn)程,互不影響。主要作用為

頁面渲染,腳本執(zhí)行,事件處理等

關(guān)于瀏覽器進(jìn)程問題可以簡單基礎(chǔ)三點(diǎn):

1) 瀏覽器是多進(jìn)程的。
2) 瀏覽器之所以能夠運(yùn)行,是因?yàn)橄到y(tǒng)給它的進(jìn)程分配了資源(cpu、內(nèi)存)。
3) 簡單點(diǎn)理解,每打開一個Tab頁,就相當(dāng)于創(chuàng)建了一個獨(dú)立的瀏覽器進(jìn)程。

平時 coding 接觸到最多的一個瀏覽器進(jìn)程是瀏覽器渲染進(jìn)程(瀏覽器內(nèi)核),它管理著頁面渲染。腳本執(zhí)行,事件處理等。要同時處理這么多事情,渲染進(jìn)程顯然是多線程的,它主要包括以下5個常駐線程:

GUI渲染線程,負(fù)責(zé)渲染瀏覽器界面,解析HTML,CSS,構(gòu)建DOM樹和RenderObject樹,布局和繪制等。

JS引擎線程,也稱為JS內(nèi)核,負(fù)責(zé)處理Javascript腳本程序,(例如V8引擎)。

事件觸發(fā)線程,用來控制事件循環(huán)(可以理解為,JS引擎線程自己都忙不過來,需要瀏覽器另開線程協(xié)助)。

定時觸發(fā)器線程,瀏覽器定時計數(shù)器并不是由JavaScript引擎計數(shù)的,(因?yàn)镴avaScript引擎是單線程的, 如果處于阻塞線程狀態(tài)就會影響記計時的準(zhǔn)確),JS中常用的setInterval和setTimeout就歸這個線程管理。

異步http請求線程,也就是ajax發(fā)出http請求后,接收響應(yīng)、檢測狀態(tài)變更等都是這個線程管理的。

三、Javascript是單線程的

我們常說的JavaScript是單線程的,其實(shí)就是說的JS引擎是單線程的,它僅僅是瀏覽器渲染進(jìn)程種的一個線程。為什么呢?因?yàn)镴avaScript的主要作用是與用戶互動,以及操作DOM,如果JavaScript有兩個線程,一個線程對一個DOM節(jié)點(diǎn)執(zhí)行 A 操作,另一個線程這個DOM節(jié)點(diǎn)執(zhí)行 B 操作,那么就會起沖突,所以JavaScript在前端的應(yīng)用就注定了它是單線程的。

然而JavaScript的單線程特性就注定我們不用它去完成密集的 cpu 運(yùn)算,因?yàn)槊芗?cpu 運(yùn)算耗時過長,阻塞頁面渲染。為了解決這個問題,HTML5提出 Web Worker 標(biāo)準(zhǔn),允許JavaScript腳本創(chuàng)建多個線程,但是子線程完全受主線程控制,且不得操作DOM。

如果你覺得這篇文章對你有所幫助,那就順便點(diǎn)個贊吧,點(diǎn)點(diǎn)關(guān)注不迷路~

黑芝麻哇,白芝麻發(fā),黑芝麻白芝麻哇發(fā)哈!

前端哇發(fā)哈

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/103042.html

相關(guān)文章

  • 大話javascript 4事件循環(huán)(3)

    摘要:令人困惑的是,文檔中稱,指定的回調(diào)函數(shù),總是排在前面。另外,由于指定的回調(diào)函數(shù)是在本次事件循環(huán)觸發(fā),而指定的是在下次事件循環(huán)觸發(fā),所以很顯然,前者總是比后者發(fā)生得早,而且執(zhí)行效率也高因?yàn)椴挥脵z查任務(wù)隊列。 一、定時器 除了放置異步任務(wù)的事件,任務(wù)隊列還可以放置定時事件,即指定某些代碼在多少時間之后執(zhí)行。這叫做定時器(timer)功能,也就是定時執(zhí)行的代碼。 定時器功能主要由setTim...

    liujs 評論0 收藏0
  • 大話javascript 4事件循環(huán)(2)

    摘要:只要指定過回調(diào)函數(shù),這些事件發(fā)生時就會進(jìn)入任務(wù)隊列,等待主線程讀取。三主線程從任務(wù)隊列中讀取事件,這個過程是循環(huán)不斷的,所以整個的這種運(yùn)行機(jī)制又稱為事件循環(huán)。 一、任務(wù)隊列 同步任務(wù)與異步任務(wù)的由來 單線程就意味著,所有任務(wù)需要排隊,前一個任務(wù)結(jié)束,才會執(zhí)行后一個任務(wù)。如果前一個任務(wù)耗時很長,后一個任務(wù)就不得不一直等著。 如果排隊是因?yàn)橛嬎懔看?,CPU忙不過來,倒也算了,但是很多時候C...

    李昌杰 評論0 收藏0
  • 大話javascript 3:閉包

    摘要:由此可知閉包是函數(shù)的執(zhí)行環(huán)境以及執(zhí)行環(huán)境中的函數(shù)組合而構(gòu)成的。此時產(chǎn)生了閉包。二閉包的作用閉包的特點(diǎn)是讀取函數(shù)內(nèi)部局部變量,并將局部變量保存在內(nèi)存,延長其生命周期。三閉包的問題使用閉包會將局部變量保持在內(nèi)存中,所以會占用大量內(nèi)存,影響性能。 一、什么是閉包 1.閉包的定義 閉包是一種特殊的對象。它由兩部分構(gòu)成:函數(shù),以及創(chuàng)建該函數(shù)的環(huán)境(包含自由變量)。環(huán)境由閉包創(chuàng)建時在作用域中的任何...

    Freelander 評論0 收藏0
  • 大話javascript 2:執(zhí)行上下文與執(zhí)行上下文棧

    摘要:在中,通過棧的存取方式來管理執(zhí)行上下文,我們可稱其為執(zhí)行棧,或函數(shù)調(diào)用棧。因?yàn)閳?zhí)行中最先進(jìn)入全局環(huán)境,所以處于棧底的永遠(yuǎn)是全局環(huán)境的執(zhí)行上下文。 一、什么是執(zhí)行上下文? 執(zhí)行上下文(Execution Context): 函數(shù)執(zhí)行前進(jìn)行的準(zhǔn)備工作(也稱執(zhí)行上下文環(huán)境) JavaScript在執(zhí)行一個代碼段之前,即解析(預(yù)處理)階段,會先進(jìn)行一些準(zhǔn)備工作,例如掃描JS中var定義的變量、...

    denson 評論0 收藏0
  • 大話javascript 1:作用域和作用域鏈

    摘要:全局作用域局部作用域局部作用域全局作用域局部作用域塊語句沒有塊級作用域塊級聲明包括和,以及和循環(huán),和函數(shù)不同,它們不會創(chuàng)建新的作用域。局部作用域只在該函數(shù)調(diào)用執(zhí)行期間存在。 一、什么是作用域? 作用域是你的代碼在運(yùn)行時,各個變量、函數(shù)和對象的可訪問性。(可產(chǎn)生作用的區(qū)域) 二、JavaScript中的作用域 在 JavaScript 中有兩種作用域 全局作用域 局部作用域 當(dāng)變量定...

    NicolasHe 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<