JavaScript進程。qbclipboard是一款輕量級的實現(xiàn)復制文本到剪貼板功能的JavaScript進程。通過該進程插件可以將輸入框,文本域,DIV元素中的文本等文本內(nèi)容復制到剪貼板中。
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設,海珠企業(yè)網(wǎng)站建設,海珠品牌網(wǎng)站建設,網(wǎng)站定制,海珠網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,海珠網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
沒有,你看到的每個瀏覽器窗口是一個進程多tab頁對應多個進程。js是在瀏覽器中運行的,沒有多進程的概念。多線程可能有,定時器,ajax就需要線程調(diào)度才能運行。
一、線程和進程基本概念
進程:操作系統(tǒng)分配的占有CPU資源的最小單位。擁有獨立的地址空間。
線程:安排CPU執(zhí)行的最小單位。同一個進程下的所有線程,共享進程的地址空間。
簡單講,計算機就像工廠,進程是個大車間,計算機內(nèi)部有很多個這樣的大車間。線程是工人,每一個車間里的工人至少有一個。
為什么這么畫呢?有點一個挨一個的效果呢?是因為以前我就老是疑惑進程或者線程運行時到底是并行?還是串行?
其實,在單CPU或單核的情況下,宏觀上無論是進程也好,線程也罷,都是并行的。而在微觀下,某一個具體的時刻,他們實際上都是串行的。在多CPU或多核的情況下,才是真正意義的并行。
二、線程和進程的關系、通性
關系:進程中包含著至少一個線程。在進程創(chuàng)建之初,就會包含一個線程,這個線程會根據(jù)需要,調(diào)用系統(tǒng)庫函數(shù)去創(chuàng)建其他線程。但需要注意的是,這些線程之間是沒有層級關系的,他們之間協(xié)同完成工作。在整個進程完成工作之后,其中的線程會被銷毀,釋放資源。
通性:都包含三個狀態(tài),就緒、阻塞、運行。通俗的講,阻塞就是資源未到位,等待資源中。就緒,就是資源到位了,但是CPU未到位,還在運行其他。
三、線程的好處
既然,線程和進程是存在通性的,那么為什么操作系統(tǒng)還要設置線程這個單位,那就說說線程的幾點好處:
1、在一個程序中,多個線程可以同步或者互斥并行完成工作,簡化了編程模型;
2、線程較進程來講,更輕;
3、線程雖然微觀并行。但是,在一個進程內(nèi)部,一個線程阻塞后,會執(zhí)行這個進程內(nèi)部的其他線程,而不是整體阻塞。從某種意義上,提高了CPU的利用率。
四、市面上的通用叫法
單線程與多線程,都指在一個進程內(nèi)的單和多。不要笑我,之前真的不懂。心中那只小羊駝,奔過來,跑過去。還抬起了傲嬌的眼睛,看了我一眼,呵呵~~~
五、javaScript單線程執(zhí)行機制
1、 首先解釋下,單線程和多線程。
什么是單線程?單線程就是一個進程中只有一個線程。程序順序執(zhí)行,前面的執(zhí)行完,才會執(zhí)行后面的程序。
什么是多線程?多線程就是一個進程中只有多個線程。在進程內(nèi)部進行線程間的切換,由于每個線程執(zhí)行的時間片很短,所以在感覺上是并行的。
2、那么為什么感覺上javaScript是多線程?而且還支持AJAX異步呢?AJAX是真正的異步嗎?
先說明,從哪里可以得出javaScript是單線程。比如你頁面一上來就alert(“hello world~”);只要你不關閉這個對話框,后續(xù)的js代碼就不會再執(zhí)行。因為,單線程就是這樣一步一步的順次執(zhí)行,前面不執(zhí)行完,后面不會執(zhí)行。也就是說,在具體的某一時刻,只有一段代碼在執(zhí)行。
可是,JavaScript明明可以處理各種觸發(fā)事件,感覺上是異步多線程啊。其實,它的原理是這樣的,JavaScript單線程的執(zhí)行瀏覽器的一個事件隊列,要執(zhí)行的函數(shù)和觸發(fā)事件的回調(diào)函數(shù)都被放在這個隊列中。比如,我點擊率一下按鈕,之后又將瀏覽器縮小了,那么這兩個事件的回調(diào)函數(shù)就會順次地被放在當前執(zhí)行的“函數(shù)”之后,再一一執(zhí)行。
那么,既然JavaScript是單線程,那么如何維護這個函數(shù)隊列呢,他分身無術啊。這時候,就需要知道,瀏覽器可不是單線程。雖然,每一個window只有一個js引擎,但是瀏覽器是事件驅動的、異步的、多線程的。
瀏覽器內(nèi)部有一個事件輪詢(event loop),是一個大的內(nèi)部消息循環(huán),會輪詢大的消息隊列,并執(zhí)行。也就是js要處理的事件隊列,是瀏覽器維護的。
瀏覽器至少有四個線程(不同瀏覽器會有差異): js引擎線程、界面渲染線程、瀏覽器事件觸發(fā)線程、http請求線程。
其實,到這里就說的很明白了。但是,又想到了延時函數(shù)(setTimeout)的例子,感覺上,因為沒有阻塞執(zhí)行,會感覺是異步,其實并不是。只是,js在執(zhí)行到延時函數(shù)時,會觸發(fā)瀏覽器的定時器,到設置時間,瀏覽器再將這個函數(shù)放入執(zhí)行的函數(shù)隊列,再由JavaScript引擎執(zhí)行。都是在瀏覽器空閑了才會執(zhí)行。
關于AJAX的異步,是真正的異步。同樣的道理,在調(diào)用AJAX的時候,瀏覽器會開辟一個新的線程,去處理這個請求,得到響應后,如果這個請求有回調(diào),會將這個回調(diào)再放入事件隊列中。再由JavaScript引擎執(zhí)行。
3、關于JavaScript的阻塞
瀏覽器雖然是多線程,但是由于JavaScript具有阻塞特性,無論外鏈還是內(nèi)嵌腳本,在瀏覽器執(zhí)行解釋js腳本的時候,瀏覽器是不會去做別的事情的,比如渲染頁面,而是直到js下載并執(zhí)行完畢。
這樣,js腳本的下載、解釋執(zhí)行,會反該頁面的繼續(xù)繪制,給用戶帶來不良的體驗。所以,要對其優(yōu)化,有如下幾點:
a、將script內(nèi)嵌和外鏈,在可以的情況下,放在body底部。注:對于css,瀏覽器是并行下載
b、在頁面onload后,加載js
c、html5 script標簽的defer屬性,在頁面加載完成后下載
d、使用創(chuàng)建script標簽的方式,在頁面加載完成后添加進去。
注:解決阻塞就是一句話,先讓頁面渲染完,再加載js。
六、Node.js單線程執(zhí)行機制
腦子就像有問題一樣。js都是單線程的了,node.js就是js實現(xiàn)的,還能是多線程??。『呛菄}~
Node.js其實還不是真正意義上的js,他是借用了js語法實現(xiàn)的,達到真正意義的非阻塞服務端語言。但是他的運行機制,也是事件輪詢 (Event Loop)。
首先我們來看一個簡單的master/worker的例子
worker程序
首先無論在子進程還是父進程都可以接收linux的信號 SIGINT,SIGTERM,SIGHUP 等。
只要是程序能夠監(jiān)聽到的退出信號。我們都可以統(tǒng)一通過監(jiān)聽 exit 來處理程序