1.为什么要异步I/O
Node既可以作为服务器端去处理客户端带来的大量并发请求,也能作为客户端对网络中的各个应用进行并发请求。--
在B/S模型中,如果网页临时需要获取一个网络资源,通过异步的方式获取服务端的资源,在下载资源的期间,用户交互都不会处于等待状态。但是前端获取资源的速度也取决于后端的响应速度。随着WebApp不断膨胀,数据也会分布式到多台服务器上,分布式将会是常态,这也会放大异步和同步性能上的差异。
不同的I/O类型及其对应的开销
I/O类型 | 花费的CPU时钟周期 |
---|---|
cpu一级缓存 | 3 |
cpu二级缓存 | 14 |
内存 | 250 |
硬盘 | 41000000 |
网络 | 240000000 |
I/O是昂贵的,分布式I/O是更昂贵的。只有后端能够快速的响应资源,才能让前段的体验更好。
2.资源分配
通常计算机在运行的过程对组件进行了抽象,分为I/O设备和计算设备。
多线程的代价在于创建线程和执行线程上下文切换的开销较大。另外,在复杂的业务中,多线程编程经常面临锁、状态同步等问题,优势是在多核CPU上能够有效提升CPU的利用率。
单线程同步编程缺点在于性能,任意一个略慢的任务都会导致后续执行代码被阻塞,在计算机资源中,通常I/O与CPU计算之间是可以并行进行的,但是同步编程会让后续任务等待,造成资源不能更好地利用。
异步I/O就是期望I/O的调用不会阻塞后续运算,将原有等待I/O的这段时间分配给其余的业务去执行。
3.异步I/O实现
操作系统对计算机进行了抽象,将所有输入输出设备抽象为文件。内核在进行文件I/O操作时,通过文件描述符进行管理,而文件描述符类似于应用程序和系统内核之间的凭证。应用程序如果需要进行I/O调用,需要先打开文件描述符,然后再根据文件描述符去实现文件的读写。此处非阻塞I/O与阻塞I/O的区别在于阻塞I/O完成整个获取数据的过程,而非阻塞I/O则不带数据直接返回,要获取数据,还需要通过文件描述符再次获取。
非阻塞I/O返回之后,CPU的时间片可以处理其他事务,由于完整的I/O并没有完成,应用程序需要重复调用I/O操作来确认是否完成。这种重复调用操作判断是否完成的技术叫轮询
网友评论