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