产生背景
对于后台开发我们一个重要问题即使用尽可能少的服务器资源处理海量的请求,除了我们再架构上做多机自动扩容外,我们还必须尽可能提高单机硬件的利用率(CPU利用率+IO利用率)
为了提高硬件的利用率往往我们采用三种技术路径:
- 多线程
- 异步IO
- 协程
协程和异步IO以及多线程的对比
多线程
多线程可以充分利用CPU的多核,实现真正的并行,它是操作系统的基础设施。但是线程是一个粗粒度、相对比较笨重的多任务的抽象机制,例如以下几个特点
- 创建线程非常耗时
- 线程上下文切换非常耗时(要从用户态切换到内核态;保存当前线程执行环境;加载目标线程的执行环境;再从内核态切换回来等一系列操作)
- 每个线程会预先分配一个几M的调用栈
- 系统中最多只能同时运行数千个线程(当就绪线程个数远大于CPU核数,操作系统大量的时间就会用来进行线程切换,性能急剧下降)
异步IO
操作系统中有两种IO:同步IO和异步IO(5种I/O模型)
同步IO:发起IO(比如read)后,CPU必须原地等待其结束,然后才能继续往下执行
异步IO:发起IO(比如read)前,会先注册一个回调函数;发起IO后,CPU无需原地等待其完成,而是继续往下执行