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

資訊專欄INFORMATION COLUMN

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

codergarden / 3113人閱讀

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

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

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

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

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

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

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

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

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

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

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

有兩種解決方案:

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

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

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

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

多進(jìn)程模式;

多線程模式;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

三、Javascript是單線程的

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

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

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

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

前端哇發(fā)哈

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.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ù)隊(duì)列。 一、定時(shí)器 除了放置異步任務(wù)的事件,任務(wù)隊(duì)列還可以放置定時(shí)事件,即指定某些代碼在多少時(shí)間之后執(zhí)行。這叫做定時(shí)器(timer)功能,也就是定時(shí)執(zhí)行的代碼。 定時(shí)器功能主要由setTim...

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

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

    李昌杰 評(píng)論0 收藏0
  • 大話javascript 3:閉包

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

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

    摘要:在中,通過(guò)棧的存取方式來(lái)管理執(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í)行一個(gè)代碼段之前,即解析(預(yù)處理)階段,會(huì)先進(jìn)行一些準(zhǔn)備工作,例如掃描JS中var定義的變量、...

    denson 評(píng)論0 收藏0
  • 大話javascript 1:作用域和作用域鏈

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

    NicolasHe 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<