Node的异步与java的异步_node中异步IO的理解
解釋性語言和編譯型語言的區(qū)別:
計算器不能直接的理解高級語言,只能理解機器語言,所以必須把高級語言翻譯為機器語言,翻譯的方式有兩種,一個是編譯,一個是解釋。
解釋性語言的程序不需要編譯,它是在運行程序的時候進行翻譯,比如java,專門有一個解釋器可以直接執(zhí)行Java程序,每一個語句都是執(zhí)行的時候才能翻譯,編譯型就是編譯的時候直接編譯成機器可以執(zhí)行的,編譯和執(zhí)行時分開的,但是不能跨平臺。因為翻譯只做了一次,運行的時候不需要再去翻譯,所以編譯型語言的程序執(zhí)行效率高。
對于解釋性語言,程序運行時的控制權(quán)在解釋器而不在于程序,對于編譯型語言程序運行時的控制權(quán)在程序。
進程的前臺運行和后臺運行
后臺進程是一直運行的服務(wù)端程序,又稱為守護進程,通常是在系統(tǒng)后臺運行,沒有控制終端,不與前臺交互,一般作為系統(tǒng)服務(wù)使用。其稱為后臺進程的原因大部分是因為它沒有控制端,無法和前臺的用戶交互。
相對應(yīng)的前臺進程,就是我們在終端中開啟的進程,例如我們在終端中npm run server.js啟動一個webServer,此時啟動的進程就是前臺進程,當(dāng)你把當(dāng)前的命令行終端進行關(guān)閉了之后,該進程也便被殺死了。
node中的阻塞/非阻塞IO和同步/異步IO
表面上來看,這兩組的概念都差不多,阻塞/非阻塞IO,是操作系統(tǒng)內(nèi)核對于IO的兩種處理方式,對于阻塞IO,比如讀取文件,操作系統(tǒng)在讀取完文件之后,才會給應(yīng)用程序返回結(jié)果,這一段過程呢,應(yīng)用程序在等待操作系統(tǒng)的回復(fù),是為應(yīng)用層面的同步IO。
對于非阻塞IO,操作系統(tǒng)在接收到應(yīng)用程序?qū)τ谧x取文件的請求時,立即返回給應(yīng)用程序一個結(jié)果,但是應(yīng)用程序怎么知道操作系統(tǒng)完成了IO操作呢?這時候應(yīng)用程序就會對操作系統(tǒng)發(fā)起詢問(你到底好了沒有?人家都快急死了),發(fā)起詢問的方法又經(jīng)過好幾種演變,比如read、poll、epoll等,中間多的無非就是根據(jù)文件描述符減少詢問的次數(shù),總體上來說這種方式不好。并不能達到我們理想的異步IO。
那么從應(yīng)用程序方面來將,我們期望的異步IO,就是應(yīng)用程序進行了IO操作之后,不再需要操心操作系統(tǒng)什么時候返回,去執(zhí)行下邊的代碼就行了,當(dāng)操作執(zhí)行完了之后呢,直接給應(yīng)用程序發(fā)信息告訴他就行了。Linux系統(tǒng)下原生提供了一種AIO是通過信號或者回調(diào)來傳遞數(shù)據(jù)的,這個AIO就是我們的理想的異步IO。但是不幸的是只有Linux中有,而且無法利用系統(tǒng)緩存。
node(單線程)中對于*nix平臺而言,采用的是線程池+epoll異步IO模擬實現(xiàn)應(yīng)用程序?qū)用娴漠惒絀O,主線程進行執(zhí)行程序,碰到我們異步IO調(diào)用時,將改異步IO分配給線程池中的某一個線程,然后就變成了線程池中的某個線程和操作系統(tǒng)的阻塞IO進行IO操作,當(dāng)IO線程接收到操作系統(tǒng)的阻塞IO執(zhí)行的返回結(jié)果之后,IO線程再發(fā)送時間給主線程。
node中對于window平臺而言,是依靠于IOCP來實現(xiàn)的,其內(nèi)部仍然是線程池原理,不同之處在于這些線程池由系統(tǒng)內(nèi)核接手管理。
node中對于異步IO的實現(xiàn):
對于異步IO的實現(xiàn),其中有幾個組成部分:事件循環(huán)、觀察者、請求對象
事件循環(huán)是node中的一種執(zhí)行機制,這種機制是回調(diào)執(zhí)行的基礎(chǔ)部分,它保證了我們的回調(diào)函數(shù)能夠被執(zhí)行。
觀察者是暴露回調(diào)函數(shù)的窗口,如果整體的場景為飲料工廠的話,我們的瓶子就是我們的回調(diào)函數(shù),事件循環(huán)就是傳送帶在那一直轉(zhuǎn),而觀察者就是瓶子就如機器的入口,機器就是我們的應(yīng)用程序。所以應(yīng)用程序從觀察者這里獲取事件,應(yīng)用程序詢問觀察者是否還有事件。
請求對象,是應(yīng)用程序封裝的一個對象,里邊包含了要做的IO操作類型,以及回調(diào)函數(shù)。
整體流程就是,異步調(diào)用開始之后,應(yīng)用程序封裝一個請求對象,送入我們的線程池中的某個線程,該線程和操作系統(tǒng)的非阻塞IO通過epoll機制進行工作,這其中,會有觀察者在線程池中進行檢查,當(dāng)某個線程的IO操作完成之后,觀察者會將回調(diào)函數(shù)(封裝在請求對象中的)放在事件循環(huán)上(上段提到的傳送帶),然后主線程調(diào)用回調(diào)函數(shù)。
參考:《深入淺出Node.js》
問題思考:
操作系統(tǒng)的線程與CPU中的線程有什么不同?
總結(jié)
以上是生活随笔為你收集整理的Node的异步与java的异步_node中异步IO的理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 今天黄金多少钱啊?
- 下一篇: 北京国贸有个室内攀岩,多少钱,第一次去,