阻塞io与非阻塞io、同步io与异步io的理解

前言

对于node有一个很大的特点就是非阻塞io,这也是由于node使用了单线程,避免了多线程之间通信的同步以及线程之间切换带来的损耗,从而大大提神了性能。由于单线程的原因,所以需要借助非阻塞io来实现快速处理响应用户的请求,而不是等处理完一个任务之后在执行下一个任务。在介绍io的问题之前,先了解一下计算机操作系统底层对于内存的划分。

用户空间与内核空间

每一台计算机都有一个或者多个操作系统,而操作的的核心就是内核。内核其实可以看成是比较重要的应用程序,所以它会有自己相应的内存空间,这个内存空间就是内核空间。内核可以访问底层硬件设备的所有权限。为了保护内核不被普通的应用程序直接操作,从而将内存空间划分为内核空间和用户空间,普通的应用程序就是运行在用户空间。

io操作的基本流程

当应用程序调用类似read等函数读取数据的时候,此时会执行一个系统调用,也就是调用内核的函数去读取响应的数据文件。首先内核会将对应的数据读取到内核空间,等数据都读取完毕之后,内核通知用户程序读取内核空间的数据,将其复制到对应的用户空间,此时才算完成一次数据的读取操作。

这个过程涉及到两个步骤

1、内核将数据读取到内核空间
2、内核通知应用程序将对应的数据从内核空间拷贝到用户空间

阻塞io与阻塞io

阻塞io指的就是应用程序调用read等函数读取数据,到内核通知应用程序这段时间内,线程不处理其他的操作指令,完成处于等待的状态,直到可以读取数据。而对于非阻塞io而言,在这段时间内,线程可以处理其他的指令。node真是利用了非阻塞io,才能在一个线程上处理很多的用户请求,不会因为io操作导致线程阻塞。

同步io和异步io

同步io则是指在应用程序调用read等函数读取数据,在步骤1中,可以使用轮询或者事件回调的机制进行监听内核是否读取数据完毕,在读取完毕之后执行步骤2,将内核中的数据拷贝到用户空间,这个过程线程仍然是阻塞的,也就是需要线程主动去完成数据的拷贝的动作。同步就是指的这个操作。而对于异步io,从应用程序发起数据的读取操作开始,到将数据拷贝到用户空间整个过程都是由内核完成的,线程不会由任何的阻塞,在数据拷贝完毕之后,内核会通知应用程序。

总结

阻塞io是对于线程而言,则是在进行数据的读取操作的时候,此时线程会主动执行阻塞操作,直到内核完成对数据的读取。而同步io则是指在内核读取数据完毕之后,需要应用程序主动将数据从内核空间拷贝到用户空间,此时这个阶段线程是阻塞的。而对于异步io而言,不需要主动拷贝数据,都是内核完成之后通知应用程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值