通过单片机理解来理解异步非阻塞

通过单片机理解来理解异步非阻塞

并发在BS架构中非常重要,是web服务器的典型应用场景。
传统后台高级语言java、php虽然能实现高并发,但是却有缺点,最好解决并发的方案是异步非阻塞。下文以单片机多任务来讲解异步非阻塞的优点。

两个基本概念

并发

并发指的时服务器同时应对多个客户端请求,这里的同时是宏观的,从微观来讲cpu只在某一小段时间处理其中一个请求并且在不同的处理线程上进行切换,因为切换的特别快,就给人一种在同时处理请求的错觉,实际上cpu是在分时进行处理。而并行则是完全真正的同时处理。

并行

​ 并行指的的是单个cpu同时处理处理多个客户端请求,这里的同时是真正的同时,一个cpu只处理一个程序,而不是类似于并发通过cpu切换来实现的,并行需要cpu只处理一个程序,一般我们电脑都是4核到16核,如果并行操作,那么一个服务器只能同时为4到16个客户端提供服务,这是不满满足需求的。因此并发更加适合web服务器。

不同语言对并发处理实现

java

​ java作为http服务器(实际底层是TCP)时,当面对多并发场景时会采用多线程的解决方案,也就是说来一个连接就开辟一个线程,建立100个连接就开辟100个线程,并且每个线程都是阻塞的,只有处理完当前的任务才会继续向下执行,比如读取一个图片文件,只要读取完毕后才会进行下一步返回。线程是耗费内存的,8g内存最多开辟4000个线程。

PHP

​ PHP处理高并发和java类似,他是采用多进程的做法,同样是耗费内存。

​ 无论是线程还是进程,耗费内存的缺点可以通过增加物理内存的方法来解决,但是多线程和多进程切换还有一个最重要的坑:那就是CPU的上下文切换,所谓的上下文切换就是CPU在不同线程上切换时要保存运行运行时的上下文,那么什么是上下文呢?

​ 谈到上下文就不得不谈下单片机操作系统的实现了。之前使用的STM32F4系列单片机,主频168M,可以运行UCOS和FreeRtos多任务操作系统,单片机内部只有一个CPU,那他是怎么实现多任务操作的呢?看过过UCOS的源代码会发现,作为单核心的单片机所谓的多任务的实现方式仍然是分时操作,UCOS和FreeRtos的作用就是在合适的时间将CPU执行指针放在不同的内存空间上执行单个任务函数,执行完毕后就将CPU任务指针切换到下一个任务函数的所在内存区域,切换过程中必须保存上一个任务运行是的任务堆栈空间和相关的寄存器,以便于切回来后仍然能正常运行。

​ 高级语言java和php并发的实现和单片机多任务实现原理相同,上下文就是程序运行单个线程和进程切换时对当前运行现场(堆栈和相关寄存器)的存储和恢复。

​ 服务器CPU的频率特别高,一般都在3-4G左右,执行单个任务时间特别短,但是相对来讲上下文的存储和恢复确比任务执行时间长的多,这样一来当并发数高了以后,真正处理任务的时间远小于上下文切换的时间,也就是有效工作的效率特别低,这就是多线程和多进程处理并发的缺点。

nodejs

​ 通过上边的讲述我们明白传统后台语言处理并发在上下午切换耗费的时间远大于真正处理实际任务的时间造成cpu效率低下,导致没有真正发挥出CPU的性能。既然上下午切换时间长,那么可以不可以不进行切换又能实现并发呢?当然可以,这就得拿出nodejs了

​ nodejs最大的特点是单线程、异步非阻塞。它对并发的实现是一个主线程来处理所有的TCP连接,当其中一个主线程具有耗费时间的任务时,比如读取文件,主线程不会阻塞而是直接跳过,设置回调函数通过异步任务来显示,当文件读取完毕后执行回调函数。

​ nodejs的这两个特点非常适合多并发场景,8g内存能同时建立4万左右并发,是传统php和java的10倍。当然nodejs不是没有缺点,nodejs的特性觉得了他不适合与CPU密集型的任务处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值