新聞中心
在機(jī)器學(xué)習(xí)的領(lǐng)域中,深度學(xué)習(xí)已經(jīng)成為了一種非常重要的技術(shù)。而在深度學(xué)習(xí)的實(shí)踐中,Linux系統(tǒng)也成為了一種非常常用的操作系統(tǒng),因?yàn)長inux系統(tǒng)具有非常好的擴(kuò)展性和可定制性,也更容易地進(jìn)行開發(fā)和調(diào)試。在Linux系統(tǒng)上實(shí)踐深度學(xué)習(xí)需要具備一定的操作和開發(fā)技能,同時需要更深入了解機(jī)器學(xué)習(xí)的相關(guān)知識。

本文將介紹,幫助讀者更深入地學(xué)習(xí)和掌握深度學(xué)習(xí)在Linux系統(tǒng)上的實(shí)踐技術(shù)。
一、深度學(xué)習(xí)的基本原理
深度學(xué)習(xí)是一種機(jī)器學(xué)習(xí)的方法,它基于人工神經(jīng)網(wǎng)絡(luò)的設(shè)計和訓(xùn)練,能夠自動學(xué)習(xí)特征并進(jìn)行分類、識別、聚類等任務(wù)。深度學(xué)習(xí)所使用的神經(jīng)網(wǎng)絡(luò)被稱為深度神經(jīng)網(wǎng)絡(luò),它通常具有多個隱層,每個隱層都有多個神經(jīng)元。
深度學(xué)習(xí)的基本原理包括以下幾個方面:
1. 數(shù)據(jù)準(zhǔn)備:深度學(xué)習(xí)需要大量的數(shù)據(jù)進(jìn)行訓(xùn)練,因此需要對數(shù)據(jù)進(jìn)行清洗和預(yù)處理,包括數(shù)據(jù)清理、去除異常值、數(shù)據(jù)標(biāo)準(zhǔn)化等。
2. 特征提?。荷疃葘W(xué)習(xí)憑借嵌套的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),可以自動地從數(shù)據(jù)中提取特征,在特征提取方面表現(xiàn)出色。
3. 神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu):深度學(xué)習(xí)所使用的神經(jīng)網(wǎng)絡(luò)具有多個隱層,每個隱層都有多個神經(jīng)元,充分利用了深度結(jié)構(gòu)的優(yōu)勢。
4. 參數(shù)優(yōu)化:深度學(xué)習(xí)需要通過參數(shù)優(yōu)化進(jìn)行訓(xùn)練,根據(jù)訓(xùn)練數(shù)據(jù)的反饋不斷調(diào)整神經(jīng)網(wǎng)絡(luò)的參數(shù),使得神經(jīng)網(wǎng)絡(luò)的訓(xùn)練誤差盡可能小。
二、Linux系統(tǒng)下實(shí)踐深度學(xué)習(xí)的技術(shù)要點(diǎn)
在Linux系統(tǒng)下進(jìn)行深度學(xué)習(xí),需要掌握以下技術(shù)要點(diǎn)。
1. Python編程:Python是目前深度學(xué)習(xí)領(lǐng)域更流行的編程語言之一,因?yàn)樗浅H菀咨鲜?,而且有豐富的機(jī)器學(xué)習(xí)和深度學(xué)習(xí)庫可以使用。在Linux系統(tǒng)下進(jìn)行深度學(xué)習(xí),需要熟練掌握Python語言。
2. 安裝深度學(xué)習(xí)庫:Linux系統(tǒng)下有很多深度學(xué)習(xí)庫可以使用,例如TensorFlow、Keras、PyTorch等。在使用這些庫之前,需要將它們安裝到Linux系統(tǒng)中。
3. 安裝GPU驅(qū)動:GPU可以大大加快深度學(xué)習(xí)的訓(xùn)練過程,因此在Linux系統(tǒng)下實(shí)踐深度學(xué)習(xí)通常需要安裝GPU驅(qū)動。GPU驅(qū)動的安裝過程因硬件不同而異,需要根據(jù)具體硬件架構(gòu)和型號選擇相應(yīng)的驅(qū)動。
4. 熟練使用Linux命令行:在Linux系統(tǒng)下進(jìn)行深度學(xué)習(xí)需要熟練掌握Linux命令行,例如文件管理、文本編輯、軟件安裝等。這對深度學(xué)習(xí)的開發(fā)和調(diào)試非常重要。
5. 硬件性能優(yōu)化:在Linux系統(tǒng)下實(shí)踐深度學(xué)習(xí)還需要對硬件進(jìn)行性能優(yōu)化,例如選擇合適的CPU和GPU、更換SSD硬盤等。這些優(yōu)化措施可以大大提高深度學(xué)習(xí)的訓(xùn)練速度和效率。
三、深入學(xué)習(xí)深度學(xué)習(xí)
除了掌握深度學(xué)習(xí)在Linux系統(tǒng)下的操作技術(shù),還需要深入學(xué)習(xí)深度學(xué)習(xí)的相關(guān)知識。
1. 深入了解神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu):深度學(xué)習(xí)的基礎(chǔ)是神經(jīng)網(wǎng)絡(luò),因此需要深入了解神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的原理和實(shí)現(xiàn)。
2. 學(xué)習(xí)深度學(xué)習(xí)的算法原理:深度學(xué)習(xí)所使用的算法包括反向傳播、梯度下降等,需要對這些算法的原理和實(shí)現(xiàn)進(jìn)行深入了解。
3. 學(xué)習(xí)優(yōu)化算法:深度學(xué)習(xí)需要通過優(yōu)化算法進(jìn)行訓(xùn)練,例如SGD、Adam等。學(xué)習(xí)優(yōu)化算法的原理可以幫助調(diào)試和優(yōu)化深度學(xué)習(xí)的代碼。
4. 學(xué)習(xí)實(shí)際應(yīng)用:深度學(xué)習(xí)已經(jīng)被廣泛應(yīng)用于圖像處理、語音識別、自然語言處理等領(lǐng)域。學(xué)習(xí)如何將深度學(xué)習(xí)應(yīng)用于實(shí)際問題是非常重要的。
結(jié)語
深度學(xué)習(xí)在Linux系統(tǒng)下的實(shí)踐需要掌握一定的操作技術(shù)和相關(guān)知識。本文介紹了,希望可以對深度學(xué)習(xí)初學(xué)者有所啟發(fā)和幫助,讓大家更加深入地了解和掌握深度學(xué)習(xí)技術(shù)。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,響應(yīng)式網(wǎng)站制作,設(shè)計師量身打造品牌風(fēng)格,熱線:028-86922220最全從輸入URL到瀏覽器顯示頁面都發(fā)生了什么前端瀏覽器渲染流程
首先了解一下URL的組成:
從上面的URL可以看出,一個完整的URL包括以下幾部分:
1、協(xié)議部分:該URL的協(xié)議部分為“http:”,這代表網(wǎng)頁使用的是HTTP協(xié)議。在Internet中可以使用多種協(xié)議,如HTTP,F(xiàn)TP等等本例中使用的是HTTP協(xié)議。在”HTTP”后面的“//”為分隔符
2、域名部分:該URL的域名部分為“www.baidu.com”。一個URL中,也可以使用IP地址作為域名使用
3、端口部分:跟在域名后面的是端口,域名和端口之間使用“:”作為分隔符。端口不是一個URL必須的部分,如果省略端口部分,將采用默認(rèn)端口80
4、虛擬目錄部分:從域名后的之一個“/”開始到最后一個“/”為止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例歲明雹中的虛擬目錄是“/news/”
5、文件名部分:從域名后的最后一個“/”開始到“?”為止,是文件名部分,乎帆如果沒有“?”,則是從域名后的最后一個“/”開始到“#”為止,是文件部分,如果沒有“?”和“#”,那么從域名后的最后一個“/”開始到結(jié)束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一個URL必須的部分,如果省略該部分,則使用默認(rèn)的文件名
6、錨部分:從“#”開始到最后,都是錨部分。本例中的錨部分是“name”。錨部分也不是一個URL必須的部分
7、參數(shù)部分:從“?”開始到“#”為止之間的部分為參數(shù)槐御部分,又稱搜索部分、查詢部分。本例中的參數(shù)部分為“boardID=5&ID=24618&page=1”。參數(shù)可以允許有多個參數(shù),參數(shù)與參數(shù)之間用“&”作為分隔符。
很多大公司面試喜歡問這樣一道面試題, 輸入URL到看見頁面發(fā)生了什么? ,今天我們來總結(jié)一下。 簡單來說,共有以下幾個過程
下面我們來看看具體的細(xì)節(jié)
輸入 www.google.com 網(wǎng)址后,首先在本地的域名服務(wù)器中查找,沒找到去根域名服務(wù)器查找,沒有再去 com 頂級域名服務(wù)器查找,,如此的類推下去,直到找到IP地址,然后把它記錄在本地,供下次使用。大致過程就是 . -> .com -> google.com. -> www.google.com. 。 (你可能覺得我多寫 .,并木有,這個.對應(yīng)的就是根域名服務(wù)器,默認(rèn)情況下所有的網(wǎng)址的最后一位都是.,既然是默認(rèn)情況下,為了方便用戶,通常都會省略,瀏覽器在請求DNS的時候會自動加上)
既然已經(jīng)懂得了解析的具體過程,我們可以看到上述一共經(jīng)過了N個過程,每個過程有一定的消耗和時間的等待,因此我們得想辦法解決一下這個問題!
DNS存在著多級緩存,從離瀏覽器的距離排序的話,有以下幾種: 瀏覽器緩存,系統(tǒng)緩存,路由器緩存,IPS服務(wù)器緩存,根域名服務(wù)器緩存,頂級域名服務(wù)器緩存,主域名服務(wù)器緩存。
在你的chrome瀏覽器中輸入:
系統(tǒng)緩存主要存在/etc/hosts(Linux系統(tǒng))中
檢查瀏覽器是否有緩存
通過 Cache-Control 和 Expires 來檢查是否命中強(qiáng)緩存,命中則直接取本地磁盤的html(狀態(tài)碼為200 from disk(or memory) cache,內(nèi)存or磁盤);
如果沒有命中強(qiáng)緩存,則會向服務(wù)器發(fā)起請求(先進(jìn)行下一步的TCP連接),服務(wù)器通過 Etag 和 Last-Modify 來與服務(wù)器確認(rèn)返回的響應(yīng)是否被更改(協(xié)商緩存),若無更改則返回狀態(tài)碼(304 Not Modified),瀏覽器取本地緩存;
若強(qiáng)緩存和協(xié)商緩存都沒有命中則返回請求結(jié)果。
不知道你們有沒有注意這樣一件事,你訪問
TCP 協(xié)議通過三次握手建立連接。
翻譯成大白話就是:
為什么是3次?
:避免 歷史 連接,確認(rèn)客戶端發(fā)來的請求是這次通信的人。
為什么不是4次?
:3次夠了第四次浪費(fèi)
建立連接的過程是利用客戶服務(wù)器模式,假設(shè)主機(jī)A為客戶端,主機(jī)B為服務(wù)器端。
采用三次握手是為了防止失效的連接請求報文段突然又傳送到主機(jī)B,因而產(chǎn)生錯誤。失效的連接請求報文段是指:主機(jī)A發(fā)出的連接請求沒有收到主機(jī)B的確認(rèn),于是經(jīng)過一段時間后,主機(jī)A又重新向主機(jī)B發(fā)送連接請求,且建立成功,順序完成數(shù)據(jù)傳輸??紤]這樣一種特殊情況,主機(jī)A之一次發(fā)送的連接請求并沒有丟失,而是因?yàn)榫W(wǎng)絡(luò)節(jié)點(diǎn)導(dǎo)致延遲達(dá)到主機(jī)B,主機(jī)B以為是主機(jī)A又發(fā)起的新連接,于是主機(jī)B同意連接,并向主機(jī)A發(fā)回確認(rèn),但是此時主機(jī)A根本不會理會,主機(jī)B就一直在等待主機(jī)A發(fā)送數(shù)據(jù),導(dǎo)致主機(jī)B的資源浪費(fèi)。
采用兩次握手不行,原因就是上面說的失效的連接請求的特殊情況。而在三次握手中, client和server都有一個發(fā)syn和收ack的過程, 雙方都是發(fā)后能收, 表明通信則準(zhǔn)備工作OK.
為什么不是四次握手呢? 大家應(yīng)該知道通信中著名的藍(lán)軍紅軍約定, 這個例子說明, 通信不可能100%可靠, 而上面的三次握手已經(jīng)做好了通信的準(zhǔn)備工作, 再增加握手, 并不能顯著提高可靠性, 而且也沒有必要。
之一次握手
:
客戶端發(fā)送syn包(Seq=x)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);
第二次握手:
服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=x+1),同時自己也發(fā)送一個SYN包(Seq=y),即SYN+ACK包,此時服務(wù)器進(jìn)入SYN_RECV狀態(tài);
第三次握手:
客戶端收到服務(wù)器的SYN ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=y+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手。
握手過程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù)。理想狀態(tài)下,TCP連接一旦建立,在通信雙方中的任何一方主動關(guān)閉連接之前,TCP 連接都將被一直保持下去。
要先申請CA證書,并安裝在服務(wù)器上(一個文件,配置nginx支持監(jiān)聽443端口開啟ssl并設(shè)置證書路徑)
瀏覽器發(fā)送請求;
網(wǎng)站從瀏覽器發(fā)過來的加密規(guī)則中選一組自身也支持的加密算法和hash算法,并向?yàn)g覽器發(fā)送帶有公鑰的證書,當(dāng)然證書還包含了很多信息,如網(wǎng)站地址、證書的頒發(fā)機(jī)構(gòu)、過期時間等。
瀏覽器解析證書。
驗(yàn)證證書的合法性。如頒發(fā)機(jī)構(gòu)是否合法、證書中的網(wǎng)站地址是否與訪問的地址一致,若不合法,則瀏覽器提示證書不受信任,若合法,瀏覽器會顯示一個小鎖頭。
若合法,或用戶接受了不合法的證書,瀏覽器會生成一串隨機(jī)數(shù)的密碼(即密鑰),并用證書中提供的公鑰加密。
使用約定好的hash計算握手消息,并使用生成的隨機(jī)數(shù)(即密鑰)對消息進(jìn)行加密,最后將之前生成的所有消息一并發(fā)送給網(wǎng)站服務(wù)器。
網(wǎng)站服務(wù)器解析消息。用已有的私鑰將密鑰解密出來,然后用密鑰解密發(fā)過來的握手消息,并驗(yàn)證是否跟瀏覽器傳過來的一致。然后再用密鑰加密一段握手消息,發(fā)送給瀏覽器。
瀏覽器解密并計算握手消息的HASH,如果與服務(wù)端發(fā)來的HASH一致,此時握手過程結(jié)束,之后所有的通信數(shù)據(jù)將由之前瀏覽器生成的隨機(jī)密碼并利用對稱加密算法進(jìn)行加密。這里瀏覽器與網(wǎng)站互相發(fā)送加密的握手消息并驗(yàn)證,目的是為了保證雙方都獲得了一致的密碼,并且可以正常的加密解密數(shù)據(jù),為后續(xù)真正數(shù)據(jù)的傳輸做一次測試。
發(fā)送HTTP請求
首先科補(bǔ)一個小知識,HTTP的端口為80/8080,而HTTPS的端口為443
發(fā)送HTTP請求的過程就是構(gòu)建HTTP請求報文并通過TCP協(xié)議中發(fā)送到服務(wù)器指定端口 請求報文由
請求行
,
請求抱頭
,
請求正文
組成。
請求行
請求行的格式為 Method Request-URL HTTP-Version CRLFeg: GET index.html HTTP/1.1 常用的方法有: GET , POST , PUT , DELETE , OPTIONS , HEAD 。
常見的請求方法區(qū)別
這里主要展示 POST 和 GET 的區(qū)別
常見的區(qū)別
注意一點(diǎn)你也可以在GET里面藏body,POST里面帶參數(shù)
重點(diǎn)區(qū)別
GET 會產(chǎn)生一個 TCP 數(shù)據(jù)包,而 POST 會產(chǎn)生兩個 TCP 數(shù)據(jù)包。
詳細(xì)的說就是:
注意一點(diǎn),并不是所有的瀏覽器都會發(fā)送兩次數(shù)據(jù)包,F(xiàn)irefox就發(fā)送一次
請求報頭
請求報頭允許客戶端向服務(wù)器傳遞請求的附加信息和客戶端自身的信息。
從圖中可以看出,請求報頭中使用了Accept, Accept-Encoding, Accept-Language, Cache-Control, Connection, Cookie等字段。Accept用于指定客戶端用于接受哪些類型的信息,Accept-Encoding與Accept類似,它用于指定接受的編碼方式。Connection設(shè)置為Keep-alive用于告訴客戶端本次HTTP請求結(jié)束之后并不需要關(guān)閉TCP連接,這樣可以使下次HTTP請求使用相同的TCP通道,節(jié)省TCP連接建立的時間。
請求正文
當(dāng)使用POST, PUT等方法時,通常需要客戶端向服務(wù)器傳遞數(shù)據(jù)。這些數(shù)據(jù)就儲存在請求正文中。在請求包頭中有一些與請求正文相關(guān)的信息,例如: 現(xiàn)在的Web應(yīng)用通常采用Rest架構(gòu),請求的數(shù)據(jù)格式一般為json。這時就需要設(shè)置 Content-Type: application/json 。
更重要的事情-HTTP緩存
HTTP屬于客戶端緩存,我們常認(rèn)為瀏覽器有一個緩存數(shù)據(jù)庫,用來保存一些靜態(tài)文件,下面我們分為以下幾個方面來簡單介紹HTTP緩存
緩存的規(guī)則
緩存規(guī)則分為
強(qiáng)制緩存
和
協(xié)商緩存
強(qiáng)制緩存
當(dāng)緩存數(shù)據(jù)庫中有客戶端需要的數(shù)據(jù),客戶端直接將數(shù)據(jù)從其中拿出來使用(如果數(shù)據(jù)未失效),當(dāng)緩存服務(wù)器沒有需要的數(shù)據(jù)時,客戶端才會向服務(wù)端請求。
又稱對比緩存。客戶端會先從緩存數(shù)據(jù)庫拿到一個緩存的標(biāo)識,然后向服務(wù)端驗(yàn)證標(biāo)識是否失效,如果沒有失效服務(wù)端會返回304,這樣客戶端可以直接去緩存數(shù)據(jù)庫拿出數(shù)據(jù),如果失效,服務(wù)端會返回新的數(shù)據(jù)
強(qiáng)制緩存
對于強(qiáng)制緩存,服務(wù)器響應(yīng)的header中會用兩個字段來表明——Expires和Cache-Control。
Expires
Exprires的值為服務(wù)端返回的數(shù)據(jù)到期時間。當(dāng)再次請求時的請求時間小于返回的此時間,則直接使用緩存數(shù)據(jù)。但由于服務(wù)端時間和客戶端時間可能有誤差,這也將導(dǎo)致緩存命中的誤差,另一方面,Expires是HTTP1.0的產(chǎn)物,故現(xiàn)在大多數(shù)使用Cache-Control替代。
Cache-Control
Cache-Control有很多屬性,不同的屬性代表的意義也不同。
協(xié)商緩存
協(xié)商緩存需要進(jìn)行對比判斷是否可以使用緩存。瀏覽器之一次請求數(shù)據(jù)時,服務(wù)器會將緩存標(biāo)識與數(shù)據(jù)一起響應(yīng)給客戶端,客戶端將它們備份至緩存中。再次請求時,客戶端會將緩存中的標(biāo)識發(fā)送給服務(wù)器,服務(wù)器根據(jù)此標(biāo)識判斷。若未失效,返回304狀態(tài)碼,瀏覽器拿到此狀態(tài)碼就可以直接使用緩存數(shù)據(jù)了。
對于協(xié)商緩存來說,緩存標(biāo)識我們需要著重理解一下,下面我們將著重介紹它的兩種緩存方案。
Last-Modified
Last-Modified:服務(wù)器在響應(yīng)請求時,會告訴瀏覽器資源的最后修改時間。
從字面上看,就是說:從某個時間節(jié)點(diǎn)算起,是否文件被修改了
這兩個的區(qū)別是一個是修改了才下載一個是沒修改才下載。
Last-Modified 說好卻也不是特別好,因?yàn)槿绻诜?wù)器上,一個資源被修改了,但其實(shí)際內(nèi)容根本沒發(fā)生改變,會因?yàn)長ast-Modified時間匹配不上而返回了整個實(shí)體給客戶端(即使客戶端緩存里有個一模一樣的資源)。為了解決這個問題,HTTP1.1推出了Etag。
Etag
Etag:服務(wù)器響應(yīng)請求時,通過此字段告訴瀏覽器當(dāng)前資源在服務(wù)器生成的唯一標(biāo)識(生成規(guī)則由服務(wù)器決定)
但是實(shí)際應(yīng)用中由于Etag的計算是使用算法來得出的,而算法會占用服務(wù)端計算的資源,所有服務(wù)端的資源都是寶貴的,所以就很少使用Etag了。
緩存的優(yōu)點(diǎn)
不同刷新的請求執(zhí)行過程
瀏覽器地址欄中寫入URL,回車
F5
Ctrl+F5
服務(wù)器處理請求并返回HTTP報文
它會對TCP連接進(jìn)行處理,對HTTP協(xié)議進(jìn)行解析,并按照報文格式進(jìn)一步封裝成HTTP Request對象,供上層使用。這一部分工作一般是由Web服務(wù)器去進(jìn)行,我使用過的Web服務(wù)器有Tomcat, Nginx和Apache等等 HTTP報文也分成三份,
狀態(tài)碼
,
響應(yīng)報頭
和
響應(yīng)報文
狀態(tài)碼
狀態(tài)碼是由3位數(shù)組成,之一個數(shù)字定義了響應(yīng)的類別,且有五種可能取值:
平時遇到比較常見的狀態(tài)碼有:200, 204, 301, 302, 304, 400, 401, 403, 404, 422, 500
常見狀態(tài)碼區(qū)別
200 成功
請求成功,通常服務(wù)器提供了需要的資源。
204 無內(nèi)容
服務(wù)器成功處理了請求,但沒有返回任何內(nèi)容。
301 永久移動
請求的網(wǎng)頁已永久移動到新位置。 服務(wù)器返回此響應(yīng)(對 GET 或 HEAD 請求的響應(yīng))時,會自動將請求者轉(zhuǎn)到新位置。
302 臨時移動
服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請求,但請求者應(yīng)繼續(xù)使用原有位置來進(jìn)行以后的請求。
304 未修改
自從上次請求后,請求的網(wǎng)頁未修改過。 服務(wù)器返回此響應(yīng)時,不會返回網(wǎng)頁內(nèi)容。
400 錯誤請求
服務(wù)器不理解請求的語法。
401 未授權(quán)
請求要求身份驗(yàn)證。 對于需要登錄的網(wǎng)頁,服務(wù)器可能返回此響應(yīng)。
403 禁止
服務(wù)器拒絕請求。
404 未找到
服務(wù)器找不到請求的網(wǎng)頁。
422 無法處理
請求格式正確,但是由于含有語義錯誤,無法響應(yīng)
500 服務(wù)器內(nèi)部錯誤
服務(wù)器遇到錯誤,無法完成請求。
響應(yīng)報頭
常見的響應(yīng)報頭字段有: Server, Connection…。
響應(yīng)報文
你從服務(wù)器請求的HTML,CSS,文件就放在這里面
就是 Webkit 解析渲染頁面的過程。
這個過程涉及兩個比較重要的概念
回流
和
重繪
,DOM結(jié)點(diǎn)都是以盒模型形式存在,需要瀏覽器去計算位置和寬度等,這個過程就是回流。等到頁面的寬高,大小,顏色等屬性確定下來后,瀏覽器開始繪制內(nèi)容,這個過程叫做重繪。瀏覽器剛打開頁面一定要經(jīng)過這兩個過程的,但是這個過程非常非常非常消耗性能,所以我們應(yīng)該盡量減少頁面的回流和重繪
這個過程中可能會有dom操作、ajax發(fā)起的http網(wǎng)絡(luò)請求等。
web-socket、ajax等,這個過程通常是為了獲取數(shù)據(jù)
setTimeout、setInterval、Promise等宏任務(wù)、微任務(wù)隊列
當(dāng)Render Tree中部分或全部元素的尺寸、結(jié)構(gòu)、或某些屬性發(fā)生改變時,瀏覽器重新渲染部分或全部文檔的過程稱為回流。
會導(dǎo)致回流的操作:
一些常用且會導(dǎo)致回流的屬性和方法:
當(dāng)頁面中元素樣式的改變并不影響它在文檔流中的位置時(例如:color、background-color、visibility等),瀏覽器會將新樣式賦予給元素并重新繪制它,這個過程稱為重繪。
的解析是由瀏覽器的引擎完成的。由于JavaScript是單線程運(yùn)行,也就是說一個時間只能干一件事,干這件事情時其他事情都有排隊,但是有些人物比較耗時(例如IO操作),所以將任務(wù)分為
同步任務(wù)
和
異步任務(wù)
,所有的同步任務(wù)放在主線程上執(zhí)行,形成執(zhí)行棧,而異步任務(wù)等待,當(dāng)執(zhí)行棧被清空時才去看看異步任務(wù)有沒有東西要搞,有再提取到主線程執(zhí)行,這樣往復(fù)循環(huán)(冤冤相報何時了,阿彌陀佛),就形成了Event Loop事件循環(huán),下面來看看大人物
先看一段代碼
結(jié)果我想大家都應(yīng)該知道。主要來介紹JavaScript的解析,至于Promise等下一節(jié)再說
JavaScript是一門單線程語言,盡管H5中提出了 Web-Worker ,能夠模擬實(shí)現(xiàn)多線程,但本質(zhì)上還是單線程,說它是多線程就是扯淡。
既然是單線程,每個事件的執(zhí)行就要有順序,比如你去銀行取錢,前面的人在進(jìn)行,后面的就得等待,要是前面的人弄個一兩個小時,估計后面的人都瘋了,因此,瀏覽器的引擎處理JavaScript時分為
同步任務(wù)
和
異步任務(wù)
這張圖我們可以清楚看到
js引擎存在monitoring process進(jìn)程,會持續(xù)不斷的檢查主線程執(zhí)行棧是否為空,一旦為空,就會去Event Queue那里檢查是否有等待被調(diào)用的函數(shù)。 估計看完這些你對事件循環(huán)有一定的了解,但是事實(shí)上我們看對的沒這么簡單,通常我們會看到Promise,setTimeout,process.nextTick(),這個時候你和我就懵逼。
不同任務(wù)會進(jìn)入不同的任務(wù)隊列來執(zhí)行。 引擎開始工作后,先在宏任務(wù)中開始之一次循環(huán)( script里面先執(zhí)行,不過我喜歡把它拎出來,直接稱其進(jìn)入執(zhí)行棧 ),當(dāng)主線程執(zhí)行棧全部任務(wù)被清空后去微任務(wù)看看,如果有等待執(zhí)行的任務(wù),執(zhí)行全部的微任務(wù)(其實(shí)將其回調(diào)函數(shù)推入執(zhí)行棧來執(zhí)行),再去宏任務(wù)找更先進(jìn)入隊列的任務(wù)執(zhí)行,執(zhí)行這個任務(wù)后再去主線程執(zhí)行任務(wù)(例如執(zhí)行“`console.log(“hello world”)這種任務(wù)),執(zhí)行棧被清空后再去微任務(wù),這樣往復(fù)循環(huán)(冤冤相報何時了)
下面來看一段代碼
我們看看它的執(zhí)行情況
具體的執(zhí)行過程大致就是這樣。
關(guān)于linux 401的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
創(chuàng)新互聯(lián)【028-86922220】值得信賴的成都網(wǎng)站建設(shè)公司。多年持續(xù)為眾多企業(yè)提供成都網(wǎng)站建設(shè),成都品牌建站設(shè)計,成都高端網(wǎng)站制作開發(fā),SEO優(yōu)化排名推廣服務(wù),全網(wǎng)營銷讓企業(yè)網(wǎng)站產(chǎn)生價值。
分享名稱:深度學(xué)習(xí)Linux401——進(jìn)階指南(linux401)
分享URL:http://www.dlmjj.cn/article/dppiici.html


咨詢
建站咨詢
