Skip to content

Commit

Permalink
modified Event-Loop
Browse files Browse the repository at this point in the history
  • Loading branch information
qufei committed Apr 20, 2019
1 parent ab06f1a commit 5ffa6cc
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 12 deletions.
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,13 @@
- ```[面试]``` ```module.exports与exports的区别```,参考:[module.exports与exports的区别](/docs/nodejs/module.md#module.exports与exports的区别)
- ```[面试]``` ``` 假设有a.js、b.js两个模块相互引用,会有什么问题?是否为陷入死循环?```,参考:[#](/docs/nodejs/module.md#问题1)
- ```[面试]``` ``` a模块中的undeclaredVariable变量在b.js中是否会被打印?```,参考:[#](/docs/nodejs/module.md#问题2)
- **事件轮询(Event Loop)** [[more]](/docs/nodejs/event-loop.md)
- `[EventLoop]` [线程模型、EventLoop介绍](/docs/nodejs/event-loop.md#线程模型)
- `[I/O]`[操作系统I/O模型及轮询技术演变](/docs/nodejs/event-loop.md#操作系统的轮询技术演进)
- `[I/O]`[白话风格(小明与妹子的邂逅)讲解I/O演进](/docs/nodejs/event-loop.md#白话风格)
- `[Node.js-EventLoop]` [Node.js中的Event Loop](/docs/nodejs/event-loop.md#Node.js中的EventLoop)
- `[Browser-EventLoop]` [浏览器中的Event Loop](/docs/nodejs/event-loop.md#浏览器中的EventLoop)
- `[Interview]` ``` I/O多路复用轮询技术select和epoll的区别? ```,参考:[#](/docs/nodejs/event-loop.md#select和epoll的区别)
- **中间件** [[more]](/docs/nodejs/middleware.md)
- ```[Mddleware]``` [常用Web框架&中间件汇总](/docs/nodejs/middleware.md)
- **缓存**
Expand Down
24 changes: 12 additions & 12 deletions docs/nodejs/event-loop.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
- [线程模型](#线程模型)
- [EventLoop](#EventLoop)
- [操作系统I/O模型及轮询技术演变](#操作系统的轮询技术演进)
- [同步阻塞I/O](#同步阻塞I/O)
- [同步非阻塞I/O](#同步非阻塞I/O)
- [I/O多路复用(Select、poll、epoll、kqueue)](I/O多路复用)
- [信号驱动I/O](信号驱动I/O)
- [异步I/O模型](异步I/O模型)
- [同步阻塞I/O](#同步阻塞IO)
- [同步非阻塞I/O](#同步非阻塞IO)
- [I/O多路复用(Select、poll、epoll、kqueue)](#IO多路复用)
- [信号驱动I/O](#信号驱动IO)
- [异步I/O模型](#异步IO模型)
- [白话风格(小明与妹子的邂逅)](#白话风格)
- [Node.js中的Event Loop](#Node.js中的EventLoop)
- [浏览器中的Event Loop](浏览器中的EventLoop)
- [浏览器中的Event Loop](#浏览器中的EventLoop)

## 面试指南

Expand Down Expand Up @@ -44,21 +44,21 @@ EventLoop是Javascript对异步的具体实现,在程序执行过程中,直
* 应用程序先发起系统调用待数据就绪
* 将数据从内核缓冲区拷贝到应用缓冲区

#### 同步阻塞I/O
#### 同步阻塞IO

从应用程序开始系统调用->数据就绪,进行拷贝->拷贝结束,这之间应用程序都处于等待状态,不能做其它事情,直到将数据拷贝到用户空间或出错才返回,我们称之为阻塞I/O模式。

![](./img/阻塞IO.png)

#### 同步非阻塞I/O
#### 同步非阻塞IO

相比于同步阻塞I/O模式,同步非阻塞I/O在每次调用之后,如果数据没有就绪就会立即返回,之后重复调用来检查I/O操作是否就绪,这对CPU资源是一个极其浪费的操作,直到数据就绪将数据从内核拷贝到用户空间,返回成功指示给到应用程序。

Read:就是一种实现,通过重复轮询I/O来判断。

![](./img/同步非阻塞IO.png)

#### I/O多路复用
#### IO多路复用

链接(Socket)并发大的情况,上面两种就不适合了,前面一个处理不完,后面就只能干等,这里就用到了I/O多路复用,下图所示相比较前两种,分为了两步,先进行select数据就绪后,在调用recvfrom进行真正的I/O读写操作。它的高级之处还在于能够一个线程同时处理多个Socket。

Expand All @@ -78,19 +78,19 @@ poll和select在实现上没有本质的区别,相比较select,poll基于链

是linux下效率最高的I/O事件通知机制,没有最大链接限制,通过callbak回调通知机制,不在是每次调用都对链接进行线性遍历,这样就不会随着文件描述符的增加导致效率下降。

在1GB内存的机器上能监听大约10万个端口,远超过select的1024限制,具体可以在服务器上查看`cat /proc/sys/fs/file-max`
在1GB内存的机器上能监听大约10万个端口,远超过select的1024限制,具体可以在服务器上查看`cat /proc/sys/fs/file-max`

- **kqueue**

与epoll类似,仅存于FreeBSD(一种类UNIX操作系统)。

#### 信号驱动I/O
#### 信号驱动IO

仅在Unix上支持,与I/O多路复用相比避免了select的阻塞轮询。应用程序进行系统调用后立即返回,处理其它事物,在数据就绪之后系统会发送一个SIGIO信号到应用程序,应用进程开始读取数据。

![](./img/信号驱动IO.png)

#### 异步I/O模型
#### 异步IO模型

异步I/O模型是目前最理想的一种形式,应用程序发起系统调用后无需等待直接返回当前调用状态,进行后续的其它任务,结果由内核完成I/O操作之后通过回调通知到我们的应用程序,中间没有阻塞过程。

Expand Down

0 comments on commit 5ffa6cc

Please sign in to comment.